ORB-SLAM (四)Initializer单目初始化

一. 通过对极约束并行计算F和H矩阵初始化

  VO初始化目的是为了获得准确的帧间相对位姿,并通过三角化恢复出初始地图点。初始化方法要求适用于不同的场景(特别是平面场景),并且不要进行人为的干涉,例如选取视差大(large parallax)的场景(视差大代表相机移动会带来明显的图像变化,通常距离相机距离越远,距离相机光轴越近,视差越小)。ORB-SLAM中并行计算了适用于平面场景的单应性矩阵H和一般场景下的基础矩阵F,然后通过打分选取合适的。ORB-SLAM的初始化要求是比较高的,只有在确定初始化安全的情况下,才会去初始化。

首先复习一下对极约束

F矩阵适用于3D点不共面的情况,我们以左侧相机为参考系,约定

相机内参K,

空间点坐标P = [X, Y, Z]T; 齐次坐标为[X, Y, Z, 1]T

在Z=1归一化平面上的坐标为xi = [X/Z, Y/Z, 1]T,i=1, 2

图像平面坐标为pi = [u, v],i=1, 2; 齐次坐标为[u, v, 1]

可以推出pi = Kxi

对极约束就是满足:

p2K-T t^R K-1 p1=0

x2t^R x1 = 0

其中 E = t^R 称为本质矩阵(Essential Matrix),F = K-T t^R K-1基础矩阵(Fundamental Matrix),根据匹配点的坐标p1, p2可以计算出F矩阵和E矩阵,E矩阵可以通过8点法求解线性方程组得到,然后通过对E矩阵奇异值分解E = UΣVT,注意其中奇异值应该是[σ, σ, 0]的形式,表示图像仅在2维空间中经过了缩放。如果发现获得奇异值不满足,需要将矩阵投影到E所满足的流形上。最后通过U, Σ, V计算出t和R

H矩阵适用于3D点共面的情况

设P点所在平面满足 nTP+d=0

将其结合对极约束p2 = K(RP+t)

可以得到H矩阵与匹配点坐标p1,p2之间的关系,同样可以通过求解线性方程然后分解矩阵的方法来获取t和R

二. 步骤

1. 在金字塔0层上提取特征点,匹配前后两帧,得到像素坐标下的匹配点。

2. 并行计算H矩阵和F矩阵,其中H矩阵使用归一化的DLT(直接线性变换)方法,F矩阵使用8-点法,具体可以参考[1], H矩阵使用8个点,F矩阵使用4个点,迭代次数设定为相同,打分机制也设定平衡。

3. 如果场景接近平面,或者视差较小,可以使用单应性矩阵来解释。通过打分机制选择模型。

4. 利用选择的模型,恢复运动和地图点。分解H矩阵可以恢复出8种姿态,SVD分解E矩阵也可以恢复出4种姿态,通过深度值以及场景的先验信息,一般可以得到唯一满足要求的。但是小视角情况下会出现判断错误的情况出现,因此ORB-SLAM中选择使用这些备选姿态直接三角化出地图点,再通过视角,深度以及重投影误差来判定是否有唯一解,若没有,则放弃,重新回到第一步去初始化。

5. 若初始化成功,则进行GlobalBundleAdjustment

相比于PTAM和LSD-SLAM,ORB在NewCollege的室外平面场景中初始化鲁棒性是比较出色的。

[1] 高翔,视觉SLAM十四讲

posted @ 2017-03-03 13:58  徐尚  阅读(...)  评论(...编辑  收藏