繼續研究ROS,今天的主題是編寫節點讓小烏龜畫簡單的幾何圖形。
主要參考這位老兄的博客https://blog.csdn.net/IMBA_09/article/details/84950696。
1:進入工作空間
1 cd catkin_ws/src #進入工作空間 2 catkin_create_pkg my_turtle_package rospy roscpp #新建my_turtle_package包
2:節點代碼
1 cd my_turtle_package/src/ 2 touch draw_rectangle.cpp
在打開的新文件中代碼如下:
1 #include <ros/ros.h> 2 #include <geometry_msgs/Twist.h> 3 #define PI 3.14159265358979323846 4 5 int main(int argc, char **argv){ 6 ros::init(argc, argv, "draw_rectangle"); //"draw_rectangle"必須是nodename 7 std::string topic = "/turtle1/cmd_vel"; //topic name 8 ros::NodeHandle n; 9 ros::Publisher cmdVelPub = n.advertise<geometry_msgs::Twist>(topic, 1); 10 //第一個參數也可以寫成"/turtle1/cmd_vel"這樣的topic name 11 //第二個參數是發布的緩沖區大小,<geometry_msgs::Twist>是消息類型 12 ros::Rate loopRate(2); 13 //與Rate::sleep();配合指定自循環頻率 14 ROS_INFO("draw_retangle start...");//輸出顯示信息 15 geometry_msgs::Twist speed; // 控制信號載體 Twist message 16 //聲明一個geometry_msgs::Twist 類型的對象speed,並將速度的值賦值到這個對象里面 17 int count = 0; 18 while (ros::ok()){ 19 speed.linear.x = 1; // 設置線速度為1m/s,正為前進,負為后退 20 speed.linear.y = 0; 21 speed.linear.z = 0; 22 speed.angular.x = 0; 23 speed.angular.y = 0; 24 speed.angular.z = 0; 25 count++; 26 while(count == 5) 27 { 28 count=0; 29 speed.angular.z = PI; //轉90° 30 } 31 cmdVelPub.publish(speed); // 將剛才設置的指令發送給機器人 32 ros::spinOnce();//調用此函數給其他回調函數得以執行 33 loopRate.sleep();//按loopRate(2)設置的2HZ將程序掛起 34 } 35 36 return 0; 37 }
在terminal中繼續輸入下面的命令:
1 cd ~/catkin_ws/src/my_turtle_package 2 gedit CMakeLists.txt
用gedit打開CMakeLists.txt文件,然后找到##Declare a C++ executable,在這一行的前面或者后面添加如下內容:
1 add_executable(draw_rectangle src/draw_rectangle.cpp) 2 target_link_libraries(draw_rectangle ${catkin_LIBRARIES})
添加完以上內容后我們保存並退出CMakeLists.txt文件。然后在terminal中繼續輸入如下命令進行編譯:
1 cd ~/catkin_ws/ 2 catkin_make
一切順利的話就會編譯成功,接下來就可以讓小烏龜來畫矩形了。
3:啟動節點
打開第一個terminal終端,啟動ros
1 roscore
打開第二個terminal終端,啟動rosnode
rosrun turtlesim turtlesim_node
打開第三個terminal終端,啟動my_turtle_package節點
1 cd ~/catkin_ws/ 2 source devel/setup.bash 3 rosrun my_turtle_package draw_rectangle
此時我們可以看到小烏龜已經在畫矩形了,如果按下Ctr+C退出節點,小烏龜也停止了。