ORB-SLAM3代码分析(一)
2021SC@SDUSC
一、ORB-SLAM3系统概述
ORB-SLAM3是建立在ORB-SLAM2和ORB-SLAM-VI上的。
图中是ORB-SLAM3的主要系统组件
·Atlas地图集
Atlas地图集由一系列不连续的小地图构成,并能够无缝连接,实现重定位、回环检测、地点识别等功能。当每一个新的视觉帧进入流程,跟踪线程立即追踪并定位新一帧的位姿。
·跟踪线程
用来根据当前的active地图,实时地跟踪最新一帧的位置,利用最小化重投影误差的方式实现位姿的最大后验估计MAP。决定新一帧是否作为关键帧加入地图也是在这个线程中完成的。
·局部建图线程
添加关键帧和点到active地图,VI-Bundle Adjustment在当前被插入帧前后窗口内被用来提升地图的质量。
·回环地图合并线程
该线程以关键帧率检测active地图和Atlas地图之间的公共区域。如果公共区域属于active地图,则需要进行loop correction回环矫正;如果它属于不同的地图,则两个地图则会被合并成一个地图并将大地图设置为当前的active地图。
二、System.cc代码分析
System.cc这个文件主要是SLAM系统的初始化、跟踪线程的入口以及轨迹的保存。
1.System的构造函数
代码如下(示例):
System::System(const string &strVocFile, //词典文件路径
const string &strSettingsFile, //配置文件路径
const eSensor sensor, //传感器类型
const bool bUseViewer, //是否使用可视化界面
const int initFr, //初始化帧的id,开始时为0
const string &strSequence,
const string &strLoadingFile
):
mSensor(sensor), //初始化传感器类型
mpViewer(static_cast<Viewer*>(NULL)),
mbReset(false), mbResetActiveMap(false),
mbActivateLocalizationMode(false),
mbDeactivateLocalizationMode(false)
接下来摘取主要初始化代码段进行注释
//建立一个新的ORB字典
mpVocabulary = new ORBVocabulary();
// 建立关键帧数据库
mpKeyFrameDatabase = new KeyFrameDatabase(*mpVocabulary);
//创建地图集
mpAtlas = new Atlas(0);
// 创建用于显示帧和地图的类,由Viewer调用
mpFrameDrawer = new FrameDrawer(mpAtlas);
mpMapDrawer = new MapDrawer(mpAtlas, strSettingsFile);
// 创建跟踪线程(主线程),在mian函数中执行
mpTracker = new Tracking(this, mpVocabulary, mpFrameDrawer, mpMapDrawer,
mpAtlas, mpKeyFrameDatabase, strSettingsFile, mSensorstrSequence);
//创建并开启local mapping线程,线程函数为LocalMapping::Run()
mpLocalMapper = new LocalMapping(this, mpAtlas, mSensor==MONOCULAR || mSensor==IMU_MONOCULAR, mSensor==IMU_MONOCULAR || mSensor==IMU_STEREO, strSequence);
mptLocalMapping = new thread(&ORB_SLAM3::LocalMapping::Run,mpLocalMapper);
以上代码是对SLAM系统整体的初始化
未完待续