0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

ORB-SLAM2的變量命名規(guī)則代碼運行流程簡析

工程師鄧生 ? 來源:CSDN ? 作者:ncepu_Chen ? 2022-09-29 09:49 ? 次閱讀

運行官方Demo

以TUM數(shù)據(jù)集為例,運行Demo的命令:

./Examples/RGB-D/rgbd_tum Vocabulary/ORBvoc.txt Examples/RGB-D/TUM1.yaml PATH_TO_SEQUENCE_FOLDER ASSOCIATIONS_FILE

rgbd_tum.cc的源碼:

poYBAGM0-gOAXumXAAGdQ4YQ8ns561.jpg
pYYBAGM0-gyAehCOAAEtp0ovUKg988.jpg

運行程序rgbd_tum時傳入了一個重要的配置文件TUM1.yaml,其中保存了相機參數(shù)和ORB特征提取參數(shù):


poYBAGM0-jyAI7fXAAELEC16DeQ600.jpgpoYBAGM0-kaAJXHhAABrtvyeWDY012.jpg閱讀代碼之前你應(yīng)該知道的事情 變量命名規(guī)則 ORB-SLAM2中的變量遵循一套命名規(guī)則: 1、變量名的第一個字母為m表示該變量為某類的成員變量. 2、變量名的第一、二個字母表示數(shù)據(jù)類型: ·p表示指針類型 ·n表示int類型 ·b表示bool類型 ·s表示std::set類型 ·v表示std::vector類型 ·l表示std::list類型 ·KF表示KeyFrame類型 這種將變量類型寫進(jìn)變量名的命名方法叫做匈牙利命名法. 理解多線程 為什么要使用多線程? 1、加快運算速度: 

poYBAGM0-nyAJcUxAABrR2C_b6Y862.jpg

開兩個線程同時計算兩個矩陣,在多核處理器上會加快運算速度 2. 因為系統(tǒng)的隨機性,各步驟的運行順序是不確定的 . Tracking線程不產(chǎn)生關(guān)鍵幀時,LocalMapping和LoopClosing線程基本上處于空轉(zhuǎn)的狀態(tài) . 而Tracking線程產(chǎn)生關(guān)鍵幀的頻率和時機不是固定的,因此需要3個線程同時運行,LocalMapping和LoopClosing線程不斷循環(huán)查詢Tracking線程是否產(chǎn)生關(guān)鍵幀,產(chǎn)生了的話就處理.

406907ac-3f83-11ed-9e49-dac502259ad0.png


poYBAGM0-siAG2huAAEV_81wYwY762.jpgpYYBAGM0-tCARGafAACXQYjc83I836.jpg多線程中的鎖 為防止多個線程同時操作同一變量造成混亂,引入鎖機制: 將成員函數(shù)本身設(shè)為私有變量(private或protected),并在操作它們的公有函數(shù)內(nèi)加鎖. 

pYYBAGM0-uyAbZBtAACaF0bno9M743.jpg

一把鎖在某個時刻只有一個線程能夠拿到,如果程序執(zhí)行到某個需要鎖的位置,但是鎖被別的線程拿著不釋放的話,當(dāng)前線程就會暫停下來;直到其它線程釋放了這個鎖,當(dāng)前線程才能拿走鎖并繼續(xù)向下執(zhí)行. 什么時候加鎖和釋放鎖? unique_lock lockCon(mMutexConnections);這句話就是加鎖,鎖的有效性僅限于大括號{}之內(nèi),也就是說,程序運行出大括號之后就釋放鎖了.因此可以看到有一些代碼中加上了看似莫名其妙的大括號.

poYBAGM0-xiABa0JAACNoQ9tg8M303.jpg

SLAM主類System System類是ORB-SLAM2系統(tǒng)的主類,先分析其主要的成員函數(shù)和成員變量:

409ead8a-3f83-11ed-9e49-dac502259ad0.png

40bfc844-3f83-11ed-9e49-dac502259ad0.png

構(gòu)造函數(shù) System(const string &strVocFile, string &strSettingsFile, const eSensor sensor, const bool bUseViewer=true): 構(gòu)造函數(shù)

poYBAGM0-1yAe5G5AAH7Aw9eI_U257.jpgpYYBAGM0-2OAT08BAABoaeVDoMs467.jpg

LocalMapping和LoopClosing線程在System類中有對應(yīng)的std::thread線程成員變量,為什么Tracking線程沒有對應(yīng)的std::thread成員變量? 因為Tracking線程就是主線程,而LocalMapping和LoopClosing線程是其子線程,主線程通過持有兩個子線程的指針(mptLocalMapping和mptLoopClosing)控制子線程. (ps: 雖然在編程實現(xiàn)上三大主要線程構(gòu)成父子關(guān)系,但邏輯上我們認(rèn)為這三者是并發(fā)的,不存在誰控制誰的問題).

跟蹤函數(shù)

System對象所在的主線程就是跟蹤線程,針對不同的傳感器類型有3個用于跟蹤的函數(shù),其內(nèi)部實現(xiàn)就是調(diào)用成員變量mpTracker的GrabImageMonocular(GrabImageStereo或GrabImageRGBD)方法.

40df2ee6-3f83-11ed-9e49-dac502259ad0.png

傳感器類型用于跟蹤的成員函數(shù) pYYBAGM0-36ASEIEAACHrnznLmI311.jpg

審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 傳感器
    +關(guān)注

    關(guān)注

    2541

    文章

    49979

    瀏覽量

    747680
  • SLAM
    +關(guān)注

    關(guān)注

    23

    文章

    405

    瀏覽量

    31713

原文標(biāo)題:ORB-SLAM2代碼運行流程

文章出處:【微信號:3D視覺工坊,微信公眾號:3D視覺工坊】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    代碼里的命名規(guī)則:錯誤的和正確的對比

    命名規(guī)則。這樣做的主要作用就是使源代碼更易讀易懂。所以,也就更容易維護(hù)和擴展。這篇文章里,我將舉出一些例子,說明什么是“不好的代碼”,什么是“清楚的
    發(fā)表于 06-13 22:33

    請問用樹莓派運行ORB-SLAM2算法可行嗎?

    最近想用樹莓派3B跑ORB-SLAM2,現(xiàn)在的問題就是Pangolin無法執(zhí)行,每次執(zhí)行都報錯 Pangolin X11: Unable to retrieve framebuffer
    發(fā)表于 03-15 22:30

    視覺SLAM特征點法與直接法對比分析

    視覺SLAM——特征點法與直接法對比以及主流開源方案對比 ORB LSD SVO DSO
    發(fā)表于 06-02 16:56

    變量命名應(yīng)簡單清晰

    代碼中使用了超長的命名會影響代碼的清晰性。同時,超長的變量命名會造成換行,這會影響代碼的結(jié)構(gòu),不
    發(fā)表于 09-26 11:48 ?14次下載

    javascript變量命名規(guī)則與規(guī)范

    JavaScript 變量與代數(shù)一樣,JavaScript 變量可用于存放值(比如 x=2)和表達(dá)式(比如 z=x+y)。變量可以使用短名稱(比如 x 和 y),也可以使用描述性更好的
    發(fā)表于 12-05 10:03 ?3576次閱讀
    javascript<b class='flag-5'>變量</b><b class='flag-5'>命名</b><b class='flag-5'>規(guī)則</b>與規(guī)范

    Python公認(rèn)的命名規(guī)則總結(jié)

    對于模塊名/包名、函數(shù)名、變量名、類名、常量名的命名,Python有一些公認(rèn)的規(guī)則,具體如下。
    的頭像 發(fā)表于 01-23 11:25 ?1709次閱讀

    編程代碼的書寫規(guī)則

    為大家搜集到編程代碼的書寫規(guī)則,小伙伴們千萬要記住這些規(guī)則。 如果對現(xiàn)在的工作不滿意,掌握這些技巧也是可以順利離職的小竅門哦~ 01 以一種代碼已經(jīng)被混淆的方式
    的頭像 發(fā)表于 11-12 18:03 ?2369次閱讀

    獲取單片機代碼運行時間的方法資料下載

    電子發(fā)燒友網(wǎng)為你提供獲取單片機代碼運行時間的方法資料下載的電子資料下載,更有其他相關(guān)的電路圖、源代碼、課件教程、中文資料、英文資料、參考
    發(fā)表于 04-24 08:49 ?12次下載
    <b class='flag-5'>簡</b><b class='flag-5'>析</b>獲取單片機<b class='flag-5'>代碼</b><b class='flag-5'>運行</b>時間的方法資料下載

    ORB SLAM中涉及的一些基礎(chǔ)概念

    ORB-SLAM 3提供了多地圖的存儲和拼接功能,在跟蹤丟失后可以嘗試將現(xiàn)有地圖和歷史地圖進(jìn)行匹配、融合,并更新當(dāng)前的活躍地圖(Active Map)
    的頭像 發(fā)表于 10-28 14:28 ?1199次閱讀

    ORB-SLAM3與ORB-SLAM2相比有哪些優(yōu)勢呢?

    自主導(dǎo)航是機器人基礎(chǔ)性和關(guān)鍵性技術(shù),是機器人實現(xiàn)其他更高級任務(wù)的前提。視覺 SLAM (Simultaneous Localization And Mapping) 利用視覺傳感器獲取環(huán)境圖像信息,基于多視圖幾何算法構(gòu)建環(huán)境地圖。
    的頭像 發(fā)表于 01-16 10:58 ?2633次閱讀

    OV2SLAM(高速視覺slam)

    視覺里程計最近幾年越來越受到學(xué)術(shù)界以及工業(yè)界的認(rèn)可,以ORB和VINS為代表的視覺SLAM已經(jīng)可以滿足絕大多數(shù)場景,而OV2SLAM在其他VSLAM中脫穎而出,其實時性以及具體的回環(huán)性能在測試中都得到了認(rèn)可。
    的頭像 發(fā)表于 03-21 17:16 ?1350次閱讀

    ORB-SLAM3整體流程詳解

    ORB-SLAM2相比,ORB-SLAM3在處理大視差和長時間未觀測到的場景時效果更好。它還提供了更準(zhǔn)確的幀間運動估計和更快的處理速度。
    的頭像 發(fā)表于 06-19 09:28 ?2887次閱讀
    <b class='flag-5'>ORB-SLAM</b>3整體<b class='flag-5'>流程</b>詳解

    python變量命名規(guī)則

    規(guī)則和約定。本文將詳盡、詳實、細(xì)致地探討Python變量命名規(guī)則,幫助讀者了解如何正確命名變量
    的頭像 發(fā)表于 11-23 15:44 ?1029次閱讀

    工程實踐中VINS與ORB-SLAM的優(yōu)劣分析

    ORB-SLAM是一種基于特征的單目視覺SLAM系統(tǒng),廣泛用于實時三維地圖構(gòu)建和機器人定位。該系統(tǒng)使用ORB特征進(jìn)行高效的視覺識別和地圖重建,支持關(guān)鍵幀技術(shù)和回環(huán)檢測來優(yōu)化地圖的準(zhǔn)確性。
    的頭像 發(fā)表于 04-08 10:17 ?2139次閱讀
    工程實踐中VINS與<b class='flag-5'>ORB-SLAM</b>的優(yōu)劣分析

    基于多攝像頭的高魯棒性視覺SLAM系統(tǒng)設(shè)計

    本文的主要目標(biāo)是通過擴展ORB-SLAM2的功能來增強準(zhǔn)確性,從多個攝像頭中的姿態(tài)估計和地圖重用開始。所有這些多攝像頭的圖像特征將被合并到跟蹤模塊中進(jìn)行特征匹配,以及在閉環(huán)檢測期間進(jìn)行位置識別。
    發(fā)表于 04-20 17:51 ?411次閱讀
    基于多攝像頭的高魯棒性視覺<b class='flag-5'>SLAM</b>系統(tǒng)設(shè)計