ORB-SLAM的局部建图线程实际做的工作是来维护全局map以及管理关键帧的,对tracking得到的关键帧进行筛选融合,以及对关键帧中的地图点进行融合,剔除冗余的关键帧和地图点,维护一个稳定的全局map,并将筛选后的关键帧提供给回环检测使用。
代码架构
这一部分通过之前实例化SLAM系统对象时,实例化了一个LocalMapping的对象,并且开启一个线程,运行LocalMapping::Run()函数。整个代码逻辑如下:
局部建图线程主函数流程
- 设置当前不能接受新的关键帧到系统中,即在局部建图(处理关键帧)过程中不允许新关键帧集有变动
- 对新关键帧进行处理。
- 筛选当前关键帧对应的地图
- 对极约束检测特征点,并建立地图点加入全局map。
- 进行数据融合。
- 将关键帧交给回环检测
- 设置当前可以接受新的关键帧到系统中,即在局部建图(处理关键帧)过程中允许新关键帧集有变动
关键帧插入
- 我们先计算当前关键帧的BoW向量
- 然后更新当前关键帧所看到的地图点的观测值
- 接着更新Covisibility图的边,并将该关键帧插入到地图中
地图点的筛选
在这一步需要检查最近加入的这些地图点,并将一些冗余的地图点从最近地图点的列表中去除 有四处地图点的剔除规则:
- 地图点是被标记为bad的时候l
- 有超过25%的关键帧可以看到这个点
- 未被超过2个关键帧看到,并且当前关键帧的ID和看到该点的第一个关键帧之间的ID之差大于等于2的时候
- 当前关键帧的ID和看到该点的第一个关键帧之间的ID之差大于等于3的时候
新的地图点创建
相机运动过程中和共视程度比较高的关键帧通过三角化恢复出一些MapPoints
- 获取Cov图中附近的关键帧
- 计算当前帧和每个附近关键帧之间的对极约束,计算满足对极约束的匹配点
- 对当前帧和某一个关键帧之间的匹配点进行三角化计算,求解匹配点的深度
- 接着分别检查新得到的点在两个平面上的重投影误差,如果大于一定的值,直接抛弃该点。
- 检查尺度一致性
局部集束调整
局部BA优化的过程是,通过当前取得的关键帧找到附近的局部关键帧,局部地图点和可以观察到这些局部地图点但是不是局部关键帧的关键帧作为固定关键帧。我们通过固定附近的fixFK,统一优化附近的局部关键帧和当前关键帧的位姿,如果局部关键帧为空,那么不调整局部关键帧。
关键帧的筛选
检查冗余关键帧(仅限局部关键帧)
如果它看到的90%的MapPoints至少在其他3个关键帧(同样或更精细的尺度)中被看到,则关键帧被认为是冗余的.
参考博文:
https://blog.csdn.net/chishuideyu/article/details/76021496
https://blog.csdn.net/u010128736/article/details/53395936
https://blog.csdn.net/qq_30356613/article/details/80588326