orb-slam在眾多SLAM方法中處於怎樣的地位?


前一陣出了orbslam2,提供單目,雙目和rgbd介面。加之代碼也很整潔,確實是很好的工作。
特點是以orb特徵貫穿始終,從一開始的特徵處理,匹配,以及用於迴環的bag-of-words,詞典,全用的是orb。下面說說我個人對它的一些看法。

作者從opencv2.4的orb改進了一版,比opencv里的orb多了一個網格處理,盡量保證每小塊圖像都能提到特徵,避免了局部特徵點不足的情形。據我個人的測試(Thinkpad T450 i7),在640x480的圖像中提取500orb約用時13ms左右,匹配精度可以接受,滿足實時性要求。

相比於lsd-slam,orb-slam更像一個系統工程——採用當前各種主流的方式計算slam。它穩重大方,不像lsd那樣追求標新立異。orb-slam基於研究了很久的特徵點,使用dbow2庫進行迴環檢測,具備重新定位能力,使用g2o作為global和local的優化,乃至pnp也用g2o來算。從效果而言比lsd優化,代碼也比lsd整潔,更適合繼續開發。雖說如樓上所言不像ptam那麼驚艷(比如slam++名字好聽效果好看但是不開源啊),我們做研究畢竟還是效果至上。

個人覺得,orb-slam的動機還是單目slam,用來做雙目或rgbd有些不足。至少orb的建圖部分只含有稀疏的map point,不管用於機器人還是AR/VR,這無論如何是不夠的。如果給它加上一個較好的地圖模塊,相信會更加受歡迎。

附上我自己的orb-slam2在手持kinect2上的視頻,僅供參考:
http://pan.baidu.com/s/1eRcyW1s

------------- 2016.2.25 -----------------
優點:迴環檢測做的很好,基本上只要見過的場景都能找回來。介面豐富,代碼清楚。
缺點:
* kinect2 qhd解析度下(960x540),默認參數,thinkpad T450,幀率&<=10Hz;
* 運行前要讀取一個幾百兆的字典——調試程序的時候比較考驗耐心;
* 比較容易lost,雖然也容易找回來;
* 尼瑪為什麼不支持地圖保存和讀取!

這個TODO是讓我去做嗎!

------------ 2016.3 ------------------
在kinect部分加了個稠密地圖,效果看上去還可以,給做rgbd的同學作個參考:
加上地圖顯示就真的只有10Hz了……
這個是自己擼了個點雲地圖模塊上去的orbslam2:
http://pan.baidu.com/s/1hrbW840
還有一個是改了改速度但是精度比較糙的orbslam2:
http://pan.baidu.com/s/1skdGeIT

各有各用途吧,糙和精的應該都有人喜歡。


額,這個地位指什麼?
orbslam 是14-15年被一個西班牙博士做的,目前還在做,最近又發了新文章:Probabilistic Semi-Dense Mapping from Highly Accurate Feature-Based Monocular SLAM。
orbslam可以看做是PTAM的一個延伸。ptam想必做visual slam 的都知道,它是第一個將tracking和mapping分成兩個線程實現的實時slam系統,07年出來的時候很驚艷。幾乎成立後來feature-based slam方法的標準。orbslam 算是這個思路的延伸,於ptam相比它又加了一個loopclosing的線程。
這個系統基於ptam,個人感覺效果也更好一些(畢竟ptam相對較老),整合了covisible graph,基於bagofwords 做relocalization等技術。
處於什麼地位很難講,雖然創新點不是很多,但是工程上,它是目前最好的。幾篇文章都發在機器人或者控制的頂會上了。


粘一個綜述:
ORB-SLAM 基本延續了 PTAM 的演算法框架,但對框架中的大部分組件都做了改進, 歸納起來主要有 4 點: 1) ORB-SLAM 選用了 ORB 特徵[27], 基於 ORB 描述量的特徵匹配和重定位[28], 都比 PTAM
具有更好的視角不變性. 此外, 新增三維點的特徵匹配效率更高, 因此能更及時地擴展場景. 擴展場
景及時與否決定了後續幀是否能穩定跟蹤. 2) ORBSLAM 加入了循環迴路的檢測和閉合機制, 以消除誤差累積. 系統採用與重定位相同的方法來檢測迴路(匹配迴路兩側關鍵幀上的公共點), 通過方位
圖(Pose Graph)優化來閉合迴路. 3) PTAM 需要用戶指定 2 幀來初始化系統, 2 幀間既要有足夠的
公共點, 又要有足夠的平移量. 平移運動為這些公共點提供視差(Parallax), 只有足夠的視差才能三角
化出精確的三維位置. ORB-SLAM 通過檢測視差來自動選擇初始化的 2 幀. 4) PTAM 擴展場景時也
要求新加入的關鍵幀提供足夠的視差, 導致場景往往難以擴展. ORB-SLAM 採用一種更魯棒的關鍵幀和三維點的選擇機制——先用寬鬆的判斷條件儘可能及時地加入新的關鍵幀和三維點, 以保證後續幀的魯棒跟蹤; 再用嚴格的判斷條件刪除冗餘的關鍵幀和不穩定的三維點, 以保證 BA 的效率和精度. 。

來自《基於單目視覺的同時定位與地圖構建方法綜述》
說的大體不錯。


整體上支持@龐阿坤的說法。
個人覺得客觀地講, orb-slam雖然效果看起來目前最好(我沒有在自己數據集上復現),但其文章創新新並不是很大,不如PTAM,整體上感覺是基於PTAM的改進版本。(感覺就是拼出來的)
將特徵改為ORB,特徵提取匹配的計算量減少。增加閉環檢測模塊,並將其嵌入tracking模塊。
orb-slam 是目前基於特徵的單目slam系統中效果最好的(the state of art),
與之對應的LSD-SLAM是direct-slam中最好的,且不提取圖片特徵,直接基於pixels;
orb-slam論文中,作者一再強調orb-slam比lsd效果好....
整體上,orb-slam是一個很贊的單目slam系統,very impressive!


這段時間都在討論orb,前面幾位大蝦也已經說了很多,我就說一些更細節一點的吧,來表達我對這工作的支持。

前面@黃耀 師兄和@龐阿困 師兄都已經提到,orb在理論開創性方面遠不及ptam,然而orb也絕不僅僅是ptam添加了loop closure模塊並替換圖像特徵為orb而已。它吸收了近幾年monoslam領域的很多理論成果,比如逆深度的使用,g2o工具箱的優化等。所以我更贊同@半閑居士 高博的說法,orb是一個系統工程,考慮比較全面。
目前看來orb已經算是把vision slam方面能優化的東西都優化到了,比如:
關於DBOW模塊,不只是用於loop closure時的檢測,更大的意義在於在圖像幀間匹配時,不使用高維的圖像特徵描述子進行比對,轉而使用詞典對描述子進行分類,然後用分類類別進行比對。在他們組之前的論文中已經證明了這種方法的有效性,可以大大簡化運算。
另一點,orb在每一層估計中都使用了g2o工具箱進行優化,從單幀pose estimation,到局部地圖的pose序列,到局部的地圖點與pose聯合估計,再到利用迴環結果的全局pose序列估計。考慮非常全面細緻,把能優化的步驟都進行了優化。
另外orb的代碼寫得很漂亮,清晰易懂結構合理,可以學習到很多。

當然雖然我是orb的腦殘粉,還是深知orb還遠未到終點,有幾個問題還有待解決。
1. 如高博所說,orb所建地圖非常稀疏,不僅僅是不好看的問題,而是稀疏的地圖對於機器人下一步的應用會造成很大困難。單目沒辦法像RGBd那樣直接獲取深度,所以高博使用的稠密建圖方法很難在單目攝像頭上復用。關於這一點作者的也正在著手解決,主要的思想應該還是用lsd的建圖結合orb的定位。不過源碼還沒放出,拭目以待。
2. 速度問題,雖然我覺得作者在速度方面已經絞盡腦汁,傾盡所有,但實際運行的速度依然不容樂觀。PC端達到實時的壓力不大,但是在嵌入式平台上非常堪憂。我已經把源碼移植到安卓下測試,在沒做什麼平台優化的情況下,幀率約在0.7左右。。
3. 巨大的詞典。目前orb使用了一個用nearest neighbor方法訓練出來的140多m的樹狀詞典。前面已經說過,這個詞典在整個orb中至關重要,每次運行前必須載入至內存。在安卓手機上載入的過程長達三分鐘,很惱人。
4. 系統中有很多magic number,比如特徵匹配的閾值,迴環圖像對比的閾值,都是經驗設定,在不同場景下對應值也有所不同。這些數其實可以通過機器學習的方法學習得到。
5. deep learning對系統的助力,可以思考。

一不小心說了不少,先廢話那麼多吧。。。


orb-slam綜合感覺不錯,就是pure rotation容易跟丟,提取特徵點少的場景景容易跟丟。lsd速度慢,精度低些,不過因基於gradient,估計對規則紋理的室內和建築場景有利。svo對於手持拍攝視頻不好,作者提供的無人機測試數據還可以。 orb-slam和lsd今年都有新論文可以看看,多個方法各有優劣。

對於移動平台,目前單目slam演算法的運算和存儲要求高,穩定性也還不夠。分方向還有stero camera,rgb-d,other sensors combined (imu, gps)等。


效果很好,起了個拋磚引玉的作用,可以研究orb究竟好在哪裡,不好在哪裡,學習吸收,化繁為簡。(嗯,其實不需要bundle adjustment,至少不是那麼用的)。

(有圖有真相,無bundle adjustment 迴環)

ORB裡面bug也還是很多,而且過於面向對象了,使得代碼反而凌亂。還有些理論上作者理解也有錯誤,一併在此指出:

1. [bug] 初始化如果進入Homography checking,一共有八個數值解,其中兩個具有物理意義,在沒有先驗假設的情況下,是無法區分這兩個解對錯的。作者假設parallax大的那個為最優解,這是錯誤的。parallax取決於觀察平面的角度,垂直時大(正對著牆),平行時小(行走時平視馬路),簡單假設大的parallax贏是錯誤的。
正規改法是取第三個frame,三個frame就只有一個物理解。
取巧的改法是隨機返回兩個物理解中的一個,如果不巧是錯的,自然tracking不上,重新開始。

2. [bug] http://ORBmatcher.cc:478 行,統計方向有誤, int bin = round(rot*factor) 改為: int bin = round(rot/(360*factor));

3. [bug] Initializer::checkRT : 890, nGood++ 應該在{} 裡面:
if(cosParallax&<0.99998){
vbGood[vMatches12[i].first]=true;
nGood++;
}

4. 。。。一些代碼可以優化的地方,不算bug,不細說了。

其它的就涉及到理論和演算法流程,這裡不詳談。ORB其實就是PTAM的加強版,最大的價值在於:1.證明了mono vision odometry 可行;2. 證明了orb很適合 mono vision odometry。理論上的突破不大,反而過於複雜了。


關注monoslam也有一段時間了,談一點不成熟的思考。
semidense和dense的slam剛出來的時候感覺很驚艷,但卻都陷入同樣的一個困境,都是深度估計不準。這個問題不能很好解決一直會被湊出來的feature based的slam壓制。
semidense計算出深度是角點處一個小patch的平均,然而角點處的深度往往變化劇烈。
dense方法計算深度更加困難,由於很多pixel在圖像上很相似很難做到精確的幀間匹配,所以很難做到準確。
所以究竟利用少量的相對準確的對應點,還是大量的不太準的對應點做slam效果好,我覺得從orbslam的結果已經給出了答案。


我整理了SLAM學習過程中的開發資源發布在github上:GeekLiB/Lee-SLAM-source


先來張圖鎮樓

IEEE transactions on Robotics 2015 best paper award.

夠一個學者吹好久的成就。

從原理上而言,中規中矩。所有優化問題全是基於g2o算,特徵匹配直接用ORB的描述符,迴環檢測用BOW。並沒有太多學術上的創新,論文里幾乎沒有什麼公式。

從工程的角度看,非常適合移植到實際項目。

因為,效果好,重現容易,代碼結構清晰,命名規範。


很贊的討論!最近也在做orbslam的優化,感覺移動端上速度特別堪憂;另外還有就是詞典的大小,達成二進位還是有40+M


都說這個是一個工程實現比較理想的東西,但是作為小白,我目前所了解的,這樣一個系統在嵌入式平台上面實現還是比較難於工程實現的,因為要效果好、穩定的話硬體平台也很貴~~~


Mark一下


不錯的解答,學到了


推薦閱讀:

機器人能通過觀察環境明白自己在哪嗎?機器人定位的方式對解決「人類路痴」問題有幫助嗎?
基於深度學習的單目深度估計有什麼發展前景呢?
Bundle Adjustment到底是什麼?
三維重建 3D reconstruction 有哪些實用演算法?
華中科技大學圖像所怎麼樣?

TAG:機器人 | 計算機視覺 |