上一篇介绍了ROS中的元老机器人——PR2,虽然功能强大,但价格昂贵,无法推广。所以Willow Garage又开发了一款低成本的机器人平台——TurtleBot。
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已经成功加载到仿真环境当中。
查看当前系统中的话题列表,可以看到很多已经发布和等待订阅的话题。
打开rviz,可视化显示需要的传感器数据,可以看到机器人摄像头、激光雷达、点云等信息。
然后使用如下命令启动键盘控制节点:
$ roslaunch turtlebot_teleopkeyboard_teleop.launch
根据终端中的命令提示,控制TurtleBot在仿真器中移动,rviz中的机器人以及传感器信息会同步更新。
TurtleBot导航仿真
接下来在仿真环境中使用TurtleBot实现导航功能。
第一步是SLAM建图。turtlebot_gazebo功能包中已经提供了使用gmapping实现SLAM建图的启动文件,但是文件内部的包含路径有一点问题,直接运行会提示错误。
使用如下命令打开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过程。
SLAM结束后使用如下命令保存地图,命名为turtlebot_test_map:
$ rosrun map_servermap_saver -f turtlebot_test_map
接下来我们在建立完成的地图上实现TurtleBot自主导航功能。turtlebot_gazebo功能包中同样提供了实现导航功能的launch启动文件,但是文件内部的包含路径也有问题,直接运行会提示错误。
使用如下命令打开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中可以看到传感器信息和机器人状态显示。
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机器人。
查看当前系统中的话题列表,因为TurtleBot 3 burger模型较为简单,搭载的传感器也并不多,所以这里发布和订阅的话题也比较少。
基于这个仿真环境和现有的传感器数据,可以使用如下命令实现TurtleBot 3的SLAM功能:
$ roslaunch turtlebot3_slam turtlebot3_slam.launch
$ rosrun turtlebot3_teleop turtlebot3_teleop_key
打开rviz,并且订阅传感器和地图数据,通过键盘控制TurtleBot 3运动,就可以看到SLAM效果了。
类似于TurtleBot 2,我们也可以在建立的地图上实现导航功能,此处不再赘述。