转载自:一起研究ORB-SLAM(三)--LocalMapping和LoopClosing线程
上两篇文章主要介绍了ORB-SLAM中最重要的三个线程中的一个,今天这篇文章介绍最后一个线程,这个介绍完事了之后,就开始介绍里头的算法了!!! 依然是上一篇的问题,能告诉我ORB-SLAM中主要的三个线程是什么吗?
Tracking LocalMapping 和 LocalClosing 。一起研究ORB-SLAM(一)--结构和入口
一起研究ORB-SLAM(二)---Tracking线程
小莱姆:师兄,能透露下这篇文章的具体细节吗?
师兄:可以啊,上面一段不是说过了嘛,还来问我!!
从现在开始进入正题了,首先介绍LocalMapping ,主要是以流程为主,并没有涉及到太多算法方面的内容,也就是说没有什么公式了,从这篇之后会逐渐给大家带进数学的世界~
LocalMaping 线程
该线程中的 KeyFrame 是通过 Tracking 线程送进来的
第一个函 数的作用是检查这个队列是否为空队列,若是为空阻塞,不为空继续走
第二个函数: ProcessNewKeyFrame() 主要作用是更新关键点与关键帧的关联,确定哪些关键点与关键帧是有关系的。
第三个部分,用来剔除不好的观测点。 三个原则:
a. 关键点质量不好的点
b. 应该观测到,但是没有观测到的比值,若是小于 25% 则被认为是不好的点。
c. 观测到该点的关键帧的数量太少。
第四部分,运动过程中,共同观测到匹配点,通过三角化恢复一些 MapPoints ,单目通过三角化的方法生成,而双目通过反投影的方法。
第五部分, MapPoints 融合,如下图所示:
该过程中,首先判断生成的关键点与原有的点的位置是否重合,若是重合或接近进行优化,在ORB-SLAM
中多数点被做移除,通过原始的估计出移动的位姿状态,并把不好的剔除掉,通过这个过程会把匹配点做的越来越少,则单目通过三角化,双目通过反投影的方式进行新的MapPoint
的创建。
以上五步是一个循环的步骤,然后进行局部优化处理,然后对关键帧进行剔除,保留下90%
的MapPoints
点能被的关键帧(至少三个)观测到被保留。
LoopClosing
线程(闭环检测)
该线程的数据主要是通过LocalMapping
送进来的
首先去取出一帧进行处理,检查当前帧是否距离上一次的闭环检测超过 10 帧,若是超过,继续下一次的闭环检测。主要过程是根据当前帧相连的,使用 BOW 算法计算当前的最低得分。主要是为了算出一个阈值,进行自适应处理,如下图所示的一个连接分组的形式。
1 2 3 4 10 都是闭环的候选帧,则通过图可以在,节点 1 与 2 、 3 相连 所以 1 与 3 、 3 为一组,以此类推。最后 10 为单独的一组。
算出最低分之后,以最低分作为阈值,进行闭环检测,若是小于该组的最低得分,则被认为不是闭环的候选位置。如下所示,是闭环候选帧的检测流程。
检测闭环的过程可以概述为如下过程:
最后处理完事了,还有许多的帧,然后进行连续性检测,若是连续的三是相邻的,则被认为是回环的点。然后继续优化的过程,主要使用 Sim3 算法进行优化。
下一篇SIM(3)算法哦!!! 接受数学的洗礼吧!!