一、Gmapping是基于粒子滤波的算法。
缺点:严重依赖里程计,无法适应无人机及地面不平坦的区域,无回环(激光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计算得到初始最高分数,确定深度,分支就是进行拓展,定界就是剪枝。提高运算效率。