两轮差速底盘SLAM系列(8)--gmapping建图

本文最后更新于:2022年5月29日 上午

前言

在继续看本文之前,你需要完成下面的前提条件:

  • 上位机ROS和底层STM32之间可以正常互相收发数据;
  • 编写好了键盘控制节点,可以发布Twist速度话题信息;
  • 可以通过Twist速度话题信息控制小车移动;
  • 可以采集激光雷达深度信息;
  • 可以发布里程计信息;
  • 可以发布TF坐标变换。

根据move_base功能框图可以知道,想要实现建图导航功能,还需要提供地图信息。ROS开源社区汇集了多种SLAM算法,可以直接使用或进行二次开发,这里我使用的gmapping功能包

gmapping功能包

目前来讲是最成熟也是用得最多的一种SLAM功能包。

V3CsPA.png

从上图可以看出,我们只需要给gmapping功能包提供深度信息、IMU信息、里程计信息,它就可以生成输出栅格地图话题信息。

安装gmapping

1
sudo apt install ros-kinetic-gmapping

如果之前没有安装move_base,使用以下命令安装:

1
sudo apt install ros-kinetic-move-base

栅格地图取值原理

V3Cy8I.png

  • 致命障碍:栅格值为254,障碍与机器人的中心重合,此时机器人必然与障碍物发生碰撞。
  • 内切障碍:栅格值为253,障碍物处于机器人轮廓的内切圆内,此时机器人也必然与障碍物发生碰撞。
  • 外切障碍:栅格值为252~128,障碍物处于机器人的轮廓的外切圆内,此时机器人与障碍物临界接触,不一定发生碰撞。
  • 非自由空间:栅格值为128~0,障碍物附近区域,一旦机器人进入该区域,将有较大概率发生碰撞,属于危险警戒区。机器人应该尽量避免进入。
  • 自由区域:栅格值为0,此处没有障碍物,机器人可以自由通过。
  • 未知区域:栅格值为255,此处还没有探知是否有障碍物,机器人可以前往继续建图。

配置gmapping节点

SLAM算法已经在gmapping功能包中实现,我们暂时不需要深入理解算法的实现原理(想要深入理解的可以查看相关的论文资料),现在我们只需要关注如何借助其提供的接口实现相应功能。

现在来创建一个运行gmapping节点的launch文件,进行节点的相关参数配置。进入agv_car功能包目录下的launch文件夹,创建一个gmapping.launch文件:

1
2
roscd agv_car/launch/
gedit gmapping.launch

文件代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<launch>

<node name="slam_gmapping" pkg="gmapping" type="slam_gmapping">
<param name="odom_frame" value="odom"/>
<param name="base_frame" value="base_link"/>
<param name="map_frame" value="map"/>
<!-- remap -->
<remap from="scan" to="/scan"/>
</node>

<!-- Set a static coordinate transformation from /base_link to /base_footprint -->
<node pkg="tf" type="static_transform_publisher" name="basefootprint_to_baselink" args="0 0 0 0 0 0 /base_footprint /base_link 40" />

</launch>

文件包含了三部分:

  1. gmapping参数配置,这里的配置参数我只写出来少数几个,其它的参数不进行配置它会有默认值,具体参数配置说明可以查看gmapping功能包介绍

  2. tf坐标变换,/base_footprint/base_link之间的关系。

机器人SLAM

新建launch文件

首先启动机器人,发布SLAM所需要的深度信息、里程计信息,并接受运动控制Twist指令。启动的节点有点多,可以使用launch文件启动,在agv_car功能包launch文件夹下创建一个base.launch文件:

1
2
roscd agv_car/launch
gedit base.launch

文件代码如下:

1
2
3
4
5
6
7
<launch>
<!-- 启动base_control节点,发布里程计信息和tf变换 -->
<node pkg="agv_car" type="base_control" name="base_control" />

<!-- 启动keyboard_control节点,发布Twist运动控制指令 -->
<node pkg="agv_car" type="keyboard_control" name="keyboard_control" />
</launch>

再创建一个gmapping_demo.launch文件:

1
gedit gmapping_demo.launch

文件代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
<launch>
<!-- 启动激光雷达 -->
<include file="$(find agv_car)/launch/laser4.launch" />

<!-- 启动gmapping -->
<include file="$(find agv_car)/launch/gmapping.launch" />

<!-- rviz -->
<node name="rviz" pkg="rviz" type="rviz" args="-d $(find agv_car)/rviz/mapping.rviz"/>

</launch>

启动gmapping建图

1
2
roslaunch agv_car base.launch 
roslaunch agv_car gmapping_demo.launch

现在可以使用键盘控制机器人运动,进行建图了。

3i6nXD.png

保存地图

建图完成后,在 agv_car功能包创建maps文件夹保存地图文件:

1
2
3
4
roscd agv_car
mkdir map
cd map
rosrun map_server map_saver -f map

分别生成一个map.pgm图像文件和一个map.yaml配置文件

.pgm图像文件:

3i6LuD.png

该图像文件可以后续使用软件进行编辑修改,例如:可以添加一堵墙、添加一些障碍物或者去掉一些障碍物等,进行人为修正地图。

.yaml配置文件:

3i6ODe.png


两轮差速底盘SLAM系列(8)--gmapping建图
https://kevinloongc.github.io/posts/43720.html
作者
Kevin Loongc
发布于
2020年2月18日
许可协议