hdl_graph_slam源码解析(五)
5. loop detection
hdl_graph_slam算法中的回环检测部分主要是在loop_detector.hpp代码中定义并实现的,主要分为两部分,分别是:从历史关键帧中寻找可能的回环、对可能的回环进行点云配准确定回环。因此,整体的代码结构并不复杂:
std::vector<Loop:Ptr> detect(const std::vector<Keyframe::Ptr>& keyframes,const std::deque<Keyframe::Ptr>& new_keyframes, hdl_graph_slam::GraphSLAM& graph_slam){
std::vector<Loop::Ptr> detected_loops;
for(const auto& new_keyframe:new_keyframes){
//在历史关键帧中寻找可能的回环(candidates)
auto candidates = find_candidates(keyframes, new_keyframe);
//分别将可能的回环(candidates)与new_keyframe配准,得到检测的回环
auto loop = matching(candidates, new_keyframe, graph_slam);
if(loop){
detected_loops.push_back(loop);
}
}
return deteted_loops;
}
在寻找可能回环(candidates)的时候,主要遵循两个原则:第一个准则是两个关键帧之间的运动距离大于某一个阈值,注意这里是距离而不是位移哦,这一标准通常意味着从时序上比较相近的关键帧不是我们需要检测的回环。例如,在当前时刻有一个关键帧 k 1 k_1 k1,可能1s后又有一个关键帧 k 2 k_2 k