以前研究VSLAM時,本人對SVO研究過一段時間,那個時候沒有時間總結,git
如今快畢業了,總結一下本身瞭解的算法吧。。。。github
對SVO的總結共分爲3各部分,分別爲簡介和評價部分、跟蹤部分、深度濾波部分(建圖部分)。算法
簡介部分app
轉載請說明出處:dom
http://blog.csdn.net/zhubaohua_bupt/article/details/74822742
ide
SVO[2]是C. Forster, M. Pizzoli, and D. Scaramuzza在14年提出的一個半直接法的VSLAM(單目)。函數
開源代碼:https://github.com/uzh-rpg/rpg_svo 。性能
咱們知道,VSLAM有直接法和特徵點法兩大類。直接法和特徵點法,在幀間VO階段的不一樣在於,優化
直接法:提取梯度紋理特徵明顯的像素,幀間VO是靠圖像對齊,即經過spa
最小化像素灰度差函數來優化幀間位姿。
特徵點法:提取特徵點(一般是角點),幀間VO靠PNP,即縮小在後幀圖像上,
重投影點與特徵匹配點距離偏差,來優化幀間位姿。
而SVO是這樣乾的:
提取稀疏特徵點(相似特徵點法),幀間VO用圖像對齊(相似於直接法),
SVO結合了直接法和特徵點法,所以,稱它爲半直接法。
SVO主要乾了兩件事,
<1>跟蹤
<2>深度濾波
深度濾波是咱們常說的建圖(Mapping)部分。
跟蹤部分乾的事情是:初始化位姿,估計和優化位姿(分別對應於幀間VO和局部地圖優化)。
初始化位姿:
用KLT光流法找匹配,而後恢復H矩陣。初始化思想是這樣的,
第一幀上提取的特徵點,做爲關鍵幀,後來的幀不斷用KLT與第一幀匹配,
直到匹配到的特徵點平均視差比較大,就認爲初始化成功,計算對應特徵點的深度,
與此對應的幀做爲第二幀。以後進入正常工做模式,即估計和優化位姿。
正常工做模式:
首先,經過和上一幀進行對齊,求取初始位姿;
而後,創建局部地圖,經過優化局部地圖和當前幀的投影灰度塊偏差,來優化當前位姿;
最後,判斷此幀是不是關鍵幀,若是爲關鍵幀就提取新的特徵點。
通過以上四個步驟,完成一幀的處理。若是在CMakeLists裏打開了HAVE_G2O的選項,
代碼隔一段時間還會BA,不過很是慢。
深度濾波部分主要任務是完成估計特徵點的深度信息。
深度濾波和跟蹤部分相互依賴,由於深度濾波是以相機位姿已知爲前提進行的,
而跟蹤部分又依靠深度濾波的結果(較準確的三維點),完成位姿的估計。
乍一看,這是個雞生蛋,蛋生雞的問題,既然二者循環迭代,總得有個起始點。
其實,單目的slam在啓動時須要初始化,而這個初始化就提供粗糙的幀間位姿,
以便於深度濾波和跟蹤部分的迭代。
當深度能夠用後(稱之爲收斂),把它放入地圖裏,用於跟蹤。
這個得從SVO乾的事來講,它既沒有閉環檢測,也沒有重定位(SVO的重定位太。。。),
它乾的事只要是定位,比較符合視覺里程計(VO)的特色。
ORBSLAM算是目前性能最好的開源算法,這些功能它都有,所以算一個比較完整的VSLAM算法。
優勢:是比較快,若是你跑代碼的時候發現很容易跟丟,能夠修改這幾個配置參數:
quality_min_fts:匹配到的最小特徵點。
quality_max_drop_fts:允許相鄰幀匹配到特徵點的最大落差。
缺點:缺點是比較明顯的
和ORBSLAM相比。
<1>因爲位姿的估計和優化全是靠灰度匹配,這就致使了系統對光照的魯棒性不足。
<2>對快速運動魯棒性性不足。直接法都似這個樣子。。能夠加入IMU改善。
<3>沒有重定位和閉環檢測功能。
若是把此工程修改爲RGBD的模式後,魯棒性和精度明顯提升,近似於ORBSLAM的RGBD模式。
[1]C. Forster, M. Pizzoli, and D. Scaramuzza, 「SVO: Fast Semi-DirectMonocular Visual Odometry,」 in Proc. IEEE Intl. Conf. on Robotics and Automation, 2014.
[2] MatiaPizzoli,Christian Forster, and Davide Scaramuzza. REMODE: Probabilistic,monocular densereconstruction in real time. In International Conference onRobotics andAutomation (ICRA), pages 2609–2616, Hong Kong,China, June 2014.