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利用時間作為約束,如果歷史位姿對應時間與當前位姿對應時間的時間差太小,說明是個小回環,意義不大,作者在程式裡將時間差設定為大於...