LoopClosing类是ORB_SLAM2算法中的闭环检测模块。闭环检测在SLAM系统中起着非常关键的作用,它可以检测到机器人在环境中已经访问过的地方,通过消除累积误差来优化地图。LoopClosing类与跟踪(Tracking)、局部地图构建(LocalMapping)等其他模块共同工作,以实现实时的闭环检测和地图优化。
以下是LoopClosing类的主要方法及其C++用法:
- SetTracker(Tracking* pTracker):设置与闭环检测模块关联的跟踪模块。
- SetLocalMapper(LocalMapping* pLocalMapper):设置与闭环检测模块关联的局部地图构建模块。
- Run():闭环检测的主要工作循环,负责检查新关键帧、检测闭环、计算Sim3变换、纠正闭环等。
- InsertKeyFrame(KeyFrame *pKF):向闭环检测模块插入新关键帧。
- RequestReset():请求重置闭环检测模块。
- RunGlobalBundleAdjustment(unsigned long nLoopKF):在单独的线程中运行全局Bundle Adjustment优化。
LoopClosing类还包含一些成员变量,例如:
- mpMap:指向地图数据结构的指针。
- mpTracker:指向跟踪模块的指针。
- mpKeyFrameDB:指向关键帧数据库的指针。
- mpORBVocabulary:指向ORB词汇表的指针。
- mpLocalMapper:指向局部地图构建模块的指针。
- mlpLoopKeyFrameQueue:存储等待处理的新关键帧列表。
为了实现线程安全,LoopClosing类使用多个互斥锁(mutex)来保护可能被多个线程访问的数据。例如,mMutexLoopQueue用于保护新关键帧列表,mMutexReset用于保护重置状态相关的标志,mMutexFinish用于保护闭环检测模块的完成状态等。