loam框架的注意点,公式推导细节,lego-loam对其的改进及自身不足,

目录

前端流程及注意细节:

总体结构:

特征提取部分:

特征关联匹配部分:

最小二乘优化部分:

后端部分:

lego-loam对其的改进:


前端流程及注意细节:

总体结构:

1.激光slam框架loam的流程图如下。slam的过程使用帧间匹配作为里程计,但在实际工程应用中,可以与先验地图做匹配实现定位,免去了不必要的建图流程(但又会牵扯出地图更新问题,即long-term slam)。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5ZKM6YGT5LiA5paH5a2XXw==,size_20,color_FFFFFF,t_70,g_se,x_16

特征提取部分:

2.loam利用机械式多线激光雷达模型,将点云投影到为透视图,这样在单帧点云中,进行临近搜索和计算的效率会特高很多。

3.投影的方式有两种:

1)可根据点云坐标解算每个点所属的行和列,这样计算量大,对16线雷达(如velodyne16线的行/扫描线夹角为2°)的效果尚可,但随着线数增多,可能会出现解算错误(单个点甚至会算错2行)。

2)对于直接在点云数据中提供行号的雷达,可通过雷达驱动自带的点云格式中,直接读取每个点的行号,避免了计算量和计算错误。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5ZKM6YGT5LiA5paH5a2XXw==,size_20,color_FFFFFF,t_70,g_se,x_16

4.下图为每个点曲率的计算公式(看着很复杂),但实际的代码中,就是计算了每根扫描线上的二维曲率(即前后各5个点形成的夹角)。

5.还对一些异常点做了剔除处理。如遮挡严重的B1和间断点A2。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5ZKM6YGT5LiA5paH5a2XXw==,size_20,color_FFFFFF,t_70,g_se,x_16

6.下来对提取到的特征按照曲率大小进行分类,分类平面点和边缘点。细分为以下四类是为了匹配和后端建图使用。即匹配使用特征点ac,bd则为对应关联的线和面特征点,且建图时使用的是bd。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5ZKM6YGT5LiA5paH5a2XXw==,size_20,color_FFFFFF,t_70,g_se,x_16

特征关联匹配部分:

7.前端里程计仅使用相邻帧间匹配。

8.首先将当前时刻k+1的特征点投影到k时刻(根据一个预估的R,t)特征所在的坐标系,投影之后的点记为X^。

9.通过关联最临近边缘和面特征来计算残差,使得残差最小的Rt即为帧间位姿变换:

1)边缘点:对于当前帧投影而来的点i,寻找上一帧点云中对应的最临近点j(使用kdtree),并在上一帧点云中的上或下相邻行,找相邻j最近的点l,计算点i到线jl的距离,即为线特征的残差;

2)平面点:对于当前帧投影而来的点i,寻找上一帧点云中对应的最临近点j(使用kdtree),再在同一行找距离j最近的点l,并在上一帧点云中的上或下相邻行,找相邻j最近的点m,计算点i到jlm构成的面的距离,即为面特征的残差;

注意:此处仅点i为当前帧的特征点云,其余皆为上一帧的特征点云。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5ZKM6YGT5LiA5paH5a2XXw==,size_20,color_FFFFFF,t_70,g_se,x_16

10.上一步构建完误差损失函数。下来具体的计算,需要代入预设好的位姿变换Rt。

11.此处公式中对旋转的参数描述使用的欧拉角(公式和代码会比较繁琐,现在多用四元数形式计算),旋转顺序为z->x->y。写成对应的矩阵形式,最后的损失函数如下。

12.这里需要注意的是参数符号的变化,带^的为转换到同一坐标系下的坐标,不带的为在自身雷达坐标系下的坐标(可直接读取点云获得)。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5ZKM6YGT5LiA5paH5a2XXw==,size_20,color_FFFFFF,t_70,g_se,x_16

最小二乘优化部分:

13.使用LM进行最小二乘优化,重点在求损失函数的雅克比矩阵上。

14.求解过程如下,先将求导公式链式分解为两部分。

15.第一部分直接求导很麻烦,可根据其物理意义求:

思路跳出这个公式,我们通常对D求X的偏导数,意思是求X如何变化,能让D的改变最大,即为D的数值的梯度方向(梯度方向即为变化最大的方向)。

由D(即点到线和点到面的距离)的物理意义可知,垂直(梯度)方向即为误差D变化最大(优化减小到0)的方向。

16.实际计算中,线面特征误差的梯度方向,皆可通过上述关联点的坐标构建向量,计算向量投影得到。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5ZKM6YGT5LiA5paH5a2XXw==,size_20,color_FFFFFF,t_70,g_se,x_16

17.下来就是对雅克比分解的第二项求导,即投影点坐标对6个自由度分量分别求导。计算规则如下,整合形式如红笔所写。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5ZKM6YGT5LiA5paH5a2XXw==,size_20,color_FFFFFF,t_70,g_se,x_16

后端部分:

1.每10帧点云里选一帧,与之前建好的地图做匹配,地图分为一个个cube块。在cube内做关联和更新。

2.由于之前所有帧都叠加在了一起,没有上一帧和行号的概念,就是用kdtree进行粗暴的搜索,找地图中最临近的5个点,计算点到线和点到面的残差。

3.此处的代码中,线方程使用PCA主成分分析法求,面方程默认搜索到的就是平面点,直接拟合平面方程。

4.构建误差,优化之后得到位姿,将新一帧的特征点云添加到对应的cube中去。

lego-loam对其的改进:

1.进行了地面分割,匹配用的平面特征点只在地面点中寻找。

2.对非地面点进行了dfs聚类,剔除了小于30个点的聚类,相当于去了噪点。

3.在聚类后剩余的非地面点中,提取平面和边缘点,但在匹配时,只选取边缘点。

4.在其论文中,先使用了地面点做匹配,求出了3个自由度,再代入边缘点的匹配中作为初值再计算。两端LM优化。。。但在后期的代码中,又改回了直接优化6自由度的方法(此处无法考证原因,精度?优化效率?)。

5.loam对地图使用栅格,丢失了每一帧的信息,且后端优化中无法对地图做校正。而lego-loam使用每一个关键帧特征点云单独的格式存储地图。这样做既就克服了这两个缺点,此后的升级版lio-sam也是基于此技术,

6.lego-loam的论文中没有说回环检测,但是其代码中加入了回环,方法比较粗暴,对特征直接使用gtsam优化。

7.lego-loam还加入了imu信息的可选项,实验验证,加入imu信息,定位建图的精度和鲁棒性都会好很多,但是其对imu的信息处理为松耦合,比较粗糙,不如lio-sam的紧耦合。(代码中外参设置部分甚至似乎只考虑了旋转,而没有平移)。

完。。。。。。。。。。

矩阵论知识忘了好多,得好好复习下了

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

和道一文字_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值