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


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

4.雙目VIO版本,加入了LK光流和滑動(dòng)窗口BA優(yōu)化

5.VI-ORB-SLAM2

6.添加了支持魚眼

7.添加保存和導(dǎo)入地圖功能

8.添加保存和導(dǎo)入地圖功能

9.添加了地圖可視化


11.添加了點(diǎn)線融合

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

13.動(dòng)態(tài)語義SLAM 目標(biāo)檢測(cè)+VSLAM+光流/多視角幾何動(dòng)態(tài)物體檢測(cè)+octomap地圖+目標(biāo)數(shù)據(jù)庫

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


16.提出了一種構(gòu)建3D密集語義圖的方法,該方法同時(shí)利用YOLOv3[3]的2D圖像標(biāo)簽和3D幾何信息

17.ORB-SLAM2在unity中仿真

18.ORB-SLAM2使用CUDA加速

19.ORB-SLAM2
加入距離最優(yōu)路徑規(guī)劃器利用該模型來約束路徑,使得每個(gè)姿勢(shì)中相關(guān)聯(lián)的地圖點(diǎn)的數(shù)量高于閾值。

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

21.將激光雷達(dá)數(shù)據(jù)集成到ORB-SLAM3中


23.在ORB-SLAM3中使用深度學(xué)習(xí)YOLOv3

24.使用ORB-SLAM3創(chuàng)建周圍環(huán)境的分段3D八進(jìn)制圖,可以在八進(jìn)制圖中刪除或添加特定的分段對(duì)象

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

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

4. 主函數(shù)main
(1)首先是ros系統(tǒng)的初始化,以及啟動(dòng)相關(guān)線程
ros::init(argc, argv, "Mono_Inertial");
ros::NodeHandle n("~");
(2)創(chuàng)建SLAM系統(tǒng),system會(huì)初始化所有的系統(tǒng)進(jìn)程,并且準(zhǔn)備好生成幀,此處會(huì)調(diào)用system的構(gòu)造函數(shù)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)準(zhǔn)備捕獲圖像,并用SLAM類進(jìn)行初始化
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);//捕獲圖像,并進(jìn)行跟蹤
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)訂閱話題,獲取彩色圖像,當(dāng)接收到圖像后便會(huì)運(yùn)行此函數(shù),調(diào)用ImageGrabber中的GrabImage函數(shù)。
如果運(yùn)行程序時(shí)出現(xiàn)沒有畫面的情形,大概率是因?yàn)樵掝}名稱不對(duì)應(yīng),先使用rostopic list或者rviz查看發(fā)布的話題,然后更改下面代碼中的話題名稱。
// 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)在回調(diào)函數(shù)中的GrabImage函數(shù)作用是,將訂閱獲取的ros image message轉(zhuǎn)換為矩陣類型,并將rgb圖像以及時(shí)間戳參數(shù)壓入img0Buf,并將其傳遞給System中的TrackStereo函數(shù),進(jìn)行跟蹤。這里會(huì)完成和IMU傳感器對(duì)齊。
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圖像輸入以及初始地圖構(gòu)建
上面一節(jié)展示了這幅圖,我們也將第一列給講述完畢了,當(dāng)然是使用ROS的方式,這里也可以使用opencv等操作,避免使用ROS。
下面我們將開始介紹
TrackMonocular(im,tIm,vImuMeas);這部分的內(nèi)容。

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

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