ORB-SLAM2局部建图LcalMapping函数说明

LocalMapping::Run()函数说明

概述

LocalMapping::Run() 是ORB-SLAM2中的线程主函数,负责维护和优化地图以确保地图的一致性和质量。

输入输出:

无输入参数。无输出。

核心算法

LocalMapping线程的主要工作流程,包括处理新关键帧、剔除地图点、生成新地图点、融合重复点、局部捆绑调整、冗余关键帧剔除、闭环检测等任务,以维护ORB-SLAM2地图的一致性和质量。

  1. mpCurrentKeyFrame->ComputeBoW():将关键帧的特征点描述子转换为词袋模型(BoW),并将关键帧插入到地图中。
  2. MapPointCulling:根据地图点的观测情况,剔除质量不好的地图点。
  3. CreateNewMapPoints:通过当前关键帧与相邻关键帧的三角化操作生成新的地图点。
  4. SearchInNeighbors:检查并融合当前关键帧与相邻关键帧中重复的地图点。
  5. Local Bundle Adjustment:当局部地图中的关键帧数量大于2个时,执行局部捆绑调整(BA)。
  6. KeyFrameCulling:检测并剔除当前帧相邻的冗余关键帧。
  7. InsertKeyFrame:将当前关键帧加入闭环检测队列中。
运行步骤
  1. (Step 1)设置LocalMapping为繁忙,告知Tracking线程不接受新的关键帧。
  2. 主线程大循环(MainLoop):检查是否有新的关键帧(CheckKeyFrames):
    • 如果有新关键帧,则执行以下子步骤:
      • Step 2 处理新关键帧(ProcessKeyFrame),包括计算BoW、更新观测、描述子、共视图等。
      • (Step 3)。根据地图点的观测情况,剔除不合格的地图点(MapPointCulling)。
      • (Step 4)。创建新地图点(CreateNewMapPoints),当前关键帧与相邻关键帧通过三角化产生新的地图点,使跟踪更稳定。
      • (Step 5)。搜索邻近关键帧并融合重复点(SearchNeighbors):检查并融合当前关键帧与相邻关键帧中的重复地图点。
    • 如果没有新的关键帧,进入下一步。
  3. 检查是否有请求停止LocalMapping线程:
    • 如果有请求停止:
      • (Step 6)。进行局部BA调整 Optimizer::LocalBundleAdjustment,优化地图和相机位姿。
      • (Step 7)冗余关键帧剔除(KeyFrameCulling):检测并剔除当前帧相邻的关键帧中的冗余关键帧。
      • (Step 8)如果没有请求停止,将当前关键帧加入闭环检测队列(InsertKeyFrame)。
  4. 设置LocalMapping为非繁忙,允许接受新的关键帧。
  5. 检查是否已完成,如果未完成,则返回第2步,继续处理新的关键帧。
  6. 线程执行结束。
调用场合

本函数用于ORB-SLAM2的地图维护和优化,作为LocalMapping线程的主要工作函数,在LocalMapping线程启动时被调用。

总结

LocalMapping::Run()负责处理新关键帧、地图点的剔除和生成、局部捆绑调整、冗余关键帧的剔除以及闭环检测等任务,以维护ORB-SLAM2地图的一致性和质量。该函数通过多个步骤循环执行,直到满足终止条件,同时与Tracking线程进行协同工作,确保地图的连贯性。

LocalMapping::ProcessNewKeyFrame() 函数说明

概述

ProcessNewKeyFrame() 函数主要功能是处理新关键帧,包括关联地图点、更新地图点信息,以及将新关键帧插入到地图中。

输入: 无输入参数。

核心算法

ProcessNewKeyFrame() 调用了以下重要的函数,也就对应着主要执行步骤:

  1. mpCurrentKeyFrame->ComputeBoW():计算当前关键帧的词袋(Bag of Words)向量。
  2. mpCurrentKeyFrame->GetMapPointMatches():获取当前关键帧中的与地图点匹配的特征点。
  3. pMP->AddObservation(mpCurrentKeyFrame, i):为地图点添加关键帧的观测信息。
  4. pMP->UpdateNormalAndDepth():更新地图点的平均观测方向和观测距离。
  5. pMP->ComputeDistinctiveDescriptors():计算地图点的最佳描述子。
  6. mpCurrentKeyFrame->UpdateConnections():更新当前关键帧与其他关键帧之间的连接关系(共视图)。
  7. mpMap->AddKeyFrame(mpCurrentKeyFrame):将当前关键帧插入到地图中。
运行步骤

ProcessNewKeyFrame() 的执行步骤和功能是处理新的关键帧,包括计算词袋向量、更新观测、描述子、更新共视图连接关系,并将关键帧插入到地图中。

具体步骤如下:

  1. 从跟踪线程给定的关键帧队列中,取出最前面的关键帧,pop front(),作为当前要处理的关键帧。
  2. 计算当前关键帧特征点的词袋(BoW)表示ComputeBoW()。
  3. 遍历关键帧中所有的有效地图点,GetMapPointMatches,对地图点进行更新:
    • 如果地图点不是来自当前帧的观测(
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值