ROS探索总结(四十九)——ROS机器人实例 (TurtleBot)

17016
21
2018年4月18日 17时08分

上一篇介绍了ROS中的元老机器人——PR2,虽然功能强大,但价格昂贵,无法推广。所以Willow Garage又开发了一款低成本的机器人平台——TurtleBot。

image

TurtleBot的目的是给入门级的机器人爱好者或从事移动机器人编程开发者提供一个基础平台,让他们直接使用TurtleBot自带的软硬件,专注于应用程序的开发,避免了设计草图、购买、加工材料、设计电路、编写驱动、组装等一系列工作。借助该机器人平台,可以省掉很多前期工作,只要根据平台的软硬件接口,就能开发出所需的功能。

TurtleBot可以说是ROS中最为重要的机器人之一,它伴随ROS一同成长,一直都作为ROS开发前沿的机器人,几乎每个版本的ROS测试都会以TurtleBot为主,包括ROS2也率先在TurtleBot上进行了大量测试。

所以TurtleBot也是ROS支持度最好的机器人之一,可以在ROS社区中获得大量关于TurtleBot的相关资源,很多功能包都能直接复用到我们自己的移动机器人平台上,绝对是使用ROS开发移动机器人的重要资源。

TurtleBot第一代发布于2010年,两年后发布了第二代产品。前两代TurtleBot都使用iRobot的机器人作为底盘,在底盘上可以装载激光雷达、Kinect等传感器,使用PC搭载基于ROS的控制系统。

在2016年的ROSCon上,韩国机器人公司Robotis和开源机器人基金会(OSRF)发布了TurtleBot 3,彻底颠覆了原有TurtleBot的外形设计,成本进一步降低,而且模块化更强,可以根据开发者的需求自由改装。TurtleBot 3并不是为取代TurtleBot 2而生,而是提出了一种更加灵活的移动机器人平台。

那么如何在ROS中使用Turtlebot呢?

首先需要安装Turtlebot相关的所有功能包,使用如下命令安装:

$ sudo apt-get install ros-kinetic-turtlebot-*

安装完成后的功能包中包含了所有Turtlebot真机与仿真的功能,这里还是以gazebo仿真为主进行实践。

 

gazebo中的TurtleBot

 

第一步依然是启动gazebo仿真环境,并且加载Turtlebot机器人:

$ export TURTLEBOT_GAZEBO_WORLD_FILE="/opt/ros/kinetic/share/turtlebot_gazebo/worlds/playground.world"
$ roslaunch turtlebot_gazebo turtlebot_world.launch

这里需要使用环境变量TURTLEBOT_GAZEBO_WORLD_FILE为仿真环境指定地图,否则会显示找不到地图的错误。

启动成功后可以看到gazebo界面,TurtleBot 2已经成功加载到仿真环境当中。

image

查看当前系统中的话题列表,可以看到很多已经发布和等待订阅的话题。

image

打开rviz,可视化显示需要的传感器数据,可以看到机器人摄像头、激光雷达、点云等信息。

image

然后使用如下命令启动键盘控制节点:

$ roslaunch turtlebot_teleopkeyboard_teleop.launch

根据终端中的命令提示,控制TurtleBot在仿真器中移动,rviz中的机器人以及传感器信息会同步更新。

image

ROS探索总结(四十九)——ROS机器人实例 (TurtleBot)插图(5)

TurtleBot导航仿真

 

接下来在仿真环境中使用TurtleBot实现导航功能。

第一步是SLAM建图。turtlebot_gazebo功能包中已经提供了使用gmapping实现SLAM建图的启动文件,但是文件内部的包含路径有一点问题,直接运行会提示错误。

image

使用如下命令打开gmapping_demo.launch文件,进行一点修改:

$ roscd turtlebot_gazebo/launch/
$ sudo gedit gmapping_demo.launch

在gmapping.launch.xml文件的路径前加入gmapping文件夹,修改后的gmapping_demo.launch文件内容如下:

<launch>
    <include file="$(find turtlebot_navigation)/launch/includes/gmapping/gmapping.launch.xml"/>
</launch>

然后使用如下命令启动仿真环境和gmapping节点:

$ export TURTLEBOT_GAZEBO_WORLD_FILE="/opt/ros/kinetic/share/turtlebot_gazebo/worlds/playground.world"
$ roslaunch turtlebot_gazebo turtlebot_world.launch
$ roslaunch turtlebot_gazebo gmapping_demo.launch
$ roslaunch turtlebot_rviz_launchers view_navigation.launch
$ roslaunch turtlebot_teleop keyboard_teleop.launch

通过键盘控制TurtleBot在仿真环境中移动,在打开的rviz中可以看到SLAM过程。

image

SLAM结束后使用如下命令保存地图,命名为turtlebot_test_map:

$ rosrun map_servermap_saver -f turtlebot_test_map

接下来我们在建立完成的地图上实现TurtleBot自主导航功能。turtlebot_gazebo功能包中同样提供了实现导航功能的launch启动文件,但是文件内部的包含路径也有问题,直接运行会提示错误。

image

使用如下命令打开amcl_demo.launch文件,进行一点修改:

$ roscd turtlebot_gazebo/launch/
$ sudo gedit amcl_demo.launch

在amcl.launch.xml文件的路径前加入amcl文件夹,修改后的amcl_demo.launch文件内容如下:

<launch>
   <!-- Map server -->
   <arg name="map_file"default="$(envTURTLEBOT_GAZEBO_MAP_FILE)"/>
   <node name="map_server" pkg="map_server"type="map_server" args="$(arg map_file)" />

   <!-- Localization -->
   <arg name="initial_pose_x"default="0.0"/>
   <arg name="initial_pose_y"default="0.0"/>
   <arg name="initial_pose_a"default="0.0"/>
   <include file="$(find turtlebot_navigation)/launch/includes/amcl/amcl.launch.xml">
       <arg name="initial_pose_x"value="$(arg initial_pose_x)"/>
       <arg name="initial_pose_y"value="$(arg initial_pose_y)"/>
       <argname="initial_pose_a" value="$(arg initial_pose_a)"/>
   </include>

   <!-- Move base -->
   <include file="$(find turtlebot_navigation)/launch/includes/move_base.launch.xml"/>
</launch>

现在关闭除仿真环境以外的其他节点和rviz,运行如下命令就可以开始导航了。

$ roslaunch turtlebot_gazebo amcl_demo.launch map_file:=/home/hcx/turtlebot_test_map.yaml
$ roslaunch turtlebot_rviz_launchers view_navigation.launch

在rviz中选择导航的目标点后,gazebo中的TurtleBot开始向目标移动,rviz中可以看到传感器信息和机器人状态显示。

image

TurtleBot 3

ROS Kinetic中也集成了TurtleBot 3相关功能包的二进制安装文件,我们也来尝尝鲜。

使用如下命令安装TurtleBot 3的所有相关功能包:

$ sudo apt-get install ros-kinetic-turtlebot3-*

安装完成后,使用如下命令启动TurtleBot 3的仿真环境:

$ export TURTLEBOT3_MODEL=burger
$ roslaunch turtlebot3_gazebo turtlebot3_world.launch

TurtleBot 3目前有两种模型:burger和Waffle,启动之前必须通过环境变量的方式设置所需要的模型,这里选择burger。

启动成功后,可以看到gazebo仿真环境和TurtleBot 3机器人。

image

查看当前系统中的话题列表,因为TurtleBot 3 burger模型较为简单,搭载的传感器也并不多,所以这里发布和订阅的话题也比较少。

image

基于这个仿真环境和现有的传感器数据,可以使用如下命令实现TurtleBot 3的SLAM功能:

$ roslaunch turtlebot3_slam turtlebot3_slam.launch
$ rosrun turtlebot3_teleop turtlebot3_teleop_key

打开rviz,并且订阅传感器和地图数据,通过键盘控制TurtleBot 3运动,就可以看到SLAM效果了。

image

类似于TurtleBot 2,我们也可以在建立的地图上实现导航功能,此处不再赘述。

ROS探索总结(四十九)——ROS机器人实例 (TurtleBot)插图(13)CaptureROS探索总结(四十九)——ROS机器人实例 (TurtleBot)插图(15)

发表评论

后才能评论

评论列表(21条)

  • ygvld_0638 2020年4月8日 下午2:30

    古月老师好我配置好了TURTLEBOT_GAZEBO_WORLD_FILE ,但是启动gazebo仍然黑屏,显示:
    waitForService: Service [/gazebo/set_physics_properties] has not been advertised, waiting…
    (TURTLEBOT_GAZEBO_WORLD_FILE路径 下也确认存在.world 文件)
    有什么解决办法吗呜呜

    • 握紧额的手_额要带你走 回复 ygvld_0638 2020年4月13日 下午5:23

      我也遇到了,“Warning [ModelDatabase.cc:334] Getting models from[http://gazebosim.org/models/]. This may take a few seconds.”
      等了一会儿确实加载出来了.

  • 爱礼丝 2019年11月7日 下午2:47

    古月老师你好,可以让turtlebot2按自己绘制的路线行进吗,这样的话还需要路径规划吗?

  • maltose 2019年9月11日 上午10:17

    老师 请问 如果打算自己安装源代码包然后修改里面的算法 应该怎么做 我下载了open-slam和slam的包,但是好像跑不起来

    • 古月 回复 maltose 2019年9月12日 下午9:14

      现在ros版本的源码,一般在github上,然后修改编译运行

  • 入海的鱼 2019年8月27日 下午8:56

    古前辈您好,我在第一步启动gazebo仿真环境时,执行完代码后,出现了gazebo界面,但TurtleBot 2没有加载到仿真环境中,并且仿真界面一会儿也没啦,终端中说有无效的参数:
    VMware: vmw_ioctl_command error 无效的参数.
    Aborted (core dumped)
    [gazebo_gui-3] process has died [pid 13055, exit code 134, cmd /opt/ros/kinetic/lib/gazebo_ros/gzclient __name:=gazebo_gui __log:=/home/lin/.ros/log/01229b5c-c8c7-11e9-928e-000c29d99e50/gazebo_gui-3.log].
    log file: /home/lin/.ros/log/01229b5c-c8c7-11e9-928e-000c29d99e50/gazebo_gui-3*.log
    请问怎么解决?

    • 古月 回复 入海的鱼 2019年9月1日 下午1:59

      虚拟机问题多,最好用双系统

    • 1213清心 回复 古月 2020年5月6日 下午6:51

      古前辈您好,我也遇到了turtlebot2的问题,我用到了depthimage_to_laserscan这个包,它似乎不支持group加命名空间,





      就是只有这个scan收不到数据,image是正常的

    • 古月 回复 1213清心 2020年5月12日 上午11:07

      可以试下用remap机制,把需要修改的话题名重映射一下

  • 楼兰 2019年8月2日 上午10:48

    古月大佬,运行完export TURTLEBOT_GAZEBO_WORLD_FILE=”/opt/ros/kinetic/share/turtlebot_gazebo/worlds/playground.world”
    $ roslaunch turtlebot_gazebo turtlebot_world.launch这两步之后报错:
    [gazebo-2] process has died [pid 8766, exit code 255, cmd /opt/ros/kinetic/lib/gazebo_ros/gzserver -e ode /opt/ros/kinetic/share/turtlebot_gazebo/worlds/playground.world __name:=gazebo __log:=/home/han/.ros/log/de62cbc4-b4cf-11e9-b88f-a0886966aef4/gazebo-2.log].
    log file: /home/han/.ros/log/de62cbc4-b4cf-11e9-b88f-a0886966aef4/gazebo-2*.log

  • sun 2019年3月3日 上午10:23

    请问作者,如何用自己的slam算法(比如ratslam)在ROS中建图呢

    • 古月 回复 sun 2019年3月3日 下午4:09

      类似gmapping一样,封装成一个包,定义好输入和输出,最好和ROS的接口统一

  • 米明 2018年11月18日 下午9:58

    古前辈您对TurtleBot 3的XL430舵机有研究吗?把舵机接上Opencr,运行键盘控制,舵机没有反应,后面测试说找不到舵机?您知道怎么解决这个问题吗?

  • jack37 2018年7月12日 下午7:48

    想问问作者,在slam建图过程中,图是漂移的,然后多次叠加,感觉原点在变 请问一个该如何解决呢

    • 古月 回复 jack37 2018年7月15日 下午7:23

      有可能是机器人的里程计数据或者激光数据的精度低,导致定位的时候有抖动,需要给底层数据做好滤波

  • 纠结伦 2018年5月17日 下午11:21

    roslaunch turtlebot_gazebo amcl_demo.launchmap_file:=/home/hcx/turtlebot_test_map.yaml
    这里报错[turtlebot_gazebo.launch] is not a launch file name
    请问怎么解决啊

    • 古月 回复 纠结伦 2018年5月19日 下午4:09

      turtlebot_gazebo安装了么?安装了的话,就是环境变量和路径的问题。
      roslaunch turtlebot_gazebo amcl_demo.launch map_file:=/home/hcx/turtlebot_test_map.yaml
      这里的/home/hcx/肯定是要修改的

    • 纠结伦 回复 古月 2018年5月23日 下午10:37

      谢谢古月大神,问题已解决,实验已经成功,学到了很多东西

  • 不冷 2018年5月16日 上午9:28

    作者辛苦!
    使用kinetic,文中有些程序是错误的,如下:
    $ roslaunch turtlebot_rviz_launchersview_navigation.launch 应改为
    $ roslaunch turtlebot_rviz_launchers view_navigation.launch

    $ roslaunch turtlebot_teleopkeyboard_teleop.launch 应改为
    $ roslaunch turtlebot_teleop keyboard_teleop.launch