继续研究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退出节点,小乌龟也停止了。