VSLAM学习(三) 单目相机位姿估计

目录
VSLAM学习(一) 三维运动、相机模型、SLAM模型
VSLAM学习(二) 非线性优化
VSLAM学习(三) 单目相机位姿估计
VSLAM学习(四) Bundle Adjustment

一、对极几何约束

相机在不同位姿拍到世界中同一个路标,会有不同的成像位置,如下图所示

VSLAM学习(三) 单目相机位姿估计_第1张图片

世界路标 P \boldsymbol P P,在相机两个不同位姿所拍到的帧 I 1 , I 2 \boldsymbol I_1,\boldsymbol I_2 I1,I2中,分别投影在了 p 1 , p 2 \boldsymbol p_1,\boldsymbol p_2 p1,p2两点。
这两帧时刻,相机的坐标中心点分别为 C 1 , C 2 \boldsymbol C_1,\boldsymbol C_2 C1,C2
e 1 , e 2 \boldsymbol e_1,\boldsymbol e_2 e1,e2分别是这两个时刻中心点在另一帧上的投影

那么很容易看出, p 1 e 1 / / P C 2 \boldsymbol p_1\boldsymbol e_1 // \boldsymbol P\boldsymbol C_2 p1e1//PC2 p 2 e 2 / / P C 1 \boldsymbol p_2\boldsymbol e_2 // \boldsymbol P\boldsymbol C_1 p2e2//PC1

1.1 本质矩阵

P \boldsymbol P P点在 I 1 \boldsymbol I_1 I1帧和 I 2 \boldsymbol I_2 I2帧的坐标系下的向量坐标分别为 P 1 \boldsymbol P_1 P1 P 2 \boldsymbol P_2 P2
那么根据三维运动我们知道:

P 2 = R 12 P 1 + t \boldsymbol P_2=\boldsymbol R_{12}\boldsymbol P_1+\boldsymbol t P2=R12P1+t

两边同时左叉乘 t \boldsymbol t t

t ∧ P 2 = t ∧ R 12 P 1 \boldsymbol t^{\land}\boldsymbol P_2=\boldsymbol t^{\land}\boldsymbol R_{12}\boldsymbol P_1 tP2=tR12P1
两边再同时与 P 2 \boldsymbol P_2 P2作内积

0 = P 2 T t ∧ R 12 P 1 0=\boldsymbol P_2^T\boldsymbol t^{\land}\boldsymbol R_{12}\boldsymbol P_1 0=P2TtR12P1

我们将 t ∧ R 12 = d e f E \displaystyle{\boldsymbol t^{\land}\boldsymbol R_{12}\overset{\mathrm{def}}{=}\boldsymbol E} tR12=defE称为本质矩阵(Essential Matrix)

P 2 T E P 1 = 0 \boldsymbol P_2^T\boldsymbol E\boldsymbol P_1=0 P2TEP1=0

1.2 基础矩阵

根据相机模型我们知道

{ s 1 p 1 = K P 1 s 2 p 2 = K P 2 \left\{ \begin{aligned} s_1\boldsymbol p_1&=\boldsymbol K\boldsymbol P_1 \\ s_2\boldsymbol p_2&=\boldsymbol K\boldsymbol P_2 \end{aligned} \right. {s1p1s2p2=KP1=KP2

其中 s 1 , s 2 s_1,s_2 s1,s2分别为P点在相机两帧里的深度
   p 1 , p 2 \boldsymbol p_1,\boldsymbol p_2 p1,p2分别为P点在相机图片像素坐标的齐次坐标

K \boldsymbol K K移到左边:

{ s 1 K − 1 p 1 = P 1 s 2 K − 1 p 2 = P 2 \left\{ \begin{aligned} s_1\boldsymbol K^{-1}\boldsymbol p_1&=\boldsymbol P_1 \\ s_2\boldsymbol K^{-1}\boldsymbol p_2&=\boldsymbol P_2 \end{aligned} \right. {s1K1p1s2K1p2=P1=P2

带入之前本质矩阵式中,得

0 = p 2 T ( K − 1 ) T E K − 1 p 1 0=\boldsymbol p_2^T(\boldsymbol K^{-1})^T\boldsymbol E\boldsymbol K^{-1}\boldsymbol p_1 0=p2T(K1)TEK1p1

我们将 ( K − 1 ) T E K − 1 = d e f F \displaystyle{(\boldsymbol K^{-1})^T\boldsymbol E\boldsymbol K^{-1}\overset{\mathrm{def}}{=}\boldsymbol F} (K1)TEK1=defF称为基础矩阵(Fundamental Matrix)

p 2 T F p 1 = 0 \boldsymbol p_2^T\boldsymbol F\boldsymbol p_1=0 p2TFp1=0

以上两个关于本质矩阵和基础矩阵的等式称为对极几何约束

二、求解旋转与平移

2.1 八点法

将本质矩阵约束中的坐标归一化

x 2 T E x 1 = 0 \boldsymbol x_2^T\boldsymbol E\boldsymbol x_1=0 x2TEx1=0

记归一化坐标 x 1 = ( u 1 , v 1 , 1 ) T \boldsymbol x_1=(u_1,v_1,1)^\mathrm{T} x1=(u1,v1,1)T, x 2 = ( u 2 , v 2 , 1 ) T \boldsymbol x_2=(u_2,v_2,1)^\mathrm{T} x2=(u2,v2,1)T
记本质矩阵 E = ( e 1 e 2 e 3 e 4 e 5 e 6 e 7 e 8 e 9 ) \boldsymbol E=\begin{pmatrix}e_1 & e_2 & e_3 \\e_4 & e_5 & e_6 \\e_7 & e_8 & e_9\end{pmatrix} E=e1e4e7e2e5e8e3e6e9

那么

( 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 ) = ( u 2 u 1 , u 2 v 1 , u 2 , v 2 u 1 , v 2 v 1 , v 2 , u 1 , v 1 , 1 ) ( e 1 e 2 e 3 e 4 e 5 e 6 e 7 e 8 e 9 ) = 0 (u_2,v_2,1) \begin{pmatrix} e_1 & e_2 & e_3 \\ e_4 & e_5 & e_6 \\ e_7 & e_8 & e_9 \end{pmatrix} \begin{pmatrix} u_1 \\ v_1 \\ 1 \end{pmatrix}= (u_2u_1,u_2v_1,u_2,v_2u_1,v_2v_1,v_2,u_1,v_1,1) \begin{pmatrix} e_1 \\ e_2 \\ e_3 \\ e_4 \\ e_5 \\ e_6 \\ e_7 \\ e_8 \\ e_9 \end{pmatrix} =0 (u2,v2,1)e1e4e7e2e5e8e3e6e9u1v11=(u2u1,u2v1,u2,v2u1,v2v1,v2,u1,v1,1)e1e2e3e4e5e6e7e8e9=0

现在要求解这9个值,由于等式等于0,可以去掉一个尺度自由度,那么只需8个方程即可求解。而 E = t ∧ R \boldsymbol E=\boldsymbol t^\mathrm{\land}\boldsymbol R E=tR,平移和旋转各有3个自由度,去掉尺度就只有5个自由度了,所以理论上最少只需要5对点就能求解,但是比较麻烦。

取8对点的方法称为八点法,将Essential矩阵展开成向量格式
a 1 = ( u 2 u 1 , u 2 v 1 , u 2 , v 2 u 1 , v 2 v 1 , v 2 , u 1 , v 1 , 1 ) \boldsymbol a_1=(u_2u_1,u_2v_1,u_2,v_2u_1,v_2v_1,v_2,u_1,v_1,1) a1=(u2u1,u2v1,u2,v2u1,v2v1,v2,u1,v1,1)
e = ( v e c T E ) T = ( e 1 , e 2 , ⋅ ⋅ ⋅ , e 9 ) T \quad\boldsymbol e=(\mathrm{vec}^\mathrm{T}\boldsymbol E)^\mathrm{T}=(e_1,e_2,···,e_9)^\mathrm{T} e=(vecTE)T=(e1,e2,,e9)T

a 1 T e = 0 \boldsymbol a_1^\mathrm{T}\boldsymbol e=0 a1Te=0
同样方法再找7对点,将对应系数记为 a 2 ⋅ ⋅ ⋅ a 8 \boldsymbol a_2···\boldsymbol a_8 a2a8
可以得到方程组

( a 1 a 2 a 3 a 4 a 5 a 6 a 7 a 8 ) e = 0 \begin{pmatrix} \boldsymbol a_1 \\ \boldsymbol a_2 \\ \boldsymbol a_3 \\ \boldsymbol a_4 \\ \boldsymbol a_5 \\ \boldsymbol a_6 \\ \boldsymbol a_7 \\ \boldsymbol a_8 \end{pmatrix} \boldsymbol e =0 a1a2a3a4a5a6a7a8e=0

即可解出 e \boldsymbol e e的值
也就是求出了本质矩阵 E \boldsymbol E E的值

然后将矩阵 E \boldsymbol E E进行奇异值分解,便可得到 R \boldsymbol R R t \boldsymbol t t
(暂略)

如果多于8对点求解,可以使用以下两种方法

  • 最小二乘求解 min ⁡ e ∥ A e ∥ 2 2 = min ⁡ e e T A T A e \min\limits_{\boldsymbol e}\|\boldsymbol A\boldsymbol e\|_2^2=\min\limits_{\boldsymbol e}\boldsymbol e^\mathrm{T}\boldsymbol A^\mathrm{T}\boldsymbol A\boldsymbol e eminAe22=emineTATAe
  • 使用RANSAC方法:
    ① 有一个模型适应于假设的局内点,即所有的未知参数都能从假设的局内点计算得出。
    ② 用1中得到的模型去测试所有的其它数据,如果某个点适用于估计的模型,认为它也是局内点。
    ③ 如果有足够多的点被归类为假设的局内点,那么估计的模型就足够合理。
    ④ 然后,用所有假设的局内点去重新估计模型,因为它仅仅被初始的假设局内点估计过。
    ⑤ 最后,通过估计局内点与模型的错误率来评估模型。

2.2 单应矩阵

所有取出的点共面时,八点法退化,无法求解。
当所有点共面时,设该平面 π = ( n T , d ) \boldsymbol\pi=(\boldsymbol n^{\mathrm T},d) π=(nT,d),即单位法向量为 n \boldsymbol n n,截距为 d d d
则有

n T P + d = 0 o r − n T P d = 1 \boldsymbol n^{\mathrm T}\boldsymbol P+d=0 \quad\quad or \quad\quad -\frac{\boldsymbol n^{\mathrm T}\boldsymbol P}{d}=1 nTP+d=0ordnTP=1

可将1带入下式:

p 2 = 1 s 1 K ( R 12 P 1 + t ) = 1 s 1 K ( R 12 P 1 + t ⋅ ( − n T P d ) ) = 1 s 1 K ( R 12 − t n T d ) P 1 = s 2 s 1 K ( R 12 − t n T d ) K − 1 p 1 = d e f H p 1 \begin{aligned} \boldsymbol p_2&=\frac{1}{s_1}\boldsymbol K(\boldsymbol R_{12}\boldsymbol P_1+\boldsymbol t) \\ &=\frac{1}{s_1}\boldsymbol K\Big(\boldsymbol R_{12}\boldsymbol P_1+\boldsymbol t·(-\frac{\boldsymbol n^{\mathrm T}\boldsymbol P}{d})\Big) \\ &=\frac{1}{s_1}\boldsymbol K(\boldsymbol R_{12}-\frac{\boldsymbol t\boldsymbol n^{\mathrm T}}{d})\boldsymbol P_1 \\ &=\frac{s_2}{s_1}\boldsymbol K(\boldsymbol R_{12}-\frac{\boldsymbol t\boldsymbol n^{\mathrm T}}{d})\boldsymbol K^{-1}\boldsymbol p_1 \\ &\overset{\mathrm{def}}{=}\boldsymbol H\boldsymbol p_1 \end{aligned} p2=s11K(R12P1+t)=s11K(R12P1+t(dnTP))=s11K(R12dtnT)P1=s1s2K(R12dtnT)K1p1=defHp1

( 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 ) \begin{pmatrix} u_2 \\ v_2 \\ 1 \end{pmatrix}= \begin{pmatrix} h_1 & h_2 & h_3 \\ h_4 & h_5 & h_6 \\ h_7 & h_8 & h_9 \end{pmatrix} \begin{pmatrix} u_1 \\ v_1 \\ 1 \end{pmatrix} u2v21=h1h4h7h2h5h8h3h6h9u1v11

{ u 2 = u 1 h 1 + v 1 h 2 + h 3 v 2 = u 1 h 4 + v 1 h 5 + h 6 1 = u 1 h 7 + v 1 h 8 + h 9 \left\{ \begin{aligned} u_2&=u_1h_1+v_1h_2+h_3 \\ v_2&=u_1h_4+v_1h_5+h_6 \\ 1&=u_1h_7+v_1h_8+h_9 \end{aligned} \right. u2v21=u1h1+v1h2+h3=u1h4+v1h5+h6=u1h7+v1h8+h9

归一化 H \boldsymbol H H(令 h 9 = 1 h_9=1 h9=1),③式带入①、②并移项得

{ u 2 = u 1 h 1 + v 1 h 2 + h 3 − u 2 u 1 h 7 − u 2 v 1 h 8 v 2 = u 1 h 4 + v 1 h 5 + h 6 − v 2 u 1 h 7 − v 2 v 1 h 8 \left\{ \begin{aligned} u_2&=u_1h_1+v_1h_2+h_3-u_2u_1h_7-u_2v_1h_8 \\ v_2&=u_1h_4+v_1h_5+h_6-v_2u_1h_7-v_2v_1h_8 \end{aligned} \right. {u2v2=u1h1+v1h2+h3u2u1h7u2v1h8=u1h4+v1h5+h6v2u1h7v2v1h8


( u 1 v 1 1 0 0 0 − u 2 u 1 − u 2 v 1 0 0 0 u 1 v 1 1 − v 2 u 1 − v 2 v 1 ) ( h 1 h 2 h 3 h 4 h 5 h 6 h 7 h 8 ) = ( u 2 v 2 ) \begin{pmatrix} u_1 & v_1 & 1 & 0 & 0 & 0 & -u_2u_1 & -u_2v_1 \\ 0 & 0 & 0 & u_1 & v_1 & 1 & -v_2u_1 & -v_2v_1 \end{pmatrix} \begin{pmatrix} h_1 \\ h_2 \\ h_3 \\ h_4 \\ h_5 \\ h_6 \\ h_7 \\ h_8 \end{pmatrix}= \begin{pmatrix} u_2 \\ v_2 \end{pmatrix} (u10v10100u10v101u2u1v2u1u2v1v2v1)h1h2h3h4h5h6h7h8=(u2v2)

一对点两个方程,所以只需要4对点即可求解
算出 H \boldsymbol H H,继而求解 R , t , n , K , d \boldsymbol R,\boldsymbol t,\boldsymbol n,\boldsymbol K,d R,t,n,K,d
这一步贼麻烦,暂略…

三、三角测量深度估计

求出平移和旋转之后,就可以来求某一个路标点在相机坐标下的位置了,确定深度了。

3.1 直接求解

由三维运动方程知(归一化坐标):
s 2 x 2 = s 1 R 12 x 1 + t s_2\boldsymbol x_2=s_1\boldsymbol R_{12}\boldsymbol x_1+\boldsymbol t s2x2=s1R12x1+t

那么现在的任务就是求出 s 1 , s 2 s_1,s_2 s1,s2,即是深度值
两边同时左叉乘 x 2 \boldsymbol x_2 x2
0 = s 1 x 2 ∧ R 12 x 1 + x 2 ∧ t 0=s_1\boldsymbol x_2^{\land}\boldsymbol R_{12}\boldsymbol x_1+\boldsymbol x_2^{\land}\boldsymbol t 0=s1x2R12x1+x2t
便可求出 s 1 s_1 s1的值,继而求出 s 2 s_2 s2

然而,由于噪声的存在,我们之前确定的 R , t \boldsymbol R,\boldsymbol t R,t并不完全准确,导致 s 1 , s 2 s_1,s_2 s1,s2也不准
故而通过

s 1 x 1 = P 1 s_1\boldsymbol x_1=\boldsymbol P_1 s1x1=P1

求出的路标P的坐标肯定也是个歪的

所以我们一般是对P点做最小二乘解

3.2 最小二乘解

以第一帧相机坐标系为准
对于第k帧中的路标P的坐标 x k \boldsymbol x_k xk

s k x k = R 1 k P + t k = ( R 1 k ∣ t k ) P s_k\boldsymbol x_k=\boldsymbol R_{1k}\boldsymbol P+\boldsymbol t_k=(\boldsymbol R_{1k}|\boldsymbol t_k)\boldsymbol P skxk=R1kP+tk=(R1ktk)P

展开

s k ( u k v k 1 ) = ( r k , 1 r k , 2 r k , 3 r k , 4 r k , 5 r k , 6 r k , 7 r k , 8 r k , 9 t k , 1 t k , 2 t k , 3 ) ( X Y Z 1 ) s_k \begin{pmatrix} u_k \\ v_k \\ 1 \end{pmatrix}= \left( \begin{array}{c:c} \begin{matrix} r_{k,1} & r_{k,2} & r_{k,3} \\ r_{k,4} & r_{k,5} & r_{k,6} \\ r_{k,7} & r_{k,8} & r_{k,9} \end{matrix}& \begin{matrix} t_{k,1} \\ t_{k,2} \\ t_{k,3} \end{matrix} \end{array} \right) \begin{pmatrix} X \\ Y \\ Z \\ 1 \end{pmatrix} skukvk1=rk,1rk,4rk,7rk,2rk,5rk,8rk,3rk,6rk,9tk,1tk,2tk,3XYZ1

{ s k u k = ( R 1 k ∣ t k ) 1 P s k v k = ( R 1 k ∣ t k ) 2 P s k = ( R 1 k ∣ t k ) 3 P \left\{ \begin{aligned} s_ku_k&=(\boldsymbol R_{1k}|\boldsymbol t_k)_{_1}\boldsymbol P \\ s_kv_k&=(\boldsymbol R_{1k}|\boldsymbol t_k)_{_2}\boldsymbol P \\ s_k&=(\boldsymbol R_{1k}|\boldsymbol t_k)_{_3}\boldsymbol P \end{aligned} \right. skukskvksk=(R1ktk)1P=(R1ktk)2P=(R1ktk)3P

其中 ( R 1 k ∣ t k ) n (\boldsymbol R_{1k}|\boldsymbol t_k)_{_n} (R1ktk)n表示增广矩阵 ( R 1 k ∣ t k ) (\boldsymbol R_{1k}|\boldsymbol t_k) (R1ktk)的第n行

消去第三行
{ u k ( R 1 k ∣ t k ) 3 P − ( R 1 k ∣ t k ) 1 P = 0 v k ( R 1 k ∣ t k ) 3 P − ( R 1 k ∣ t k ) 2 P = 0 \left\{ \begin{aligned} u_k(\boldsymbol R_{1k}|\boldsymbol t_k)_{_3}\boldsymbol P-(\boldsymbol R_{1k}|\boldsymbol t_k)_{_1}\boldsymbol P&=0 \\ v_k(\boldsymbol R_{1k}|\boldsymbol t_k)_{_3}\boldsymbol P-(\boldsymbol R_{1k}|\boldsymbol t_k)_{_2}\boldsymbol P&=0 \end{aligned} \right. {uk(R1ktk)3P(R1ktk)1Pvk(R1ktk)3P(R1ktk)2P=0=0


( u k ( R 1 k ∣ t k ) 3 − ( R 1 k ∣ t k ) 1 v k ( R 1 k ∣ t k ) 3 − ( R 1 k ∣ t k ) 2 ) P = 0 \begin{pmatrix} u_k(\boldsymbol R_{1k}|\boldsymbol t_k)_{_3}-(\boldsymbol R_{1k}|\boldsymbol t_k)_{_1} \\ v_k(\boldsymbol R_{1k}|\boldsymbol t_k)_{_3}-(\boldsymbol R_{1k}|\boldsymbol t_k)_{_2} \end{pmatrix}\boldsymbol P =0 (uk(R1ktk)3(R1ktk)1vk(R1ktk)3(R1ktk)2)P=0

将所有的帧都整合起来,记

A = d e f ( u 1 ( R 11 ∣ t 1 ) 3 − ( R 11 ∣ t 1 ) 1 v 1 ( R 11 ∣ t 1 ) 3 − ( R 11 ∣ t 1 ) 2 u 2 ( R 12 ∣ t 2 ) 3 − ( R 12 ∣ t 2 ) 1 v 2 ( R 12 ∣ t 2 ) 3 − ( R 12 ∣ t 2 ) 2 ⋮ u n ( R 1 n ∣ t n ) 3 − ( R 1 n ∣ t n ) 1 v n ( R 1 n ∣ t n ) 3 − ( R 1 n ∣ t n ) 2 ) \boldsymbol A\overset{\mathrm{def}}{=} \begin{pmatrix} u_1(\boldsymbol R_{11}|\boldsymbol t_1)_{_3}-(\boldsymbol R_{11}|\boldsymbol t_1)_{_1} \\ v_1(\boldsymbol R_{11}|\boldsymbol t_1)_{_3}-(\boldsymbol R_{11}|\boldsymbol t_1)_{_2} \\ u_2(\boldsymbol R_{12}|\boldsymbol t_2)_{_3}-(\boldsymbol R_{12}|\boldsymbol t_2)_{_1} \\ v_2(\boldsymbol R_{12}|\boldsymbol t_2)_{_3}-(\boldsymbol R_{12}|\boldsymbol t_2)_{_2} \\ \vdots \\ u_n(\boldsymbol R_{1n}|\boldsymbol t_n)_{_3}-(\boldsymbol R_{1n}|\boldsymbol t_n)_{_1} \\ v_n(\boldsymbol R_{1n}|\boldsymbol t_n)_{_3}-(\boldsymbol R_{1n}|\boldsymbol t_n)_{_2} \end{pmatrix} A=defu1(R11t1)3(R11t1)1v1(R11t1)3(R11t1)2u2(R12t2)3(R12t2)1v2(R12t2)3(R12t2)2un(R1ntn)3(R1ntn)1vn(R1ntn)3(R1ntn)2

A P = 0 \boldsymbol A\boldsymbol P=0 AP=0

那么,可对P求最小二乘解

min ⁡ P 1 2 ∥ A P ∥ 2 2 = min ⁡ P 1 2 P T A T A P \min\limits_{\boldsymbol P}\frac{1}{2}\|\boldsymbol A\boldsymbol P\|_2^2= \min\limits_{\boldsymbol P}\frac{1}{2}\boldsymbol P^{\mathrm T}\boldsymbol A^{\mathrm T}\boldsymbol A\boldsymbol P \\ Pmin21AP22=Pmin21PTATAP

你可能感兴趣的:(#,VSLAM,三维场景,slam,计算机视觉,线性代数)