這一部分是orb_slam系統中最基本的一步,會對每一幀影象進行跟蹤計算。tracking執行緒執行在主線程中,主要思路是在當前幀和(區域性)地圖之間尋找盡可能多的對應關係,來優化當前幀的位姿。每次新採集到一幀影象,就是用下列介面將影象傳入slam系統就行處理。該**位於主程式中:
// pass the image to the slam system
slam.trackmonocular(im,tframe);
在檢查完系統將模式切換為跟蹤模式後,是用下面介面進入功能:
mptracker->grabimagemonocular(im,timestamp);
本文做匹配的過程中,是用的都是orb特徵描述子。先在8層影象金字塔中,提取fast特徵點。提取特徵點的個數根據影象解析度不同而不同,高解析度的影象提取更多的角點。然後對檢測到的特徵點用orb來描述,用於之後的匹配和識別。跟蹤這部分主要用了幾種模型:運動模型(tracking with motion model)、關鍵幀(tracking with reference keyframe)和重定位(relocalization)。
在成功與前面幀跟蹤上之後,為了提高速率,本文使用與之前速率相同的運動模式來**相機姿態,並搜尋上一幀觀測到的地圖點。這個模型是假設物體處於勻速運動,例如勻速運動的汽車、機械人、行人等,就可以用上一幀的位姿和速度來估計當前幀的位姿。使用的函式為trackwithmotionmodel()。這裡匹配是通過投影來與上一幀看到的地圖點匹配,使用的是matcher.searchbyprojection()。
if(mvelocity.empty() || mcurrentframe.mnid2)
else
當使用運動模式匹配到的特徵點數較少時,就會選用關鍵幀模式。即嘗試和最近乙個關鍵幀去做匹配。為了快速匹配,本文利用了bag of words(bow)來加速。首先,計算當前幀的bow,並設定初始位姿為上一幀的位姿;其次,根據位姿和bow詞典來尋找特徵匹配,使用函式matcher.searchbybow();最後,利用匹配的特徵優化位姿。
假如使用上面的方法,當前幀與最近鄰關鍵幀的匹配也失敗了,那麼意味著需要重新定位才能繼續跟蹤。重定位的入口如下:
bok =relocalization();
此時,只有去和所有關鍵幀匹配,看能否找到合適的位置。首先,計算當前幀的bow向量,在關鍵幀詞典資料庫中選取若干關鍵幀作為候選。使用函式如下:
// relocalization is performed when tracking is lost
// track lost: query keyframe database for keyframe candidates for relocalisation
vector
vpcandidatekfs = mpkeyframedb->detectrelocalizationcandidates(&mcurrentframe);
其次,尋找有足夠多的特徵點匹配的關鍵幀;最後,利用ransac迭代,然後使用pnp演算法求解位姿。這一部分也在tracking::relocalization() 裡。
通過之前的計算,已經得到乙個對位姿的初始估計,我們就能透過投影,從已經生成的地圖點中找到更多的對應關係,來精確結果。函式入口為:
bok =tracklocalmap();
為了降低複雜度,這裡只是在區域性圖中做投影。區域性地圖中與當前幀有相同點的關鍵幀序列成為k1,在covisibility graph中與k1相鄰的稱為k2。區域性地圖有乙個參考關鍵幀kref∈k1,它與當前幀具有最多共同看到的地圖雲點。針對k1, k2可見的每個地圖雲點,通過如下步驟,在當前幀中進行搜尋:
(1)將地圖點投影到當前幀上,如果超出影象範圍,就將其捨棄;
(2)計算當前視線方向向量v與地圖點雲平均視線方向向量n的夾角,捨棄n·v < cos(60°)的點雲;
(3)計算地圖點到相機中心的距離d,認為[dmin, dmax]是尺度不變的區域,若d不在這個區域,就將其捨棄;
(4)計算影象的尺度因子,為d/dmin;
(5)將地圖點的特徵描述子d與還未匹配上的orb特徵進行比較,根據前面的尺度因子,找到最佳匹配。
這樣,相機位姿就能通過匹配所有地圖點,最終被優化。
// check if we need to insert a new keyframe
if(neednewkeyframe())
createnewkeyframe();
確定關鍵幀的標準如下:
(1)在上乙個全域性重定位後,又過了20幀;
(2)區域性建圖閒置,或在上乙個關鍵幀插入後,又過了20幀;
(3)當前幀跟蹤到大於50個點;
(4)當前幀跟蹤到的比參考關鍵幀少90%。
ORB SLAM2詳解(六)閉環檢測
首先我們計算關鍵幀ki和在covisibility graph中與其相連的關鍵幀之間的詞袋 bow 之間的相似度。本文中,作者離線訓練了大量的基於orb描述的詞袋,在程式執行時載入進去。這裡的詞袋作為對該關鍵幀的描述,將閉環檢測轉變為乙個類似於模式識別的問題。當相機再次來到之前到過的場景時,就會因為...
ORB SLAM2 定位模式
void load const string filename,systemsetting mysystemsetting,keyframedatabase mpkeyframedatabase 別忘了新增標頭檔案和命名空間中的類宣告。同樣,需要在map.cc檔案中修改load 函式。laod 函式...
ORBSLAM2之LocalMapping執行緒
一 處理新關鍵幀processnewkeyframe 五 區域性ba 六 刪除冗餘關鍵幀keyframeculling 七 將當前關鍵幀插入閉環檢測佇列 更新當前關鍵幀的共檢視updateconnections a 遍歷當前關鍵幀的mp,更新共檢視 b 更新當前關鍵幀的子關鍵幀與父關鍵幀 i.與當前...