ORB-SLAM笔记——(2)框架概述

上篇已经提到过,Raulmur博士开源了两版ORB,其中第二版在第一版的基础上加入了双目以及RGBD相机的前端接口,并且在回环模块中增开了全局优化的线程。我们先从第一版的pipeline开始说起。另外要说的是这篇总结主要还是从整体上对架构进行说明,大体介绍每个模块的作用以及模块之间是怎么联系起来的。至于每个模块具体用到的数学方法以及代码实现,咱们后面还会一篇接着一篇的博文慢慢分析,道不阻,但的确很长哈哈哈。

ORB-SLAM笔记——(2)框架概述_第1张图片

整个系统并行跑三个线程:Tracking,LocalMapping以及LoopClosing,一个一个说。

1. Tracking线程

顾名思义,主要负责对每一帧图像进行特征提取,与前一帧图像做特征匹配然后对该帧的相机位姿做一个初步的估计,最后决定当前帧是否是一个关键帧,如果是的话就唤醒局部建图线程。

为什么要对每一帧做关键帧的判别呢?主要因为随着你的机器人越走越远,所看到的东西自然越来越多,如果我们把看到的每一帧都存下来,并在后面对它们进行整体优化,那么整个SLAM系统会变得越来越卡,同时内存也是吃不消的。现在主流的visual SLAM方案,无论特征点法(如ORB)还是直接法(如LSD),再或者像半直接法的SVO(Semi-Direct VO,有的人也称其为稀疏直接法,这么叫是因为这个东西混合使用了直接法和特征点法,只在帧间做image-alignment得到初始位姿估计的时候用到了直接法,在对pose&structure进行优化时,构造的残差方程还是最小化特征点的重投影误差),均为Keyframe-based。

咳咳突然扯远继续说ORB,在对当前帧做位姿初始估计后它不是立即去判断是否为关键帧,而是做一步TrackLocalMap。这一环节用当前帧在局部地图内找到更多的匹配,然后利用邻域的匹配信息,对当前位姿进行优化,并对当前帧的跟踪情况进行更新记录。这部分在后面单独写一篇努力详细地讲清楚,看了很多同道中人的博客,个人感觉是ORB很亮点的一个设计但关注度好像不是很高。

该线程还有一个地图初始化的部分,单目模式用在前两个关键帧三角化出三维点坐标时,ORB在地图初始化上实现了自动化,具体怎么个初始化后面也会讲。

2. LocalMapping线程

该线程维护系统的地图,以单目ORB为例,最早在CreateInitialMapMonocular()中利用找到的头两个KFs进行初始化。在此以后,该线程从tracking线程源源不断地接受KFs,向地图加入新的map points,并删除一些冗余的KFs和map points,从而维护一个稳定的关键帧集合。需要注意的是,!线!!!!!!!!!!!!!化!但先说一句,有优化吗?是有的,我们看框架图,在对冗余关键帧进行删除之前,代码中是做了一步局部BA的,参与优化的是当前帧以及与当前帧相连的关键帧和地图点

 

在说下一线程之前,先放上ORB2的pipeline。

ORB-SLAM笔记——(2)框架概述_第2张图片

这里先讲下前端线程的不同,加入了双目和RGBD的接口,这两种相机就不用再像单目那样较为麻烦的初始化了,双目通过左右目匹配加三角化可以得到三维空间点坐标,深度相机的话就更方便了,直接分分钟获得depth数据。

在ORB2的源码实现中,第四线程FullBA(其实就是globalBA,一个作者一个叫法儿)是在LoopClosing中做完优化EssentialGraph并更新图中边的信息(这后面也细说…..感觉写到这儿挖了一堆坑欠了一屁股债哈哈哈)之后,线程内部唤醒的FullBA线程,所以我们就干脆一块儿说。

3. LoopClosing+FullBA

SLAM系统如果只是考虑图像帧时间上的关联,长久下去必定会有累计误差,后面的估计会变得不可靠,无法得到全局一致的轨迹和地图。回环检测模块能够给出一些除了临近共视帧以外的时间上更加久远的约束。说白了,就是能够检测出,机器绕了一圈儿回来以后,还能认出我来过这件事情。

FullBA相对于之前的局部BA非常好理解,优化对象变为了所有KFs以及map中的点。个人理解,这么做的原因主要是在于回环模块一旦检测出了回环,CorrectLoop这个环节,也就是把后面整体走跑偏的那么一段轨迹往正确方向拉的这个过程,还是一个局部行为。那么全局一致性势必仍会受影响,所以再做了一步全局优化。

 

后面开始,我们就要一个模块接一个地慢慢啃了,接下来先讲单目ORB地图自动初始化的问题。

(欢迎批评指正,若有幸被转发请标明出处)

你可能感兴趣的:(SLAM)