点击上方“
计算机视觉工坊
”,选择“星标”
干货第一时间送达
内容来自知乎,「计算机视觉工坊」整理,如有侵权请联系删除
https://www.zhihu.com/question/52634751
作者:清风
周末在家把2D和3D SLAM自己动手写了一遍,先放代码和效果.
https://github.com/libing64/slam2dgithub.com/libing64/slam2d
https://github.com/libing64/lidar_pose_estimatorgithub.com/libing64/lidar_pose_estimator
1、2D SLAM
2D SLAM一般都是基于scan-to-scan match然后位置积分,比如ICP或者PLICP等,然后做mapping,后端为了减少drift会加scan-to-map对齐或者map-to-map对齐。
自己实现的这一版,参考了目前主流的SLAM算法,写代码时也加入自己的一些想法和理解。
scan-to-scan match使用了Point-Line ICP, 理论上收敛速度更快,参考An ICP variant using a point-to-line metric, 不过在实现时直接用ceres优化求解的相对位姿, 代码非常简洁。
scan-to-scan match的结果如果直接积分, drift会很快,加入scan-to-map对齐来减少drift,参考hector-mapping中的方法A flexible and Scalable SLAM System with Full 3D motion Estimation, 没有用高斯牛顿法,而是直接搞了一个局部最优的搜索,给一个random的方向,然后该方向找个最优解,多尝试几次可以认为就到了局部最优。
降低drift效果很明显。
update map这一步比较直接, 由于位置经过了scan-to-map的修正,这里直接往地图上投影就好了.
2、3D Lidar SLAM
LOAM: Lidar Odometry and Mapping in Real-time非常经典,github上ALOAM的开源实现很漂亮,我也借鉴了ALOAM中使用ceres来求解非线性优化,总体还是按照LOAM文章里的过程来写。
本来3D 点云的对齐是非常慢的事情,LOAM使用edge point和planar point实现了实时的计算,目前我也只写了scan-to-scan match和积分,mapping部分还在学习.