ORB-SLAM2初步(源碼邏輯分析)


今天主要是梳理一下ORB-SLAM2源碼的邏輯關系,GitHub和泡泡機器人上有很好的注釋版本(吳博),大神請(輕)板磚。

一、文件

 

如圖所示,Examples里面存放的分別是基於單目、雙目、RGBD的實例程序,一般都是基於TUM等數據庫,還有一個ROS版本的ORB-SLAM2,以及一個應用與AR的Demo程序;

 include文件夾存放的是頭文件,ORB-SLAM2可以被當作一個庫來使用,很多函數都可以直接調用;

src文件夾存放的是和include對應的源文件,包括主要的Tracking、LocalMapping、LoopClosing等的實現過程都在這個文件夾下;

Thirdparty存放的是用到的第三方庫,Vocabulary存放的是回環檢測中BoW用到的視覺詞典;

其它的主要是一些編譯文件,作者不僅給出了CMakeLists.txt,還給出了build.sh,只要配置好了本地環境,運行一下build.sh就行了。

 

二、運行過程

作者將整個SLAM過程做成一個系統(System),因此只要在主函數中聲明一個SLAM System就可以進入跟蹤過程了,以mono_tum.cc為例:

(1)LoadImages(strFile, vstrImageFilenames, vTimestamps);//作者首先從文件中讀取了圖像名稱列表

(2)ORB_SLAM2::System SLAM(argv[1],argv[2],ORB_SLAM2::System::MONOCULAR,true);//然后聲明了一個SLAM系統,並設定是單目MONOCULAR

(3)for(int ni=0; ni<nImages; ni++)//使用一個for循環依次讀取圖片並將圖片輸入到聲明的SLAM系統中;

  {  

    im = cv::imread(string(argv[3])+"/"+vstrImageFilenames[ni],CV_LOAD_IMAGE_UNCHANGED);

    SLAM.TrackMonocular(im,tframe);//進入SLAM系統的接口

  }

(4)SLAM.Shutdown();//圖像讀取完畢之后關閉SLAM系統;

//主函數運行結束,后面另有保存軌跡的函數等;

//從上面過程可以看出,SLAM系統的入口在TrackMonocular這個函數,SLAM的實現在System中;

 

//以下過程就在System.cpp文件中

//在System的構造函數中,作者在聲明該SLAM系統時就啟用了至少3個線程,分別計算跟蹤、局部建圖和回環檢測,還有一個是可選的交互線程

mpTracker = new Tracking(this, mpVocabulary, mpFrameDrawer, mpMapDrawer,
  mpMap, mpKeyFrameDatabase, strSettingsFile, mSensor);//Tracking線程的初始化;

mptLocalMapping = new thread(&ORB_SLAM2::LocalMapping::Run,mpLocalMapper);//LocalMapping線程的初始化;

mptLoopClosing = new thread(&ORB_SLAM2::LoopClosing::Run, mpLoopCloser);//LoopClosing線程的初始化;

mptViewer = new thread(&Viewer::Run, mpViewer);//Viewer線程的初始化;

//構造函數中還有讀取視覺詞典等操作

(3.1)cv::Mat System::TrackMonocular(const cv::Mat &im, const double &timestamp);//SLAM系統的入口

(3.2)cv::Mat Tcw = mpTracker->GrabImageMonocular(im,timestamp);//跟蹤線程的入口,因為調用該函數的對象為mpTracker;

 

//下面就進入了Tracking.cpp文件

  (3.2.1)cv::Mat Tracking::GrabImageMonocular(const cv::Mat &im, const double &timestamp)//首先進入該函數體中,進行灰度圖的轉換;

  (3.2.3)Track();//然后在灰度圖轉換的函數體中完成函數的跳轉,當前這個函數就是跟蹤的主函數體;

    (3.2.3.1)if(mState==NOT_INITIALIZED)  //判斷系統是否初始化,沒有初始化就跳轉到初始化函數,這是單目所獨有的過程;

          {

            MonocularInitialization();//初始化的跳轉函數,具體的初始化過程在Initializer.cc文件中

          }

    (3.2.3.2)if(mpInitializer->Initialize(mCurrentFrame, mvIniMatches, Rcw, tcw, mvIniP3D, vbTriangulated))//初始化的跳轉在這個函數中,因為初始化有一些條件,因此需要做判斷

  (3.2.1)return mCurrentFrame.mTcw.clone();//最終在灰度圖轉換的函數中完成跟蹤過程,返回相機位姿矩陣;

 (3.1)return Tcw;//跳轉,實現對相機位姿的跟蹤

 

三、總結

  代碼的邏輯比較清晰,而且封閉性比較好,可以稍作修改作為庫文件使用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM