天天看點

SLAM或VO中兩幀間恢複Rt的方法彙總2D-2D:對極幾何沒有特征比對下的2D-2D:極線搜尋三角測量Triangulation3D-2D:PnP3D-3D ICP

2D-2D:對極幾何

A.對極限制

@輸入:參考幀和目前幀的2D點坐标對(一般8對),内參

@輸出:運動恢複R t

SLAM或VO中兩幀間恢複Rt的方法彙總2D-2D:對極幾何沒有特征比對下的2D-2D:極線搜尋三角測量Triangulation3D-2D:PnP3D-3D ICP

參考幀和目前幀的二維像素點通過特征點法拿到了比對關系,那麼從各自光心出發的兩條射線交點即3D點,P和兩個光心構成了極平面, e 1 e1 e1 \ e 2 e2 e2為極點, l 1 l1 l1 \ l 2 l2 l2是極線(Epipolar line)。

對極幾何必須要有正确的比對關系,否則目前幀無法找到參考幀 p 1 p1 p1對應的點在 p 2 p2 p2,那樣的話就要用極線搜尋了。

對極幾何求R t的步驟是:

1.根據比對的像素點對和内參求出基礎矩陣F或者本質矩陣E。E=t^ R,隻和運動有關,是以是我們求的本質,平移和旋轉各3自由度,單目尺度歧義性自由度-1,是以E有5個自由度,一般用八點法,8對點求;F還包括内參 F = K − T ∗ E ∗ K − 1 F=K^{-T}*E*K^{-1} F=K−T∗E∗K−1.

2.根據E或者R恢複R t。這裡一般用SVD分解恢複出4個解,然後取點在相機前方的那個解。

B.單應矩陣

@輸入:參考幀和目前幀的2D點坐标對(一般4對),内參

@輸出:運動恢複R t

Homography描述兩個平面之間的映射關系,自由度為8。可以通過4對不共線的點得出。一般配合RANSAC。

退化(degenerate):特征點共面or純旋轉,基礎矩陣的自由度下降(比如平移那塊沒了),就出現了退化。

ORB中H 和F都算,取好的。

沒有特征比對下的2D-2D:極線搜尋

SLAM或VO中兩幀間恢複Rt的方法彙總2D-2D:對極幾何沒有特征比對下的2D-2D:極線搜尋三角測量Triangulation3D-2D:PnP3D-3D ICP

深度濾波器:用多次三角測量讓深度估計收斂

直接法時候沒有特征點比對,是以需要用極限搜尋,如DSO中ImmaturePoint::traceOn()。DSO論文中沒有過多提及,深度濾波器部分可以看SVO比較詳細。

@輸入:*Frame_ref, *Frame_curr, R, t, 參考幀點像素位置和深度估計區間, 内參

@輸出:目前幀對應點像素位置,點的深度和不确定度。

這時候的前提是已知Rt(可以是估計出來的,也可以是靜止模型、勻速模型、随機模型之類的),思路是:

這時候隻知道參考幀的點像素坐标和深度區間,也知道目前幀的極線, p 1 p1 p1深度區間投過來後限定了極線的搜尋範圍,于是在範圍内用塊比對之類的方法評估NCC(Normalized Cross Correlation)找到相似度最高的點,如果隻把這個點當作最終結果是不行的,很容易陷入局部極值。是以需要用濾波的方法多次搜尋直到收斂。是以過程是:

1.假設像素的深度滿足高斯分布,通過極限搜尋确定目前幀像素點對應位置

2.根據幾何關系三角化計算深度和幾何不确定性(DSO還加上了光度不确定性)

3.根據深度和不确定性融合進上一次的估計中,DSO中是GN疊代,直到深度收斂。

三角測量Triangulation

@輸入:參考幀和目前幀的2D點坐标對,恢複出的R t

@輸出:空間點的位置(即參考幀和目前幀點對應的深度s1 s2)

在用2D-2D的方法恢複出Rt後,還需要用運動估計點的空間位置。

SLAM或VO中兩幀間恢複Rt的方法彙總2D-2D:對極幾何沒有特征比對下的2D-2D:極線搜尋三角測量Triangulation3D-2D:PnP3D-3D ICP

理論上兩個射線會交于點P,但無論是比對誤差還是運動估計誤差等噪聲都會導緻無法相交,是以一般用最小二乘的思路解點的位置。最後求得兩幀系下的位置深度s1和s2。三角測量必須要有一定的平移。(CSDN裡面 \^{}打不出反協号)

s 1 ∗ x 1 ν x 1 = 0 = s 2 ∗ x 1 ν ∗ R ∗ s 2 + x 1 ν t s_1*x_1 ^ \nu x_1=0=s_2 * x_1 ^\nu *R * s_2+x_1^\nu t s1​∗x1ν​x1​=0=s2​∗x1ν​∗R∗s2​+x1ν​t

3D-2D:PnP

@輸入:參考幀下的特征點像素坐标和3D坐标,比對到目前幀的2D點像素坐标,内參

@輸出:運動估計R t

Perspective-n-Point,當知道了n個空間點和其投影位置的情況下求解位姿。3D-2D比2D-2D簡單的多,最少隻需要3對點,不過他需要特征點的3D位置,可以由三角化or RGB-D or lidar提供,是以在雙目和RGB-D中就很友善,單目中要先初始化後才能用PnP。需要注意的是:3D點的位置應該是在參考幀坐标系下的,實際上等價于在世界坐标系下已知(因為參考幀對世界系的T已知),而目前幀的空間坐标是不知道的,隻知道參考幀特征點對應的2D像素坐标,否則就成了3D-3D ICP了。

PnP有很多方法,一般先用P3P/EPnP估計一個初值,然後用非線性優化的方法即BA refine:

SLAM或VO中兩幀間恢複Rt的方法彙總2D-2D:對極幾何沒有特征比對下的2D-2D:極線搜尋三角測量Triangulation3D-2D:PnP3D-3D ICP

目前已知p1 p2坐标和P在左圖下的3D點,這時候BA優化重投影誤差,不斷更新R t,讓P在右圖的投影p2^盡量接近p2,即可用G-N L-M等優化方法求出R t。(這裡可以看看其中的雅可比推導),BA的目标函數:

ξ ∗ = arg ⁡ min ⁡ ξ    1 2 ∑ ∥ u i − 1 s i K e x p ( ξ ν ) P i ∥ 2 2 \xi^* = \mathop{\arg\min}_{\xi} \ \ \frac{1}{2} \sum \| u_i - \frac{1}{s_i}Kexp(\xi^\nu)P_i \|^2_2 ξ∗=argminξ​  21​∑∥ui​−si​1​Kexp(ξν)Pi​∥22​

即重投影誤差,u是目前幀像素坐标即p2,Pi是參考幀下的3D點齊次坐标,這裡的1/s實際上就是在K投影前将目前系下估計出的3D坐标歸一化,是以變量隻有李代數。

3D-3D ICP

@輸入:配對好的一組3D點對,即那坨點雲分别在參考幀下和目前幀下的坐标

@輸出:運動恢複R t

這時候不用輸入相機内參,3D-3D和相機模型無關,是以lidar也可以直接用,視覺和lidar的ICP差別是:視覺可以通過特征點去比對2D點然後找到對應的3D點對,但是lidar有時比較難比對特征點對,就認為距離最近的兩個點是同一個點,即最近鄰,當然這個點也是有一定的幾何特征的特征點;當然lidar也可以用強度比對之類的。

BA的目标函數:p p’為兩對輸入,變量為李代數

ξ ∗ = arg ⁡ min ⁡ ξ    1 2 ∑ ∥ p i − e x p ( ξ ν ) p i ′ ∥ 2 2 \xi^* = \mathop{\arg\min}_{\xi} \ \ \frac{1}{2} \sum \| p_i - exp(\xi^\nu)p_i ' \|^2_2 ξ∗=argminξ​  21​∑∥pi​−exp(ξν)pi′​∥22​

繼續閱讀