<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 2460字,需瀏覽 5分鐘

           ·

          2020-08-03 20:23

          點擊上方小白學視覺”,選擇加"星標"或“置頂

          重磅干貨,第一時間送達

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

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

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

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

          ORBSLAM3相對于ORBSLAM2做出的主要改動:

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

          2. 也是因為這種情況,ORBSLAM3中還有很多小的地圖(類似于carto中的submap)

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

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

          4. loop and map merging 線程:因為有了很多瑣碎的地圖,因此新增了map merging的部分,如果兩個地圖有重合部分,且重合處屬于當前Active的Map,則對其進行LoopCorrection,類似于之前的檢測到回環(huá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. 相機模型:

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

          魚眼模型帶來的改變:

          a. 重定位:ORBSLAM2通過求解PnP問題進行重定位后的計算,但是因為新增了魚眼模型,因此需要新建一個可以不基于相機模型的Pnp算法,因此也就有了最大似然PnP算法;

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

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

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

          三角化的這部分在ORBSLAM2中只用于跟蹤,根據(jù)兩幀匹配好的圖像進行計算地圖點的坐標,這里把他用于雙目匹配計算深度;我在EUCM雙目魚眼中計算深度的方法也是如此,但是因為沒有加入前面的最優(yōu)與次優(yōu)篩選的條件outliner就會比較多

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

          NO_IMAGE_YET
          NOT_INITIALIZED
          OK
          RECENTLY_LOST:?當前地圖中的KF>10,且丟失時間<5秒

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

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

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

          接下來對比一下Tracking::ResetActiveMap() 與ORBSLAM2中的Reset(),方便更清楚這個函數(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ù)的主要作用相對于之前的Reset() ,不變的部分是對一些Tracking所用到的類成員變量進行reset,如mCurrentFrame, mLastFrame等,同時,通知其他幾個線程需要reset的消息。但是變化的部分主要是Atlas的加入,每一個線程的reset都是只針對currentMap,并不會影響其他的Map,新建的線程mpAltas也會將目前的地圖清除,

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

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

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

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

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

          3.接下來一切準備就緒,

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

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

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

          1. 初始化:

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

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

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

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

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

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

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

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

          瀏覽 145
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  盛世大厦和刚下班的银行打电话成人 | 国产一区二区视频麻豆 | 人人摸人人看人人草 | 囯产精品久久久久久久久久98 | 操逼热在线观看 |