转载自 一起研究ORB-SLAM(二)
上一篇文章我讲述就ORB-SLAM的基本流程,还记得ORB-SLAM分为哪三个主要的线程吗?在脑子里头大声的所出来吧,Tracking、LOCAL MAPPING 和 LOOP CLOSING,今天就要讲述第一个线程的所带个大家的故事。
一起研究ORB-SLAM(一)--结构和入口小莱姆:师兄,我也想知道我是怎么样工作的,能否将的通俗一点,少点公式,多点初学者能明白的语言吧!!
今天详细的写一下关于 Tracking 线程的内容,该线程共分为五个部分,分别是对帧的初始化,相机位姿跟踪、地图局部跟踪、是否生成关键帧和生成关键帧五个部分,主要流程如下图所示的几个过程。
初始化:
初始化的过程主要含有两个方法,分别是对双目或 RGBD 和单目初始化的过程,其中第一个方法 SteroInitialzation 主要是对双目和 RGBD ,而 MonocularIntialzation 是对单目进行初始化的。
相机位姿跟踪(主要是针对两个关键帧之间的优化):
该部分的代码量占了将近源代码的二分之一,所示是很重的部分 !!!
该部分主要的两个方法是对用户界面操作的时候时使用,默认是采用第一种方法,第二种方法是进行跟踪与定位。不进行地图的构建。第一种方法主要是开启建图和跟踪的工作,其中位姿跟踪的方法共分为两种,分别是分别是匀速模型跟踪和关键帧模型跟踪,分别对应的方法是 TrackWithMotionModel 和 TrackReferenceKeyFram ,下图的第一附 = 张图片是匀速模型,该模型主要默认第 K 帧的几机帧是匀速的,所以Δ R k-1 约等于 Δ R k 然后使用 g2o 进行投影优化得到一个比较稳定的值。 关键帧使用的情况是当匀速模型失败的时候,如下图第二幅所示,当参考帧是 KF 的时候, F k 默认自己的位姿和参考帧的位姿相同,从而进行优化。
若是图片的跟踪失败,触发重定位函数,进行帧的重定位,重定位主要使用 EPNP 方法继续求解。
步骤如下:
1. 首先通过 BOW 继续搜索,搜索到一个比较可靠关键帧,然后继续 EPNP 求解。
2. EPNP 过程:假设在世界坐标系下有 N 个 3D 点 Piw 从其中选择 4 个控制点,选择的规则是 质心 和 使用 PCA 算法在三个主方向上个选一个。
3. 使用之前的每个 3D 点找到 4 个选取值对应的 a j 点,使得
上面计算的是在世界坐标系下,但是在相机坐标系下依然要满足于上述的等式:
只要求出相机坐标系下的 p i c 和 c j c 即可。
根据投影模型,就可以的到下面的式子,其中λ为尺度 P 为相机的内参矩阵。
通过等式的分解,尺度λ可以约掉,就可以得得到下面的两组等式。
可以把上面的两个式子写成 MX = 0
然后进行特征值分解 M 矩阵!!! 其种 N 值可以选择 4 种,分别是 1 2 3 4 ORB-SLAM 中采用的是 3.
在求解的过程中,可以认为四个控制点的距离是不变的,故而可以通过四个参考点进行两两组合,求出 6 个对应的距离,所以根据尺度的不变性,可以的出如下的约束。然后使用高斯牛顿法进行错误率的优化,之后得出正确的点值。
局部地图跟踪(附近跟自己有关的关键帧优化):
优化的是局部的,跟自己有关系的关键帧,优化
方法 1 : UpdateLocalMap()
该方法主要是找到自己有关的关键帧,形成一个集合并找到对应的关键点
方法 2 : SearchLoalPoints()
获取局部地图与当前帧的匹配
方法 3 : PoseOptimization()
优化当前的位姿
三个方法主要是为了弥补位姿跟踪过程中产生的不足。
是否生成对应的关键帧
三个关键条件: 很长时间没有插入关键帧 局部地图空闲 跟踪快要失败的时候
最后生成关键帧
主要方法是 KeyFrame( 当前关键帧,地图管理器,关键帧数据库 );
小莱姆:师兄,我终于看明白了,一些公式还是很简单的,但是还要回去补习数学知识