本次的目的主要是讲解ORBSLAM2中SLAM系统的构造函数System::System
,这里主要进行了字典文件加载及相关线程的初始化。
首先是构造函数的参数
System::System(const string &strVocFile, //词典文件路径
const string &strSettingsFile, //配置文件路径
const eSensor sensor, //传感器类型
const bool bUseViewer): //是否使用可视化界面
mSensor(sensor), //初始化传感器类型
mpViewer(static_cast<Viewer*>(NULL)), //对指针赋予默认值,避免野指针的存在
mbReset(false), //无复位标志
mbActivateLocalizationMode(false), //没有这个模式转换标志
mbDeactivateLocalizationMode(false) //没有这个模式转换标志
在构造函数中主要进行了以下处理:
-
输出欢迎信息及使用的传感器信息
//输出欢迎信息 cout << endl << "ORB-SLAM2 Copyright (C) 2014-2016 Raul Mur-Artal, University of Zaragoza." << endl << "This program comes with ABSOLUTELY NO WARRANTY;" << endl << "This is free software, and you are welcome to redistribute it" << endl << "under certain conditions. See LICENSE.txt." << endl << endl; //输出当前传感器类型 cout << "Input sensor was set to: "; if(mSensor==MONOCULAR) cout << "Monocular" << endl; else if(mSensor==STEREO) cout << "Stereo" << endl; else if(mSensor==RGBD) cout << "RGB-D" << endl;
-
创建一个
opencv
提供的yaml
文件读取类用于读取配置文件中的参数//创建一个yaml文件读取类 cv::FileStorage fsSettings(strSettingsFile.c_str(), //将配置文件名转换成为字符串 cv::FileStorage::READ); //只读 //如果打开失败,就输出调试信息 if(!fsSettings.isOpened()) { cerr << "Failed to open settings file at: " << strSettingsFile << endl; //然后退出 exit(-1); }
-
使用
DBOW2
提供的词袋类来载入词袋文件cout << endl << "Loading ORB Vocabulary. This could take a while..." << endl; //建立一个新的ORB字典 mpVocabulary = new ORBVocabulary(); //加载字典并返回字典加载状态 bool bVocLoad = mpVocabulary->loadFromTextFile(strVocFile); //如果加载失败,就输出调试信息 if(!bVocLoad) { cerr << "Wrong path to vocabulary. " << endl; cerr << "Falied to open at: " << strVocFile << endl; //然后退出 exit(-1); } //否则则说明加载成功 cout << "Vocabulary loaded!" << endl << endl;
-
创建相关的线程并设置线程之间的数据指针
//创建关键帧数据库 mpKeyFrameDatabase = new KeyFrameDatabase(*mpVocabulary); //创建地图 mpMap = new Map(); //这里的帧绘制器和地图绘制器将会被可视化的Viewer所使用 mpFrameDrawer = new FrameDrawer(mpMap); mpMapDrawer = new MapDrawer(mpMap, strSettingsFile); //在主进程中初始化追踪线程 mpTracker = new Tracking(this, //将系统对象传递给追踪线程 mpVocabulary, //字典 mpFrameDrawer, //帧绘制器 mpMapDrawer, //地图绘制器 mpMap, //地图 mpKeyFrameDatabase, //关键帧数据库 strSettingsFile, //配置文件路径 mSensor); //传感器类型 //初始化局部建图线程并运行 mpLocalMapper = new LocalMapping(mpMap, //地图 mSensor==MONOCULAR); // ? 为什么这个要设置成为MONOCULAR??? //运行这个局部建图线程 mptLocalMapping = new thread(&ORB_SLAM2::LocalMapping::Run, //这个线程会调用的函数 mpLocalMapper); //这个调用函数的参数 //初始化闭环检测线程并运行 mpLoopCloser = new LoopClosing(mpMap, //地图 mpKeyFrameDatabase, //关键帧数据库 mpVocabulary, //ORB字典 mSensor!=MONOCULAR); //当前的传感器是否是单目 //创建回环检测线程 mptLoopClosing = new thread(&ORB_SLAM2::LoopClosing::Run, //线程的主函数 mpLoopCloser); //该函数的参数 //创建可视化线程并运行 if(bUseViewer) { //如果指定了,程序的运行过程中需要运行可视化部分 //新建viewer mpViewer = new Viewer(this, //又是这个 mpFrameDrawer, //帧绘制器 mpMapDrawer, //地图绘制器 mpTracker, //追踪器 strSettingsFile); //配置文件的访问路径 //新建viewer线程 mptViewer = new thread(&Viewer::Run, mpViewer); //给运动追踪器设置其查看器 mpTracker->SetViewer(mpViewer); } //设置线程间的指针 mpTracker->SetLocalMapper(mpLocalMapper); mpTracker->SetLoopClosing(mpLoopCloser); mpLocalMapper->SetTracker(mpTracker); mpLocalMapper->SetLoopCloser(mpLoopCloser); mpLoopCloser->SetTracker(mpTracker); mpLoopCloser->SetLocalMapper(mpLocalMapper);