博客
关于我
ORB-SLAM2代码详解08: 局部建图线程LocalMapping
阅读量:725 次
发布时间:2019-03-15

本文共 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/

你可能感兴趣的文章
python判断汉字数目
查看>>
python判断文件是空的,如果是空的,就删除
查看>>
python判断密码是否正确_python密码判断是否符合要求的方法
查看>>
python判断字符串包含中文_Python 判断字符串是否包含中文
查看>>
python删除第一行_Python 乱码指北:一行删掉根目录
查看>>
Python删除列表元素的三种方法
查看>>
python初步学习-python数据类型-集合(set)
查看>>
python列表生成字典_Python中将字典转换为列表的方法
查看>>
python列表对应元素合并为列表及判断一个列表是几维
查看>>
python列表去重复后按照顺序_从包含不可共元素的Python列表中删除重复元素,同时保留顺序?...
查看>>
python列表前几个_python之列表
查看>>
python列表元组
查看>>
Python列表/元组/字典和集合使用
查看>>
python列表 行列选择_python_pandas_dataframe_行列选择_切片操作
查看>>
python列表
查看>>
python列出当前目录、子目录和文件的脚本
查看>>
python+flask计算机毕业设计骨科门诊患者档案管理系统(程序+开题+论文)
查看>>
python+flask计算机毕业设计高校体测管理系统的设计与实现(程序+开题+论文)
查看>>
Python切片对象和__getitem__
查看>>
python+flask计算机毕业设计高校体育赛事系统(程序+开题+论文)
查看>>