如果想通过话题通信机制,实现小乌龟的圆周运动,需要首先明确小乌龟的运动情况,以及所涉及的指挥运动的参数,这里需要首先手动发布一个turtlesim的节点,这里我使用roslaunch来实现小乌龟模拟器,然后再分别尝试使用C++与Python语言进行编程实现小乌龟的圆周运动
其中< node pkg=“包名” type=“节点类型” name=“此处名字可自动逸” output=“screen”/>
launch文件需要放在对应的launch文件夹下
运行launch文件,使用roslaunch命令,该命令其实内部启动了 roscore,所以比较方便。打开终端,切换到项目目录下,运行下面的命令:
source ./devel/setup.bash
roslaunch plumbing_test01(您的项目名,可自定义) start_turtle.launch
然后会发现自己的屏幕上会有小乌龟了。

这个时候我们可以将光标定位在命令框中,通过键盘操作小乌龟的运动,但是我们希望小乌龟实现圆周运动,这个时候仅仅通过键盘实现其实不太现实,这个时候我们尝试编程实现,我们通过话题进行发布相关的数据,实现圆周运动。
在命令框中,使用下面的命令进行查看,然后得到乌龟运动对应的话题名称
rostopic list

查看topic的消息数据类型
rostopic info /turtle1/cmd_vel

查看该消息类型的数据结构
rosmsg info geometry_msgs/Twist

可以发现该消息数据类型包括了线速度和角速度,每个速度又包含了三个维度(x,y,z),这就对应了ROS运动中的 偏航(yaw)、俯仰(pitch)、横滚(roll),即右手坐标系中的:偏航(yaw)绕z轴旋转,俯仰(pitch)绕y轴旋转,横滚(roll)绕x轴旋转。由于模拟器中的乌龟为平面图,乌龟运动的线速度仅有 x 方向和角速度的 z 方向,即绕着z轴转动,将乌龟的平面作为oy平面即可。
有了以上的逐步分析, 我们接下来进行编程实现。
#include "ros/ros.h"
#include "geometry_msgs/Twist.h"int main(int argc,char *argv[]){ros::init(argc,argv,"my_control");ros::NodeHandle nh;ros::Publisher pub = nh.advertise("/turtle1/cmd_vel",10);ros::Rate rate(10);//设置发布频率//组织消息geometry_msgs::Twist twist;twist.linear.x=1.0;twist.linear.y=0.0;twist.linear.z=0.0;twist.angular.x=0.0;twist.angular.y=0.0;twist.angular.z=0.5;while(ros::ok()){pub.publish(twist);//休眠rate.sleep();//回调ros::spinOnce();}return 0;
}
#! /usr/bin/env python
# -*- coding:utf-8 -*-
import rospy
from geometry_msgs.msg import Twist
if __name__ == "__main__":rospy.init_node("pub_test_01_p")pub = rospy.Publisher("/turtle1/cmd_vel",Twist,queue_size=10)#发布频率rate = rospy.Rate(10)#确定发布数据twist = Twist()twist.linear.x = 1.0twist.linear.y=0.0twist.linear.z = 0.0twist.angular.x=0.0twist.angular.y=0.0twist.angular.z=0.5while not rospy.is_shutdown():pub.publish(twist)rate.sleep()
【注:不论C++实现还是Python实现均需要进行CMakeLists.txt的配置,然后编译运行】
运行效果如下:
rostopic pub -r 10 /turtle1/cmd_vel geometry_msgs/Twist "linear:x: 1.0y: 0.0z: 0.0
angular:x: 0.0y: 0.0z: 0.5"