loam源码解读之后端优化

2023-05-30 0 774

1.主旋律程

TransformAssociateToMap()

将转交到的鸭岛座标切换到强化后的camera_init极座标下。未知转交到的新一代的鸭岛为:

loam源码解读之后端优化

上一格鸭岛统计数据为:

loam源码解读之后端优化

上一格强化后的鸭岛统计数据为:

loam源码解读之后端优化

新一代帧强化后的统计数据为:

loam源码解读之后端优化
loam源码解读之后端优化
loam源码解读之后端优化
loam源码解读之后端优化

extractSurroundingKeyFrames()

抽取环绕着sizes。分成三种情形:杀青poem检验情形和没迈入poem检验情形。

迈入poem检验:

关键步骤一:结点大部份突破点,找前段时间的50个sizes做为环绕着sizes,少于50个sizes后,弹出最先的sizes加进新一代的sizes,以保证环绕着sizes是新一代的50帧。

关键步骤二:通过强化后的突破点位姿,将点云左边切换到camera_init极座标下。

没开启poem检验情形:

关键步骤一:根据机器人当前位置,找附近50米内的大部份sizes,然后再滤波筛选出所需要的sizes。

关键步骤二:删除上一次保存的环绕着sizes中,不在新一代查找的sizes里的帧。

关键步骤三:找出新一代查找的sizes,不在环绕着sizes中的sizes,将其加进到环绕着sizes中。

关键步骤四:通过强化后的突破点位姿,将点云左边切换到camera_init极座标下。

抽取完sizes后,将这些sizes对应的特征点云,压入容器并过滤,用于后面的特征匹配强化。

downsampleCurrentScan()

处理当前订阅到的特征点云统计数据:cornerCloud,outlierCloud,surfCloud

对其,分别进行过滤。其中过滤后的cornerCloud 用于后面线特征匹配。将outlierCloud,surfCloud全部点云统计数据,用于后面的面特征匹配。

Scan2MapOptimization()

后端强化。

cornerOptimization()

关键步骤二:将订阅的角点特征点切换到camera_init下,与extractSurroundingKeyFrames抽取的环绕着角点特征进行匹配强化。

关键步骤三:特征匹配

通过kdtree找到与特征点前段时间的5个环绕着特征点。

计算环绕着特征点协方差,计算协方差特征向量,其中最大的特征值对应的特征向量,认为是特征的方向向量。

计算特征点的平均座标值,和方向向量,来找到两个特征点。

特征点匹配,同上一章节的特征匹配方法一样。

surfOptimization()

进行面特征匹配。找到前段时间的5个点,默认其是在同一个平面。现在求平面方程,然后计算特征点到平面的距离,以完成特征匹配。

平面一般方程为:

loam源码解读之后端优化
loam源码解读之后端优化

通过QR求解,得到平面法向量(参数向量)X,进而得到平面方程。

然后按照前一章节方法,求解点到面的距离。

LMOptimization()

loam源码解读之后端优化
loam源码解读之后端优化
loam源码解读之后端优化
loam源码解读之后端优化
loam源码解读之后端优化
loam源码解读之后端优化

transformUpdate()

根据IMU统计数据,通过加权平均法修正rx和rz

关键步骤一:根据当前帧时间戳找到,对应时刻的IMU姿态。

关键步骤二:加权平均求姿态。

saveKeyFramesAndFactor()

保存sizes,并进行因子图强化。距离前一格距离大于0.3米情形下,才保存sizes。然后进行因子图强化,来求解最优状态。最后更新LM强化的最优值。

correctPoses()

检验到完成一次poem检验后,更新大部份的sizes位姿。

publishTF()

发布鸭岛统计数据和tf变换

publishKeyPosesAndFrames()

发布位姿和sizes

clearCloud()

清除匹配的环绕着帧。每次匹配都是重新生成环绕着点云。

poem检验线程 loopClosureThread:

不断检验当前帧是否构成poem,构成poem,计算因子,进行因子图强化。

performLoopClosure()

线程任务函数。

detectLoopClosure()

poem检验。

关键步骤1:查找距离当前帧距离在7米范围内,且时间差在30秒一下的前段时间sizes

关键步骤2:将新一代帧的线特征点云和面特征点云,都切换到地图极座标(camera_init)下。

关键步骤3:根据找到的最佳匹配帧前、后25帧点云,取出来做为参考点云。后续与当前点云进行匹配。

关键步骤4:icp帧间匹配,然后构建约束,加进到图强化中,进行强化。

注意:两帧点云都是在

地图发布线程(visualizeGlobalMapThread()):

发布地图,保存点云和轨迹:

点云包括线特征点云(切换到cemera_init下),面特征点云(包含outlier点云)

transformFusion类,主要就是发布话题,不再阐释。

lego-loam源代码阐释专栏:

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务