引言
ROS 功能强大,要想学会也需要花费一番力气。
ROS wiki 上提供了非常丰富的教程。但是按部就班的按照 wiki 去学习,难免会感到枯燥。
如果在学习 wiki 的同时能用一个小项目练练手,学习的兴趣可能会提高很多,对 ROS 相关概念的理解也会更加直观。
turtlesim 就是这样一个小项目。它是 ROS 三个官方教程之一,另外两个分别是用 c++ 和 Python 编写 node 的教程,如下图所示:
安装
turtlesim package 默认并不在 ROS 系统中,需要额外安装,命令如下:
sudo apt-get install ros-$(rosversion -d)-turtlesim
对于绝大部分 ros package,其在 ubuntu 软件库中的名字很有规律,都是
ros-版本-package
。例如要在 ros kinetic 版本中安装 turtlesim package,对应的 ubuntu 软件库中的名字就是 ros-kinetic-turtlesim;在 ros indigo 版本中安装游戏手柄驱动包 joy,对应的名字就是 ros-indigo-joy。
turtlesim package 里面有 4 个可执行文件( node):
- turtlesim_node
- turtle_teleop_key
- draw_square
- mimic
后边会一一介绍。
启动仿真平台 turtlesim_node
在 terminal 中输入如下命令
roscore # 开启 ros master
rosrun turtlesim turtlesim_node # 运行 turtlesim_node
此时会打开 2D 仿真平台,里面有一只小海龟。每次运行 turtlesim_node 会随机出现不同的小海龟。
而且在 terminal 里也会有提示:
[ INFO] [1551962335.522651861]: Starting turtlesim with node name /turtlesim
[ INFO] [1551962335.527811615]: Spawning turtle [turtle1] at x=[5.544445], y=[5.544445], theta=[0.000000]
即生成一个名为 turtle1 的小海龟,所处位置是 x=5.54,y=5.54,朝向角度为 0 度。
现在打开 rosgraph,直观地看一下目前的系统结构:
rqt_graph
目前系统已经有了 1 个 node 和 3 个 topic。turtlesim 接收来自 /turtle1/cmd_vel 上的线速度和角速度控制信息,按照指令驱动 turtle1 动作,同时发布 turtle1 的位置信息到 /turtle1/pose 上。
此时,如果向 /turtle1/cmd_vel topic 上发布如下控制信息,可以在 2D 仿真平面上看到海龟向前移动。
rostopic pub /turtle1/cmd_vel geometry_msgs/Twist "linear:
x: 2.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0"
要在命令行中输入上述信息,只需要在输入 rostopic pub /turtle1/cmd_vel
之后按两次 tab
键,后边的内容会自动补全,补全的默认值都是0.0,所以还需要自己设定期望的线速度和角速度。
执行之后可以通过 turtle1/pose 获取当前位置信息
rostopic echo /turtle1/pose
结果为
x: 7.56044435501
y: 5.544444561
theta: 0.0
linear_velocity: 0.0
angular_velocity: 0.0
即执行一次线速度为 2 的操作之后,turtle1 从 x=5.54 的位置移动到了 x=7.56。这里稍微有些误差,可以忽略。
以上过程就是在命令行中向 cmd_vel topic 发送命令驱动海龟移动。
下面介绍如何通过键盘上的按键更加便捷的操控海龟移动。
启动键盘操控节点 turtle_teleop_key
rosrun turtlesim turtle_teleop_key
会提示:
Reading from keyboard
---------------------------
Use arrow keys to move the turtle.
即用键盘上的方向键控制海龟运动。
在用键盘控制时,要将光标聚焦到启动 turtle_teleop_key 的 terminal 才有效。
再查看一下 rosgraph,结果如下:
如上图所示,刚刚启动的 /teleop_turtle 节点可以将键盘操作转化成 cmd_vel 命令驱动海龟运动。
驱动海龟自动画图 draw_square
在相应窗口 ctrl + c 关闭刚才的 turtle_teleop_key node。
turtlesim 自带了一个实现自动移动的可执行文件 draw_square,启动它:
rosrun turtlesim draw_square
海龟开始自动的沿正方形轨迹运动。这个节点本质上是不断地为 turtle 设定下一个目标点,并基于当前 turtle/pose 信息,向 cmd_vel 发布命令,驱使 turtle 向目标点移动,到达之后左转,再设定目标点,移动过去。源代码
此时的 rosgraph 为
动作复制 mimic
turtlesim 中最后一个可执行文件是 mimic。它的作用是让一个海龟复制另一个海龟的动作。
假设现在的场景是一个海龟在 draw_square 驱动下移动,我们希望另一个海龟也复制同样的动作。
这里我们首先要有另外一只海龟。可以通过 spawn service 实现。命令如下:
rosservice call /spawn "x: 3.0
y: 3.0
theta: 0.0
name: 'turtle2'"
上述命令是通过 call 相应的 service,在给定位置生成一个海龟,名为 turtle2。 此时,我们就有了 2 个小海龟。如下图所示:
然后启动 mimic
rosrun turtlesim mimic
再查看一下 rosgraph,如下
为了实现动作复制,我们需要让 mimic 的输入为 turtle1 的 pose,输出为 turtle2 的 cmd_vel,即将 mimic 原本的输入输出 topic 做如下修改:
- /input/pose ----> /turtle1/pose
- /output/cmd_vel ----> /turtle2/cmd_vel
现在关掉 mimic ,再用如下方式重新启动 mimic
rosrun turtlesim mimic input:=turtle1 output:=turtle2
后边的参数表示将原程序中的两个参数 input, output,替换为 turtle1, turtle2.
rosgraph 如下
mimic 接收 turtle1/pose,产生 turtle2/cmd_vel,驱动 turtle2 做相应的动作。
上图中,误差积累使得右上角的 turtle1 轨迹已经变形了。
Written by YY
Revised by QP