ORB-SLAM介绍(无源码版本)
??SLAM大致可分為激光SLAM和視覺SLAM,本篇就重點介紹一下一種經(jīng)典的視覺SLAM——ORB SLAM。在2015年被首次提出,后續(xù)也有比較好的擴(kuò)展性,應(yīng)用很廣泛。要想真正讀懂ORB-SLAM肯定要從源碼入手,網(wǎng)上也有很多教程去解讀源碼。但鑒于目前的需要,所以只是從結(jié)構(gòu)上介紹下ORB-SLAM,不對代碼進(jìn)行任何的解讀。如果你是和我一樣的小白,不妨看一看,可能會有所收獲~
??首先列舉幾種常見的視覺SLAM,這些大部分都是在ORB-SLAM之前。
??內(nèi)容參考:一文詳解ORB-SLAM3
??下面對ORB-SLAM進(jìn)行一些特點的介紹:
??ORB-SLAM基于PTAM架構(gòu),同樣是基于關(guān)鍵幀(key fream based)在保證tracking和mapping線程分開基礎(chǔ)上,又增加了地圖初始化和閉環(huán)檢測的功能,總共三個線程(tracking、local mapping、loop closing )。
??ORM-SLAM的適用范圍:最開始基于單目,后來擴(kuò)展到stereo和RGB上
??ORB-SLAM的實現(xiàn)是需要完全依托于ROS,對ORB-SLAM的評價是雖然完成了,但僅限于demo,所以基本只有后面的改進(jìn)版本才能夠廣泛應(yīng)用。
??ORB-SLAM的輸入及輸出:
????輸入:攝像頭采集的圖像及時間碼
????輸出:軌跡(每幀圖像對應(yīng)的相機(jī)位姿)+地圖(KF+MP)
??上圖是ORB-SLAM的架構(gòu)圖,也是流程圖(簡直清晰的一塌糊涂),把這個圖讀懂了,就完全明白ORB-SLAM的工作流程及原理了。見簡單概括下:主要有5個模塊,其中tracking,local mapping,loop closing是重點模塊,完成了大部分內(nèi)容。place recognition模塊主要是配合上面三個重點模塊,MAP只是一個數(shù)據(jù)結(jié)構(gòu)的存儲庫(不作為介紹的重點)。下面我根據(jù)流程執(zhí)行順序依次介紹各個模塊。
注:上文提到了,ORB-SLAM主要是由三個線程完成。所以第一步是三個線程的初始化,在此不再贅述。
1.TRACKING
??從架構(gòu)圖上可看出包含四個部分,包括了它所能完成的三個功能:(1)確定每幀的初始位姿 (2) 姿態(tài)優(yōu)化 (3)確定KF給Local Mapping。完成三個具體功能之前,要做一些準(zhǔn)備工作:
??準(zhǔn)備工作1:從frame中提取ORB特征,如果你不知道啥是ORB,可以參考:ORB(Oriented FAST and Rotated BRIEF)
??準(zhǔn)備工作2:初始化局部地圖(這也是單目的局限性,第一時間必須多角度初始化建立局部地圖),ORB-SLAM提供自動初始化方式。單目SLAM地圖初始化的目標(biāo)是構(gòu)建初始的三維點云,初始化的常見方法有三種:
??ORB SLAM作者提出一種基于統(tǒng)計的模型選擇方法,該方法優(yōu)先選擇第三種方法,并期望在場景退化情形下自動選擇第二種方法。如果選取的兩幀不滿足要求,放棄這兩幀并重新初始化
??該模型方法的具體操作過程,參考:ORB-SLAM(三)地圖初始化
??下面介紹tracking完成的具體三個功能:
??(1)確定每幀的初始位姿(pose)
??pose的確定是根據(jù)上一幀完成的,根據(jù)從上一幀提取出的特征(特征的對應(yīng)關(guān)系是Frame 1對n匹配feature,feature 1對1匹配MP,后續(xù)處理都以幀為單位)。
注:相機(jī)位姿:位姿即位置和姿態(tài),相機(jī)的位姿可以看做相機(jī)從原始位置到當(dāng)前位置的變換,包含一個平移變換和一個旋轉(zhuǎn)變換
參考:視覺SLAM中相機(jī)位姿的多種描述
??估計當(dāng)前位姿的過程有兩個:1)跟蹤 2)計算位姿
??1)跟蹤(跟蹤局部地圖前要先構(gòu)建局部地圖,也就是初始化),跟蹤的目的是找到MP和當(dāng)前幀特征之間的對應(yīng)關(guān)系。原理是當(dāng)前幀和參考關(guān)鍵幀匹配,通過MP建立聯(lián)系(3D→2D的過程)。幀是2D特征,MP是3D點
跟蹤的的具體操作流程是:
??根據(jù)上一幀的位姿加上兩幀MP之間的關(guān)系,將上一幀的MP投影到當(dāng)前幀。在投影點和當(dāng)前幀原有點間尋找匹配,建立當(dāng)前幀和MP之間的新關(guān)系。
??2)計算位姿,跟蹤后,通過PnP對當(dāng)前幀的位姿進(jìn)行求解
姿態(tài)優(yōu)化的原因:影響ORB SLAM精度的影響因素:幀與幀之間的位姿優(yōu)化是否準(zhǔn)確
??(2)位姿優(yōu)化
??主要思路是在當(dāng)前幀和(局部)地圖之間尋找盡可能多的對應(yīng)關(guān)系,來優(yōu)化當(dāng)前幀的位姿
??進(jìn)行位姿優(yōu)化的原因:得到的位姿是相對位姿,通過優(yōu)化來保障精度。
??優(yōu)化位姿的方式:局部/全局位姿優(yōu)化,閉環(huán)檢測優(yōu)化
??(3)確定關(guān)鍵幀
??通過參考幀就可以決定當(dāng)前幀是不是關(guān)鍵幀
??關(guān)鍵幀要求:
????1.不要太稠密(兩相鄰關(guān)鍵幀有一定時間距離)
????2.當(dāng)前幀確定為關(guān)鍵幀至少要匹配到50個MP
????3.當(dāng)前幀匹配MP不能超過參考幀的90%,否則認(rèn)為是冗余關(guān)鍵幀,不需要創(chuàng)建
??添加關(guān)鍵幀時間:局部地圖優(yōu)化的空閑時間
??要選出關(guān)鍵幀的原因就是減少幀的數(shù)量,便于后面的BA
2.Local Mapping
??整個模塊的功能是更新局部地圖(由關(guān)鍵幀的聯(lián)系組成),將新關(guān)鍵幀加入,建立關(guān)鍵幀之間的聯(lián)系對關(guān)鍵幀位姿和map point點位置進(jìn)行修正
??從架構(gòu)圖上看,Local Mapping具體完成5部分功能:(1)關(guān)鍵幀的插入 (2)MP的剔除 (3)MP的創(chuàng)建 (4)local BA (5)KF的剔除
??(1)關(guān)鍵幀的插入
??添加關(guān)鍵幀步驟:
????確定當(dāng)前幀的鄰接關(guān)鍵幀和二級鄰接關(guān)鍵幀(確定方法同上,只不過發(fā)起者變成鄰接關(guān)鍵幀),將當(dāng)前幀的MP投影至一級/二級,若出現(xiàn)新匹配特征,曾更加該關(guān)鍵幀與MP的聯(lián)系,未出現(xiàn)新的,但出現(xiàn)匹配更多的也修改MP與該幀的匹配聯(lián)系。若匹配MP的數(shù)量達(dá)到閾值,即認(rèn)定為關(guān)鍵幀。
??(2)Map Point的剔除
??MP的剔除是選擇與關(guān)鍵幀聯(lián)系較少,少于某一個指定閾值(原文中應(yīng)該是3)。認(rèn)定其為壞點,將其剔除。減少MP的數(shù)量,有利于優(yōu)化速度。剔除的檢查步驟發(fā)生在MP新加入時
??(3)Map Point的創(chuàng)建
??MP創(chuàng)建原則:
????當(dāng)前關(guān)鍵幀在covisibility graph中鄰接的一些關(guān)鍵幀(設(shè)定共同MP個數(shù),達(dá)到要求算鄰接)。對鄰接的關(guān)鍵幀進(jìn)行遍歷,在極線上進(jìn)行搜索并三角化。根據(jù)匹配點對,通過三角化計算3d點。再確定MP的相關(guān)屬性(平均觀測方向、觀測距離、最佳描述子)
注:MP和KF變了之后,covisibility和spantree都要變。添加進(jìn)入約束后要進(jìn)行局部BA
??(4)局部優(yōu)化(local BA)
??目的:這個不用輸,就是提高局部地圖精度
??局部優(yōu)化的參與者:當(dāng)前關(guān)鍵幀A、與A直接相連的關(guān)鍵幀B,與B關(guān)聯(lián)的關(guān)鍵幀C、A對應(yīng)的MP,B對應(yīng)的MP(不包括與A共同的)
注:全局優(yōu)化的參與者:除第一幀外所有關(guān)鍵幀及所有MP
??(5)局部KF的剔除
??根據(jù)covisibility確定局部關(guān)鍵幀,若關(guān)鍵幀A對應(yīng)的MP能被其他至少三個關(guān)鍵幀觀測到90%以上,認(rèn)為其冗余,去除。也是為優(yōu)化增加便利
以上完成VO過程
3.Loop Closing
??模塊整體作用:解決累計誤差,尺度漂移問題
??步驟:確定候選閉環(huán)幀→確定閉環(huán)幀
??具體過程:ORB-SLAM采用改進(jìn)的DBoW2的方式解決環(huán)路檢測問題。改進(jìn)點就在于原來是尋找一個,現(xiàn)在返回多個可能匹配值。
??為了解DBoW2,介紹詞袋模型(bag of words),詞袋模型是以特征描述作為元素的詞典。本文就是ORB特征了。詞典元素可以通過數(shù)據(jù)訓(xùn)練出來(可離線訓(xùn)練,增強(qiáng)實時性)。從圖像中提取特征描述(多用多維向量表示),將特征描述分類(可用聚類中各種機(jī)器學(xué)習(xí)算法)。就組成了詞袋模型。為了便于搜索再使用樹狀結(jié)構(gòu)組織,就形成DBoW2。簡而言之DBoW2可以判斷兩張圖片是否有相似性,改進(jìn)后輸出與屬于輸入有相似性的一組圖片。
??確定候選閉環(huán)幀:確定局部關(guān)鍵幀,計算局部關(guān)鍵幀的詞袋向量和所有局部關(guān)鍵幀的詞袋向量相似度。關(guān)鍵幀庫中尋找不小于最小相似度的作為備選回環(huán)關(guān)鍵幀。再檢查剩下的一致性確定閉環(huán)幀(連續(xù)三次的關(guān)鍵幀對應(yīng)相同的候選閉環(huán)幀)
??確定閉環(huán)幀(回環(huán)驗證):從候選的回環(huán)幀中確定真的回環(huán)幀。遍歷每個回環(huán)幀,匹配和當(dāng)前幀的MP,用MP去求一個相似變換(通過RANSAC)。如果回環(huán)幀對應(yīng)的矩陣有足夠多內(nèi)點,做Sim3優(yōu)化,過程循環(huán)一下。最終發(fā)現(xiàn)足夠多內(nèi)點,接受該回環(huán)幀。
??閉環(huán)融合:回環(huán)幀信息融合到當(dāng)前幀中(因誤差累計更信任之前的信息)
??優(yōu)化Essential Graph也是優(yōu)化的一種,操作對象是covisibility graph,為后續(xù)局部優(yōu)化、全局優(yōu)化減少工作量。
4.place recognition模塊
??功能是路徑識別,即判斷兩幀是否存在大范圍的相似。應(yīng)用場景是回環(huán)檢測和重定位(因阻擋、模糊等情況丟失后重新匹配關(guān)鍵幀)
??以上就是ORB-SLAM的整個操作流程,只有清楚上面這些操作,才能更好的理解后面的ORB-SLAM2和ORB-SLAM3哈~
補(bǔ)充說明內(nèi)容:
1.covisibility graph、essential graph到底是什么?
??圖的思想貫穿了ORB-SLAM,優(yōu)化也是選取的圖優(yōu)化。不能說covisibility graph就是全局地圖,我覺得叫位姿地圖吧。covisibility graph的每個頂點是相機(jī)的pose(位姿),邊是pose和pose之間的變換關(guān)系。邊建立的基礎(chǔ)和幀、MP組成的圖有關(guān)系,也就是相機(jī)看到相似點時就會產(chǎn)生聯(lián)系,邊的權(quán)值就是聯(lián)系的可信程度。我覺得還是不要把這個和幀,MP聯(lián)系在一起了,單純當(dāng)成姿態(tài)關(guān)系圖就行了。
??而essential graph是對covisibility graph的一個簡化(ORB-SLAM自己提的),減少邊的數(shù)量(保持連通性,最小生成樹),目的是在全局回環(huán)的時候減少計算量。
參考:Covisibility Graph - 心田居士 - 博客園 (cnblogs.com) 這篇文章的作者主要內(nèi)容也是參考高博在知乎的一個回答
2.三角化創(chuàng)建MP點什么意思?
??文中說通過三角化的方式就可以創(chuàng)建MP點,三角化指根據(jù)在兩個圖片中的點和變換矩陣就能確定3D點坐標(biāo)。具體的我也不是很明白(數(shù)學(xué)過程沒看~),把其理解為根據(jù)一組匹配點確定特征點(MP)的過程吧。
參考:slam 三角化 - 知乎
3.局部地圖、全局地圖到底指什么?
??這個問題困惑了我很久,這里的地圖不是指看得到那種地圖。其實是特征點信息,局部是當(dāng)前臨近,全局就是所有。這些特征點可以配合當(dāng)前幀去求位姿信息,也就實現(xiàn)了定位的功能。至于SLAM最后建的圖其實就是無數(shù)個特征點,特征點分布就可以反應(yīng)環(huán)境的輪廓。
參考資料:
orb-slam的簡單講解-馮兵_騰訊視頻
SLAM - 標(biāo)簽 - 路游俠 - 博客園
下面這篇對ORB-SLAM的特點把握的比較好:
ORB-SLAM2詳解(一)
總結(jié)
以上是生活随笔為你收集整理的ORB-SLAM介绍(无源码版本)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux常用命令(精)
- 下一篇: 语法分析与中间代码生成