gmapping算法讲解(保姆级Gmapping算法介绍到复现)
目录
1.前言
2.Gmmaping算法介绍
2.1Gmapping的前世今生
2.1.1降低粒子数量
2.1.2缓解粒子耗散和多样性丢失
2.2Gmapping算法的优缺点
3.Gmapping算法源代码的安装与编译
3.1安装依赖库
3.2下载Gmapping源代码
3.2.1方法一:
3.2.2方法二:
4.下载数据集
5.数据集测试
6.Gmapping算法launch文件各参赛含义
7.附录:Gmapping常用名词通俗解释
7.1粒子滤波
7.2粒子退化 、重采样 、粒子多样性
8.后记
1.前言
本文主要是学习SLAM过程中 ,记录下我复现Gmapping算法的过程 ,包括我遇到的各种问题 ,以便后续自己复习 ,也希望能对大家有所帮助 ,在此 ,也感谢很多CSDN的前辈的文章 ,给了我很多帮助 ,在此致谢 。
2.Gmmaping算法介绍
Gmapping是一个基于2D激光雷达使用RBPF算法完成二维栅格地图构建的SLAM算法 ,在介绍时 ,为了对新手友好 ,我将不讲太多理论的知识和相关数学公式的推导 ,尽量用通俗易懂的话语帮助各位理解,如果后续读者需要研究相关理论知识 ,可以去看Gmapping的论文和网上很多大神的讲解 。
2.1Gmapping的前世今生
完整的SLAM问题是在给定传感器数据的情况下 ,同时进行机器人位姿和地图的估计问题 。然而,现实的情况是这样的 ,如果需要得到一个精确的位姿需要与地图进行匹配 ,如果需要得到一个好的地图 ,需要有精确的位姿才能做到 ,显然这是一个相互矛盾的问题 。
为了解决这一问题 ,FastSLAM算法独辟蹊径 ,采用RBPF方法 ,将SLAM算法分解成两个问题:一个是机器人定位问题 ,另一个是已知机器人位姿进行地图构建的问题 。
FastSLAM算法中的机器人轨迹估计问题使用的是粒子滤波方法(先建图 ,再定位) 。由于使用的是粒子滤波 ,每一个粒子都包含了机器人的轨迹和对应的环境地图 。将不可避免的带来两个问题 。第一个问题 ,当环境大或者机器人里程计误差大时 ,需要更多的粒子才能得到较好的估计,这是将造成内存爆炸;第二个问题 ,粒子滤波避免不了使用重采样 ,以确保当前粒子的有效性,然而重采样带来的问题就是粒子耗散和粒子多样性的丢失 。由于这两个问题出现 ,导致FastSLAM算法理论上可行 ,实际上却不能实现 。针对以上问题Gmapping提出了两种针对性的解决方法:降低粒子数量和缓解粒子消散 。
2.1.1降低粒子数量
目的:通过降低粒子数量的方法大幅度缓解内存爆炸 。
方法一:直接采用极大似然估计的方式 ,根据粒子的位姿的预测分布和地图的匹配程度 ,通过扫描匹配粒子的最优位姿参数 ,就用该位姿参数 ,直接当作新粒子的位姿。
方法二:Gmapping算法通过最近一帧的观测(scen) ,把泊松分布限制在一个狭小的有效区域 。然后在正常的对泊松分布进行采样 。
2.1.2缓解粒子耗散和多样性丢失
Gmapping算法采用粒子滤波算法对移动机器人轨迹进行估计 ,必然少不了粒子重采样的过程。随着采样次数的增多 ,会出现所有粒子都从一个粒子复制而来 ,这样粒子的多样性就完全丧失了 。所以 ,问题不能解决 ,只能从减少重采样的思路走 。Gmapping提出选择性重采样的方法,根据所有粒子自生权重的离散程度(也就是权重方差)来决定是否进行粒子重采样的操作 。
总结:Gmapping是基于FastSLAM算法将RBPF方法变成现实 。
2.2Gmapping算法的优缺点
优点:Gmapping可以实时构建室内环境地图 ,在小场景中计算量少 。且地图精度较高 ,对激光雷达扫描频率要求较低
缺点:随着环境的增大,构建地图所需的内存和计算量就会变得巨大 ,所以Gmapping不适合大场景构图 。
3.Gmapping算法源代码的安装与编译
这里用的是Ubuntu18.04
3.1安装依赖库
3.2下载Gmapping源代码
3.2.1方法一:
注意:1.上述命令中 ,如果你的Ubuntu版本是16.04 ,需要将melodic换成kinetic,melodic对应的 Ubuntu版本对应的是18.04 。
2.方法一虽然操作时候安装没有问题 ,但在建图测试时有时候会出现问题 ,需要重新进行源码安装 。
3.2.2方法二:
第一步:在主目录下创建一个文件 ,命名为gmapping(这个名字随意),再在gmapping文件夹下面创建src编译空间
在src目录下打开终端 ,创建工作空间 ,输入
第二步:下载Gmapping源代码
下载完后 ,效果如图
注意: 有时候会出现下载不了的情况 ,如下图 这种情况一般都是网速的问题 ,可以将下载命令重复多试几次 。
第三步:编译 ,返回到gmapping目录下,打开终端 ,输入
注意:不用catkin_make编译的原因是因为下载的源代码之间的功能包可能存在互相依赖的问题 ,在同时编译的时候会报错 。
4.下载数据集
百度网盘自取
链接:https://pan.baidu.com/s/1o5n10WIBEhYXUUuioURKXQ?pwd=28jn 提取码:28jn下载后,将数据集放在gmapping目录下 ,如图
5.数据集测试
第一步:打开一个终端 ,输入
第二步:另开一个终端 ,输入
注意:1.第二行命令~$ rosrun gmapping slam_gmapping scan:=base_scen 中的gmapping不是你创建的文件夹的名字 ,而是你下载的gmapping源代码的功能包的名字 ,你就算创建的文件夹叫“abc(或者其他什么) ” ,第二行照样这样写 。
2.第二行命令是用来监听话题消息的 ,你还没有运行相关话题,所以此时该命令下面没有任何消息 ,是正常的 。 只有当你运行功能包 ,这下面才会有信息显示。
第三步:在数据集文件下创建终端,输入
注意:这个命令对应的是我发的链接的数据集 ,如果是其他数据集 ,记得将后面数据包的名字换一下
第四步:再新开一个终端 ,打开可视化界面
注意:此时的可视化界面是没有图像的 ,需要调参数
第五步:调节参数 ,打开可视化界面左下角的Add,选中map,打开map选项 ,选中Topic选项里面的/map,这样图像就出来了 。
做到此步就已经算是对Gmapping算法复现成功了 。
6.Gmapping算法launch文件各参赛含义
在这方面CSDN上面已经有很多大神对此做了很详细的介绍了 ,所以我就不班门弄斧了 ,这里我推荐一篇我看过的文章 ,写的很全面了
https://blog.csdn.net/qq_42037180/article/details/100819788
7.附录:Gmapping常用名词通俗解释
在学习的过程中我发现有很多人对于粒子滤波 ,重采样,粒子多样性 ,粒子退化这些概念有些模糊 ,为此我在看到的文章中发现有人对此做了一个类比,通俗易懂 ,在此分享给大家 。
7.1粒子滤波
附上该文章链接:https://www.guyuehome.com/14967
7.2粒子退化 、重采样 、粒子多样性
附上该文章链接:https://www.codetd.com/article/3003143
8.后记
看到这里,其实Gmapping这个算法我已经介绍的很全面了 ,几乎综合了网上我看到的所有关于Gmapping的文章 。后续我也会对其他经典的SLAM算法进行复现和介绍 ,包括视觉,激光 ,以及视觉和激光的融合 。如果感兴趣的读者觉得我写的还不错 ,麻烦点个三连吧(点赞 、收藏 、关注) ,谢谢大家 。
创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!