对LOAM的特征点法的创新性评价
对于图像来说,特征点法的普及度已经非常高了
但是对于雷达点云来说,将特征点的概念推广到激光点云领域是LOAM作者zhang ji的一大贡献!
LOAM的角点_论文提法和程序写法
博主在自家屋子里做了实验,预期的四个墙角都会有红色的角点,但是并没有达到,只有一个墙角是整齐的红色的角点
在代码里,除了sharp point边缘点,flat point平面点,还有less sharp point和less flat point,实际代码里是这四种策略
下面这个动图描绘velodyne 16雷达的扫描频率设置为10Hz下的建图过程,其返回的点云数据是按照先上下,后左右的顺序
这个雷达的水平扫描角度的分辨率是0.2°,我们可以算出来理论上一帧有360 / 0.2 × 16 = 28800 个点,但是实际上你可以试试,每次的点数不是完全一样的,有时多一点有时少一点,在程序中将存储点的数组定义为40000个元素,这是选了一个保守的上限。
LOAM计算角点到折线的距离、计算平面点到平面的距离
计算角点到折线的距离,看下方网址
Point-Line Distance--2-Dimensional -- from Wolfram MathWorldhttps://mathworld.wolfram.com/Point-LineDistance2-Dimensional.html计算平面点到平面的距离,看下方网址
Point-Plane Distance -- from Wolfram MathWorldhttps://mathworld.wolfram.com/Point-PlaneDistance.html特别注意的是,LOAM使用了点到直线和点到平面来计算距离,这就意味着他适用于结构化比较好的室内环境,因为在室内环境中充满了平直的墙壁、地面、家具、平直的转折角。对于室外环境就没这么理想了,可能充满了树叶、石块、车辆等等不规则的物体,其直线和平面的假设就不太准确了。
后续改进的LEGO-LOAM就充分利用了地面信息,实现了室外场景下的适应
LOAM处理运动畸变
LOAM解决运动畸变的方法比较简单,就是根据每个点的相对时间进行补偿。无独有偶,我最近看百度Apollo的激光雷达运动补偿源代码的时候,发现百度也是这么简单处理的。雷达扫描一帧的时间是固定的,可以得到每个点的采集时刻,将所有点都统一到同一时刻,这里选择的是每完成一帧扫描的末尾时刻
论文中假设雷达做最简单的运动,即匀速运动,也就是说一次扫描过程中雷达的线速度和角速度都是不变的。在时间间隔不大时,例如100ms,可以认为这样的假设比较合理。当然如果是无人机这种做剧烈运动的,这个假设就不太合理了,此时可以用IMU补偿
优化_由最小一乘引出最小二乘
如图可见,最小一乘就像这种,离群点害群之马直接影响了整个的曲线的曲率
最小二乘法则为了避免这个问题
求解非线性最小二乘问题的常用方法有LM( Levenberg-Marquardt)方法和高斯牛顿法。作者在论文中声称采用了LM方法,但是在程序中却使用了高斯牛顿法。不管用哪种方法,都需要计算目标函数的雅克比矩阵,这个是最繁琐的一步。雅克比矩阵由一阶导数构成,求导数可以采用数值法,也可以用解析法。数值法就是用很小的差分近似表示导数,一般用在函数复杂或者根本无法得到解析解的情况;解析法就是直接用初等函数的求导公式求出复合函数的导数,这样比较精确。
在A-LOAM版本里,引入了ceres库,省去了计算雅可比矩阵的繁琐过程
建图
这块的主成分分析其实是这个意思(来自靓仔刘的理解)
这块因为特征点多了十倍,所以采用ICP的效果不再可行,采用类似于NDT的思想
直接拿这堆待匹配的点云,通过他们的特征向量来判断这一块点云大概是线或者是面,然后做匹配
特征值两长一短,则是平面,短的那个作为平面的法向量
特征值两短一长,则是边缘,长的那个作为边缘的方向向量
三个向量相交于几何中心,由此确定边缘线和平面
可以结合下述的动图看