orb slam2回環檢測初探1

2021-09-25 19:43:46 字數 3007 閱讀 8226

1.detectloop()

步驟1:如果距離上次閉環沒多久(小於10幀),或者map中關鍵幀總共還沒有10幀,則不進行閉環檢測

if(mpcurrentkf->mnidadd(mpcurrentkf);//將當前關鍵幀新增到資料庫中

mpcurrentkf->seterase();

return false;

}

步驟2:遍歷所有共視關鍵幀,計算當前關鍵幀與每個共視關鍵幀的bow相似度得分,並得到最低得分minscore

const vectorvpconnectedkeyframes = mpcurrentkf->getvectorcovisiblekeyframes();//得到與該幀連線的關鍵幀

const dbow2::bowvector ¤tbowvec = mpcurrentkf->mbowvec;//當前幀的詞袋向量

float minscore = 1;

for(size_t i=0; iisbad())

continue;

const dbow2::bowvector &bowvec = pkf->mbowvec;//當前幀的詞袋向量

float score = mporbvocabulary->score(currentbowvec, bowvec);

if(score步驟3:在所有關鍵幀中找出閉環候選幀

vectorvpcandidatekfs = mpkeyframedb->detectloopcandidates(mpcurrentkf, minscore);

詳細請見keyframedatabase.cpp中的detectloopcandidates()

orb-slam2 回環檢測初探2

步驟4:一致性檢驗

一致性檢驗通過維護乙個連續性的groups,每次檢測到回環就檢查當前候選關鍵幀是不是跟之前連續,如果連續,那麼連續性++,否則groups全部清零,重新再來。

所謂的連續性,就是當前的候選關鍵幀,獲取它全部的相連幀包括他自己,形成乙個組.看之前的組跟現在這個組有沒有重合。

(1)每個候選幀將與自己相連的關鍵幀構成乙個「子候選組spcandidategroup」,vpcandidatekfs–>spcandidategroup

(2)檢測「子候選組」中每乙個關鍵幀是否存在於「連續組」,如果存在ncurrentconsistency++,則將該「子候選組」放入「當前連續組vcurrentconsistentgroups」

(3)如果ncurrentconsistency大於等於3,那麼該」子候選組「代表的候選幀過關,進入mvpenoughconsistentcandidates

mvpenoughconsistentcandidates存放一致性超過閾值的幀 當它不為空的時候,閉環就可以進入下乙個階段了,傳遞給compute sim3的下乙個物件

vcurrentconsistentgroups當前連續組

mvconsistentgroups剛開始被拿來比較,看當前的候選關鍵幀是否保持有一致性最後被vcurrentconsistentgroups更新,儲存新的連續性組

mvpenoughconsistentcandidates.clear();// 最終篩選後得到的閉環幀

// consistentgroup.first對應每個「連續組」中的關鍵幀,consistentgroup.second為每個「連續組」的序號

vectorvcurrentconsistentgroups;

vectorvbconsistentgroup(mvconsistentgroups.size(),false);

for(size_t i=0, iend=vpcandidatekfs.size(); ispcandidategroup = pcandidatekf->getconnectedkeyframes();

spcandidategroup.insert(pcandidatekf)

//一致性是否滿足要求

bool benoughconsistent = false;

//當前幀的組跟之前的組是否有一致性(用於大迴圈)

bool bconsistentforsomegroup = false;

// 遍歷之前的「子連續組」

for(size_t ig=0, iendg=mvconsistentgroups.size(); igspreviousgroup = mvconsistentgroups[ig].first;

// 遍歷每個「子候選組」,檢測候選組中每乙個關鍵幀在「子連續組」中是否存

bool bconsistent = false;

for(set::iterator sit=spcandidategroup.begin(), send=spcandidategroup.end(); sit!=send;sit++)

}if(bconsistent)

if(ncurrentconsistency>=mncovisibilityconsistencyth && !benoughconsistent)}}

// 如果該「子候選組」的所有關鍵幀都不存在於「子連續組」,那麼vcurrentconsistentgroups將為空,

// 於是就把「子候選組」全部拷貝到vcurrentconsistentgroups,並最終用於更新mvconsistentgroups,計數器設為0,重新開始

if(!bconsistentforsomegroup)

} //用當前連續組更新

mvconsistentgroups = vcurrentconsistentgroups;

// add current keyframe to database

mpkeyframedb->add(mpcurrentkf);

if(mvpenoughconsistentcandidates.empty())

else

mpcurrentkf->seterase();

return false;

ORB SLAM(六)回環檢測

這件事情就好比乙個人走在陌生的城市裡,一開始還能分清東南西北,但隨著在小街小巷轉來轉去,已經不知道自己在什麼地方了。通過認真辨識周邊環境,他可以建立起區域性的地圖資訊 區域性優化 再回憶以前走過的路徑,他可以糾正一些以前的地圖資訊 全域性優化 然而他還是不敢確定自己在城市的精確方位。直到他看到了乙個...

ORB SLAM(六)回環檢測

這件事情就好比乙個人走在陌生的城市裡,一開始還能分清東南西北,但隨著在小街小巷轉來轉去,已經不知道自己在什麼地方了。通過認真辨識周邊環境,他可以建立起區域性的地圖資訊 區域性優化 再回憶以前走過的路徑,他可以糾正一些以前的地圖資訊 全域性優化 然而他還是不敢確定自己在城市的精確方位。直到他看到了乙個...

3D SLAM LeGo LOAM(2) 回環檢測

lego loam的回環檢測策略比較簡單,它同時對距離和時間作考量。1.利用了pcl中基於半徑的近鄰搜尋演算法,以機械人當前位姿為搜尋點,查詢半徑為7m範圍內的若干個位姿 2利用時間作為約束,如果歷史位姿對應時間與當前位姿對應時間的時間差太小,說明是個小回環,意義不大,作者在程式裡將時間差設定為大於...