之前都是研究视觉SLAM,却从来没有做过激光SLAM。实验室没有激光雷达,就用Gazebo做个仿真玩一下。博主这里用的是Ubuntu18.04+ROS Melodic,Gazebo是9.0.0版本。

1、一些准备工作

1.1 关于Gazebo的使用

使用Gazebo之前最好先从官方下载好模型文件,然后按照如下命令安装:

$ unzip osrf-gazebo_models-e6d645674e8a.zip
$ cd osrf-gazebo_models-e6d645674e8a
$ mkdir build
$ cd build
$ cmake -DCMAKE_INSTALL_PREFIX=~/.gazebo ..
$ sudo make install

Gazebo9.0.0在打开时会出现如下问题,但好像并不影响使用:

解决这个错误的办法是将~/.ignition/fuel/config.yaml文件中的https://api.ignitionfuel.org改成https://api.ignitionrobotics.org:

1.2 安装相关ROS包

  • 安装turtlebot3相关的ROS包
$ sudo apt-get install ros-melodic-turtlebot3 ros-melodic-turtlebot3-description ros-melodic-turtlebot3-gazebo ros-melodic-turtlebot3-msgs ros-melodic-turtlebot3-slam ros-melodic-turtlebot3-teleop
  • 安装SLAM相关的ROS包
# 目前激光SLAM的建图方法有很多中,turtlebot3支持gmapping、cartographer、hector、karto、frontier_exploration,
# 而ROS Melodic版本官方的软件源里只有karto
$ sudo apt-get install ros-melodic-slam-karto

使用gmapping的话需要编译源码安装,首先需要安装OpenSLAM

$ git clone https://github.com/ros-perception/openslam_gmapping
$ mkdir build
$ cd build
$ sudo make install
$ sudo ldconfig  #有时候源码编译安装一些第三方库后依然会出现找不到动态链接库的情况,一般这个命令可以解决

然后从GitHub下载gmapping的源码包,将其放在一个ROS工作空间下,使用catkin_make编译通过即可。

  • 安装navigation相关的ROS包
$ sudo apt-get install ros-melodic-navigation

2、建图

$ export TURTLEBOT3_MODEL=burger #每开一个新的终端都要设置一下这个环境变量,除了burger也可以是waffle或waffle_pi
$ roslaunch turtlebot3_gazebo turtlebot3_house.launch #这里也可以选择其他的环境,或者自己搭建一个虚拟环境
$ roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch #建图时要切换到这个终端,用键盘控制turtlebot运动
$ roslaunch turtlebot3_slam turtlebot3_slam.launch slam_methods:=karto #这里也可以选择其他的slam方法

建图的过程如下图所示,左边为Gazebo的仿真模型,右边为Rviz中显示的建图效果:

地图建完以后一定要将地图保存下来,不然就白建了:

$ mkdir -p ~/maps/housemap
$ rosrun map_server map_saver -f ~/maps/housemap/housemap

3、导航

利用刚才构建的地图进行turtlebot的自主导航仿真实验:

$ roslaunch turtlebot3_gazebo turtlebot3_house.launch
$ roslaunch turtlebot3_navigation turtlebot3_navigation.launch map_file:=/home/jay/maps/housemap/housemap.yaml

运行上面第二条命令时可能会出现如下错误:

解决方法是修改turtlebot3_navigation包中param文件夹下的global_costmap_params.yaml和local_costmap_params.yaml两个文件,将其中所有坐标系前面的“/”去掉。重新运行命令,打开以后是这个样子的:

接下来首先要做的是调整RViz中turtlebot在地图中的位姿,使其与Gazebo中turtlebot在环境中的位姿一致。做法是用鼠标选中RViz工具栏中的“2D Pose Estimate”,然后根据Gazebo中tuetlebot的位姿点击RViz地图中的相应位置,注意姿态也要相同。设置好turtlebot的初始位姿,其效果是这样的:

接下来我们就开始导航了,鼠标选择工具栏中的“2D Nav Goal”,在地图中任意设置一个目标位姿,turtlebot便会自动规划路径,然后慢悠悠地移动过去:

以上就是博主做的一个简单的激光SLAM自主导航仿真实验,其实里面涉及的理论和算法还是蛮多的,抽时间一定要认真学习一下。