两轮差速底盘SLAM系列(8)--gmapping建图
本文最后更新于:2022年5月29日 上午
前言
在继续看本文之前,你需要完成下面的前提条件:
- 上位机ROS和底层STM32之间可以正常互相收发数据;
- 编写好了键盘控制节点,可以发布Twist速度话题信息;
- 可以通过Twist速度话题信息控制小车移动;
- 可以采集激光雷达深度信息;
- 可以发布里程计信息;
- 可以发布TF坐标变换。
根据move_base功能框图可以知道,想要实现建图导航功能,还需要提供地图信息。ROS开源社区汇集了多种SLAM算法,可以直接使用或进行二次开发,这里我使用的gmapping功能包
。
gmapping功能包
目前来讲是最成熟也是用得最多的一种SLAM功能包。
从上图可以看出,我们只需要给gmapping功能包
提供深度信息、IMU信息、里程计信息,它就可以生成输出栅格地图话题信息。
安装gmapping
1 |
|
如果之前没有安装move_base,使用以下命令安装:
1 |
|
栅格地图取值原理
- 致命障碍:栅格值为254,障碍与机器人的中心重合,此时机器人必然与障碍物发生碰撞。
- 内切障碍:栅格值为253,障碍物处于机器人轮廓的内切圆内,此时机器人也必然与障碍物发生碰撞。
- 外切障碍:栅格值为252~128,障碍物处于机器人的轮廓的外切圆内,此时机器人与障碍物临界接触,不一定发生碰撞。
- 非自由空间:栅格值为128~0,障碍物附近区域,一旦机器人进入该区域,将有较大概率发生碰撞,属于危险警戒区。机器人应该尽量避免进入。
- 自由区域:栅格值为0,此处没有障碍物,机器人可以自由通过。
- 未知区域:栅格值为255,此处还没有探知是否有障碍物,机器人可以前往继续建图。
配置gmapping节点
SLAM算法已经在gmapping功能包
中实现,我们暂时不需要深入理解算法的实现原理(想要深入理解的可以查看相关的论文资料),现在我们只需要关注如何借助其提供的接口实现相应功能。
现在来创建一个运行gmapping节点的launch文件,进行节点的相关参数配置。进入agv_car
功能包目录下的launch文件夹,创建一个gmapping.launch
文件:
1 |
|
文件代码如下:
1 |
|
文件包含了三部分:
gmapping参数配置,这里的配置参数我只写出来少数几个,其它的参数不进行配置它会有默认值,具体参数配置说明可以查看gmapping功能包介绍。
tf坐标变换,
/base_footprint
与/base_link
之间的关系。
机器人SLAM
新建launch文件
首先启动机器人,发布SLAM所需要的深度信息、里程计信息,并接受运动控制Twist指令。启动的节点有点多,可以使用launch文件启动,在agv_car
功能包launch文件夹下创建一个base.launch
文件:
1 |
|
文件代码如下:
1 |
|
再创建一个gmapping_demo.launch
文件:
1 |
|
文件代码如下:
1 |
|
启动gmapping建图
1 |
|
现在可以使用键盘控制机器人运动,进行建图了。
保存地图
建图完成后,在 agv_car功能包
创建maps文件夹保存地图文件:
1 |
|
分别生成一个map.pgm图像文件和一个map.yaml配置文件
.pgm图像文件:
该图像文件可以后续使用软件进行编辑修改,例如:可以添加一堵墙、添加一些障碍物或者去掉一些障碍物等,进行人为修正地图。
.yaml配置文件: