本文共 1391 字,大约阅读时间需要 4 分钟。
ORB-SLAM2代码详解08: 局部建图线程LocalMapping
本文详细介绍了ORB-SLAM2库中LocalMapping线程的实现,重点分析其核心功能和工作原理。
1. 成员函数/变量解析
1.1 核心缓冲队列
- mlNewKeyFrames (
protected
): 由Tracking线程插入的关键帧缓冲队列。 - InsertKeyFrame (
public
): 向缓冲队列插入新关键帧。 - CheckNewKeyFrames (
protected
): 检查缓冲队列中是否有新关键帧。 - KeyframesInQueue (
public
): 查询缓冲队列中关键帧数量。 - mbAcceptKeyFrames (
protected
): 表示LocalMapping线程是否愿意接收新关键帧。 - AcceptKeyFrames (
public
): 获取mbAcceptKeyFrames
值。 - SetAcceptKeyFrames (
public
): 设置mbAcceptKeyFrames
值。
2. 局部建图主函数: Run()
- LocalMapping线程的主循环,每3ms检查一次缓冲队列。
- 当前线程设置为不接受新关键帧(
SetAcceptKeyFrames(false)
)。 - 检查缓冲队列,若有新关键帧,执行以下步骤:
- 处理新关键帧。
- 剔除劣质地图点。
- 创建新地图点。
- 将当前关键帧与共视关键帧融合。
- 局部BA优化。
- 剔除冗余关键帧。
- 将关键帧加入闭环检测。
- 设置当前线程为接受新关键帧(
SetAcceptKeyFrames(true)
),暂停3ms后重复循环。
3. 处理新关键帧: ProcessNewKeyFrame()
- 取出队列头的关键帧。
- 计算关键帧的词向量。
- 判断地图点是否为新生成的:
- 若地图点是共视关键帧匹配得到的,添加当前关键帧观测。
- 若地图点是新生成的,加入临时存储容器
mlpRecentAddedMapPoints
。
- 更新地图点共视关系。
- 将关键帧添加到地图中。
4. 剔除劣质地图点: MapPointCulling()
- 标准1:召回率(
mnFound / mnVisible
)< 0.25。 - 标准2:3帧内观测数目少于2(双目为3)。
- 若地图点未通过3帧考验,标记为坏地图点。
5. 创建新地图点: CreateNewMapPoints()
- 与共视程度最高的前10帧(单目20帧)进行特征匹配。
- 双目相机可通过视差恢复地图点或三角化生成地图点。
6. 融合当前关键帧: SearchInNeighbors()
- 正向融合:将当前帧地图点融合到共视帧。
- 反向融合:将共视帧地图点融合到当前帧。
- 更新当前帧地图点信息。
7. 局部BA优化: Optimizer::LocalBundleAdjustment()
- 优化当前帧局部地图:
- 一级共视关键帧位姿优化。
- 二级共视关键帧位姿不变。
- 所有局部地图点位姿优化。
8. 剔除冗余关键帧: KeyFrameCulling()
- 若90%以上地图点被超过3个其他关键帧观测到,标记为冗余关键帧。
总结
本文对ORB-SLAM2库中LocalMapping线程的实现进行了详细分析,涵盖了关键帧处理、地图点优化、局部BA优化等核心功能。通过理解这些实现细节,可以更好地掌握ORB-SLAM2在实时定位和建图中的优势。
转载地址:http://szhlz.baihongyu.com/