天天看点

一起研究ORB-SLAM(二)---Tracking线程

转载自 一起研究ORB-SLAM(二)

上一篇文章我讲述就ORB-SLAM的基本流程,还记得ORB-SLAM分为哪三个主要的线程吗?在脑子里头大声的所出来吧,Tracking、LOCAL MAPPING 和 LOOP CLOSING,今天就要讲述第一个线程的所带个大家的故事。 

一起研究ORB-SLAM(一)--结构和入口  

小莱姆:师兄,我也想知道我是怎么样工作的,能否将的通俗一点,少点公式,多点初学者能明白的语言吧!! 

今天详细的写一下关于 Tracking  线程的内容,该线程共分为五个部分,分别是对帧的初始化,相机位姿跟踪、地图局部跟踪、是否生成关键帧和生成关键帧五个部分,主要流程如下图所示的几个过程。

一起研究ORB-SLAM(二)---Tracking线程

初始化:  

初始化的过程主要含有两个方法,分别是对双目或 RGBD 和单目初始化的过程,其中第一个方法 SteroInitialzation 主要是对双目和 RGBD ,而 MonocularIntialzation 是对单目进行初始化的。  

相机位姿跟踪(主要是针对两个关键帧之间的优化):  

该部分的代码量占了将近源代码的二分之一,所示是很重的部分 !!! 

该部分主要的两个方法是对用户界面操作的时候时使用,默认是采用第一种方法,第二种方法是进行跟踪与定位。不进行地图的构建。第一种方法主要是开启建图和跟踪的工作,其中位姿跟踪的方法共分为两种,分别是分别是匀速模型跟踪和关键帧模型跟踪,分别对应的方法是 TrackWithMotionModel 和 TrackReferenceKeyFram ,下图的第一附 = 张图片是匀速模型,该模型主要默认第 K 帧的几机帧是匀速的,所以Δ R k-1  约等于   Δ R k  然后使用 g2o 进行投影优化得到一个比较稳定的值。   关键帧使用的情况是当匀速模型失败的时候,如下图第二幅所示,当参考帧是 KF 的时候, F k 默认自己的位姿和参考帧的位姿相同,从而进行优化。

一起研究ORB-SLAM(二)---Tracking线程
一起研究ORB-SLAM(二)---Tracking线程

若是图片的跟踪失败,触发重定位函数,进行帧的重定位,重定位主要使用 EPNP 方法继续求解。  

步骤如下:  

1.         首先通过 BOW 继续搜索,搜索到一个比较可靠关键帧,然后继续 EPNP 求解。  

2.         EPNP 过程:假设在世界坐标系下有 N 个 3D 点 Piw    从其中选择 4 个控制点,选择的规则是   质心   和   使用 PCA 算法在三个主方向上个选一个。  

3.         使用之前的每个 3D 点找到 4 个选取值对应的 a j   点,使得

一起研究ORB-SLAM(二)---Tracking线程

上面计算的是在世界坐标系下,但是在相机坐标系下依然要满足于上述的等式: 

一起研究ORB-SLAM(二)---Tracking线程

只要求出相机坐标系下的 p i c  和 c j c  即可。  

根据投影模型,就可以的到下面的式子,其中λ为尺度 P 为相机的内参矩阵。

一起研究ORB-SLAM(二)---Tracking线程

通过等式的分解,尺度λ可以约掉,就可以得得到下面的两组等式。

一起研究ORB-SLAM(二)---Tracking线程

可以把上面的两个式子写成 MX = 0

一起研究ORB-SLAM(二)---Tracking线程

然后进行特征值分解 M 矩阵!!!   其种 N 值可以选择 4 种,分别是 1 2 3 4 ORB-SLAM  中采用的是 3.

一起研究ORB-SLAM(二)---Tracking线程

在求解的过程中,可以认为四个控制点的距离是不变的,故而可以通过四个参考点进行两两组合,求出 6 个对应的距离,所以根据尺度的不变性,可以的出如下的约束。然后使用高斯牛顿法进行错误率的优化,之后得出正确的点值。

一起研究ORB-SLAM(二)---Tracking线程

局部地图跟踪(附近跟自己有关的关键帧优化):  

优化的是局部的,跟自己有关系的关键帧,优化  

方法 1 : UpdateLocalMap()   

该方法主要是找到自己有关的关键帧,形成一个集合并找到对应的关键点  

方法 2 : SearchLoalPoints() 

获取局部地图与当前帧的匹配  

方法 3 : PoseOptimization() 

优化当前的位姿  

三个方法主要是为了弥补位姿跟踪过程中产生的不足。  

是否生成对应的关键帧  

三个关键条件:   很长时间没有插入关键帧   局部地图空闲    跟踪快要失败的时候  

最后生成关键帧  

主要方法是 KeyFrame( 当前关键帧,地图管理器,关键帧数据库 ); 

小莱姆:师兄,我终于看明白了,一些公式还是很简单的,但是还要回去补习数学知识

继续阅读