1.主旋律程
TransformAssociateToMap()
将转交到的鸭岛座标切换到强化后的camera_init极座标下。未知转交到的新一代的鸭岛为:
上一格鸭岛统计数据为:
上一格强化后的鸭岛统计数据为:
新一代帧强化后的统计数据为:
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个点,默认其是在同一个平面。现在求平面方程,然后计算特征点到平面的距离,以完成特征匹配。
平面一般方程为:
通过QR求解,得到平面法向量(参数向量)X,进而得到平面方程。
然后按照前一章节方法,求解点到面的距离。
LMOptimization()
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源代码阐释专栏:
















