计算机视觉大型攻略 —— SLAM(4) ORB SLAM2(三)Local Mapping线程
书接前文,Local Mapping线程(Local Mapping)。
开源代码:https://github.com/raulmur/ORB_SLAM2.git
参考文献:
[1] ORB-SLAM: a Versatile and Accurate Monocular SLAM System
[2] ORB-SLAM2: an Open-Source SLAM System for Monocular, Stereo and RGB-D Cameras
[3] Double Window Optimization for Constant Time Visual SLAM
[4] Bags of Binary Words for Fast Place Recognition in Image Sequences
[5]ORB: an efficient alternative to SIFT or SURF
系统架构
论文[2]中给出的算法框架图。这一篇写Local Mapping。
Local Mapping 线程
Tracking线程将新的Keyframe传给Local Mapping线程。此线程使用Local BA优化Local地图与相机位姿。
Local Map由两个集合K1, K2组成。K1是与当前帧观测到同一地图点的集合。K2是covisibility graph中与K1相连的集合。
插入关键帧
Local Mapping线程得到关键帧后,首先更新地图。 为新插入的关键帧,
为Local Map中的关键帧。
- 更新Covisibility Graph。添加新的节点,如果与其他的关键帧存在公共特征点,创建边。
- 更新Essential Graph(Spinning tree)。与公共特征点最多的关键帧建立连接。
- 计算
的词袋。
Recent Map Points Culling
检查之前“新”进入地图的特征点(Map point),去掉一批不稳定的点。
- 当一个新的Map Point创建后,在紧跟其后的三个关键帧插入的时候 ,都需要通过一个额外的"新人关卡"。该点需要在预测帧中的25%以上跟踪成功,才能通过这个检查。否则就删除这个点。
- 一旦地图点通过了测试,就成立了老伙计了。每次插入关键帧时就可以绕过这个关卡。 只有在可以观测到该地图点的关键帧少于三个时,才会将其删除。这种事情通常在两种情况下发生。第一,有关键帧被删除的时候。第二,Local BA去外点时候。
创建新的地图点(New Map Point Creation)
新的关键帧插入,因此需要创建新的地图点(这些地图点在随后紧接着的三次关键帧插入时,都需通过上面的"新人关卡"。
- 地图点(Map point)的属性包括世界坐标系的坐标,ORB描述符,观测方向和观测距离。
- 如上图,将
上的特征点与其他帧做匹配。K1为观测到相同特征点的关键帧集合,K2是Covisibility Graph中与K1连接的关键帧集合。K1, K2构成了Local Map。
局部BA (Local BA)
跟踪线程做了Motion-only BA,此时在Local Mapping线程内执行Local BA。
-
上面的公式里面
指的是K1集合,
指的是
里的公共地图点,
为之前定义的K2集合。
-
为投影误差,与Motion-only BA的定义相同。
-
Motion-only BA只优化当前帧的位姿(
,
)而Local BA优化K1集合所有关键帧的位姿(
,
) 与地图(
)。
-
下图为一个简单示意。右上方框内是被优化对象,包括K1集合里的Keyframe(位姿)以及他们能观测到的地图点。
-
K2集合的Keyframe只是作为约束条件参与了代价计算,其本身并没有优化。
Local KeyFrame Culling
为进一步提高系统性能,有必要限制一下Keyframe的数量。如果局部地图里的某一帧,他的可观测地图点的90%,可以被其他三个关键帧观测到,那么就可以删掉他。这个操作后续还会引起一系列的连锁反应,如冗余地图点的去除等。
总结一下,Local Mapping线程接到新插入的Keyframe,通过局部BA优化局部地图的地图点和相应关键帧的位姿。过程中,删除冗余关键帧和地图点,降低地图的复杂度,提升了系统性能。
下一篇:Loop Closing线程与全局BA 上一篇: 跟踪线程