INDEMIND雙目視覺慣性模組上線開售至今受到了眾多開發者、學生的青睞,INDEMIND感激的同時決定為不同學習階段的用戶開設一系列技術公開課,解答用戶最為關注的問題及疑惑。今天,INDEMIND將為大家帶來ORB-SLAM2的演算法示例。

一.ORB-SLAM

1. ORB-SLAM簡介

ORB-SLAM是一個基於ORB特徵點的實時SLAM系統,由Raul Mur-Arta、J. M. M. Montiel和Juan D. Tardos於2015年發表在IEEE Transactions on Robotics。ORB-SLAM基於PTAM架構,增加了地圖初始化和閉環檢測的功能,優化了關鍵幀選取和地圖構建的方法,在處理速度、追蹤效果和地圖精度上都取得了不錯的效果,十分適用於室內外大小規模的環境場景應用[1]。

ORB-SLAM2則是在ORB-SLAM的基礎上添加了對雙目相機、RGBD相機的支持,同樣包含跟蹤(Tracking)、建圖(Mapping)、重定位(Relocalization)、閉環檢測(Loop closing)等模塊。

2. 系統架構

ORB-SLAM主要分為追蹤、地圖構建和閉環檢測三個線程,具體系統架構如下:

1) 追蹤

ORB特徵提取初始姿態估計(速度估計)姿態優化(Track local map,利用鄰近的地圖點尋找更多的特徵匹配,優化姿態)選取關鍵幀2) 地圖構建加入關鍵幀(更新各種圖)驗證最近加入的地圖點(去除Outlier)

生成新的地圖點(三角法)

局部Bundle adjustment(該關鍵幀和鄰近關鍵幀,去除Outlier)驗證關鍵幀(去除重複幀)3) 閉環檢測 選取相似幀(bag of words)檢測閉環(計算相似變換(3D<->3D,存在尺度漂移,因此是相似變換),RANSAC計算內點數)融合三維點,更新各種圖圖優化(傳導變換矩陣),更新地圖所有點[2]

ORB-SLAM關鍵點如下:

3. 特性分析

1) ORB-SLAM所有步驟統一使用圖像的ORB特徵。ORB特徵是一種非常快速的特徵提取方法,具有旋轉不變性,並可以利用金字塔構建出尺度不變性。使用統一的ORB特徵有助於SLAM演算法在特徵提取與追蹤、關鍵幀選取、三維重建、閉環檢測等步驟具有內生的一致性。

2) 為了消除累計誤差,ORB-SLAM演算法加入了循環檢測和閉合機制。

3) ORB-SLAM 採用一種更魯棒的關鍵幀和三維點的選擇機制——先用寬鬆的判斷條件儘可能及時地加入新的關鍵幀和三維點, 以保證後續幀的魯棒跟蹤; 再用嚴格的判斷條件刪除冗餘的關鍵幀和不穩定的三維點,以保證 BA 的效率和精度。

4) ORB-SLAM系統代碼結構十分清晰,非常適用於適配到實際場景中。

雖然ORB-SLAM是一個非常工程化的系統,但其同樣存在很多劣勢。

1) ORB-SLAM對高速機動場景支持不足,旋轉時比較容易丟幀。

2) 構建的場景點雲地圖非常稀疏,只保留了圖像中特徵的一部分作為關鍵點,無法通過密集點雲地圖描述物體結構屬性,因此無法滿足障礙物識別需求。

3) 初始化時最好保持低速運動,對準紋理豐富的場景。

4) ORB-SLAM為了兼容性犧牲了部分載入速度,因此在載入地圖時比較緩慢。

簡而言之,對於地圖密度要求不高的定位和追蹤問題,ORB-SLAM是一個不錯的選擇。

二.安裝及調用

INDEMIND雙目視覺慣性模組採用視覺+IMU的多感測器融合架構,可獲取精準的圖像及IMU數據,並依賴於微秒級時間同步機制與高精度的感測器標定方法,可為多種開源演算法提供精準穩定的前端數據獲取能力。

說明:本次ORB-SLAM Demo是基於INDEMIND雙目視覺慣性模組採集的數據,離線運行而來。安裝及調試教程基於Ubuntu 16,各位老兵可略過。

1. 下載ORB-SLAM

下載地址:

raulmur/ORB_SLAM2?

github.com
圖標

2. 下載INDEMIND雙目視覺慣性模組SDK

INDEMIND雙目視覺慣性模組的SDK為開發者提供了豐富的開發工具與輔助,省去了開發者對相機的標定、數據同步等開發工作,加速開發進程。因此,我們直接根據自身操作系統直接下載INDEMIND雙目視覺慣性模組的SDK即可。

下載地址:

INDEMIND | SDK下載?

indemind.cn

3. 使用SDK

創建SDK對象

CIMRSDK* pSDK = new CIMRSDK();

設置使用的 SLAM

MRCONFIG config = { 0 };
config.bSlam = true; //true 開啟 SLAM,false 不開啟 SLAM

//獲取模組標定信息

CameraCalibrationParameter param;

獲取模組圖像數據

pSDK->RegistModuleCameraCallback(SdkCameraCallBack,NULL);

獲取 SLAM 結果

pSDK->RegistModulePoseCallback(sdkSLAMResult,NULL);

將param的參數寫入文件中

ofstream out("./datafile.txt");

釋放資源

pSDK->Release();
delete pSDK;

編譯

安裝 cmake

sudo apt-get install cmake

安裝 google-glog + gflags

sudo apt-get install libgoogle-glog-dev

安裝 BLAS & LAPACK

sudo apt-get install libatlas-base-dev

安裝 SuiteSparse and CXSparse

sudo apt-get install libsuitesparse-dev

編譯器

使用 Ubuntu 16.04 編譯 demo 程序需要使用 GCC5.4 版本,否則可能鏈接失敗。

使用 Ubuntu 18.04 編譯 demo 程序需要使用 GCC7.3 版本,否則可能鏈接失敗。

編譯

cd build
cmake ..
make

執行

把剛才編譯的可執行文件 TestIndem 拷貝到剛才解壓 SDK 的 lib 目錄下的 1604 目錄下,在 lib/1604 目錄下使用 sudo ./TestIndem.sh 命令啟動程序。

TestIndem 和 TestIndem.sh 需要可執行許可權。 使用命令 chmod 777 TestIndem 和 chmod777 TestIndem.sh 進行修改。

為了提高系統穩定性,請運行時使用超級用戶(root 許可權)運行,或者使用 「sudo ./程序名」 運行,例如 DEMO 運行「sudo ./TestIndem.sh」。

*注意:在 Ubuntu 18.04 上使用 GCC7.3 編譯 demo 的時候,需要把 demo 裏的 CMakeLists.txt 的1604 改成 1804 才能編譯成功,編譯成功後把 TestIndem 拷貝到 lib/1804 下運行。

4. ORB-SLAM2參數設置及矯正

需要更改的相機參數:

//雙目攝像頭之間的相對關係
cv::Mat R = cv::Mat(3,3,CV_64FC1,R_matrix);
cv::Mat t = cv::Mat(3,1,CV_64FC1,t_matrix);
//3X3 左相機內參矩陣
cv::Mat K_l = cv::Mat(3,3,CV_64FC1,_Kl);
//3X3 右相機內參矩陣
cv::Mat K_r = cv::Mat(3,3,CV_64FC1,_Kr);
//4X1 左相機畸變差校正參數,魚眼畸變
cv::Mat D_l = cv::Mat(4,1,CV_64FC1,_Dl);
//4X1 右相機畸變差校正參數,魚眼畸變
cv::Mat D_r = cv::Mat(4,1,CV_64FC1,_Dr);
//3X3 基線校正後左相機旋轉矩陣
cv::Mat R_l = cv::Mat(3,3,CV_64FC1,_Rl);
//3X3 基線校正後左相機旋轉矩陣
cv::Mat R_r = cv::Mat(3,3,CV_64FC1,_Rr);
//3X4 基線校正後左相機投影矩陣
cv::Mat P_l = cv::Mat(3,4,CV_64FC1,_Pl);
//3X4 基線校正後右相機投影矩陣
cv::Mat P_r = cv::Mat(3,4,CV_64FC1,_Pr);
//矯正
cv::stereoRectify(K_l,D_l,K_r,D_r,cv::Size(cols_l,rows_l),R,t,R_l,R_r,P_l,P_r,Q,cv::CALIB_ZERO_DISPARITY,0);
//左相機去魚眼畸變
cv::fisheye::initUndistortRectifyMap(K_l,D_l,R_l,P_l.rowRange(0,3).colRange(0,3),cv::Size(cols_l,rows_l),CV_32FC1,M1l,M2l);
//右相機去魚眼畸變
cv::fisheye::initUndistortRectifyMap(K_r,D_r,R_r,P_r.rowRange(0,3).colRange(0,3),cv::Size(cols_r,rows_r),CV_32FC1,M1r,M2r);

編譯

cd ORB_SLAM2
chmod +x build.sh
./build.sh

執行

基於雙目的執行

./Examples/Stereo/stereo_euroc Vocabulary/ORBvoc.txt Examples/Stereo/EuRoC.yaml PATH_TO_SEQUENCE/mav0/cam0/data PATH_TO_SEQUENCE/mav0/cam1/data Examples/Stereo/EuRoC_TimeStamps/SEQUENCE.txt

至此,INDEMIND雙目視覺慣性模組運行ORB-SLAM工程全部部署完畢,實際表現如下:

三.Demo演示

ORB-SLAM2 Demo https://www.zhihu.com/video/1059408815304347648

INDEMIND雙目視覺慣性模組是專為計算機視覺技術研發應用而研發的雙目慣性相機,模組採用「雙目+IMU」多感測器融合架構,擁有微秒級時間同步機制,減少了感測器數據同步誤差,可提供精準實時的1280*800@50FPS圖像源與高頻率IMU數據,為SLAM研發奠定了良好的前端數據基礎。

在出廠時,INDEMIND還對雙目視覺慣性模組進行了高精度的專業標定,減少了感測器裝配誤差,提升精度。並且,INDEMIND雙目視覺慣性模組擁有完備的SDK開發工具及豐富的開發文檔,無縫支持多種開源項目,節省開發者開發工作,詳細SDK信息,請參考:indemind.cn/sdk.html

未完待續……接下來我們將為大家帶來INDEMIND雙目慣性模組實時運行ORB-SLAM DEMO

福利時間:

活動1:【雙目慣性模組免費試用】,開發者可獲得15天雙目慣性模組免費試用期,反饋精彩內容(包括並不限於模組性能、項目體驗、項目效果等),可將免費試用期延長至30天。更多活動信息關注INDEMIND微信公眾號或戳:u.eqxiu.com/s/GIfts1hn

活動2:【在校開發者優惠活動】,關注INDEMIND公眾號提交相關信息即可領取模組100元優惠券。券後900的價格,用戶即可擁有一臺包含多種技術支持及豐富SDK和高精度Vi-SLAM演算法支持的雙目視覺慣性模組。

參考資料:

  1. 《ORB-SLAM(一)簡介》 扶朕起來嗨 CSDN
  2. 《ORB-SLAM2詳解(一)簡介》sylvester0510 CSDN
  3. raulmur/ORB_SLAM2

推薦閱讀:

相關文章