loam 简介
loam 是2014年lidar实现的 slam,经典的入门算法,kitti数据集排名始终靠前,代码开源过后来关闭了,但有人模拟出 A-loam、lego-loam
论文地址: www.ri.cmu.edu/pub_files/2014/7/Ji_LidarMapping_RSS2014_v8.pdf
代码:www.github.com/HKUST-Aerial-Robotics/A-LOAM
1.点云提取特征
用局部表面平滑度指标判断
根据c值对扫描点进行排序,c值最大的特征点即边缘点,c值最小的特征点即平面点。为了在环境中均匀分布特征点,将扫描分为四个相同的子区域。每个子区域最多可以提供2个边缘点和4个平面点。当点 i 的c值大于或小于阈值,且所选点个数不超过最大值时,点 i 才能被选为边点或平面点(特征点的均匀化)。
剔除异常点,如下图所示
a中,B点是平行点,橙色激光束与B所在平面平行,这种测量不准
b中,A点容易被遮挡,为遮挡点,也不采用
2.特征点匹配
这里目的是让第k帧和第k+1帧的边缘点匹配,
但雷达即便是一帧数据,不同时刻坐标原点也会随着雷达变动,
首先要统一坐标系,如图
上图把tk到tk+1这一帧之间的点云pk,投影到pk一横,再把橙色pk+1投影到tk+1时刻,也就是前一帧投影到结束时刻,后一帧投影到开始时刻,这样坐标系统一了。
怎么把pk投影到pk一横,用到雷达点云校正方法,有三种
1)用视觉里程计位姿校正
2)用imu计算旋转补偿
3)只有雷达时,用线形插值,假设雷达匀速运动,所以是线性插值,loam用此方法,右图球面插值更准确
要两帧匹配,在红色扫描线提取 i 和 与i距离最近的点 j,为了匹配,要用i到直线的距离,为了得到直线,用绿色扫描线的小写L点与j组成直线,这样i与小写L、j组成的直线距离最短时,说明两帧特征点重合,此时的两帧的转换矩阵才是最优的。
距离De的求法,平行四边形面积/小写Lj长度,两条相邻边向量叉乘得到平行四边形面积
平面点使用原理类似
算出Dh的长度,平面法线与平面交点,确定平面,当i到平面距离最短时,两帧间的位姿变换最优,每个点都这么做,会组成很多残差,用于优化。
建图部分:
如下图所示,目的是用绿色的地图对齐之前的黑色地图,在当前帧的位置取立体栅格,建立局部地图,黄色区域不能太靠边,范围在3-18之间,当lidar采集到的点落入某个block时,就用这个点去匹配这个block的特征点,与之前不同的是提取边缘点大于2个,平面点大于3个
程序中,一旦centerCubeI<3也就是黄色区域太靠左,就要把黄色区域往右移动,
I I 五星 I I I I 变为
I I I 五星 I I I
此处 i = laserCloudWidth - 1,从最大开始递减
角点 laserCloudCornerArray【 3 】= laserCloudCornerArray【 2 】,也就实现了右移一个block