1、/odom
: (odometry : 里程计,就是车子方向盘下面的各种表)下面是它内部的参数:
std_msgs/Header header
string child_frame_id
// 子类坐标系geometry_msgs/PoseWithCovariance
pose
// 平移和旋转geometry_msgs/TwistWithCovariance
twist
// 线速度和角速度
它包含了一个机器人当前运动状态的所有信息。
其中 child_frame_id
就是机器人它自己的名字。
2、编码器
什么是编码器,编码器的原理,如何使用,程序如何控制。这些问题如果你不懂,请看:电子模块 — 编码器 这一节的内容。
1、ROS中Twist消息和轮子转动
ROS使用Twist消息类型发布运动指令给基控制器。虽然话题可以随意命名,但一般我们会使用/cmd_vel作为话题名。基控制器节点订阅/cmd_vel话题,然后把Twist消息翻译转换成发动机信号,从而使轮子转动。
运行如下命令可以查看Twist消息的组成:
rosmsg show geometry_msgs/Twist
执行后结果如下:
geometry_msgs/Vector3 linear
float64 x
float64 y
float64 z
geometry_msgs/Vector3 angular
float64 x
float64 y
float64 z
一个Twist消息由两个类型为Vector3的子消息组成,其中一个子消息是用x,y,z来表示线速度;而另一个是用来表示角速度。对于在二维平面运动的差速驱动机器人,只需要用到线速度的x部分和角速度的z部分。因为它只能前进或者后退,或者绕z轴旋转。
全方向移动的机器人就会用到线速度的y部分;而飞行机器人或者水下机器人就可能用到上述所有变量。
1)Twist消息的例子
假设想让机器人以0.1m/s的速度向前走,则在命令行表示这个Twist消息,它会是以下的形式:
rostopic pub -r 10 /cmd_vel geometry_msgs/Twist '{linear: {x: -0.1,y: 0,z: 0},angular: {x: 0,y: 0,z: -1}}'
注意上面Twist消息格式中怎样用大括号区分一个子消息,并用冒号、逗号和空格(空格是必不可少的)来分开变量名和值。
其实这种方式很少使用,我们实际可以用其他ROS节点把Twist消息传给机器人。
2)用Rviz监视机器人运动
在尝试不同的Twist命令和运动控制脚本的过程中,我们将使用RVIZ来把机器人的运动可视化。我们可以使用Odometry Display类型去跟踪机器人的方位(坐标和方向)。机器人的每一个方位状态是用一个箭头来表示的,这个箭头指向机器人在这个坐标时所面对的方向。注意这个状态反应的是机器人的测量数据。它与机器人在现实世界的状态是有差距的。
接下来我们尝试试用ArbotiX模拟器去运行几个例子。首先用以下命令启动一个模拟的TurtleBot:
roslaunch rbx1_bringup fake_turtlebot.launch
在另一个终端,用设置好的Odometry Display配置文件启动RVIZ:
rosrun rviz rviz -d `rospack find rbx1_nav`/sim.rviz
最后,再启动一个终端窗口,发布以下Twist消息,使机器人顺时针转圈。
rostopic pub -r 10 /cmd_vel geometry_msgs/Twist '{linear: {x: 0.1,y: 0,z: 0},angular: {x: 0,y: 0,z: -0.5}}'
我们可以通过设定参数-r,以10Hz的频率发布Twist消息。在运行ArbotiX模拟器的时候,这个参数并不是必须的,加上也没关系。
需要注意的是,在Odometry Display配置中的keep参数设置为100,这说明我们想显示在最早的箭头消失前最新的100个箭头。而Position Tolerance(单位为m)和Angle Tolerance(单位为rad)两个参数可以让你控制多久显示一个新的箭头。
点击Reset按钮,或者先取消选择Odometry Display旁边的选项框然后再选上,都可以在任意一点去掉已经显示的箭头。
在刚才发布消息的同一个窗口下按下“Ctrl-C”,然后发布一条空的Twist消息,可以让机器人停止旋转:
rostopic pub -1 /cmd_vel geometry_msgs/Twist '{}'
在一个现实的机器人尝试Twist消息之前,需要花一点时间介绍校准问题。