0. 簡介
那篇文章中提到了ORB-SLAM3是一個支持視覺、視覺加慣導、混合地圖的SLAM系統,可以在單目,雙目和RGB-D相機上利用針孔或者魚眼模型運行。
與ORB-SLAM2相比,ORB-SLAM3在處理大視差和長時間未觀測到的場景時效果更好。它還提供了更準確的幀間運動估計和更快的處理速度。
此外,ORB-SLAM3還支持更多的傳感器,包括RGB-D攝像頭和車載LIDAR。ORB-SLAM3的代碼結構也比ORB-SLAM2更加簡潔,使得它更容易理解和擴展。
1. 主要貢獻
個單目和雙目的視覺慣導SLAM系統:全部依賴于MAP(最后后驗概率估計),即使是在IMU初始化的時候。
高召回率的場景重識別算法:DBoW2需要匹配三個連續的關鍵幀,太慢了。
作者的方法是:候選的關鍵幀第一次就進行幾何一致性檢測,然后利用三個共視的關鍵幀進行局部的一致性檢驗,這種策略提升了召回率,并簡化了數據關聯,從而提高了地圖準確性,但計算成本變高。
第一個可以解決純視覺或者視覺慣導的完整的混合地圖的SLAM系統。
在單目或者雙目的系統中,Atlas代表的是一系列不連續的地圖,而且可以把他們應用到所有的建圖過程中:場景重識別、相機重定位、閉環檢測和精確的地圖融合。
這就允許地圖是在不同的時間構建的(增量的SLAM系統),純視覺的Atlas是參考的2019年IROS的一篇文章:ORBSLAM-atlas: a robust and accurate multi-map system,本文又添加了視覺慣導的混合地圖系統來實現場景重識別。
抽象的相機表示:使SLAM系統與所使用的相機模型無關。并允許通過提供其投影,非投影和Jacobian函數來添加新模型我們提供了針孔和魚眼模型的實現。
2. ORB-SLAM2 和 ORB-SLAM3 改進代碼
這部分可以看一下作者的《使用ORBSLAM2進行kineticV2稠密建圖,實時轉octomap建圖以及導航》這篇文章。
這里來匯總一下2,3中常見的擴展,算是一個大全吧
1.高翔實現的添加稠密點云地圖


3.使用SVO中直接法來跟蹤代替耗時的特征點提取匹配,在保持同樣精度的情況下,是原始ORB-SLAM2速度的3倍

4.雙目VIO版本,加入了LK光流和滑動窗口BA優化

5.VI-ORB-SLAM2

6.添加了支持魚眼

7.添加保存和導入地圖功能

8.添加保存和導入地圖功能

9.添加了地圖可視化


11.添加了點線融合

12.使用了一種更好的特征選擇方法

13.動態語義SLAM 目標檢測+VSLAM+光流/多視角幾何動態物體檢測+octomap地圖+目標數據庫

14.用YOLO v3的語義信息來增加跟蹤性能


16.提出了一種構建3D密集語義圖的方法,該方法同時利用YOLOv3[3]的2D圖像標簽和3D幾何信息

17.ORB-SLAM2在unity中仿真

18.ORB-SLAM2使用CUDA加速

19.ORB-SLAM2
加入距離最優路徑規劃器利用該模型來約束路徑,使得每個姿勢中相關聯的地圖點的數量高于閾值。

20.增加了RGBD-IMU的運行模式和ROS接口,增加了單目IMU和雙目IMU的ROS接口,替換了詞典為二進制格式,加載速度更快。
依據ORB_SLAM3重寫了RGBD-IMU的ROS接口,避免出現隊列擁塞,提供了Kinect for Azure的參數文件

21.將激光雷達數據集成到ORB-SLAM3中


23.在ORB-SLAM3中使用深度學習YOLOv3

24.使用ORB-SLAM3創建周圍環境的分段3D八進制圖,可以在八進制圖中刪除或添加特定的分段對象

25.一種基于RGB-D模式將3D激光雷達深度信息集成到現有ORBSLAM3中的新方法。
我們提出并比較了兩種深度圖生成方法:傳統的計算機視覺方法,即逆膨脹操作和基于監督深度學習的方法。
通過添加直接讀取激光雷達點云的所謂RGB-L(LiDAR)模式,將前者直接集成到ORB-SLAM3框架中。

3. 主要結構
由于網上對ORB-SLAM3的內容很多了,這里打算換一個形式,如果這里大段重復別人的內容不是很好,這里換一種形式,即用簡單的話語+鏈接的形式來完成整個ORB-SLAM3的介紹。
這里的圖是以單目融合IMU的文件(Mono_inertial_tum_vi.cc)為例的。但是我們需要注意的是我們一般會使用ros作為 warpper,所以我們會使用ros_mono_inertial.cc完成理解

4. 主函數main
(1)首先是ros系統的初始化,以及啟動相關線程
ros::init(argc, argv, "Mono_Inertial");
ros::NodeHandle n("~");
(2)創建SLAM系統,system會初始化所有的系統進程,并且準備好生成幀,此處會調用system的構造函數System::System(),具體見System.cc
// Create SLAM system. It initializes all system threads and gets ready to process frames. ORB_SLAM3::System SLAM(argv[1],argv[2],ORB_SLAM3::IMU_MONOCULAR,true);
(3)準備捕獲圖像,并用SLAM類進行初始化
ImuGrabber imugb;
ImageGrabber igb(&SLAM,&imugb,bEqual); // TODO
//ImageGrabber類如下
class ImageGrabber
{
public:
ImageGrabber(ORB_SLAM3::System* pSLAM, ImuGrabber *pImuGb, const bool bClahe): mpSLAM(pSLAM), mpImuGb(pImuGb), mbClahe(bClahe){}//類的初始化
void GrabImage(const sensor_msgs::ImageConstPtr& msg);//捕獲圖像,并進行跟蹤
cv::Mat GetImage(const sensor_msgs::ImageConstPtr &img_msg);
void SyncWithImu();
queue img0Buf;
std::mutex mBufMutex;
ORB_SLAM3::System* mpSLAM;
ImuGrabber *mpImuGb;
const bool mbClahe;
cv::Ptr mClahe = cv::createCLAHE(3.0, cv::Size(8, 8));
};
(4)訂閱話題,獲取彩色圖像,當接收到圖像后便會運行此函數,調用ImageGrabber中的GrabImage函數。
如果運行程序時出現沒有畫面的情形,大概率是因為話題名稱不對應,先使用rostopic list或者rviz查看發布的話題,然后更改下面代碼中的話題名稱。
// Maximum delay, 5 seconds ros::Subscriber sub_imu = n.subscribe("/imu", 1000, &ImuGrabber::GrabImu, &imugb); ros::Subscriber sub_img0 = n.subscribe("/camera/image_raw", 100, &ImageGrabber::GrabImage,&igb);
(5)在回調函數中的GrabImage函數作用是,將訂閱獲取的ros image message轉換為矩陣類型,并將rgb圖像以及時間戳參數壓入img0Buf,并將其傳遞給System中的TrackStereo函數,進行跟蹤。這里會完成和IMU傳感器對齊。
void ImageGrabber::SyncWithImu()
{
while(1)
{
cv::Mat im;
double tIm = 0;
if (!img0Buf.empty()&&!mpImuGb->imuBuf.empty())
{
tIm = img0Buf.front()->header.stamp.toSec();
if(tIm>mpImuGb->imuBuf.back()->header.stamp.toSec())
continue;
{
this->mBufMutex.lock();
im = GetImage(img0Buf.front());
img0Buf.pop();
this->mBufMutex.unlock();
}
vector vImuMeas;
mpImuGb->mBufMutex.lock();
if(!mpImuGb->imuBuf.empty())
{
// Load imu measurements from buffer
vImuMeas.clear();
while(!mpImuGb->imuBuf.empty() && mpImuGb->imuBuf.front()->header.stamp.toSec()<=tIm)
? ? ? ?{
? ? ? ? ?double t = mpImuGb->imuBuf.front()->header.stamp.toSec();
cv::Point3f acc(mpImuGb->imuBuf.front()->linear_acceleration.x, mpImuGb->imuBuf.front()->linear_acceleration.y, mpImuGb->imuBuf.front()->linear_acceleration.z);
cv::Point3f gyr(mpImuGb->imuBuf.front()->angular_velocity.x, mpImuGb->imuBuf.front()->angular_velocity.y, mpImuGb->imuBuf.front()->angular_velocity.z);
vImuMeas.push_back(ORB_SLAM3::Point(acc,gyr,t));
mpImuGb->imuBuf.pop();
}
}
mpImuGb->mBufMutex.unlock();
if(mbClahe)
mClahe->apply(im,im);
mpSLAM->TrackMonocular(im,tIm,vImuMeas);
}
std::chrono::milliseconds tSleep(1);
std::sleep_for(tSleep);
}
}
5. 視覺SLAM圖像輸入以及初始地圖構建
上面一節展示了這幅圖,我們也將第一列給講述完畢了,當然是使用ROS的方式,這里也可以使用opencv等操作,避免使用ROS。
下面我們將開始介紹
TrackMonocular(im,tIm,vImuMeas);這部分的內容。

這部分主要完成的是將圖像傳到SLAM系統中并進行跟蹤,具體可以參考ORB-SLAM3 細讀單目初始化過程(上)和ORB_SLAM3原理源碼解讀系列(1)—— ORB特征點提取。
這一章節中主要介紹了Frame部分,主要完成工作是特征點提取,涉及到的知識點其實很多,包括圖像金字塔、特征點均勻化、四叉樹算法分發特征點、特征點方向計算等等。
然后超詳細解讀ORB-SLAM3單目初始化(下篇)和ORB_SLAM3原理源碼解讀系列(2)——單目初始化這一講主要講述了Tracking::Track()。
Tracking部分作用論文已提及,包含輸入當前幀、初始化、相機位姿跟蹤、局部地圖跟蹤、關鍵幀處理、姿態更新與保存等。
除此以外,單目SLAM系統需要設計專門的策略來生成初始化地圖(局部建圖),這也是為什么代碼中單獨設計一個CreateInitialMapMonocular()函數來實現單目初始化。
在文章ORB-SLAM3 單目地圖初始化(終結篇)、ORB_SLAM3原理源碼解讀系列(3)——創建單目初始化地圖和ORB-SLAM3源碼閱讀筆記1:Tracking、LocalMapping和LoopClosing三線程之間的關系里面有著詳細的解釋,這里作者建議參照著代碼注釋與文章來進行解析。
6. System完成多地圖以及閉環檢測
經過上一節的講述,視覺SLAM圖像輸入以及初始地圖構建部分也已經算是講述完畢了,最后一部分就是

6.1 多地圖系統
ORB-SLAM3中的地圖,大致上采用了ORB-SLAM1/2和ORB-Atlas的方法完成了重定位、回環和地圖融合。詳細內容可以參考ORB-SLAM3多地圖管理以及ORBSLAM-Altas:多地圖SLAM
6.2 重定位
ORB-SLAM3在重定位的策略上做了一些改進。為了保證重定位不出錯,重定位常常設置了嚴苛的條件,保證高精準率而識別率較低。
舊的方法(ORB-SLAM1/2)中當3個關鍵幀完全匹配上后才判定為重定位成功。然而作者發現,三個關鍵幀經過了很長的時間。
主要改進是,當當前關鍵幀與數據庫的關鍵幀匹配上后,檢測與當前關鍵幀具有共視關系的關鍵幀是否也能夠匹配,如果可以則判定為重定位成功;
否則才繼續使用接下來的關鍵幀進行判定。,具體文章可以參考【ORB-SLAM3】LoopClosing-回環檢測與地圖融合詳述,以及ORB-SLAM3源碼閱讀筆記13:回環檢測與重定位的實現與分析。
6.3 視覺地圖融合
視覺地圖融合方式與ORB-Atlas的大致相同,對融合的區域起了一個新的名字叫做“銜接窗口(welding window)”。
同時指明在銜接后進行完整位姿圖融合時,銜接窗口的關鍵幀固定以保證不會出現gauge freedom。(十三)ORBSLAM3子地圖融合優化
6.4 閉環
閉環檢測部分與ORB-Atlas的基本相同。
審核編輯:劉清
-
傳感器
+關注
關注
2576文章
55028瀏覽量
791225 -
RGB
+關注
關注
4文章
831瀏覽量
61932 -
SLAM
+關注
關注
24文章
457瀏覽量
33320 -
LiDAR芯片
+關注
關注
1文章
18瀏覽量
3400 -
orb
+關注
關注
0文章
21瀏覽量
10184
原文標題:ORB-SLAM3整體流程詳解
文章出處:【微信號:vision263com,微信公眾號:新機器視覺】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
ORB_FPGA單層圖像金字塔的ORB特征提取方案分析
請問用樹莓派運行ORB-SLAM2算法可行嗎?
機器人SLAM實現
SLAM還是存在許多開放性的問題
ORB SLAM中涉及的一些基礎概念
基于視覺傳感器的ORB-SLAM系統的學習
ORB-SLAM3與ORB-SLAM2相比有哪些優勢呢?
OV2SLAM(高速視覺slam)簡析
基于英特爾開發套件使用ORB-SLAM3實現無人機實時定位
視覺SLAM開源算法ORB-SLAM3原理與代碼解析
ORB-SLAM3整體結構框架分析
工程實踐中VINS與ORB-SLAM的優劣分析
基于深度學習的增強版ORB-SLAM3詳解
ORB-SLAM3整體流程詳解
評論