《视觉SLAM十四讲》-- 视觉里程计 1(上)

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 IpT 或大于 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,yBxpyqI(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} p1KP,p2K(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=Kx1p2=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=K1p1x2=K1p2(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} x2Rx1+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=K1p2K1K(RP+t)RP+tRK1p1+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} tx2tRx1(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} x2Ttx2x2TtRx1(6-7)
观察左侧, t ∧ x 2 \boldsymbol{t}^{\wedge}\boldsymbol{x}_{2} tx2 是一个与 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} x2TtRx1=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} p2TKTtRK1p1=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=tR
F = K − T E K − 1 \boldsymbol{F}=\boldsymbol{K^{-T}}\boldsymbol{E}\boldsymbol{K^{-1}} F=KTEK1
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} u21u11u22u12u28u18u21v11u22v12u28v18u21u22u28v21u11v22u12v28u18v21v11v22v12v28v18v21v22v28u11u12u18v11v12v18111 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} t1t2=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} p2K(RP+t)K(RP+t(dnTP))K(RdtnT)PK(RdtnT)K1p1(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} p2Hp1(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+h3h7u1u2h8v1u2=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+h6h7u1v2h8v1v2=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} u110u120u130u140v110v120v130v140101010100u110u120u130u140v110v120v130v1401010101u11u21u11v21u12u22u12v22u13u23u13v23u14u24u14v24v11u21v11v21v12u22v12v22v13u23v13v23v14u24v14v24 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} eminAe22=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} s2x2x2=0=s1x2Rx1+x2t(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)。

### 视觉SLAM中的视觉里程计实现原理与应用 #### 1. 视觉里程计概述 视觉里程计(Visual Odometry, VO)是一种通过连续帧间的特征匹配来估计相机运动的技术。在视觉SLAM系统中,VO的主要目标是从图像序列中计算摄像机的相对位姿变化[^2]。 #### 2. 直接法原理 直接法是视觉里程计的一种重要方法,其核心思想是利用像素亮度的一致性假设,在相邻帧间寻找最佳的光度误差最小化位置。这种方法不需要显式的特征提取和描述子匹配过程,而是直接操作灰度值或深度信息。 #### 3. 对极几何的应用 对极几何提供了两视图之间的几何约束条件,这种约束独立于场景的具体结构,仅由相机的内部参数和外部参数决定。通过对极约束可以有效减少候选匹配点的数量,从而提高匹配精度并降低计算复杂度[^4]。 #### 4. 应用实例 一个典型的基于直接法的双目SLAM系统可能包含以下几个部分:初始化阶段完成尺度恢复;跟踪阶段实时更新当前帧相对于参考帧的姿态;局部地图维护优化轨迹一致性以及回环检测消除累积漂移等问题[^1]。 ```python import numpy as np def compute_relative_pose(prev_img, curr_img): """ 计算两个连续图像帧之间的相对姿态变换矩阵T。 参数: prev_img (np.ndarray): 前一帧图像数据 curr_img (np.ndarray): 当前帧图像数据 返回: T (np.ndarray): 从prev到curr的转换矩阵(4x4齐次坐标形式) """ # 这里省略具体算法细节... pass # 示例调用 previous_image = load_image('frame_0.png') current_image = load_image('frame_1.png') relative_transform = compute_relative_pose(previous_image, current_image) print("Relative Pose:\n", relative_transform) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值