文章目录
06 视觉里程计 1
一个 SLAM 系统分为前端和后端,前端也称为视觉里程计,它根据相邻图像的信息估计出粗略的相机运动,给后端提供较好的初始值。包括特征点法和直接法两大类。
6.1 特征点法
(1)视觉 SLAM 中,将图像特征点作为路标,从而估计出相机的运动。
(2)特征点是图像中具有代表性的部分,他应该能在光照、视角发生少量变化时仍能保持一致。
-
可重复性
-
可区别性
-
高效性
-
本地性
(3)特征点由关键点(位置、大小、方向)和描述子(特征点周围的图像信息)组成。
(4)SIFT、FAST、ORB 特征,下面以 ORB 特征为例作简要介绍。
6.1.1 特征提取
(1)ORB 特征包括 Oriented FAST 关键点和 BRIEF 描述子两部分。
(2)FAST 角点主要检测局部像素灰度变化明显的地方,具体步骤为:
-
在图像中选取像素 p p p, 假设其亮度为 I p I_p Ip;
-
设置一个阈值 T T T(比如 I P I_P IP 的20%);
-
以像素 p p p 为中心,选取半径为 3 的圆上的 16 个像素点;
-
若圆上有连续 N N N 个像素点的灰度值小于 I p − T I_p-T Ip−T 或大于 I p + p I_p + p Ip+p ,则认为像素 p p p 为特征点。( N N N 通常取12 即 FAST-12,其他还有 9 和 11。)
-
重复以上步骤,依次遍历每个像素。
(3)FAST 关键点还包括旋转信息,即特征点附近的图像灰度质心,具体算法为:
- 在一个小的图像块 B 中,定义图像的矩为
m p q = ∑ x , y ∈ B x p y q I ( x , y ) , p , q = { 0 , 1 } m_{p q}=\sum_{x, y \in B} x^{p} y^{q} I(x, y), \quad p, q=\{0,1\} mpq=x,y∈B∑xpyqI(x,y),p,q={0,1}
- 计算图像的质心
C = ( m 10 m 00 , m 01 m 00 ) C=(\frac{m_{10}}{m_{00}}, \frac{m_{01}}{m_{00}}) C=(m00m10,m00m01)
- 连接图像块 B 的几何中心 O 和 质心 C,得到向量 O C → \overrightarrow{O C} OC,则特征点的方向可以定义为
θ = arctan ( m 01 / m 10 ) \theta=\arctan(m_{01}/m_{10}) θ=arctan(m01/m10)
(4)BRIEF 是一种二进制描述子,由 0 和 1 组成。在关键点附近区域内,按照一定规则或随机选取 128 对像素点(如 p p p 和 q q q ),若 p > q p>q p>q 则取 1,反之取 0,最终得到一个 128 维由 0、1 组成的向量。
6.1.2 特征匹配
(1)汉明距离:两个二进制串之间的汉明距离,指的是其不同位数的个数。
(2)假设两张图像 I 1 I_1 I1 和 I 2 I_2 I2 经上述特征点提取后,分别得到特征点 x 1 m , m = 1 , 2 , . . . , M x_1^{m}, m=1,2,...,M x1m,m=1,2,...,M、 x 1 n , m = 1 , 2 , . . . , N x_1^{n}, m=1,2,...,N x1n,m=1,2,...,N。最简单的匹配算法是暴力匹配,即计算每一个特征点 x 1 m x_1^{m} x1m 与所有的 x 1 n x_1^{n} x1n 的汉明距离,然后排序,取最近的一个作为匹配点。
6.1.3 计算相机运动
有了匹配好的点对,接下来就需要根据点对估计相机的运动。
(1)如果只有两个单目图像,得到 2D-2D 间的关系,用对极几何解决;
(2)如果匹配的是帧(2D)和地图(3D),则得到 3D-2D 的关系,通过 PnP 求解;
(3)如果匹配的是 RGB-D 图像,则得到 3D-3D 间的关系,用 ICP 求解。
6.2 2D-2D:对极几何
6.2.1 对极约束
如上图所示, O 1 O_1 O1 、 O 2 O_2 O2 分别为相机光心, p 1 p_1 p1、 p 2 p_2 p2 为成像平面上的一对匹配特征点。 O 1 O 2 P O_1O_2P O1O2P 称为极平面; O 1 O 2 O_1O_2 O1O2 连线与成像平面 I 1 I_1 I1 、 I 2 I_2 I2 的交点 e 1 e_1 e1 、 e 2 e_2 e2 称为极点; l 1 l_1 l1 、 l 2 l_2 l2 称为极线; O 1 O 2 O_1O_2 O1O2 为基线。
以第一帧图像为基础,经旋转 R \boldsymbol{R} R、平移 t \boldsymbol{t} t 得到第二帧图像。
(1)在实践中, p 1 p_1 p1 和 p 2 p_2 p2 可通过特征匹配得到,空间点 P P P 未知, e 1 e_1 e1 、 e 2 e_2 e2 未知;我们希望求出变换矩阵 T 12 \boldsymbol{T_{12}} T12。
(2)我们直接以第一帧的坐标系为世界坐标系(这样省去了第一帧世界坐标系和相机坐标系的转换),空间点 P P P 的坐标为 [ X , Y , Z ] T [X, Y, Z]^T [X,Y,Z]T,则其与 p 1 p_1 p1 、 p 2 p_2 p2 关系为
s 1 p 1 = K P , s 1 p 2 = K ( R P + t ) (6-1) s_1\boldsymbol{p_1}=\boldsymbol{KP}, s_1\boldsymbol{p_2}=\boldsymbol{K(RP+t)} \tag{6-1} s1p1=KP,s1p2=K(RP+t)(6-1)
这里 s 1 s_1 s1、 s 2 s_2 s2 为深度(也就是 Z Z Z)。为便于表达,我们将上述投影关系记为
p 1 ≃ K P , p 2 ≃ K ( R P + t ) (6-2) \boldsymbol{p}_{1} \simeq \boldsymbol{K} \boldsymbol{P}, \quad \boldsymbol{p}_{2} \simeq \boldsymbol{K}(\boldsymbol{R P}+\boldsymbol{t}) \tag{6-2} p1≃KP,p2≃K(RP+t)(6-2)
由归一化坐标 x 1 \boldsymbol{x_1} x1、 x 2 \boldsymbol{x_2} x2 到像素坐标 p 1 \boldsymbol{p_1} p1、 p 2 \boldsymbol{p_2} p2,有
p 1 = K x 1 , p 2 = K x 2 (6-3) \boldsymbol{p_1}=\boldsymbol{Kx_1},\boldsymbol{p_2}=\boldsymbol{Kx_2} \tag{6-3} p1=Kx1,p2=Kx2(6-3)
也即
x
1
=
K
−
1
p
1
,
x
2
=
K
−
1
p
2
(6-4)
\boldsymbol{x_1}=\boldsymbol{K^{-1}p_1},\boldsymbol{x_2}=\boldsymbol{K^{-1}p_2} \tag{6-4}
x1=K−1p1,x2=K−1p2(6-4)
结合式(6-2)、(6-3)、(6-4),得到
x 2 ≃ R x 1 + t (6-5) \boldsymbol{x}_{2} \simeq \boldsymbol{R x_1}+\boldsymbol{t} \tag{6-5} x2≃Rx1+t(6-5)
推导过程:
x 2 = K − 1 p 2 ≃ K − 1 K ( R P + t ) ≃ R P + t ≃ R K − 1 p 1 + t ≃ R x 1 + t \begin{aligned} \boldsymbol{x_2}&=\boldsymbol{K^{-1}p_2}\\ \simeq &\boldsymbol{K^{-1}}\boldsymbol{K}(\boldsymbol{R P}+\boldsymbol{t}) \\ \simeq &\boldsymbol{R P}+\boldsymbol{t}\\ \simeq &\boldsymbol{R}\boldsymbol{K}^{-1}\boldsymbol{p}_1+\boldsymbol{t}\\ \simeq &\boldsymbol{Rx}_1+\boldsymbol{t} \end{aligned} x2≃≃≃≃=K−1p2K−1K(RP+t)RP+tRK−1p1+tRx1+t
注意,这里只是尺度意义相等,因为还相差一个缩放关系。
左乘 t ∧ \boldsymbol{t}^{\wedge} t∧,得
t ∧ x 2 ≃ t ∧ R x 1 (6-6) \boldsymbol{t}^{\wedge}\boldsymbol{x}_{2} \simeq \boldsymbol{t}^{\wedge}\boldsymbol{R x_1} \tag{6-6} t∧x2≃t∧Rx1(6-6)
再同时左乘 x 2 T \boldsymbol{x_2^T} x2T,即
x
2
T
t
∧
x
2
≃
x
2
T
t
∧
R
x
1
(6-7)
\boldsymbol{x_2^T}\boldsymbol{t}^{\wedge}\boldsymbol{x}_{2} \simeq \boldsymbol{x_2^T}\boldsymbol{t}^{\wedge}\boldsymbol{R x_1} \tag{6-7}
x2Tt∧x2≃x2Tt∧Rx1(6-7)
观察左侧,
t
∧
x
2
\boldsymbol{t}^{\wedge}\boldsymbol{x}_{2}
t∧x2 是一个与
t
\boldsymbol{t}
t 和
x
2
\boldsymbol{x}_{2}
x2 都垂直的向量(相当于叉乘),它再和
x
2
\boldsymbol{x}_{2}
x2 做内积(点乘)时,结果为零,也就是说
x 2 T t ∧ R x 1 = 0 (6-8) \boldsymbol{x_2^T}\boldsymbol{t}^{\wedge}\boldsymbol{R x_1}=0 \tag{6-8} x2Tt∧Rx1=0(6-8)
这就是对极约束。
将式(6-4)代入上式
p 2 T K − T t ∧ R K − 1 p 1 = 0 (6-9) \boldsymbol{p_2^TK^{-T}}\boldsymbol{t}^{\wedge}\boldsymbol{RK^{-1}p_1}=0 \tag{6-9} p2TK−Tt∧RK−1p1=0(6-9)
至此,容易看出,我们只需要知道两张图的像素坐标以及相机内参即可求出相机运动 R \boldsymbol{R} R、 t \boldsymbol{t} t。
将中间部分分别记为:基础矩阵 F \boldsymbol{F} F 和本质矩阵 E \boldsymbol{E} E,即
E
=
t
∧
R
\boldsymbol{E}=\boldsymbol{t}^{\wedge}\boldsymbol{R}
E=t∧R
F
=
K
−
T
E
K
−
1
\boldsymbol{F}=\boldsymbol{K^{-T}}\boldsymbol{E}\boldsymbol{K^{-1}}
F=K−TEK−1
x
2
T
E
x
1
=
p
2
T
F
p
1
=
0
(6-10)
\boldsymbol{x_2^T}\boldsymbol{E}\boldsymbol{x_1}=\boldsymbol{p_2^T}\boldsymbol{F}\boldsymbol{p_1}=0 \tag{6-10}
x2TEx1=p2TFp1=0(6-10)
(3)根据以上推导,相机位姿估计问题简化为以下两步:
-
根据匹配点的像素坐标和相机内参求出本质矩阵 E \boldsymbol{E} E;
-
由本质矩阵求出 R \boldsymbol{R} R 和 t \boldsymbol{t} t。
6.2.2 本质矩阵
(1)已知旋转和平移各有 3 个自由度,但由于尺度等价性( E \boldsymbol{E} E 任意缩放,对极几何均成立), E \boldsymbol{E} E 有 5 个自由度。
(2)理论上最少 5 对点即可求解,但由于其非线性性质,一般将它当做普通矩阵,那么就有 8 个自由度,因此采用 八点法 求解。
(3)假设一对匹配点的 归一化坐标 为 [ u 1 , v 1 , 1 ] T [u_1,v_1,1]^T [u1,v1,1]T、 [ u 1 , v 1 , 1 ] T [u_1,v_1,1]^T [u1,v1,1]T,根据对极约束,有
[ u 2 , v 2 , 1 ] [ e 1 e 2 e 3 e 4 e 5 e 6 e 7 e 8 e 9 ] [ u 1 v 1 1 ] = 0 (6-11) \left[u_{2}, v_{2}, 1\right]\left[\begin{array}{lll} e_{1} & e_{2} & e_{3} \\ e_{4} & e_{5} & e_{6} \\ e_{7} & e_{8} & e_{9} \end{array}\right]\left[\begin{array}{c} u_{1} \\ v_{1} \\ 1 \end{array}\right]=0 \tag{6-11} [u2,v2,1] e1e4e7e2e5e8e3e6e9 u1v11 =0(6-11)
把 E \boldsymbol{E} E 展开,写成列向量的形式
e = [ e 1 , e 2 , e 3 , e 4 , e 5 , e 6 , e 7 , e 8 , e 9 ] T \boldsymbol{e}=[e_1, e_2,e_3,e_4,e_5,e_6,e_7,e_8,e_9]^T e=[e1,e2,e3,e4,e5,e6,e7,e8,e9]T
将式(6-11)展开,并写成以下形式
[ u 2 u 1 , u 2 v 1 , u 2 , v 2 u 1 , v 2 v 1 , v 2 , u 1 , 1 ] ⋅ e = 0 (6-12) [u_2u_1, u_2v_1, u_2, v_2u_1, v_2v_1,v_2, u_1, 1]\cdot\boldsymbol{e}=0 \tag{6-12} [u2u1,u2v1,u2,v2u1,v2v1,v2,u1,1]⋅e=0(6-12)
将所有 8 个点表达式联立为线性方程组
( u 2 1 u 1 1 u 2 1 v 1 1 u 2 1 v 2 1 u 1 1 v 2 1 v 1 1 v 2 1 u 1 1 v 1 1 1 u 2 2 u 1 2 u 2 2 v 1 2 u 2 2 v 2 2 u 1 2 v 2 2 v 1 2 v 2 2 u 1 2 v 1 2 1 ⋮ ⋮ ⋮ ⋮ ⋮ ⋮ ⋮ ⋮ u 2 8 u 1 8 u 2 8 v 1 8 u 2 8 v 2 8 u 1 8 v 2 8 v 1 8 v 2 8 u 1 8 v 1 8 1 ) ( e 1 e 2 e 3 e 4 e 5 e 6 e 7 e 8 e 9 ) = 0 (6-13) \left(\begin{array}{ccccccccc} u_{2}^{1} u_{1}^{1} & u_{2}^{1} v_{1}^{1} & u_{2}^{1} & v_{2}^{1} u_{1}^{1} & v_{2}^{1} v_{1}^{1} & v_{2}^{1} & u_{1}^{1} & v_{1}^{1} & 1 \\ u_{2}^{2} u_{1}^{2} & u_{2}^{2} v_{1}^{2} & u_{2}^{2} & v_{2}^{2} u_{1}^{2} & v_{2}^{2} v_{1}^{2} & v_{2}^{2} & u_{1}^{2} & v_{1}^{2} & 1 \\ \vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \\ u_{2}^{8} u_{1}^{8} & u_{2}^{8} v_{1}^{8} & u_{2}^{8} & v_{2}^{8} u_{1}^{8} & v_{2}^{8} v_{1}^{8} & v_{2}^{8} & u_{1}^{8} & v_{1}^{8} & 1 \end{array}\right)\left(\begin{array}{l} e_{1} \\ e_{2} \\ e_{3} \\ e_{4} \\ e_{5} \\ e_{6} \\ e_{7} \\ e_{8} \\ e_{9} \end{array}\right)=0 \tag{6-13} u21u11u22u12⋮u28u18u21v11u22v12⋮u28v18u21u22⋮u28v21u11v22u12⋮v28u18v21v11v22v12⋮v28v18v21v22⋮v28u11u12⋮u18v11v12⋮v18111 e1e2e3e4e5e6e7e8e9 =0(6-13)
(4) E \boldsymbol{E} E 解出来以后,用奇异值分解恢复出矩阵 R \boldsymbol{R} R 和 t \boldsymbol{t} t。设 E \boldsymbol{E} E 的奇异值分解为
E = U Σ V T \boldsymbol{E=U \Sigma V^T} E=UΣVT
其中, U \boldsymbol{U} U 和 V \boldsymbol{V} V 是正交矩阵, Σ \boldsymbol{\Sigma} Σ 是奇异值矩阵。有四种可能的解
t 1 ∧ = U R Z ( π 2 ) Σ U T , R 1 = U R Z T ( π 2 ) V T t 2 ∧ = U R Z ( − π 2 ) Σ U T , R 2 = U R Z T ( − π 2 ) V T (6-14) \begin{aligned} \boldsymbol{t}_{1}^{\wedge} &=\boldsymbol{U} \boldsymbol{R}_{Z}\left(\frac{\pi}{2}\right) \boldsymbol{\Sigma} \boldsymbol{U}^{\mathrm{T}}, \quad \boldsymbol{R}_{1}=\boldsymbol{U} \boldsymbol{R}_{Z}^{\mathrm{T}}\left(\frac{\pi}{2}\right) \boldsymbol{V}^{\mathrm{T}} \\ \boldsymbol{t}_{2}^{\wedge} &=\boldsymbol{U} \boldsymbol{R}_{Z}\left(-\frac{\pi}{2}\right) \boldsymbol{\Sigma} \boldsymbol{U}^{\mathrm{T}}, \quad \boldsymbol{R}_{2}=\boldsymbol{U} \boldsymbol{R}_{Z}^{\mathrm{T}}\left(-\frac{\pi}{2}\right) \boldsymbol{V}^{\mathrm{T}} \end{aligned} \tag{6-14} t1∧t2∧=URZ(2π)ΣUT,R1=URZT(2π)VT=URZ(−2π)ΣUT,R2=URZT(−2π)VT(6-14)
其中, R Z ( π 2 ) \boldsymbol{R}_Z(\frac{\pi}{2}) RZ(2π) 表示沿 Z Z Z 轴旋转得到的旋转矩阵。
图中,蓝色线为相机,红色点为空间点 P P P 的投影,在其相对位置不变的情况下,有四种可能的情况,但只有第一种,相机有正的深度。因此,只要将任意一点代入四个解中,检测该点在两个相机下的深度,就可确定正确的解。
(5)上面我们是将 E \boldsymbol{E} E 看做普通矩阵进行求解并 SVD 分解,那么,由于没有考虑其内在约束关系,分解出来的奇异值矩阵可能并不是 [ σ , σ , 0 ] T [\sigma, \sigma, 0]^T [σ,σ,0]T ,而是 [ σ 1 , σ 2 , σ 3 ] T [\sigma_1, \sigma_2, \sigma_3]^T [σ1,σ2,σ3]T ,需要将其调整为以下形式:
E = U diag ( σ 1 + σ 2 2 , σ 1 + σ 2 2 , 0 ) V T (6-15) \boldsymbol{E}=\boldsymbol{U} \operatorname{diag}\left(\frac{\sigma_{1}+\sigma_{2}}{2}, \frac{\sigma_{1}+\sigma_{2}}{2}, 0\right) \boldsymbol{V}^{\mathrm{T}} \tag{6-15} E=Udiag(2σ1+σ2,2σ1+σ2,0)VT(6-15)
当然,由于 E \boldsymbol{E} E 具有尺度不变性,可将奇异值矩阵直接取为 d i a g ( 1 , 1 , 0 ) diag(1,1,0) diag(1,1,0)。
(6)八点法的讨论
-
用于单目 SLAM 的初始化(必须有平移,否则 E \boldsymbol{E} E 等于零)
-
对于纯旋转问题,无法求解
6.2.3 单应矩阵
若场景中的特征点都位于同一平面上(墙、地面等),本质矩阵 E \boldsymbol{E} E 便会退化,此时可通过单应矩阵 H \boldsymbol{H} H 进行运动估计。
在相机坐标系下(光心为原点),假设平面 单位法向量 为 n \boldsymbol{n} n, 且平面到原点的距离为 d d d, P \boldsymbol{P} P 为平面上某点。则平面可写成(回忆一下点到平面的距离及其表达):
n T P + d = 0 (6-16) \boldsymbol{n^TP}+d=0 \tag{6-16} nTP+d=0(6-16)
整理,得
− n T P d = 1 (6-17) -\frac{\boldsymbol{n^TP}}{d}=1 \tag{6-17} −dnTP=1(6-17)
结合式(6-2),并将上式代入
p 2 ≃ K ( R P + t ) ≃ K ( R P + t ⋅ ( − n T P d ) ) ≃ K ( R − t n T d ) P ≃ K ( R − t n T d ) K − 1 p 1 (6-18) \begin{aligned} \boldsymbol{p_{2}} & \simeq \boldsymbol{K}(\boldsymbol{R P}+\boldsymbol{t}) \\ & \simeq \boldsymbol{K}\left(\boldsymbol{R P}+\boldsymbol{t} \cdot\left(-\frac{\boldsymbol{n}^{\mathrm{T}} \boldsymbol{P}}{d}\right)\right) \\ & \simeq \boldsymbol{K}\left(\boldsymbol{R}-\frac{\boldsymbol{t} \boldsymbol{n}^{\mathrm{T}}}{d}\right) \boldsymbol{P} \\ & \simeq \boldsymbol{K}\left(\boldsymbol{R}-\frac{\boldsymbol{t} \boldsymbol{n}^{\mathrm{T}}}{d}\right) \boldsymbol{K}^{-1} \boldsymbol{p}_{1} \end{aligned} \tag{6-18} p2≃K(RP+t)≃K(RP+t⋅(−dnTP))≃K(R−dtnT)P≃K(R−dtnT)K−1p1(6-18)
至此,我们得到了两帧图像特征点 p 1 \boldsymbol{p_1} p1、 p 2 \boldsymbol{p_2} p2 之间的对应关系,将中间部分记为 H \boldsymbol{H} H,则
p 2 ≃ H p 1 (6-19) \boldsymbol{p_{2}} \simeq \boldsymbol{H} \boldsymbol{p_{1}} \tag{6-19} p2≃Hp1(6-19)
(2)类似本质矩阵求解,将上式写成下面的形式
[ u 2 v 2 1 ] ≃ [ h 1 h 2 h 3 h 4 h 5 h 6 h 7 h 8 h 9 ] [ u 1 v 1 1 ] (6-20) \left[\begin{array}{c} u_{2} \\ v_{2} \\ 1 \end{array}\right] \simeq \left[\begin{array}{lll} h_{1} & h_{2} & h_{3} \\ h_{4} & h_{5} & h_{6} \\ h_{7} & h_{8} & h_{9} \end{array}\right]\left[\begin{array}{c} u_{1} \\ v_{1} \\ 1 \end{array}\right] \tag{6-20} u2v21 ≃ h1h4h7h2h5h8h3h6h9 u1v11 (6-20)
解得
u
2
=
h
1
u
1
+
h
2
v
1
+
h
3
h
7
u
1
+
h
8
v
1
+
h
9
u_{2}=\frac{h_{1} u_{1}+h_{2} v_{1}+h_{3}}{h_{7} u_{1}+h_{8} v_{1}+h_{9}}
u2=h7u1+h8v1+h9h1u1+h2v1+h3
v
2
=
h
4
u
1
+
h
5
v
1
+
h
6
h
7
u
1
+
h
8
v
1
+
h
9
v_{2}=\frac{h_{4} u_{1}+h_{5} v_{1}+h_{6}}{h_{7} u_{1}+h_{8} v_{1}+h_{9}}
v2=h7u1+h8v1+h9h4u1+h5v1+h6
实际处理中,可以令 h 9 = 1 h_9=1 h9=1 。整理,得
h
1
u
1
+
h
2
v
1
+
h
3
−
h
7
u
1
u
2
−
h
8
v
1
u
2
=
u
2
h_{1} u_{1}+h_{2} v_{1}+h_{3}-h_{7}u_{1}u_2-h_{8}v_{1}u_2=u_2\\
h1u1+h2v1+h3−h7u1u2−h8v1u2=u2
h
4
u
1
+
h
5
v
1
+
h
6
−
h
7
u
1
v
2
−
h
8
v
1
v
2
=
v
2
(6-21)
h_{4} u_{1}+h_{5} v_{1}+h_{6}-h_{7}u_{1}v_2-h_{8}v_{1}v_2=v_2 \tag{6-21}
h4u1+h5v1+h6−h7u1v2−h8v1v2=v2(6-21)
这样一对匹配点可以构建两个约束,而单应矩阵有 8 个自由度(由于尺度不变性,可任意缩放,少一个自由度),故至少需要 4 对匹配点才可解出。类似 E \boldsymbol{E} E 的求解过程:
[ u 1 1 v 1 1 1 0 0 0 − u 1 1 u 2 1 − v 1 1 u 2 1 0 0 0 u 1 1 v 1 1 1 − u 1 1 v 2 1 − v 1 1 v 2 1 u 1 2 v 1 2 1 0 0 0 − u 1 2 u 2 2 − v 1 2 u 2 2 0 0 0 u 1 2 v 1 2 1 − u 1 2 v 2 2 − v 1 2 v 2 2 u 1 3 v 1 3 1 0 0 0 − u 1 3 u 2 3 − v 1 3 u 2 3 0 0 0 u 1 3 v 1 3 1 − u 1 3 v 2 3 − v 1 3 v 2 3 u 1 4 v 1 4 1 0 0 0 − u 1 4 u 2 4 − v 1 4 u 2 4 0 0 0 u 1 4 v 1 4 1 − u 1 4 v 2 4 − v 1 4 v 2 4 ] [ h 1 h 2 h 3 h 4 h 5 h 6 h 7 h 8 ] = [ u 2 1 v 2 1 u 2 2 v 2 2 u 2 3 v 2 3 u 2 4 v 2 4 ] (6-22) \left[\begin{array}{cccccccc} u_{1}^{1} & v_{1}^{1} & 1 & 0 & 0 & 0 & -u_{1}^{1} u_{2}^{1} & -v_{1}^{1} u_{2}^{1} \\ 0 & 0 & 0 & u_{1}^{1} & v_{1}^{1} & 1 & -u_{1}^{1} v_{2}^{1} & -v_{1}^{1} v_{2}^{1} \\ u_{1}^{2} & v_{1}^{2} & 1 & 0 & 0 & 0 & -u_{1}^{2} u_{2}^{2} & -v_{1}^{2} u_{2}^{2} \\ 0 & 0 & 0 & u_{1}^{2} & v_{1}^{2} & 1 & -u_{1}^{2} v_{2}^{2} & -v_{1}^{2} v_{2}^{2} \\ u_{1}^{3} & v_{1}^{3} & 1 & 0 & 0 & 0 & -u_{1}^{3} u_{2}^{3} & -v_{1}^{3} u_{2}^{3} \\ 0 & 0 & 0 & u_{1}^{3} & v_{1}^{3} & 1 & -u_{1}^{3} v_{2}^{3} & -v_{1}^{3} v_{2}^{3} \\ u_{1}^{4} & v_{1}^{4} & 1 & 0 & 0 & 0 & -u_{1}^{4} u_{2}^{4} & -v_{1}^{4} u_{2}^{4} \\ 0 & 0 & 0 & u_{1}^{4} & v_{1}^{4} & 1 & -u_{1}^{4} v_{2}^{4} & -v_{1}^{4} v_{2}^{4} \end{array}\right]\left[\begin{array}{l} h_{1} \\ h_{2} \\ h_{3} \\ h_{4} \\ h_{5} \\ h_{6} \\ h_{7} \\ h_{8} \end{array}\right]=\left[\begin{array}{c} u_{2}^{1} \\ v_{2}^{1} \\ u_{2}^{2} \\ v_{2}^{2} \\ u_{2}^{3} \\ v_{2}^{3} \\ u_{2}^{4} \\ v_{2}^{4} \end{array}\right] \tag{6-22} u110u120u130u140v110v120v130v140101010100u110u120u130u140v110v120v130v1401010101−u11u21−u11v21−u12u22−u12v22−u13u23−u13v23−u14u24−u14v24−v11u21−v11v21−v12u22−v12v22−v13u23−v13v23−v14u24−v14v24 h1h2h3h4h5h6h7h8 = u21v21u22v22u23v23u24v24 (6-22)
解出来以后,再恢复出 R \boldsymbol{R} R、 t \boldsymbol{t} t、 n \boldsymbol{n} n、 d d d,常用的方法有数值法和解析法,同样会出现四组可能的解,需要一一排除,只剩下唯一解。
6.2.4 小结
(1)当特征点 共面 或 相机纯旋转 时,使用单应矩阵求解效果更好。实践中,会同时计算出单应矩阵和本质矩阵,选择重投影误差最小的那个作为运动估计矩阵。
(2) E \boldsymbol{E} E 具有尺度等价性,分解得到的 R \boldsymbol{R} R 和 t \boldsymbol{t} t 也有尺度等价性,但由于 R \boldsymbol{R} R 本身有内在约束,我们认为 t \boldsymbol{t} t 有一个尺度,也就是说,无法确定 t \boldsymbol{t} t 的实际大小,它乘以任意倍数,分解都是成立的。因此,我们经常将 t \boldsymbol{t} t 归一化,让它的长度为 1。
(3)对 t \boldsymbol{t} t 归一化相当于固定了尺度。以这时的 t \boldsymbol{t} t 为单位 1,计算相机运动和特征点的 3D 位置,这个过程称为单目 SLAM 初始化。初始化以后,就可以用 3D-2D 计算相机运动了。
(4)单目初始化不能只有纯旋转,必须有一定程度的平移。单目 SLAM 实践中,可以让相机进行左右平移就可实现初始化(这样计算更简单)。
(5)当匹配点多于 8 对时,我们可以计算最小二乘解。对于式(6-13),将左侧系数矩阵记为 A \boldsymbol{A} A:
A e = 0 \boldsymbol{Ae}=0 Ae=0
可以通过最小化一个二次型来求(求出使 A e \boldsymbol{Ae} Ae 值最小的 e \boldsymbol{e} e):
min e ∥ A e ∥ 2 2 = min e e T A T A e \min _{\boldsymbol{e}}\|\boldsymbol{A} \boldsymbol{e}\|_{2}^{2}=\min _{\boldsymbol{e}} \boldsymbol{e}^{\mathrm{T}} \boldsymbol{A}^{\mathrm{T}} \boldsymbol{A} \boldsymbol{e} emin∥Ae∥22=emineTATAe
当可能存在误匹配(错误数据)时,常使用随机采样一致性(RANSAC)来求,而不是最小二乘。
6.3 三角测量
前面我们通过匹配特征点估计出了相机运动,下面还需要根据相机运动估计出特征点的空间位置。在单目 SLAM 中,仅通过单张图像,无法得到深度信息。我们通过 三角测量 估计出点的深度。
(1)以下各点所表达的含义与上面类似:
理论上 O 1 p 1 O_1p_1 O1p1 与 O 2 p 2 O_2p_2 O2p2 会相交于一点 P P P,但实际上由于噪声的存在,二者无法相交。因此可通过最小二乘法求解。
(2)以左图为参考,经变换 T \boldsymbol{T} T 得到右图。假设 x 1 \boldsymbol{x_1} x1 和 x 2 \boldsymbol{x_2} x2 为两个特征点的归一化坐标, P \boldsymbol{P} P 为第一张图像相机坐标系下的空间坐标,有
s 2 x 2 = R P + t = R ( s 1 x 1 ) + t s_2\boldsymbol{x_2}=\boldsymbol{R}\boldsymbol{P}+\boldsymbol{t}=\boldsymbol{R}(s_1\boldsymbol{x_1})+\boldsymbol{t} s2x2=RP+t=R(s1x1)+t
也就得到了书中(这里不太好理解):
s 2 x 2 = s 1 R x 1 + t (6-23) s_2\boldsymbol{x_2}=s_1\boldsymbol{R}\boldsymbol{x_1}+\boldsymbol{t} \tag{6-23} s2x2=s1Rx1+t(6-23)
其中, s 1 s_1 s1 和 s 2 s_2 s2 为深度。先计算 s 2 s_2 s2 ,将上式两侧同乘 x 2 ∧ \boldsymbol{x_2}^{\wedge} x2∧(相当于叉乘),
s 2 x 2 ∧ x 2 = 0 = s 1 x 2 ∧ R x 1 + x 2 ∧ t (6-24) s_2\boldsymbol{x_2}^{\wedge}\boldsymbol{x_2}=0=s_1\boldsymbol{x_2}^{\wedge}\boldsymbol{R}\boldsymbol{x_1}+\boldsymbol{x_2}^{\wedge}\boldsymbol{t} \tag{6-24} s2x2∧x2=0=s1x2∧Rx1+x2∧t(6-24)
右侧可看成关于 s 1 s_1 s1 的方程。我们已知相机内参、两个特征点的像素坐标以及变换矩阵,由式(6-4)容易得到归一化坐标,从而解出 s 1 s_1 s1,再由式(6-23)得到 s 2 s_2 s2。
实际上由于噪声的存在,式(6-24)右侧并不会严格等于零,所以一般情况下都是采用最小二乘法而非直接求解。
(3)三角测量是 平移 得到的(有平移才会有三角形),纯旋转无法得到三角测量。
(4)三角测量的矛盾:如下图所示,当平移很小时,深度( δ d \delta d δd)不确定性较大;也就是说,当平移较大时,三角测量更加精确。
要提高三角化的精度:
-
提高特征点的提取精度,也就是提高图片分辨率,但这样图片会变得很大,增加计算成本;
-
增大平移量,但这样有时图像的外观会发生明显变化(原先被遮挡的部分显现出来) ,导致特征提取和匹配困难。
6.4 3D-2D: PnP
(1)PnP 是求解 3D 到 2D 点对运动的方法,当知道了 n n n 个 3D 空间点及其投影位置时,便可估计出相机位姿。
(2)对极几何至少需要 8 对点才能求解,且存在初始化、纯旋转的问题;而如果两帧图像中一对特征点的 3D 位置已知,最少就只需要 3 对点便可求解。
(3)特征点的 3D 位置可由 RGB-D 相机或三角测量得到。因此,在双目或 RGB-D 视觉里程计中,可直接用 PnP 估计相机运动;在单目视觉里程计中,先用对极几何和三角测量估计出特征点的 3D 位置(也就是初始化),再使用 PnP。
(4)常用求解方法有:P3P、直接线性变换、EPnP、UPnP、光束法平差(BA)。