1. 程式人生 > >視覺 SLAM 十四講 - 7 (下)

視覺 SLAM 十四講 - 7 (下)

7.7 3D-2D: PnP

PnP(Perspective-n-Point)是求解 3D 到 2D 點對運動的方法。它描述了當我們知道 n 個 3D 空間點以及它們的投影位置時,如何估計相機所在的位姿。前面已經說了, 2D-2D 的對極幾何方法需要八個或八個以上的點對(以八點法為例),且存在著初始化、純旋轉和尺度的問題。然而,如果兩張影象中,其中一張特徵點的 3D 位置已知,那麼最少只需三個點對(需要至少一個額外點驗證結果)就可以估計相機運動。特徵點的 3D 位置可以由三角化,或者由 RGB-D 相機的深度圖確定。因此,在雙目或 RGB-D 的視覺里程計中,我們可以直接使用 PnP 估計相機運動。而在單目視覺里程計中,必須先進行初始化,然後才能使用 PnP。 3D-2D 方法不需要使用對極約束,又可以在很少的匹配點中獲得較好的運動估計,是最重要的一種姿態估計方法。

PnP 問題有很多種求解方法,例如用三對點估計位姿的 P3P[45],直接線性變換(DLT),EPnP(Efcient PnP) [46], UPnP[47] 等等)。此外,還能用非線性優化的方式,構建最小二乘問題並迭代求解,也就是萬金油式的 Bundle Adjustment。我們先來看 DLT,然後再講 Bundle Adjustment。

7.7.1 直接線性變換

考慮某個空間點 P,它的齊次座標為 P = (

X , Y , Z , 1 ) T
P = (X, Y, Z, 1)^T
。在影象 I 1 I_1 中,投影到特徵點 x 1 = ( u 1 , v 1 , 1 ) T x_1 = (u_1, v_1, 1)^T (以歸一化平面齊次座標表示)。此時相機的位姿 R , t R, t 是未知的。與單應矩陣的求解類似,我們定義增廣矩陣 [ R t ] [R|t] 為一個 3 × 4 的矩陣,包含了旋轉與平移資訊。我們把它的展開形式列寫如下:
s [ u 1 v 1 1 ] = [ t 1 t 2 t 3 t 4 t 5 t 6 t 7 t 8 t 9 t 10 t 11 t 12 ] [ X Y Z 1 ] . s \begin{bmatrix} u_1 \\ v_1 \\ 1 \end{bmatrix} = \begin{bmatrix} t_1 & t_2 & t_3 & t_4 \\ t_5 & t_6 & t_7 & t_8 \\ t_9 t_{10} & t_{11} & t_{12} \\ \end{bmatrix} \begin{bmatrix} X \\ Y \\ Z \\ 1 \end{bmatrix}.
用最後一行把 s 消去,得到兩個約束:
u 1 = t 1 X + t 2 Y + t 3 Z + t 4 t 9 X + t 10 Y + t 11 Z + t 12 , v 1 = t 5 X + t 6 Y + t 7 Z + t 8 t 9 X + t 10 Y + t 11 Z + t 12 . u_1 = \frac{t_1X + t_2Y + t_3Z + t_4}{t_9X + t_{10}Y + t_{11}Z + t_{12}}, v_1 = \frac{t_5X + t_6Y + t_7Z + t_8}{t_9X + t_{10}Y + t_{11}Z + t_{12}}.
為了簡化表示,定義 T T 的行向量:
t 1 = ( t 1 , t 2 , t 3 , t 4 ) T , t 2 = ( t 5 , t 6 , t 7 , t 8 ) T , t 3 = ( t 9 , t 10 , t 11 , t 12 ) T , t_1 = (t_1, t_2, t_3, t_4)^T, t_2 = (t_5, t_6, t_7, t_8)^T, t_3 = (t_9, t_{10}, t_{11}, t_{12})^T,