ORB SLAM筆記 2 框架概述

2021-09-25 23:23:39 字數 1889 閱讀 2292

上篇已經提到過,raulmur博士開源了兩版orb,其中第二版在第一版的基礎上加入了雙目以及rgbd相機的前端介面,並且在回環模組中增開了全域性優化的執行緒。我們先從第一版的pipeline開始說起。另外要說的是這篇總結主要還是從整體上對架構進行說明,大體介紹每個模組的作用以及模組之間是怎麼聯絡起來的。至於每個模組具體用到的數學方法以及**實現,咱們後面還會一篇接著一篇的博文慢慢分析,道不阻,但的確很長哈哈哈。

1. tracking執行緒

顧名思義,主要負責對每一幀影象進行特徵提取,與前一幀影象做特徵匹配然後對該幀的相機位姿做乙個初步的估計,最後決定當前幀是否是乙個關鍵幀,如果是的話就喚醒區域性建圖執行緒。

為什麼要對每一幀做關鍵幀的判別呢?主要因為隨著你的機械人越走越遠,所看到的東西自然越來越多,如果我們把看到的每一幀都存下來,並在後面對它們進行整體優化,那麼整個slam系統會變得越來越卡,同時記憶體也是吃不消的。現在主流的visual slam方案,無論特徵點法(如orb)還是直接法(如lsd),再或者像半直接法的svo(semi-direct vo,有的人也稱其為稀疏直接法,這麼叫是因為這個東西混合使用了直接法和特徵點法,只在幀間做image-alignment得到初始位姿估計的時候用到了直接法,在對pose&structure進行優化時,構造的殘差方程還是最小化特徵點的重投影誤差),均為keyframe-based。

該執行緒還有乙個地圖初始化的部分,單目模式用在前兩個關鍵幀三角化出三維點座標時,orb在地圖初始化上實現了自動化,具體怎麼個初始化後面也會講。

該執行緒維護系統的地圖,以單目orb為例,最早在createinitialmapmonocular()中利用找到的頭兩個kfs進行初始化。在此以後,該執行緒從tracking執行緒源源不斷地接受kfs,向地圖加入新的map points,並刪除一些冗餘的kfs和map points,從而維護乙個穩定的關鍵幀集合。需要注意的是,該!線

!程!只

!是!維

!護!地

!圖!沒

!有!全

!局!優

!化!但先說一句,有優化嗎?是有的,我們看框架圖,在對冗餘關鍵幀進行刪除之前,**中是做了一步區域性

ba的,參與優化的是當前幀以及與當前幀相連的關鍵幀和地圖點。

在說下一線程之前,先放上orb2的pipeline。

這裡先講下前端執行緒的不同,加入了雙目和rgbd的介面,這兩種相機就不用再像單目那樣較為麻煩的初始化了,雙目通過左右目匹配加三角化可以得到三維空間點座標,深度相機的話就更方便了,直接分分鐘獲得depth資料。

在orb2的原始碼實現中,第四執行緒fullba(其實就是globalba,乙個作者乙個叫法兒)是在loopclosing中做完優化essentialgraph並更新圖中邊的資訊(這後面也細說…..感覺寫到這兒挖了一堆坑欠了一屁股債哈哈哈)之後,執行緒內部喚醒的fullba執行緒,所以我們就乾脆一塊兒說。

3. loopclosing+fullba

slam系統如果只是考慮影象幀時間上的關聯,長久下去必定會有累計誤差,後面的估計會變得不可靠,無法得到全域性一致的軌跡和地圖。回環檢測模組能夠給出一些除了臨近共視幀以外的時間上更加久遠的約束。說白了,就是能夠檢測出,機器繞了一圈兒回來以後,還能認出我來過這件事情。

fullba相對於之前的區域性ba非常好理解,優化物件變為了所有kfs以及map中的點。個人理解,這麼做的原因主要是在於回環模組一旦檢測出了回環,correctloop這個環節,也就是把後面整體走跑偏的那麼一段軌跡往正確方向拉的這個過程,還是乙個區域性行為。那麼全域性一致性勢必仍會受影響,所以再做了一步全域性優化。

後面開始,我們就要乙個模組接乙個地慢慢啃了,接下來先講單目orb地圖自動初始化的問題。

ORB SLAM 學習筆記

orb slam 的整體系統框架圖 orb slam 它是由三大塊 三個流程同時執行的。第一塊是跟蹤,第二塊是建圖,第三塊是閉環檢測。1.跟蹤 tracking 這一部分主要工作是從影象中提取 orb 特徵,根據上一幀進行姿態估計,或者進行通過全域性重定位初始化位姿,然後跟蹤已經重建的區域性地圖,優...

java集合框架概述(學習筆記)

1 集合概念 是一種工具類,是一種容器,儲存任意數量的具有共同屬性的物件。2 集合的作用 在類的內部,對資料進行組織 簡單而快速的搜尋大數量的條目 有的集合介面提供了一系列排列有序的元素,並且可以在序列中間快速的插入或者刪除有關元素。有的集合介面提供了對映關係,可以通過關鍵字去快速查詢到對應的唯一物...

ORB SLAM2 定位模式

void load const string filename,systemsetting mysystemsetting,keyframedatabase mpkeyframedatabase 別忘了新增標頭檔案和命名空間中的類宣告。同樣,需要在map.cc檔案中修改load 函式。laod 函式...