最後,System的構造函數完成各個線程對應的類(mpTracker、mpLocalMapper、mpLoopCloser、mpViewer)之間的相互關聯,其實就是保存一下別的類的指針(留個聯繫方式一樣的hh)。
這個函數會根據系統運行時得到相機在各個時刻的位姿來保存一個KITTI數據集官方要求規範的軌跡文件。它是在前面分析的主程序運行結束前被調用的(filename="CameraTrajectory.txt")。
根據代碼注釋的說明:每一幀對應的相機位姿是相對於該幀的參考關鍵幀的位姿存儲的(關鍵幀的位姿會被優化)。因此要獲取某一幀的對應位姿必須先得到其參考關鍵幀的位姿,然後根據二者之間的變換再得到該幀的真正位姿。如果跟蹤失敗,則該幀的位姿不會保存。
輸入為系統指針pSys,詞典指針pVoc,繪圖類的指針pFrameDrawer、pMapDrawer,地圖指針pMap,關鍵幀資料庫指針pKFDB,系統配置文件名strSettingPath,感測器類型(int)。
接下來一些成員變數的初始化:前文提到過的Tracking線程狀態mState為NO_IMAGES_YET(枚舉變數);感測器類型eSensor即為輸入的sensor;系統默認跟蹤且建圖,因此mbOnlyTracking為false;mbVO是一個標誌位,其僅當處於定位模式且當前幀關鍵點與前一幀地圖點沒有足夠時為true,那時系統將只是一個能實現定位功能的視覺里程計;mpORBVocabulary初始化為輸入的詞典指針pVoc;mpKeyFrameDB初始化為輸入的關鍵幀資料庫指針pKFDB;mpInitializer是使用單目相機情況下進行初始化的,可以忽略;mpSystem初始化為輸入的系統指針pSys;可視化類的指針mpViewer初始為NULL;mpFrameDrawer、mpMapDrawer、mpMap也都和前述變數類似初始化為對應的輸入項;mnLastRelocFrameId記錄了上一次進行重定位的幀的ID,初始化為0。