本节记录下使用ROS中的话题机制,实现turtlesim中小乌龟的圆周运动。
如果想通过话题通信机制,实现小乌龟的圆周运动,需要首先明确小乌龟的运动情况,以及所涉及的指挥运动的参数,这里需要首先手动发布一个turtlesim的节点,这里我使用roslaunch来实现小乌龟模拟器,然后再分别尝试使用C++与Python语言进行编程实现小乌龟的圆周运动
launch 文件相关
其中< node pkg=“包名” type=“节点类型” name=“此处名字可自动逸” output=“screen”/>
<launch>
<node pkg="turtlesim" type="turtlesim_node" name="turtle1" output="screen"/>
<node pkg="turtlesim" type="turtle_teleop_key" name="key" output="screen"/>
</launch>
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平面即可。
有了以上的逐步分析, 我们接下来进行编程实现。
C++实现
#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<geometry_msgs::Twist>("/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;
}
Python实现
#! /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.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 not rospy.is_shutdown():
pub.publish(twist)
rate.sleep()
【注:不论C++实现还是Python实现均需要进行CMakeLists.txt的配置,然后编译运行】
运行效果如下:
当然以上的编程,也可以通过 rostopic pub 命令实现,-r 为循环次数,但是这里我们目的是训练编程实现,而不是ros命令,因为ros命令的操作性不太强。
rostopic pub -r 10 /turtle1/cmd_vel geometry_msgs/Twist "linear:
x: 1.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.5"