LocalMapping::Run()函数说明
概述:
LocalMapping::Run() 是ORB-SLAM2中的线程主函数,负责维护和优化地图以确保地图的一致性和质量。
输入输出:
无输入参数。无输出。
核心算法:
LocalMapping线程的主要工作流程,包括处理新关键帧、剔除地图点、生成新地图点、融合重复点、局部捆绑调整、冗余关键帧剔除、闭环检测等任务,以维护ORB-SLAM2地图的一致性和质量。
mpCurrentKeyFrame->ComputeBoW()
:将关键帧的特征点描述子转换为词袋模型(BoW),并将关键帧插入到地图中。MapPointCulling
:根据地图点的观测情况,剔除质量不好的地图点。CreateNewMapPoints
:通过当前关键帧与相邻关键帧的三角化操作生成新的地图点。SearchInNeighbors
:检查并融合当前关键帧与相邻关键帧中重复的地图点。Local Bundle Adjustment
:当局部地图中的关键帧数量大于2个时,执行局部捆绑调整(BA)。KeyFrameCulling
:检测并剔除当前帧相邻的冗余关键帧。InsertKeyFrame
:将当前关键帧加入闭环检测队列中。
运行步骤:
- (Step 1)设置LocalMapping为繁忙,告知Tracking线程不接受新的关键帧。
- 主线程大循环(MainLoop):检查是否有新的关键帧(
CheckKeyFrames
):- 如果有新关键帧,则执行以下子步骤:
- Step 2 处理新关键帧(
ProcessKeyFrame
),包括计算BoW、更新观测、描述子、共视图等。 - (Step 3)。根据地图点的观测情况,剔除不合格的地图点(
MapPointCulling
)。 - (Step 4)。创建新地图点(
CreateNewMapPoints
),当前关键帧与相邻关键帧通过三角化产生新的地图点,使跟踪更稳定。 - (Step 5)。搜索邻近关键帧并融合重复点(
SearchNeighbors
):检查并融合当前关键帧与相邻关键帧中的重复地图点。
- Step 2 处理新关键帧(
- 如果没有新的关键帧,进入下一步。
- 如果有新关键帧,则执行以下子步骤:
- 检查是否有请求停止LocalMapping线程:
- 如果有请求停止:
- (Step 6)。进行局部BA调整
Optimizer::LocalBundleAdjustmen
t,优化地图和相机位姿。 - (Step 7)冗余关键帧剔除(
KeyFrameCulling
):检测并剔除当前帧相邻的关键帧中的冗余关键帧。 - (Step 8)如果没有请求停止,将当前关键帧加入闭环检测队列(
InsertKeyFrame
)。
- (Step 6)。进行局部BA调整
- 如果有请求停止:
- 设置LocalMapping为非繁忙,允许接受新的关键帧。
- 检查是否已完成,如果未完成,则返回第2步,继续处理新的关键帧。
- 线程执行结束。
调用场合:
本函数用于ORB-SLAM2的地图维护和优化,作为LocalMapping线程的主要工作函数,在LocalMapping线程启动时被调用。
总结:
LocalMapping::Run()
负责处理新关键帧、地图点的剔除和生成、局部捆绑调整、冗余关键帧的剔除以及闭环检测等任务,以维护ORB-SLAM2地图的一致性和质量。该函数通过多个步骤循环执行,直到满足终止条件,同时与Tracking线程进行协同工作,确保地图的连贯性。
LocalMapping::ProcessNewKeyFrame() 函数说明
概述:
ProcessNewKeyFrame
() 函数主要功能是处理新关键帧,包括关联地图点、更新地图点信息,以及将新关键帧插入到地图中。
输入: 无输入参数。
核心算法:
ProcessNewKeyFrame()
调用了以下重要的函数,也就对应着主要执行步骤:
mpCurrentKeyFrame->ComputeBoW()
:计算当前关键帧的词袋(Bag of Words)向量。mpCurrentKeyFrame->GetMapPointMatches()
:获取当前关键帧中的与地图点匹配的特征点。pMP->AddObservation(mpCurrentKeyFrame, i)
:为地图点添加关键帧的观测信息。pMP->UpdateNormalAndDepth()
:更新地图点的平均观测方向和观测距离。pMP->ComputeDistinctiveDescriptors()
:计算地图点的最佳描述子。mpCurrentKeyFrame->UpdateConnections()
:更新当前关键帧与其他关键帧之间的连接关系(共视图)。mpMap->AddKeyFrame(mpCurrentKeyFrame)
:将当前关键帧插入到地图中。
运行步骤:
ProcessNewKeyFrame()
的执行步骤和功能是处理新的关键帧,包括计算词袋向量、更新观测、描述子、更新共视图连接关系,并将关键帧插入到地图中。
具体步骤如下:
- 从跟踪线程给定的关键帧队列中,取出最前面的关键帧,
pop front()
,作为当前要处理的关键帧。 - 计算当前关键帧特征点的词袋(BoW)表示
ComputeBoW
()。 - 遍历关键帧中所有的有效地图点,
GetMapPointMatches
,对地图点进行更新:- 如果地图点不是来自当前帧的观测(