<kbd id="5sdj3"></kbd>
<th id="5sdj3"></th>

  • <dd id="5sdj3"><form id="5sdj3"></form></dd>
    <td id="5sdj3"><form id="5sdj3"><big id="5sdj3"></big></form></td><del id="5sdj3"></del>

  • <dd id="5sdj3"></dd>
    <dfn id="5sdj3"></dfn>
  • <th id="5sdj3"></th>
    <tfoot id="5sdj3"><menuitem id="5sdj3"></menuitem></tfoot>

  • <td id="5sdj3"><form id="5sdj3"><menu id="5sdj3"></menu></form></td>
  • <kbd id="5sdj3"><form id="5sdj3"></form></kbd>

    ORB_SLAM3和之前版本有什么不同?

    共 2460字,需瀏覽 5分鐘

     ·

    2020-08-03 20:23

    點(diǎn)擊上方小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂

    重磅干貨,第一時(shí)間送達(dá)

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

    周六看到了ORBSLAM3的源碼,安裝運(yùn)行后看了一下其代碼結(jié)構(gòu),因?yàn)榧覫MU的部分是針對(duì)之前的ORB-VI, 因此大家可以參考jinpang的LearnORBVI可以更純粹地學(xué)習(xí)視覺+IMU的組合;

    這篇文章主要是針對(duì)其在Tracking線程做出的改動(dòng),尤其是添加Atlas后對(duì)Tracking部分的影響,LoopClosing和MapMerging的部分會(huì)在后面的分析中講到,有錯(cuò)誤也歡迎各位指正。

    各部分的流程圖整理好之后,稍后發(fā)出。

    ORBSLAM3相對(duì)于ORBSLAM2做出的主要改動(dòng):

    1. Atlas:用于保存很多瑣碎的地圖;主要的作用發(fā)揮在Tracking線程Lost時(shí),之前Lost后需要回到原先的位置進(jìn)行Relocalization(),但是現(xiàn)在,如果tracking線程丟失,ORBSLAM3會(huì)在之前的所有小地圖中進(jìn)行查詢匹配,如果匹配成功,則tracking線程繼續(xù);如果匹配不成功,則重新開辟一個(gè)小的地圖;

    2. 也是因?yàn)檫@種情況,ORBSLAM3中還有很多小的地圖(類似于carto中的submap)

    而Localmapping 線程只發(fā)生在當(dāng)下active的map中;

    3.新增最大后驗(yàn)概率,用于初始化并且refine IMU數(shù)據(jù);

    4. loop and map merging 線程:因?yàn)橛辛撕芏喱嵥榈牡貓D,因此新增了map merging的部分,如果兩個(gè)地圖有重合部分,且重合處屬于當(dāng)前Active的Map,則對(duì)其進(jìn)行LoopCorrection,類似于之前的檢測(cè)到回環(huán)。如果兩個(gè)地圖重合的部分屬于別的地圖,這就類似于找到了其他兩個(gè)地圖的重合點(diǎn),因此就將他們merge到一起。

    If the common area belongs to the active map, it performs loop correction; if it belongs to a different map, both maps are seamlessly merged into a single one, that becomes the active map.

    ?1. 相機(jī)模型:

    新增了基于KB魚眼模型的追蹤;這個(gè)模型與OpenCV的cv::fisheye標(biāo)定的時(shí)候所使用的模型是一樣的,因此大家可以使用opencv直接進(jìn)行標(biāo)定,建議使用size較大的標(biāo)定板,這是注意很有可能你的標(biāo)定板檢測(cè)不需要subpixel即可很準(zhǔn)確。

    魚眼模型帶來的改變:

    a. 重定位:ORBSLAM2通過求解PnP問題進(jìn)行重定位后的計(jì)算,但是因?yàn)樾略隽唆~眼模型,因此需要新建一個(gè)可以不基于相機(jī)模型的Pnp算法,因此也就有了最大似然PnP算法;

    b. 魚眼模型帶來的另一個(gè)改變是雙目匹配時(shí),這里對(duì)比一下兩個(gè)項(xiàng)目在這里的區(qū)別:

    ORBSLAM2:采用雙目去畸變后的圖像,去畸變的remap過程發(fā)生在進(jìn)入system之前,ComputeStereoMatches() 所采用的雙目匹配方法是在極線上搜索,是一個(gè)很小的帶狀區(qū)域;搜索到匹配點(diǎn)之后直接根據(jù)視差d計(jì)算深度z

    ORBSLAM3:采用暴力匹配的方式,在全局使用knn搜索,只查找與當(dāng)前左目描述子距離最近和次近的右目描述子,只要滿足Lowe's Law就可以送去三角化計(jì)算關(guān)鍵點(diǎn)所對(duì)應(yīng)的地圖點(diǎn)。

    三角化的這部分在ORBSLAM2中只用于跟蹤,根據(jù)兩幀匹配好的圖像進(jìn)行計(jì)算地圖點(diǎn)的坐標(biāo),這里把他用于雙目匹配計(jì)算深度;我在EUCM雙目魚眼中計(jì)算深度的方法也是如此,但是因?yàn)?span style="text-decoration:underline;">沒有加入前面的最優(yōu)與次優(yōu)篩選的條件,outliner就會(huì)比較多

    ?2. 新添加了一種狀態(tài)RECENTLY_LOST,因此主要的狀態(tài)分為以下:

    NO_IMAGE_YET
    NOT_INITIALIZED
    OK
    RECENTLY_LOST:?當(dāng)前地圖中的KF>10,且丟失時(shí)間<5秒

    個(gè)人認(rèn)為,這個(gè)狀態(tài)其實(shí)就是相當(dāng)于原先的LOST,在這里,如果激活了IMU則通過IMU數(shù)據(jù)進(jìn)行預(yù)測(cè),也就是 calculate current??pose by IMU data,

    但如果丟失時(shí)間,超過五秒,則由當(dāng)前state切換為LOST;如果是非IMU,即純視覺狀態(tài),則直接進(jìn)行重定位Relocalization();

    LOST: 這個(gè)狀態(tài)就是ORBSLAM3的一個(gè)新加的狀態(tài)(雖然名字與之前的一樣),因?yàn)樾略隽薬tlas,如果當(dāng)前地圖中的關(guān)鍵幀數(shù)量<10個(gè),可以認(rèn)為當(dāng)前地圖中沒有重要信息,直接ResetActiveMap(),這個(gè)思路相當(dāng)于之前的Reset(), 即如果初始化剛剛成功就丟失,可以認(rèn)為當(dāng)前map并不重要,直接重新初始化,這里也是一樣的思路,這個(gè)部分最終發(fā)揮作用是在函數(shù)Tracking::ResetActiveMap()中。但如果當(dāng)前的地圖已經(jīng)有很多關(guān)鍵幀(大于10幀),則調(diào)用CreateNewMap() 暫存該地圖,再新建一個(gè)空的地圖。

    接下來對(duì)比一下Tracking::ResetActiveMap() 與ORBSLAM2中的Reset(),方便更清楚這個(gè)函數(shù)的作用

    ORBSLAM3 中 Tracking::ResetActiveMap() 部分功能:

    ?Map*?pMap?=?mpAtlas->GetCurrentMap();
    ?mpLocalMapper->RequestResetActiveMap(pMap);
    ?mpLoopClosing->RequestResetActiveMap(pMap);
    ?mpKeyFrameDB->clearMap(pMap);
    ?mpAtlas->clearMap();


    ORBSLAM2 中Reset()函數(shù):

    ??mpLocalMapper->RequestReset();
    ?//?Reset?Loop?Closing
    ?mpLoopClosing->RequestReset();

    ?cout?<"Reseting?Database...";
    ?mpKeyFrameDB->clear();
    ?cout?<"?done"?<endl;

    ?//?Clear?Map?(this?erase?MapPoints?and?KeyFrames)
    ?mpMap->clear();

    ?可以看到該函數(shù)的主要作用相對(duì)于之前的Reset() ,不變的部分是對(duì)一些Tracking所用到的類成員變量進(jìn)行reset,如mCurrentFrame, mLastFrame等,同時(shí),通知其他幾個(gè)線程需要reset的消息。但是變化的部分主要是Atlas的加入,每一個(gè)線程的reset都是只針對(duì)currentMap,并不會(huì)影響其他的Map,新建的線程mpAltas也會(huì)將目前的地圖清除,

    CreateMapInAtlas(),用于新建一個(gè)submap,而atlas就是用于管理這些small map的。

    接下來主要說一下ATLAS, atlas是新建的線程,主要用于管理地圖,既然有了地圖管理者,就會(huì)有幾個(gè)隨之而來的類成員變量,最主要的是mspMaps,用于存放小地圖,同時(shí)一個(gè)重要的函數(shù)createNewMap()用于新建地圖

    強(qiáng)調(diào)一下 createNewMap(): 主要作用如下:

    1. 保存當(dāng)前地圖 mpCurrentMap->SetStoredMap(); 主要通過設(shè)置變量IsInUse為False,方便后面進(jìn)行判斷;

    2. 設(shè)定新地圖的初始幀的KFid:mnLastInitKFidMap = mpCurrentMap->GetMaxKFid()+1;

    3.接下來一切準(zhǔn)備就緒,

    mpCurrentMap?=?new?Map(mnLastInitKFidMap);?//初始化一個(gè)地圖
    mpCurrentMap->SetCurrentMap();?//將其設(shè)置為正在使用,也就是active
    mspMaps.insert(mpCurrentMap);?//將此地圖插入到mspMaps,也就是地圖管理變量中

    就此,創(chuàng)建新的小地圖完成;

    接下來最主要的一個(gè)問題就是ORBSLAM3會(huì)在什么時(shí)候創(chuàng)建新的地圖:

    1. 初始化:

    ?Map*?pCurrentMap?=?mpAtlas->GetCurrentMap();

    a. 如果是帶有IMU的初始化,則在IMU初始化完成后就直接調(diào)用?CreateMapInAtlas();(結(jié)合IMU的第一點(diǎn)作用,即在視覺初始化成功之前進(jìn)行位置追蹤,這里不難理解)

    b. 如果是不帶有IMU的Tracking,初始化的過程和ORBSLAM2一樣,在初始化時(shí)進(jìn)行新建地圖,以雙目為例,在

    StereoInitialization() 中,若有特征點(diǎn)足夠,則

    KeyFrame*?pKFini?=?new?KeyFrame(mCurrentFrame,mpAtlas->GetCurrentMap(),mpKeyFrameDB);?

    而這里GetCurrentMap()也會(huì)調(diào)用createNewMap()來新建地圖;?

    2. 如果當(dāng)前狀態(tài)設(shè)定為LOST,且當(dāng)前地圖中的關(guān)鍵幀數(shù)量已經(jīng)多余10幀,則調(diào)用createNewMap()保存當(dāng)前地圖,創(chuàng)建新地圖;

    下面是Tracking部分的流程圖,排除IMU的添加,藍(lán)色的字體是純視覺來講,與之前ORBSLAM2的主要差別。

    瀏覽 145
    點(diǎn)贊
    評(píng)論
    收藏
    分享

    手機(jī)掃一掃分享

    分享
    舉報(bào)
    評(píng)論
    圖片
    表情
    推薦
    點(diǎn)贊
    評(píng)論
    收藏
    分享

    手機(jī)掃一掃分享

    分享
    舉報(bào)

    <kbd id="5sdj3"></kbd>
    <th id="5sdj3"></th>

  • <dd id="5sdj3"><form id="5sdj3"></form></dd>
    <td id="5sdj3"><form id="5sdj3"><big id="5sdj3"></big></form></td><del id="5sdj3"></del>

  • <dd id="5sdj3"></dd>
    <dfn id="5sdj3"></dfn>
  • <th id="5sdj3"></th>
    <tfoot id="5sdj3"><menuitem id="5sdj3"></menuitem></tfoot>

  • <td id="5sdj3"><form id="5sdj3"><menu id="5sdj3"></menu></form></td>
  • <kbd id="5sdj3"><form id="5sdj3"></form></kbd>
    大逼大逼一区二区三区 | 午夜精品久久 | 销魂少妇一二三区 | 日本在线东京热 | 女人BBwww |