首页 关于
树枝想去撕裂天空 / 却只戳了几个微小的窟窿 / 它透出天外的光亮 / 人们把它叫做月亮和星星
目录

Turtlebot 你好!

Turtlebot是一款低成本的开源机器人,最早是有Melonee Wise和Tully Foote在2010年制造的。 在2013年的时候,IEEE Spectrum对两位曾经做过一个采访, 讨论了TurtleBot的设计灵感,如何从"玩具"走向"产品"的。现在我们可以看到TurtleBot对于ROS的推广起到了莫大的作用,仅从国内的机器人培训上就可以看到大多数教程都是关于TurtleBot的。

关于TurtleBot网络上已经有很多出色的教程了,我写本部分的文章并不是想再抄一个教程出来。我希望通过对TurtleBot的分析,能够让读者和我对与移动机器人有一个全面的认识, 清楚机器人是如何感知环境、改造环境的。本文先跟Turtlebot打个招呼,让它在Gazebo的世界中摩擦摩擦,之后的文章都是讲Turtlebot自由摩擦背后的故事。

1. 运行环境搭建

在写这篇文章的时候,我的神舟上就已经有了一个Turtlebot的运行环境, 我想多半是安装ROS的时候,完整安装指令自动为我安装了Turtlebot的环境。

        $ sudo apt-get install ros-kinetic-desktop-full -y
我们可以通过如下的指令查看Turtlebot相关的ROS包,如果已经安装了Turtlebot,我们可以看到类似右图的结果,列举了各种'turtlebot_'为前缀的包。 这里我们最主要关心的是turtlebot_gazebo是否存在,它是我们后续进行仿真的关键。
        $ rospack list | grep turtlebot
如果发现没有安装这些包,然后看到网上的各种教程都是运行在indigo版本上的ROS,而我们的ROS是kinetic也不用紧张。其实在kinetic版本下也有对应的Turtlebot的包, 我们可以通过Ubuntu的apt包管理器查找到它们,
        $ apt-cache search ros-kinetic-turtlebot
然后根据需要依次安装这些包,这里省事干脆一股脑的全都装上了,下面指令中最后的通配符'*'表示匹配上前缀为'ros-kinetic-turtlebot-'的所有包。
        $ sudo apt install ros-kinetic-turtlebot-*
可能光装上turtlebot的这些包还不够,因为Turtlebot默认的底盘是Kobuki,它也有各种ROS包与之对应,我们可以通过类似的套路查找和安装与kobuki相关的各种包:
        $ apt-cache search ros-kinetic-kobuki
        $ sudo apt install ros-kinetic-kobuki-*

2. 在Gazebo的世界中召唤Turtlebot

仪式很简单,只需要一条roslaunch指令就可以打开Gazebo并召唤出Turtlebot了:

        $ roslaunch turtlebot_gazebo turtlebot_world.launch
一开始的时候在我的神舟上报了两个错误,当然这也不影响我的召唤。
[ERROR] [1542421895.316291479]: Skipping XML Document "/opt/ros/kinetic/share/gmapping/nodelet_plugins.xml" which had no Root Element.
This likely means the XML is malformed or missing.
[ERROR] [1542421905.305736326, 0.490000000]: Failed to load nodelet [/depthimage_to_laserscan] of type [depthimage_to_laserscan/DepthImageToLaserScanNodelet] even
after refreshing the cache: Failed to load library /opt/ros/kinetic/lib//libDepthImageToLaserScanNodelet.so. Make sure that you are calling the
PLUGINLIB_EXPORT_CLASS macro in the library code, and that names are consistent between this macro and your XML. Error string: Could not load library
(Poco exception = libopencv_core3.so.3.3: cannot open shared object file: No such file or directory)
第一个错误说是没找到一个叫做'nodelet_plugins.xml'的文件,我跟着路径指引到gmapping的目录下一看确实没有这个文件。
        $ roscd gmapping
        $ ls
        cmake  package.xml
这个nodelet是为了提高ROS系统的效率,实现同一个进程中零拷贝传输的机制。 虽然ROS中每个进程都是一个节点,但nodelet允许在一个节点中动态的加载模块,并使之像是一个独立的节点一样运行。 这样的零拷贝传输,降低了系统中节点的通信负担。使用的时候多是以插件的形式动态加载的, 这里的nodelet_pugins.xml就是一个例子。知道了问题就好办了,我们只需要在gmapping的目录下添加一个这样的文件就好了。 这里直接从gmapping的Github上拷贝了一个下来:
        <library path="lib/libslam_gmapping_nodelet">
            <class name="SlamGMappingNodelet" type="SlamGMappingNodelet" base_class_type="nodelet::Nodelet">
                <description>
                    Nodelet ROS wrapper for OpenSlam's Gmapping.
                </description>
            </class>
        </library>
第二个错误说是不能够加载[/depthimage_to_laserscan],错误日志很长根本原因说是不能找到libopencv_core3.so.3.3。后来经过百度之后说是缺少一个叫做"depthimage_to_laserscan"的包, 找了一下本地是有一个这样的包的,估计可能是版本有点老吧。通过apt更新了一下没见到效果,
        $ sudo apt install ros-kinetic-depthimage-to-laserscan
后来找到了这个包的github源,将之克隆下来,源码编译了一下,再次运行就没有报错了。
        $ cd ~/catkin_ws/src
        $ git clone https://github.com/ros-perception/depthimage_to_laserscan.git
        $ cd ..
        $ catkin_make
        $ source devel/setup.bash
下面左图是打开的Gazebo世界,其中中间的那个黑色的圆圆的东西就是召唤出来的Turtlebot。右图是对它的特写。

成功的在Gazebo世界中召唤出Turtlebot之后,我们就相当于有了一台机器人了,接下来的工作无非是在ROS的环境中查看机器人的状态并控制它。首先我们通过Rviz查看它, Rviz是ROS系统中原生的可视化界面,我们常常用它来查看机器人的各种状态,可以说是与实际机器人之间的状态是同步的。这里查看的是Gazebo中的机器人, 如果我们有一台实际的机器人也可以通过类似的手段监视它的各种状态。

        $ roslaunch turtlebot_rviz_launchers view_robot.launch
成功运行之后,就可以打开一个rviz界面,如果按照图中左侧的Displays菜单选取DepthCloud和Image选项,并设置Image Topic为'/camera/rgb/image_raw', 调整合适的视角就可以看到下图所示的界面。
图中,机器人前面的彩色部分描述了机器人捕获到的深度信息,红色的部分说明距离机器人更近,蓝色说明相对较远。机器人视野的右侧有一个竖直的斜面,注意看左下角机器人返回的照片, 可以看到那是一个灰色的立方体,是一个障碍物。

3. 地图构建和自主导航

成功召唤出Turtlebot之后,自然就是要控制它。turtlebot_teleop包就为我们提供了一个通过键盘操控机器人的界面,通过运行如下指令就可以控制机器人前进后退,转弯了。

        $ roslaunch turtlebot_teleop keyboard_teleop.launch
在下图中,我们打开了一个终端运行了上面的指令。通过'i'和','控制机器人前进后退,'j'和'l'控制左转右转,'k'刹车,剩下的四个方位上的按键则是用来控制转弯(复合了平移和转动两个运动)。 此外还有一些功能键用来调节速度。
控制机器人运动之后,我们就可以进行地图构建了,这里使用gmapping_demo建图。为了实时监视建图结果,我们杀掉原先监视机器人状态的rviz的launch进程,打开另一个rviz的launch文件。 下面指令最后的'&'表示后台运行指令,这样就不用打开那么多终端窗口了。
        $ roslaunch turtlebot_gazebo gmapping_demo.launch &
        $ roslaunch turtlebot_rviz_launchers view_navigation.launch &
这将新打开一个rviz,需要先修改[Local map]->[Costmap]->[Topic]选择主题为/map,[Global map]->[Costmap]->[Topic]选择主题/map。 下图是通过teleop控制机器人在地图中运行了一段时间之后的建图效果,图中紫色部分是扫描到的障碍物。

Turtlebot还有一个自主导航的demo,杀掉刚才打开的gmapping_demo和view_navigation两个launch进程后,运行如下的两个指令,就可以打开一个已经编辑好的地图。

        $ roslaunch turtlebot_gazebo amcl_demo.launch &
        $ roslaunch turtlebot_rviz_launchers view_navigation.launch &
选择下图中图标后在地图上指定一点作为机器人的导航目标点。绿色的实线则是规划出来的运动轨迹, 白色的矩形则是世界地图,那些黑色的边框分别对应着世界中的各个障碍物。中间的黑色圆点跟着一个三角的则是Turtlebot,那个三角是机器人的方向和视线,同时有一个跟随者机器人运动的栅格地图。

4. 总结

在本文中,我们先介绍了如何搭建Turtlebot的运行环境,在官方的wiki上详细的介绍了如何通过apt或者源码搭建环境,只是版本有点低。 他们还额外提供了一个Ubuntu14.04的镜像,包含了indigo版本的ROS和Turtlebot的运行环境。读者可以根据需要选择使用。

接着我们在Gazebo中召唤了Turtlebot,并消除了召唤过程中报的两个错。然后,运行了两个Demo分别用于地图构建和自主导航。以后的文章将详细解释这些Demo的实现机制。




Copyright @ 高乙超. All Rights Reserved. 京ICP备16033081号-1