ROS 仿真平台—— turtlesim

引言

ROS 功能强大,要想学会也需要花费一番力气。

ROS wiki 上提供了非常丰富的教程。但是按部就班的按照 wiki 去学习,难免会感到枯燥。

如果在学习 wiki 的同时能用一个小项目练练手,学习的兴趣可能会提高很多,对 ROS 相关概念的理解也会更加直观。

turtlesim 就是这样一个小项目。它是 ROS 三个官方教程之一,另外两个分别是用 c++ 和 Python 编写 node 的教程,如下图所示:


turtlesim1.png

安装

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 会随机出现不同的小海龟。


turtlesim2.png

而且在 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
turtlesim3.png

目前系统已经有了 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,结果如下:


turtlesim4.png

如上图所示,刚刚启动的 /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 为

turtle5.png

动作复制 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.png

然后启动 mimic

rosrun turtlesim mimic 

再查看一下 rosgraph,如下


turtle1.png

为了实现动作复制,我们需要让 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 如下


turtle2.png

mimic 接收 turtle1/pose,产生 turtle2/cmd_vel,驱动 turtle2 做相应的动作。

turtle3.png

上图中,误差积累使得右上角的 turtle1 轨迹已经变形了。

Written by YY
Revised by QP

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,427评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,551评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,747评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,939评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,955评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,737评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,448评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,352评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,834评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,992评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,133评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,815评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,477评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,022评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,147评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,398评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,077评论 2 355

推荐阅读更多精彩内容