轉載 http://blog.csdn.NET/zhubaohua_bupt/article/details/74973347
1先說一下SVO大體內容
開源代碼:https://github.com/uzh-rpg/rpg_svo 。
1.1為什么叫半直接法?
我們知道,VSLAM有直接法和特征點法兩大類。直接法和特征點法,在幀間VO階段的不同在於,
直接法:提取梯度紋理特征明顯的像素,幀間VO是靠圖像對齊,即通過
最小化像素灰度差函數來優化幀間位姿。
特征點法:提取特征點(通常是角點),幀間VO靠PNP,即縮小在后幀圖像上,
重投影點與特征匹配點距離誤差,來優化幀間位姿。
而SVO是這樣干的:
提取稀疏特征點(類似特征點法),幀間VO用圖像對齊(類似於直接法),
SVO結合了直接法和特征點法,因此,稱它為半直接法。
1.2 SVO干了什么事?
SVO主要干了兩件事,
<1>跟蹤
<2>深度濾波
深度濾波是我們常說的建圖(Mapping)部分。
1.2.1跟蹤部分
跟蹤部分干的事情是:初始化位姿,估計和優化位姿(分別對應於幀間VO和局部地圖優化)。
初始化位姿:
用KLT光流法找匹配,然后恢復H矩陣。初始化思想是這樣的,
第一幀上提取的特征點,作為關鍵幀,后來的幀不斷用KLT與第一幀匹配,
直到匹配到的特征點平均視差比較大,就認為初始化成功,計算對應特征點的深度,
與此對應的幀作為第二幀。之后進入正常工作模式,即估計和優化位姿。
正常工作模式:
首先,通過和上一幀進行對齊,求取初始位姿;
然后,建立局部地圖,通過優化局部地圖和當前幀的投影灰度塊誤差,來優化當前位姿;
最后,判斷此幀是否是關鍵幀,如果為關鍵幀就提取新的特征點。
經過以上四個步驟,完成一幀的處理。如果在CMakeLists里打開了HAVE_G2O的選項,
代碼隔一段時間還會BA,不過非常慢。
1.2.2深度濾波部分
深度濾波部分主要任務是完成估計特征點的深度信息。
深度濾波和跟蹤部分相互依賴,因為深度濾波是以相機位姿已知為前提進行的,
而跟蹤部分又依靠深度濾波的結果(較准確的三維點),完成位姿的估計。
乍一看,這是個雞生蛋,蛋生雞的問題,既然兩者循環迭代,總得有個起始點。
其實,單目的slam在啟動時需要初始化,而這個初始化就提供粗糙的幀間位姿,
以便於深度濾波和跟蹤部分的迭代。
當深度可以用后(稱之為收斂),把它放入地圖里,用於跟蹤。
1.2.3為什么叫VO
這個得從SVO干的事來說,它既沒有閉環檢測,也沒有重定位(SVO的重定位太。。。),
它干的事只要是定位,比較符合視覺里程計(VO)的特點。
ORBSLAM算是目前性能最好的開源算法,這些功能它都有,因此算一個比較完整的VSLAM算法。
1.2.4 svo怎么樣
優點:是比較快,如果你跑代碼的時候發現很容易跟丟,可以修改這幾個配置參數:
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.