国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

ORB_SLAM3:單目+IMU初始化流程梳理

這篇具有很好參考價值的文章主要介紹了ORB_SLAM3:單目+IMU初始化流程梳理。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

單目+IMU模式下,前面的一些配置完成后,處理第一幀圖像時:

1、每幀圖像都會調(diào)用該函數(shù):

clahe->apply(im,im);

目的:使灰度直方圖分布較為均勻,從而使整體對比度更強(qiáng),便于后面特征點(diǎn)的提取等工作;

2、第一幀圖像(ni=0)時無IMU數(shù)據(jù)(vImuMeas容器為空),進(jìn)入下面的這個函數(shù):

SLAM.TrackMonocular(im, tframe, vImuMeas);

該函數(shù)先是對一些狀態(tài)進(jìn)行判斷,做出相應(yīng)的處理。當(dāng)有IMU數(shù)據(jù)時,將IMU數(shù)據(jù)存儲到隊(duì)列mlQueueImuData中,其主要任務(wù)是計(jì)算當(dāng)前幀相機(jī)的位姿,通過調(diào)用下面這個函數(shù)來完成;

Sophus::SE3f Tcw = mpTracker->GrabImageMonocular(imToFeed, timestamp, filename);

3、先是將彩色圖像轉(zhuǎn)為單通道灰度圖像,然后按照是否有IMU和跟蹤狀態(tài)(mState)來構(gòu)造Frame類,此時跟蹤狀態(tài)mState==NO_IMAGES_YET。當(dāng)前幀構(gòu)造Frame類時需要提取5*1500個特征點(diǎn),初始化成功后只需要提取1500個特征點(diǎn);

4、Frame構(gòu)造函數(shù)中先是完成幀的ID賦值:

mnId = nNextId++;? ? // 先賦值再自增1

然后將金字塔的相關(guān)參數(shù)賦值給成員變量,接下來是對圖像進(jìn)行特征點(diǎn)提取,這時應(yīng)用的是仿函數(shù),運(yùn)行的函數(shù)為:

int ORBextractor::operator()( InputArray _image, InputArray _mask, vector<KeyPoint>& _keypoints,
                                OutputArray _descriptors, std::vector<int> &vLappingArea)

上面仿函數(shù)一些注意的點(diǎn)是:

1)使用四叉樹的方式計(jì)算每層圖像的特征點(diǎn)并進(jìn)行均勻分配,均勻的特征點(diǎn)可以提高位姿計(jì)算精度;2)在計(jì)算特征點(diǎn)的描述子之前先對圖像進(jìn)行高斯模糊,主要是為了避免圖像噪聲的影響;

3)最后需要將金字塔中非0層的特征點(diǎn)坐標(biāo)恢復(fù)到原圖像(第0層)的坐標(biāo)系下,至于界限的意思我沒有看懂,后面也不清楚有什么用。

5、提取完特征點(diǎn)后先用OpenCV的矯正函數(shù)對特征點(diǎn)去畸變,然后計(jì)算去畸變后圖像邊界(此過程一般是在第一幀或者是相機(jī)標(biāo)定參數(shù)發(fā)生變化之后進(jìn)行),最后將特征點(diǎn)分配到圖像網(wǎng)格中(每個固定大小的網(wǎng)格記錄其里面特征點(diǎn)的索引),目的是加快后期的特征點(diǎn)匹配。

當(dāng)?shù)谝粠瑘D像進(jìn)Tracking::Track()時:

1、此時mpLastKeyFrame=NULL、mbCreatedMap=false,將跟蹤狀態(tài)mState更新為NOT_INITIALIZED;

2、進(jìn)行單目初始化,此時mbReadyToInitializate=false,創(chuàng)建初始化關(guān)鍵幀要求當(dāng)前幀的特征點(diǎn)數(shù)多于100個;

3、當(dāng)前幀滿足創(chuàng)建初始化關(guān)鍵幀條件后,更新mInitialFrame、mLastFrame和用于記錄"當(dāng)前幀"所有特征點(diǎn)的mvbPrevMatched,將容器mvIniMatches的所有值都設(shè)置為-1,該容器的長度為當(dāng)前幀特征點(diǎn)的個數(shù);

4、mpImuPreintegratedFromLastKF的Bias設(shè)置為0,*mpImuCalib是在讀取IMU的yaml文件時設(shè)置的。初始化當(dāng)前幀預(yù)積分mCurrentFrame.mpImuPreintegrated = mpImuPreintegratedFromLastKF,最后將mbReadyToInitializate設(shè)為true,意為已經(jīng)創(chuàng)建初始化參考幀,當(dāng)前幀的變換矩陣Tcw為單位矩陣。

當(dāng)?shù)诙瑘D像進(jìn)Tracking::Track()時:

1、此時有IMU數(shù)據(jù),mState=NOT_INITIALIZED、mpLastKeyFrame=NULL,當(dāng)有異常的時間戳?xí)r,需要進(jìn)行處理;

2、對IMU數(shù)據(jù)進(jìn)行預(yù)積分,對每幀IMU數(shù)據(jù)有兩種預(yù)積分,一種是相對于上一幀,另一種是相對于上一個關(guān)鍵幀;

注:在Frame構(gòu)造函數(shù)中將當(dāng)前幀的mpPrevFrame=*mLastFrame,陀螺儀輸出角速度(rad/s),加速度計(jì)輸出加速度(m/s2)。

void Tracking::PreintegrateIMU()  // 要求當(dāng)前幀的上一幀(mpPrevFrame)不為NULL且mlQueueImuData里有數(shù)據(jù)

該函數(shù)主要進(jìn)行的工作是:

1)進(jìn)入while(true)中,將符合下面這2個條件的IMU數(shù)據(jù)存入mvImuFromLastFrame容器中;

條件:a.當(dāng)前IMU時間戳 ≥ 上一幀時間戳 - mImuPer(0.001s)

b.當(dāng)前IMU時間戳 < 當(dāng)前幀時間戳 - mImuPer(0.001s)

結(jié)束while(true)的條件:當(dāng)前IMU時間戳不滿足上面的2個條件或mlQueueImuData容器為空;

2)構(gòu)造IMU預(yù)積分處理器(pImuPreintegratedFromLastFrame),偏置使用上一幀的偏置,每幀的mImuCalib都相同(其是在讀取IMU的yaml文件時設(shè)置的);

3)第一幀IMU數(shù)據(jù)和最后一幀IMU數(shù)據(jù)需要單獨(dú)處理,中間的IMU數(shù)據(jù)直接處理,主要就是計(jì)算前后2幀IMU的平均加速度(acc)、平均角速度(angVel)和兩幀之間的時間差(tstep0);

4)mpImuPreintegratedFromLastKF是在Tracking::ParseIMUParamFile(cv::FileStorage &fSettings)中設(shè)置的,其中偏置都設(shè)置為0;

5)最開始時(即當(dāng)前幀的上一幀)的dR為單位矩陣,dP、dV均為0。主要計(jì)算當(dāng)前幀相對于上一幀和上一關(guān)鍵幀之間的dP、dV和dR,計(jì)算JPa、JPg、JVa、JVg和JRg,最后計(jì)算出該時間段的協(xié)方差矩陣C;

mpImuPreintegratedFromLastKF->IntegrateNewMeasurement(acc, angVel, tstep);
pImuPreintegratedFromLastFrame->IntegrateNewMeasurement(acc, angVel, tstep);

6)更新當(dāng)前幀的mpImuPreintegratedFrame(基于上一幀的IMU預(yù)積分處理器指針)、mpImuPreintegrated(基于上一關(guān)鍵幀的IMU預(yù)積分處理器指針)和mpLastKeyFrame(上一個關(guān)鍵幀指針),最后將當(dāng)前幀的mbImuPreintegrated設(shè)為true,意為當(dāng)前幀完成了預(yù)積分。

當(dāng)?shù)诙瑘D像進(jìn)Tracking::MonocularInitialization()時:

1、此時單目初始化器(mInitialFrame)已創(chuàng)建,mbReadyToInitializate=true,要求當(dāng)前幀特征點(diǎn)超過100個或mSensor == System::IMU_MONOCULAR且當(dāng)前幀上一幀的時間戳比單目初始化參考幀的時間戳大于1秒;

2、滿足上面的條件后對當(dāng)前幀與初始化參考幀進(jìn)行特征點(diǎn)匹配,mvIniMatches容器的索引為初始化參考幀的特征點(diǎn)序號,若初始化參考幀中的該特征點(diǎn)與當(dāng)前幀有匹配,則該容器對應(yīng)的值為當(dāng)前幀特征點(diǎn)序號,否則為-1;

3、先是對兩幀中的特征點(diǎn)進(jìn)行校正,然后通過RANSAC(循環(huán)200次)雙線程計(jì)算基礎(chǔ)矩陣F和單應(yīng)矩陣H,分別記錄得分最高的SH和SF對應(yīng)的H和F矩陣,最后通過條件來判斷是通過基礎(chǔ)矩陣F還是單應(yīng)矩陣H進(jìn)行重建;

4、重建的意思是通過F或H恢復(fù)R、t以及滿足相應(yīng)條件恢復(fù)出的三維點(diǎn)的個數(shù),最后輸出滿足相關(guān)條件最好的Tcw、重建的地圖點(diǎn)和初始化參考幀中哪些特征點(diǎn)成功重建了地圖點(diǎn)(存入容器vbTriangulated中);

5、將初始化參考幀作為世界坐標(biāo)系,因此第一幀變換矩陣為單位矩陣,最后設(shè)置當(dāng)前幀位姿(Tcw)。

Tracking::CreateInitialMapMonocular()函數(shù):

1、將初始化參考幀和當(dāng)前幀都設(shè)置為關(guān)鍵幀,將初始化參考幀的mpImuPreintegrated(基于上一關(guān)鍵幀的IMU預(yù)處理器指針)設(shè)置為NULL;

2、將初始化參考關(guān)幀和當(dāng)前關(guān)鍵幀的描述子轉(zhuǎn)為BoW,主要是完成mBowVec和mFeatVec容器的賦值,其中mBowVec容器的數(shù)據(jù)類型為map,第一個數(shù)據(jù)為單詞id,第二個值為權(quán)重(weight),如果圖像中多個特征點(diǎn)對應(yīng)同一個單詞,則weight會疊加。mFeatVec容器的數(shù)據(jù)類型為map,第一個數(shù)據(jù)為節(jié)點(diǎn)id(L=2時),第二個數(shù)據(jù)類型為vector容器,其里面的內(nèi)容為該節(jié)點(diǎn)id包含的描述子索引,該容器的目的是為后面特征點(diǎn)匹配進(jìn)行加速;注:只有關(guān)鍵幀才會把其的描述子轉(zhuǎn)為Bow

3、用初始化得到的3D點(diǎn)來生成地圖點(diǎn)MapPoints,其中mvIniP3D容器中的數(shù)據(jù)為世界坐標(biāo)系下點(diǎn)的坐標(biāo) :

1)用3D點(diǎn)(世界坐標(biāo)系下)來構(gòu)造地圖點(diǎn);

2)為該地圖點(diǎn)添加屬性:

a.更新觀測到該MapPoint的關(guān)鍵幀,容器mObservations中第一個元素為關(guān)鍵幀指針,第二個元素為該地圖點(diǎn)對應(yīng)此關(guān)鍵幀中的特征點(diǎn)索引,同時更新該地圖點(diǎn)的觀測數(shù)目(nObs),雙目和RGB相機(jī):nObs=nObs+2,單目相機(jī):nObs=nObs+1;

b.從眾多關(guān)鍵幀中能觀測到該MapPoint的特征點(diǎn)中挑選最有代表性的描述子,地圖點(diǎn)最好的描述子與其它能觀測到該地圖點(diǎn)的特征點(diǎn)的描述子應(yīng)該具有最小的距離中值;注:由于一個MapPoint會被許多相機(jī)觀測到,因此在插入關(guān)鍵幀后,需要判斷是否更新當(dāng)前MapPoint最有代表性的描述子。

c.更新該MapPoint平均觀測方向以及觀測距離的范圍。

3)更新關(guān)鍵幀間的連接關(guān)系,每個邊有一個權(quán)重,邊的權(quán)重是該關(guān)鍵幀與當(dāng)前關(guān)鍵幀公共3D點(diǎn)的個數(shù);

4)全局BA優(yōu)化,優(yōu)化當(dāng)前關(guān)鍵幀的位姿和MapPoint;

單目初始化之后,得到的初始地圖中的所有點(diǎn)都是局部地圖點(diǎn)。

5)mState = OK,此時單目初始化全部完成。文章來源地址http://www.zghlxwxcb.cn/news/detail-688089.html

到了這里,關(guān)于ORB_SLAM3:單目+IMU初始化流程梳理的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【ORB_SLAM】Ubuntu20.04 配置ORB_SLAM3

    【ORB_SLAM】Ubuntu20.04 配置ORB_SLAM3

    本文主要記錄基于Ubuntu20.04環(huán)境下,對普通的ORB_SLAM3和稠密版本的ORB_SLAM3進(jìn)行環(huán)境的配置。 這里采用魚香ros的一鍵安裝,感謝小魚的一鍵安裝。 Pangolin:鏈接: https://pan.baidu.com/s/1FXYLsEK1W3xmX0m_Vqylag 提取碼: jgz2 (基于小六的注釋后的ORB_SLAM3代碼) https://github.com/electech6/ORB_SLAM3_d

    2024年02月15日
    瀏覽(28)
  • SIM初始化流程

    SIM初始化流程

    ATR(Answer To Reset):復(fù)位應(yīng)答信號,有SIM卡傳輸給終端,包括SIM卡自身的一些信息,比如支持的傳輸速率,傳輸模式等。 ??SIM卡的ATR代表\\\"Answer to Reset\\\",即復(fù)位響應(yīng)。當(dāng)SIM卡被插入設(shè)備中時,設(shè)備會向SIM卡發(fā)送一個復(fù)位命令,以獲取SIM卡的響應(yīng)。 SIM卡會回復(fù)一個ATR,其中包含有

    2024年02月04日
    瀏覽(26)
  • OpenCV迭代去畸變undistortPoints 與vins的迭代不同 第二章vins前端 第三章imu預(yù)積分 第四章vio初始化

    OpenCV迭代去畸變undistortPoints 與vins的迭代不同 第二章vins前端 第三章imu預(yù)積分 第四章vio初始化

    OpenCV去畸變undistortPoints原理解析 不動點(diǎn)迭代法—單變量非線性方程近似根matlab求解 淦VINS-MONO源碼 03–openCV與VINS中去畸變方法的不同 這里用的方法和openCV不同,假設(shè)現(xiàn)在求A點(diǎn)的去畸變坐標(biāo),那么我們將A的坐標(biāo)直接代入畸變模型中,求得再次畸變的坐標(biāo),并求得這個坐標(biāo)和

    2024年02月09日
    瀏覽(91)
  • Android 11屬性系統(tǒng)初始化流程

    Android 11屬性系統(tǒng)初始化流程

    在init進(jìn)程啟動的第二階段,調(diào)用PropertyInit 對屬性系統(tǒng)進(jìn)行初始化 PropertyInit函數(shù)在systemcoreinitproperty_service.cpp 中實(shí)現(xiàn) 注釋1處在dev下創(chuàng)建__properties__文件夾。注釋2處會收集讀取各個分區(qū)下的property_contexts文件,將讀取到的信息系列化之后,寫到/dev/ properties /property_info文件中。

    2024年04月09日
    瀏覽(20)
  • ORB_SLAM3 LocalMapping中CreateNewMapPoints

    CreateNewMapPoints 在 新插入的關(guān)鍵幀 的 鄰近的關(guān)鍵幀 中,通過 詞袋模型 與新插入關(guān)鍵幀中 沒有匹配的 ORB特征進(jìn)行匹配,并拋棄其中 不滿足對極約束 的匹配點(diǎn)對,接著通過 三角化 生成地圖點(diǎn) GetBestCovisibilityKeyFrames :找出與當(dāng)前關(guān)鍵幀 共視程度最高前nn幀 vpNeighKFs 如果是 I

    2024年02月01日
    瀏覽(32)
  • ORB_SLAM2運(yùn)行KITTI數(shù)據(jù)集

    ORB_SLAM2運(yùn)行KITTI數(shù)據(jù)集

    ????????在前文我們已經(jīng)安裝運(yùn)行了ORB_SLAM2,下載和編譯(包括報錯)在文章: ORB_SLAM2下載編譯及運(yùn)行EuRoC數(shù)據(jù)集_淺夢語11的博客-CSDN博客_euroc數(shù)據(jù)集下載 ? ? ? ? 并且我們使用運(yùn)行了EuRoC數(shù)據(jù)集。今天利用框架運(yùn)行KITTI數(shù)據(jù)集。 ? ? ? ? 注意 :如果沒有運(yùn)行成功EuRoC數(shù)據(jù)

    2024年02月08日
    瀏覽(23)
  • 【ORB_SLAM2算法中逐函數(shù)講解】

    在ORB-SLAM2算法中, TrackReferenceKeyFrame() 函數(shù)主要用于根據(jù)參考關(guān)鍵幀(Reference KeyFrame)來進(jìn)行相機(jī)位姿估計(jì)。這個函數(shù)在跟蹤過程中起到關(guān)鍵作用,它使用當(dāng)前幀與參考關(guān)鍵幀之間的匹配點(diǎn)進(jìn)行位姿估計(jì),從而實(shí)現(xiàn)視覺里程計(jì)的功能。以下是這個函數(shù)中的主要操作: 計(jì)算當(dāng)前

    2023年04月25日
    瀏覽(18)
  • UE4 源碼解析----引擎初始化流程

    UE4 源碼解析----引擎初始化流程

    ? ?在研究UE4的源碼過程中著實(shí)不理解的地方有很多,今天給大家分享一下UE4引擎的初始化流程。 C++的函數(shù)入口都是Main() 函數(shù)入口,UE4也是一樣,EngineSourceRuntimeLaunchPrivate Windows函數(shù)入口 ?引擎入口函數(shù)為:GuardedMain UE4所有相關(guān)的代碼都在游戲循環(huán)函數(shù)中,在Launch.cpp中,寫

    2024年02月06日
    瀏覽(22)
  • 【Git】初始化倉庫配置與本地倉庫提交流程

    【Git】初始化倉庫配置與本地倉庫提交流程

    目錄 一、倉庫配置郵箱與用戶名 二、本地倉庫提交流程 【Git】Linux服務(wù)器Centos環(huán)境下安裝Git與創(chuàng)建本地倉庫_centos git倉庫搭建_1373i的博客-CSDN博客 https://blog.csdn.net/qq_61903414/article/details/131260033?spm=1001.2014.3001.5501 在之前的文章里我們學(xué)習(xí)了如何在centos系統(tǒng)上安裝git以及使用gi

    2024年02月15日
    瀏覽(30)
  • 【PostgreSQL】Ubuntu 下使用 Prisma 的初始化流程

    步驟如下: 創(chuàng)建 Ubuntu 用戶 創(chuàng)建 PostgreSQL 用戶 使用 postgres 用戶登錄,然后創(chuàng)建新用戶: 設(shè)置用戶密碼 使用 postgres 或 projectname 用戶登錄,設(shè)置用戶密碼: 完成上面準(zhǔn)備工作就ok了,不需要手工創(chuàng)建數(shù)據(jù)庫,因?yàn)橄旅鎸⒂?Prisma 來創(chuàng)建數(shù)據(jù)庫。 Prisma 初始化 schema.prisma 創(chuàng)建好

    2024年01月18日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包