1、LeGo-LOAM算法流程、与LOAM区别?
其相比于最为经典的LOAM,实现了更轻量级的激光雷达slam工作。
流程图:
ros节点图:
具体改进:
- 前端数据处理增加基于柱面投影的特征分割,将原始点云中地面点分割出来并对其中的目标点云块实现聚类。
- 特征提取:从地面点云和目标聚类点云块中提取面特征以及线特征,特征提取更准确。
2、如何实现点云分割?
- 将无序的点云有序化:在点云分割之前,首先需要将一帧点云投影到一张分辨率为1800*16的图片上(由于VLP-16的水平方向的角度分辨率为0.2°,所以投影图像的水平方向分辨率为 360/2 =1800。由于VLP-16的竖直方向是16根扫描线,所以,投影图像的竖直方向的分辨率就变成了 16)。
- 提取地面点:根据16线激光雷达扫描范围,将[-15°,-1°]扫描线上的点认为是地面点,不参与后续的分割。
- 基于图像分割的方法,将上述距离图像分为多个类。并去除不能聚类的点(低于30个的类)以提升特征点提取精度。
分割:通过BFS(深度优先遍历)递归进行查找,从[0,0]点开始,遍历它前、后、左、右的4个点,分别进行对比,如果相对角度大于60°,则认为是同一个点云集群。最后分割出来的点云数量大于30个则认为分割有效(实际上大于5个可能也行)。
相邻两个点连线角度小于60, 则不是同一类。其实就是同时考虑了深度以及偏移,深度偏差较大,偏移较小的两个点则认为不是同一类。
无人驾驶学习笔记-LeGO-LOAM 算法源码学习总结_ppipp1109的博客-CSDN博客_legoloam
特征点提取:
特征提取的过程:
- 先对点云进行畸变校正(运动补偿)
- 接着计算点的平滑程度,然后按照平滑度排序,如果是不平滑的点,则选为线特征(柱子或者墙壁的棱角),如果是平滑的点,则选为面特征(地面,墙面等平面)
- 同时为了避免选择的特征过于集中在同一个地方,会把360°方向切分为6个区域,每个区域平均选择2个线特征和4个面特征。
3、详细讲一下LeGo-LOAM激光里程计算法流程
特征匹配:
- 其将点云划分为地面点和分割点,分别进行特征匹配。但是这也导致LeGo-LOAM在地面不够平坦时,地面点就不能很好的匹配,也就会直接导致失效。
- 分别匹配线特征以及面特征,并且两步LM优化
嗨害嗨!小知识点:
提问:为什么图优化中要加入核函数?
因为图优化是优化所有边,然而在slam中很容易出现其中一条边误差极大,会影响整个优化的效果。加入核函数可以削弱误差较大的边,防止其掩盖掉其他边。
具体的方式是,把原先误差的二范数度量,替换成一个增长没有那么快的函数,同时保证自己的光滑性质(不然没法求导啊!)。因为它们使得整个优化结果更为鲁棒(所谓鲁棒性,是指控制系统在一定(结构,大小)的参数摄动下,维持某些性能的特性),所以又叫它们为robust kernel(鲁棒核函数)。
很多鲁棒核函数都是分段函数,在输入较大时给出线性的增长速率,例如cauchy核,huber核等等。