非濾波單目視覺slam
主要分為以下8部分
- 數據類型
- 數據關聯
- 初始化
- 位姿估計
- 地圖維護
- 地圖生成
- 失效恢復
- 回環檢測
數據類型
- 直接法(稠密,半稠密)
基本原理是亮度一致性約束,\(J(x,y) = I(x + u(x,y)+ v(x,y))\) ,x,y是圖像的像素坐標,u,v是同一場景下的兩幅圖像I,J的對應點的像素偏移。
起源是光流法,由於使用了圖像中大部分的信息,對紋理差的部分魯棒性比直接法好,但是計算量也加大,要並行化計算。
- 間接法
就是特征點匹配,一般要考慮到特征點的魯棒性,對光照,尺度,視角的變化有很好的魯棒性,還要考慮實時性的。大部分系統使用的是Fast作為特征提取器,
描述子可以是BRIEF,BRISK,SURF,SIFT,也可以是圖像塊
- 雜交法
上面兩個的結合,直接法用於構建特征匹配,間接法用於優化相機的位姿。
數據關聯
數據關聯就是在不同圖像的觀測之間建立匹配關系,這里主要討論間接法的數據關聯,直接法本身攝像頭位姿估計就是一種數據關聯.間接法有以下幾種關聯
- 2D --> 2D
沒有地圖,沒有相機之間的變換,只能做2d--2d的數據關聯。對於描述子描述的特征,進行描述子距離的L1范數,L2范數,漢明距離等,
對於區域圖像塊描述子,通常使用模板匹配中差值平方和(SSD,ZMSSD)
- 3D --> 2D
前一時刻的位姿估計和3D結構已知,就是pnp的過程,
- 3D --> 3D
在回環檢測的時候,兩幅圖像中觀察到的3D點可以用來求兩幅圖像之間的相似變換
初始化
一般的初始化流程:
主要是為找到跟第一幅圖像有足夠數量的特征匹配點,視差足夠大的第二幅圖像
PTAM初始化要求用戶兩次輸入,來獲取地圖中的前2個關鍵幀;需要用戶在第一個和第二個關鍵幀之間,做與場景平行的、緩慢平滑相對明顯的平移運動。
SVO使用單應進行初始化,但SVO不需要用戶輸入,算法使用系統啟動時的第一個關鍵幀;提取FAST特征,用圖像間的KLT算法跟蹤特征,視差足夠的時候就選擇作為第二幅圖像,然后計算單應矩陣,只能是2維平面
LSD-SLAM從第1個圖像隨機初始化場景的深度,通過隨后的圖像進行優化。LSD-SLAM初始化方法不需要使用兩視圖幾何。不像其他SLAM系統跟蹤兩視
圖特征,LSD-SLAM只用單個圖像進行初始化
ORB-SLAM 並行計算基本矩陣和單應矩陣,根據對稱轉移誤差(多視圖幾何)懲罰不同的模型,最終選擇最合適的模型
不同的系統使用的初始化方法如下:
位姿估計
通用的位姿估計流程
因為數據關聯計算量巨大,大部分SLAM系統都有一個先決條件,即對於每個新圖像的位姿,用於數據關聯工作都有具體要求和限制。
這個先驗信息可能是恆速運動模型,可能是假設運動量不大,使用上一時刻的位姿。
PTAM,DT-SLAM,ORB-SLAM,DPPTAM都假設相機做平滑運動采用恆定速度運動模型,用跟蹤到的之前兩幅圖像的位姿變化估計作為當前圖像的先驗知識(用於數據關聯的圖像位姿的要求和限制)。但是,在相機運動方向上有猛烈移動時,這樣的模型就容易失效
LSD-SLAM和SVO都假設在隨后的圖像,相機位姿沒有明顯改變,因此,這種情況下都是用高幀率相機。
直接和間接方式都是通過最小化圖像間的測量誤差估計相機位姿;
直接方法測量光度誤差(像素值),間接方法通過最小化從圖像上一位姿的地圖中獲得的路標的重投影到當前幀的重投影誤差(幾何位置)。
地圖生成
地圖生成的一般流程
地圖生成模塊將世界表示成稠密(直接)或稀疏(間接)的點雲。
系統將2D興趣點三角化成3D路標,並持續跟蹤3D坐標,然后定位相機,這就是量度地圖(pose + point)。但是,相機在大場景運行時,量度地圖的大小就會無限增大,最終導致系統失效
拓撲地圖(pose-graph)可以減少這一弊端,它盡量將地圖中的量度信息最小化,減少幾何信息(尺度,距離和方向)而采用連接信息。視覺SLAM中,拓撲地圖是一個無向圖,節點通常表示關鍵幀,關鍵幀通過邊連接,節點之間存在相同的數據關聯
拓撲地圖與大場景的尺度比較吻合,為了估計相機位姿,也需要量度信息;從拓撲地圖到量度地圖的變化並不是一件容易的事情,因此,最近的視覺 SLAM 系統都采用混合地圖,局部量度地圖和全局拓撲地圖。
地圖制作過程會處理新路標將其添加到地圖中,還檢測和處理離群點。圖標點的添加可以通過三角化,或者濾波實現的位置估計(一般是逆深度,加上一個概率分布),收斂到一定的程度就可以加入到地圖中。
地圖維護
地圖維護通過捆集調整(Bundle Adjustment)或位姿圖優化(Pose-Graph)來優化地圖。地圖擴展的過程中,新的3D路標基於相機位姿估計進行三角化。經過一段時間的運行,由於相
機累積誤差增加,相機位姿錯誤,系統出現漂移(scale-drift)。
位姿圖優化相比全局捆集調整返回較差的結果。原因是位姿圖優化只用於關鍵幀位姿優化,(要是路標相對於的是關鍵幀表示,而不是世界下的表示,會相應地調整路標的3D結構);全局捆集調整都優化關鍵幀位姿和3D結構。
地圖維護也負責檢測和刪除地圖中的由於噪聲和錯誤特征匹配的離群點。
失效恢復
不管是錯誤的用戶運動(相機位姿的劇烈改變和運動模糊),或者相機觀測無特征的區域,還是無法匹配足夠的特征,或者其他原因,視覺SLAM系統都會track lost.
一般是視覺詞帶,pnp
閉環檢測
想法
感覺一般的slam按照上面的8個部分,想一遍要能想通,原理上面一般就算是可以了。就剩下代碼實踐了。
系統有沒有特定的要求,大范圍的可以嗎,室內還是室外,是直接法還是間接法,對應的就是稀疏地圖還是(半)稠密地圖,優化的是幾何誤差還是光度誤差。
需不需要初始化,需要人工的干預,非2維平面可以嗎,對應的就是計算本征矩陣還是單應矩陣。還是基於濾波的方法,不需要初始化,后續優化就可以。
然后就是tracking,因為視覺slam是一個非凸函數,需要一個初始值,對應的就是你的prior是什么,恆速運動模型還是高速相機,把前一幀的位姿當做初始值。
追蹤的過程的優化函數是什么,是光度不變,還是幾何誤差,就是g2o中邊,頂點的構造。
當然還要維護地圖,地圖中的點是怎么表示,基於逆深度,還是歐式幾何表示,camera-anchor的表示。地圖維護中要進行BA,還是Pose-Graph的優化,還是雜交。
然后就是閉環的檢測,基於視覺詞帶,還是隨機取一些幀進行Image Alignment。
當然這其中還有無數細節,運動快,模糊是怎么處理的(加大搜索范圍,從金字塔coarse-fine的搜索),Tracking lost在什么情況下發生,怎么進行重定位。
最小二乘法要做幾次,怎么時候收斂,要不要給他設個時間約束,權重怎么設置等等。
文獻
A survey on non-filter-based monocular Visual SLAM systems
有一個中文版的 《非濾波方法的單目視覺SLAM系統綜述》
下一篇我會把SVO,ORB-SLAM,LSD-SLAM的主要代碼學習一下