Gmapping、hector、Cartographer三种激光SLAM算法简单对比
2017-09-06 18:55
2141 查看
一、Gmapping是基于粒子滤波的算法。
缺点:严重依赖里程计,无法适应无人机及地面不平坦的区域,无回环(激光SLAM很难做回环检测),大的场景,粒子较多的情况下,特别消耗资源。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202005/07/413db94da074b7b9fdf0559da9a0ae41)
源码的核心函数:processScan()
算法框架:
① drawFromMotion()运动模型(因为有这步,所以特别依赖里程计信息)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202005/07/e144341f1b88d7ba05bcbc457bbe5caa)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202005/07/e3ae6cc4edc826f72205f2f56532524c)
② scanMatch()扫描匹配
这里面有很多模型常用的
![](https://oscdn.geek-share.com/Uploads/Images/Content/202005/07/f75617e80bfacf3829b5768a0b2cd7f7)
坐标变换之后,雷达数据映射到地图上,计算其距离最近障碍物的距离。
③ updateTreeWeights()权值更新
④ resample()重采样,为了降低退化现象,权重大的粒子多生成一些,很像遗传算法。
⑤ 地图更新updateMap()得到最优的粒子,按照他的扫描数据,利用占据栅格地图算法,更新地图。
二、Hector SLAM
基于优化的算法(解最小二乘问题),优缺点:不需要里程计,但对于雷达帧率要求很高40Hz,估计6自由度位姿,可以适应空中或者地面不平坦的情况。初值的选择对结果影响很大,所以要求雷达帧率较高。
核心函数:update()
① Matchdate()利用上一帧位置和此帧雷达扫描,运用构造的最小二乘问题,估计此帧位姿。
② UpdateByScan根据此帧位姿,雷达数据,利用占据栅格地图算法,更新地图。
扫描匹配算法:利用g2o解公式7,泰勒展开,运用双线性插值计算微分,雅克比矩阵。
函数M()该点是障碍物的概率。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202005/07/b57bd106dfad24a2934836dd02941b28)
三、Cartographer
累计误差较前两种算法低,能天然的输出协方差矩阵,后端优化的输入项。成本较低的雷达也能跑出不错的效果。
先有一定数量的laser scan构建submap,由submap拼接成地图,所谓的回环检测,就是间隔一定数量的扫描进行一次所有submap的图优化(SPA,运用了分支定界原理进行加速),但这种用有误差的估计量去作为约束去优化估计量,总有种自己估计优化自己的嫌疑,跟喜欢视觉SLAM运用词袋模型检测是否回到之前来过的地方的算法。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202005/07/a74880af5814f5eb98905b0af1f17b8c)
位姿估计:先用相关性扫描匹配(CSM)给一个初值,然后构造一个最小二乘问题(与Hector超不多),求解精确的位置。
CSM:简单来说大概是:用激光末端点匹配取到占据栅格地图中的值,获得得分,取得分最高的作为初值。加上多分辨率计算可以加速,并且获得分辨率意义下的最优解。
用分支定界原理加速求解过程(相对于暴力求解),进行深度有限优先搜索,CSM计算得到初始最高分数,确定深度,分支就是进行拓展,定界就是剪枝。提高运算效率。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202005/07/c7868199d60cc5977fc8aace898b9b09)
如有错误请指出
缺点:严重依赖里程计,无法适应无人机及地面不平坦的区域,无回环(激光SLAM很难做回环检测),大的场景,粒子较多的情况下,特别消耗资源。
源码的核心函数:processScan()
算法框架:
① drawFromMotion()运动模型(因为有这步,所以特别依赖里程计信息)
② scanMatch()扫描匹配
这里面有很多模型常用的
坐标变换之后,雷达数据映射到地图上,计算其距离最近障碍物的距离。
③ updateTreeWeights()权值更新
④ resample()重采样,为了降低退化现象,权重大的粒子多生成一些,很像遗传算法。
⑤ 地图更新updateMap()得到最优的粒子,按照他的扫描数据,利用占据栅格地图算法,更新地图。
二、Hector SLAM
基于优化的算法(解最小二乘问题),优缺点:不需要里程计,但对于雷达帧率要求很高40Hz,估计6自由度位姿,可以适应空中或者地面不平坦的情况。初值的选择对结果影响很大,所以要求雷达帧率较高。
核心函数:update()
① Matchdate()利用上一帧位置和此帧雷达扫描,运用构造的最小二乘问题,估计此帧位姿。
② UpdateByScan根据此帧位姿,雷达数据,利用占据栅格地图算法,更新地图。
扫描匹配算法:利用g2o解公式7,泰勒展开,运用双线性插值计算微分,雅克比矩阵。
函数M()该点是障碍物的概率。
三、Cartographer
累计误差较前两种算法低,能天然的输出协方差矩阵,后端优化的输入项。成本较低的雷达也能跑出不错的效果。
先有一定数量的laser scan构建submap,由submap拼接成地图,所谓的回环检测,就是间隔一定数量的扫描进行一次所有submap的图优化(SPA,运用了分支定界原理进行加速),但这种用有误差的估计量去作为约束去优化估计量,总有种自己估计优化自己的嫌疑,跟喜欢视觉SLAM运用词袋模型检测是否回到之前来过的地方的算法。
位姿估计:先用相关性扫描匹配(CSM)给一个初值,然后构造一个最小二乘问题(与Hector超不多),求解精确的位置。
CSM:简单来说大概是:用激光末端点匹配取到占据栅格地图中的值,获得得分,取得分最高的作为初值。加上多分辨率计算可以加速,并且获得分辨率意义下的最优解。
用分支定界原理加速求解过程(相对于暴力求解),进行深度有限优先搜索,CSM计算得到初始最高分数,确定深度,分支就是进行拓展,定界就是剪枝。提高运算效率。
如有错误请指出
相关文章推荐
- ros中如何模拟建图(gmapping/hector/cartographer)
- 三种简单排序算法及其对比
- [原]JS ajax类的三种封装形式及简单对比
- 三种简单排序的对比与分析(未完待续)
- 2D-slam 激光slam: 开源代码的比较HectorSLAM Gmapping KartoSLAM CoreSLAM LagoSLAM
- Gmapping hector cartogarpher 三种激光雷达算法的比对
- JVM、Dalvik、 ART三种虚拟机简单对比
- 2D-slam 激光slam: 开源代码的比较HectorSLAM Gmapping KartoSLAM CoreSLAM LagoSLAM
- ios中三种多线程的技术对比
- JAVA 关于Icon,Image,ImageIcon的简单的对比参考 分类: Java Game 2014-08-14 17:08 210人阅读 评论(0) 收藏
- Unity3D Shader编程】之五 圣诞夜篇: Unity中Shader的三种形态对比&混合操作合辑
- 用Mxnet和Tensorflow做简单多分类器的对比测试
- Ext.Net控件中,常用的三种界面控件简单介绍。
- 创建线程的三种方式对比(总结)
- 三种排序对比:选择法,插入法,冒泡法
- Nancy和ASP.NET MVC的简单对比
- C#三种字符串拼接方法的效率对比
- 原生代码加载网络图片和Volley和Picasso的简单介绍和优缺点对比
- servlet 第二讲 笔记2 第二、三种开发方法 简单的登录
- 简单介绍 C语言中 三种if宏定义