視覺里程計的主要問題是如何根據圖像來估計相機運動,VO的實現方法,按照是否需要提取特征,分為特征點法的前端以及不提取特征的直接法前端。基於特征點法的前端,長久以來被認為是視覺里程計的主流方法,它運行穩定,對光照、動態物體不敏感,是目前較為成熟的解決方案。
計算機視覺鄰域的研究者們,設計了許多比角點更加穩定的局部圖像特征,比如SIFT,SURF,ORB等。特征點由關鍵點(Key-point)和描述子(Descriper)兩部分組成。SIFT(Scale Invariant Feature Transform 尺度不變特征變換)計算量大,普通 PC 的 CPU還無法實時地計算 SIFT 特征,進行定位與建圖。所以在 SLAM 中我們甚少使用這種“奢侈”的圖像特征。ORB(Oriented FAST and Rotated BRIEF)特征則是目前看來非常具有代表性的實時圖像特征。它改進了 FAST 檢測子 不具有方向性的問題,並采用速度極快的二進制描述子BRIEF,使整個圖像特征提取的環節大大加速。
根據匹配點對,估計相機運動
1. 當相機為單目時,我們只知道 2D 的像素坐標,因而問題是根據兩組 2D 點估計運動。該問題用對極幾何來解決。
2. 當相機為雙目、RGB-D 時,或者我們通過某種方法得到了距離信息,那問題就是根據兩組 3D 點估計運動。該問題通常用 ICP 來解決。
3. 如果我們有 3D 點和它們在相機的投影位置,也能估計相機的運動。該問題通過 PnP求解。
2D-2D對級幾何
本質矩陣E由於滿足對級約束,所以E滿足尺度等價性,矩陣E具有5個自由度,表明我們可以最少使用5對點來計算E矩陣,但是E的內在非線性性質使得求解線性方程時比較麻煩。可使用經典的8點法在線性框架下求解。
求得E后,根據奇異值分解,恢復相機的R,t
單應矩陣H
單應矩陣描述了兩個平面之間的映射關系,如果場景中的特征點都位於同一平面上,則可以通過單應性來進行運動估計。
openCV相關函數:
findFundamentalMat() 計算基礎矩陣
findEssentialMat() 計算本質矩陣
findHomography() 計算單應矩陣
recoverPose() 從本質矩陣中恢復旋轉和平移
triangulatePoints() 通過三角化計算空間點位置
3D:2D PnP
PnP(Perspective-n-Point)描述了當我們知道了n個3D空間點以及它們的投影位置時,如何估計相機所在的位姿。PnP不需要使用對極約束,可以在很少的匹配點中獲得較好的運動估計,是一種重要的姿態估計方法。
PnP求解有很多求解方法,如僅用三對點估計的P3P,直接線性變換DLT,非線性優化Bundle Adjustment。SLAM中通常的做法是先使用P3P/EPnP等方法估計相機位姿,然后構建最小二乘優化問題對估計值進行調整(Bundle Adjustment)
Bundle Adjustment
Bundle Adjustment是一個最小化重投影誤差的問題,同時對位姿和空間點進行優化。
openCV相關函數:
solvePnP() Finds an object pose from 3D-2D point correspondences. This function returns the rotation and the translation vectors that transform a 3D point expressed in the object coordinate frame to the camera coordinate frame.
3D-3D ICP
可采用SVD方法以及非線性優化方法