天天看點

ORB_SLAM2捋思路

參考:http://www.cnblogs.com/mafuqiang/p/6904452.html

之前也看了很多其他的slam算法,但是一直沒有深入看下去,原因自已也有,也有一些工作上的原因。最近靜下心來想重新從ORB開始看,由于白天還要上班,是以一般也隻能下班後看下。其實之前看orb相關的部落格看了很多,網上關于orb的資料的确很多,主要參考的視訊資料還是泡泡機器人的,非常感謝泡泡機器人。因為部落格上雖然很多,有的部落客也細講了很多東西,但是看完很多部落格後還是會發現總會缺點什麼,比如有些寫部落格的部落客覺得很簡單很容易懂的東西他可能就省略了。然後耐着性子看完了orb相關的三個視訊,最長的一個接近140分鐘,做視訊的泡泡機器人真良心啊,講的非常詳細。但是自己好像感覺還沒搞清楚思路,是以寫下部落格幫助自己捋思路。

orb_slam2在orb_slam1的基礎上增加了支援相機的類型,總共可以支援三種形式的相機工作,一種是rgbd,一種是雙目,一種是單目。畢竟現在研究單目的人越來越多。orb其實總共有四個線程,一個主線程:跟蹤(tracking),另外兩個線程一個是局部建圖(local mapping)、一個是回環檢測(loop closing) 。還有一個就是顯示線程(viewing)。此處應該插入一張非常好的圖檔。

ORB_SLAM2捋思路

開始開始了,打開orb檔案夾會下的examples檔案夾會發現三個子檔案夾分别對應單目、雙目、rgbd相機的主程式。因為我想從最簡單的開始看起,是以選擇了rgbd,開始看。

主函數裡面是先初始化一個ORB_SLAM2::System對象,啟動構造函數,構造函數做了以下幾件事:加載詞典、建立資料集、建立地圖。初始化跟蹤線程,初始化局部建圖線程并啟動該線程,初始化回環檢測線程并且啟動該線程,初始化可視化線程并啟動(多線程看的不太懂)。

mpLocalMapper = new LocalMapping(mpMap, mSensor==MONOCULAR); mptLocalMapping = new thread(&ORB_SLAM2::LocalMapping::Run,mpLocalMapper);

new 的時候有構造函數就初始化,但是第thread()函數帶的第二個參數沒有看明白,查資料說是傳遞的參數,但是run()函數沒有參數呀,而且裡面也沒有用到mpLocalMapper,不懂不懂。

(其實我建議有時間也可以同時看三個線程,因為到跟蹤的後面你會發現會不停的跟mappoint keyframe local(很多函數帶有的一個單詞)打交道)然後開始線上程之間設定指針。構造函數結束并傳回函數。

然後在主函數中會調用SLAM對象的trackrRGBD()函數,每接受一個圖像調用一次這個函數,正式進入跟蹤線程。根據iembActivateLocalizationMode和mbDeactivateLocalizationMode判斷是否設定為“隻定位模式”或者“定位建圖模式”,第一次調用預設都是false。之後會遇到這個函數GrabImageRGBD,它傳回的是Tcw,相機相對于世界坐标系的轉換。進入這個函數裡面去看看,它最終會調用tracking類的track()函數,進入track()函數,首先是初始化,如果沒有初始化就先初始化,單目會相對複雜點。我們先進入雙目和rgbd的,判斷特征點的數量書否大于500,滿足就設定目前幀的位姿為機關位姿,建立關鍵幀,并将關鍵幀插入地圖(map),接着建立地圖點并且關聯到關鍵幀上。有幾個函數需要解釋下

pNewMP->AddObservation(pKFini,i); pKFini->AddMapPoint(pNewMP,i); pNewMP->ComputeDistinctiveDescriptors(); pNewMP->UpdateNormalAndDepth(); mpMap->AddMapPoint(pNewMP);

繼續閱讀