【原文核心对照代码】【一文足以系列】A-LOAM里程计部分简短精解
1|0前言
本文将通过论文对照代码的方式阐述A-LOAM这一神奇算法。全文保持各个章节短小精悍的风格。本文会省去一些细节,但是了解大部分的论文和代码实现已经足够了。
2|0点曲率计算与边缘点面点区分
论文中通过对点云点的曲率进行如下求曲率的计算。将计算的结果跟阈值进行比较。大于阈值认为是边缘点角点,小于另一个阈值认为是面点。
论文中为了在选取面点和边缘点时均匀选取,所以采取了将每个scan的点云进行分组,论文中分成了4组,a-loam里分成了6组。
且每组选取两个边缘点和四个面点。
代码会进行部分截取
这里就是分组:
选取曲率最大的点和曲率稍微大一点的点:
选取面点:
剩下的点认为是平坦程度一般的点:
平坦程度一般的点有很多 所以这里做一个体素滤波 或者说是下采样:
3|0激光雷达运动补偿
A-LOAM中由于没有集成轮速计或者imu,所以只能使用帧间匀速运动模型。这在车辆运动过程中使用这个模型是可以的,如果是手持激光雷达使用匀速运动模型,通常会有很大的误差。
对应论文中这个图片:
重投影到每一帧开始时刻的代码实现:
kitti数据已经对点云数据做了运动补偿处理,所以DISTORTION为0 不做具体的补偿
我们已知上一时刻到当前时刻的位姿变换,又因为是匀速运动模型,所以当前时刻到下一时刻,或者说这一帧从第0ms到第100ms的位姿变换,等同于上一时刻到当前时刻的位姿变换。这里求一下当前这个点在0ms到100ms的一个比例,然后利用上一时刻到当前时刻的位姿进行差值,就能求出当前时刻的点的位姿。
下面的代码是将全部点转换到末尾时刻的:
可以看到若是将全部点转换到末尾时刻,首先要将点转换到初始时刻
我们已知的是q_start_end 这个是从初始时刻到末尾时刻的位姿变换,也是可以将点从末尾时刻转换到初始时刻的位姿变换。
所以我们要求的是q_end_start 即将全部初始时刻的点全部转换到末尾时刻。
4|0帧间运动估计
论文中使用的是点到线的距离和点到面的距离,通过优化帧间位姿q t,来减小两个距离。
图中我们已知一个当前的特征点,但这个特征点未在图中表示出来。
左图 j 点是一个和当前时刻特征点上一时刻最近的一个点,且属于同一个scanID,l 点也是距离当前时刻特征点最近的一个点,只是要求不是同一个scanID,并且如果找到了,scanID不能距离当前特征点的scanID太远。
右图是寻找两个和当前时刻特征点距离最近的点,且属于同一个scanID。另一个点也是距离最近,同样有不是同一个scanID和scanID不能距离当前特征点scanID太远两个要求。
对应代码如下:
对应代码:
残差细节可以细读源码。
大概意思是:基于匀速运动模型,根据当前点的比例,计算当前点基于上一时刻的位姿。通过这个位姿将这个点转换到上一时刻,在和上一时刻的两个点或者三个点求点到线的距离或者点到面的距离。
寻找最近点的函数:
KD树构造:
将上一帧点云数据存入KD树:kdtreeCornerLast->setInputCloud(laserCloudCornerLast);
使用KD树寻找最近的点:
__EOF__

本文链接:https://www.cnblogs.com/linglingdog/p/17075893.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】