非濾波單目視覺slam筆記1

非濾波單目視覺slam

主要分爲如下8部分算法

  • 數據類型
  • 數據關聯
  • 初始化
  • 位姿估計
  • 地圖維護
  • 地圖生成
  • 失效恢復
  • 迴環檢測

數據類型

  • 直接法(稠密,半稠密)

基本原理是亮度一致性約束,\(J(x,y) = I(x + u(x,y)+ v(x,y))\) ,x,y是圖像的像素座標,u,v是同一場景下的兩幅圖像I,J的對應點的像素偏移。函數

起源是光流法,因爲使用了圖像中大部分的信息,對紋理差的部分魯棒性比直接法好,可是計算量也加大,要並行化計算。學習

  • 間接法

就是特徵點匹配,通常要考慮到特徵點的魯棒性,對光照,尺度,視角的變化有很好的魯棒性,還要考慮實時性的。大部分系統使用的是Fast做爲特徵提取器,優化

描述子能夠是BRIEF,BRISK,SURF,SIFT,也能夠是圖像塊spa

  • 雜交法

上面兩個的結合,直接法用於構建特徵匹配,間接法用於優化相機的位姿。3d

數據關聯

數據關聯就是在不一樣圖像的觀測之間創建匹配關係,這裏主要討論間接法的數據關聯,直接法自己攝像頭位姿估計就是一種數據關聯.間接法有如下幾種關聯blog

  • 2D --> 2D

沒有地圖,沒有相機之間的變換,只能作2d--2d的數據關聯。對於描述子描述的特徵,進行描述子距離的L1範數,L2範數,漢明距離等,get

對於區域圖像塊描述子,一般使用模板匹配中差值平方和(SSD,ZMSSD)io

  • 3D --> 2D

前一時刻的位姿估計和3D結構已知,就是pnp的過程,ast

  • 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的主要代碼學習一下

相關文章
相關標籤/搜索