ORB_SLAM2之System
System类是ORB_SLAM2对三大线程的封装,我们只需要调用System的接口SLAM就可以工作了。
System构造函数
- 首先根据传感器类型输出信息。
- 读入系统配置文件,使用
cv::FileStorage
打开。 - 创建系统所需要的类。
创建ORB词典ORBVocabulary
,然后加载离线词典。
创建关键帧数据库KeyFrameDatabase
。
创建地图Map
创建帧绘制器FrameDrawer
创建地图绘制器MapDrawer
- 创建跟踪主线程
mpTracker = new Tracking(this,
mpVocabulary, // 词典
mpFrameDrawer,// 帧绘制器
mpMapDrawer,// 地图绘制器
mpMap, // 地图
mpKeyFrameDatabase, // 关键帧库
strSettingsFile, // 配置文件
mSensor); // 传感器类型
- 初始化局部建图线程
mpLocalMapper = new LocalMapping(mpMap, mSensor==MONOCULAR);
// 运行
mptLocalMapping = new thread(&ORB_SLAM2::LOcalMapping::Run, // 多线程调用的函数
mpLocalMapper); // 所在的类(多线程类的使用方式)
- 创建回环检测线程
mptLoopClosing = new thread(&ORB_SLAM::LoopClosing::Run,
mpLoopCloser); // 参考局部建图线程
- 绘制线程
if(bUseViwer)
{
// 创建一个视图器
mpViwer = new Viwer(this,
mpFrameDrawer,
mpMapDrawer,
mpTracker,
strSettingFile);
// 创建线程
mptViwer = new thread(&Viwer::Run,
mpViwer);
// 给运动追踪添加查看器
mpTracker->SetViwer(mpViewer);
}
- 让线程之间指定彼此,能够进行通讯。
mpTracker->SetLocalMapper(mpLocalMapper);
mpTracker->SetLoopClosing(mpLoopClosing);
mpLocalMapper->SetTracker(mpTracker);
mpLocalMapper->SetLoopClosing(mpLoopClosing);
mpLoopClosing->SetTracker(mpTracker);
mpLoopClosing->SetLocalMapper(mpLo