美文网首页
ROS 仿真平台—— turtlesim

ROS 仿真平台—— turtlesim

作者: OurNote | 来源:发表于2019-03-06 22:03 被阅读0次

    引言

    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

    相关文章

      网友评论

          本文标题:ROS 仿真平台—— turtlesim

          本文链接:https://www.haomeiwen.com/subject/tfsfpqtx.html