保姆级Gmapping算法介绍到复现
⽬录
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安装依赖库
sudo apt-get install libsdl1.2-dev
sudo apt install libsdl-image1.2-dev
3.2下载Gmapping源代码
3.2.1⽅法⼀:
sudo apt-get install ros-melodic-gmapping
注意:1.上述命令中,如果你的Ubuntu版本是16.04,需要将melodic换成kinetic,melodic对应的  Ubuntu版本对应的是18.04。
2.⽅法⼀虽然操作时候安装没有问题,但在建图测试时有时候会出现问题,需要重新进⾏源码安装。
3.2.2⽅法⼆:
第⼀步:在主⽬录下创建⼀个⽂件,命名为gmapping(这个名字随意),再在gmapping⽂件夹下⾯创建src编译空间
在src⽬录下打开终端,创建⼯作空间,输⼊
catkin_init_workspace
第⼆步:下载Gmapping源代码
git clone github/ros-perception/openslam_gmapping
git clone github/ros-perception/slam_gmapping.git
git clone github/ros-planning/navigation.git
git clone github/ros/geometry2.git
git clone github/ros-planning/navigation_msgs.git
下载完后,效果如图
注意: 有时候会出现下载不了的情况,如下图 这种情况⼀般都是⽹速的问题,可以将下载命令重复多试⼏次。
第三步:编译,返回到gmapping⽬录下,打开终端,输⼊
catkin_make_isolated
注意:不⽤catkin_make编译的原因是因为下载的源代码之间的功能包可能存在互相依赖的问题,在同时编译的时候会报错。
4.下载数据集
百度⽹盘⾃取
下载后,将数据集放在gmapping⽬录下,如图
5.数据集测试
第⼀步:打开⼀个终端,输⼊
roscore
第⼆步:另开⼀个终端,输⼊
rosparam set use_sim_time true//设置ROS 启⽤重放数据中的时间⽽⾮本机时间,因为在默认情况下ros使⽤Ubuntu系统的时间,即当前时间。由于我们重放的⽂件是rosrun gmapping slam_gmapping scan:=base_scan //启动gmapping,并监听scan_base topic 发来消息。
注意:1.第⼆⾏命令~$ rosrun gmapping slam_gmapping scan:=base_scen 中的gmapping不是你创建的⽂件夹的名字,⽽是你下载
的gmapping源代码的功能包的名字,你就算创建的⽂件夹叫“abc(或者其他什么)”,第⼆⾏照样这样写。
2.第⼆⾏命令是⽤来监听话题消息的,你还没有运⾏相关话题,所以此时该命令下⾯没有任何消息,是正常的。 只有当你运⾏功能
git常用指令包,这下⾯才会有信息显⽰。
第三步:在数据集⽂件下创建终端,输⼊
rosbag play basic_localization_stage.bag //这个basic_localization_stage.bag是我的数据包⾥的,如果是别的数据包,只需要将名字即basic_localization_stage.bag换注意:这个命令对应的是我发的链接的数据集,如果是其他数据集,记得将后⾯数据包的名字换⼀下
第四步:再新开⼀个终端,打开可视化界⾯
第五步:调节参数,打开可视化界⾯左下⾓的Add,选中map,打开map选项,选中Topic选项⾥⾯的/map,这样图像就出来了。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。