目录
1.2 检查是否有运行模式改变(纯定位模型--定位建图模式)
一、System 构造函数及其初始化构造函数步骤
System::System(const string &strVocFile, //词典文件路径
const string &strSettingsFile, //配置文件路径
const eSensor sensor, //传感器类型
const bool bUseViewer): //是否使用可视化界面
mSensor(sensor), //初始化传感器类型
mpViewer(static_cast<Viewer*>(NULL)), //空。。。对象指针? TODO
mbReset(false), //无复位标志
mbActivateLocalizationMode(false), //没有这个模式转换标志
mbDeactivateLocalizationMode(false) //没有这个模式转换标志
以下 1-12 步都是初始化system 构造函数
-
读取配置文件
cv::FileStorage fsSettings(strSettingsFile.c_str(), //将配置文件名转换成为字符串
cv::FileStorage::READ); //只读
2.创建一个字典,并在文件中读取字典
//建立一个新的ORB字典
mpVocabulary = new ORBVocabulary();
//获取字典加载状态
bool bVocLoad = mpVocabulary->loadFromTextFile(strVocFile);
3.新建一个关键帧数据库
mpKeyFrameDatabase = new KeyFrameDatabase(*mpVocabulary);
4.创建地图
mpMap = new Map();
5.创建帧绘制器与地图绘制器
//这里的帧绘制器和地图绘制器将会被可视化的Viewer所使用
mpFrameDrawer = new FrameDrawer(mpMap);
mpMapDrawer = new MapDrawer(mpMap, strSettingsFile);
6.创建追踪进程(主进程)构造函数
mpTracker = newTracking(this, //现在还不是很明白为什么这里还需要一个this指针 TODO
mpVocabulary, //字典
mpFrameDrawer, //帧绘制器
mpMapDrawer, //地图绘制器
mpMap, //地图
mpKeyFrameDatabase, //关键帧地图
strSettingsFile, //设置文件路径
mSensor); //传感器类型iomanip
7.创建局部建图构造函数
mpLocalMapper = new LocalMapping(mpMap, //指定使iomanip
mSensor==MONOCULAR); // TODO 为什么这个要设置成为MONOCULAR???
8.创建一个新线程,运行局部建图
//运行这个局部建图线程
mptLocalMapping = new thread(&ORB_SLAM2::LocalMapping::Run, //这个线程会调用的函数
mpLocalMapper); //这个调用函数的参数
9.创建回环检测构造函数
//Initialize the Loop Closing thread and launchiomanip
mpLoopCloser = new LoopClosing(mpMap, //地图
mpKeyFrameDatabase, //关键帧数据库
mpVocabulary, //ORB字典
mSensor!=MONOCULAR); //当前的传感器是否是单目
10.创建一个新线程,启动回环检测程序
//创建回环检测线程
mptLoopClosing = new thread(&ORB_SLAM2::LoopClosing::Run, //线程的主函数
mpLoopCloser); //该函数的参数
11.判断是否可视化,若可视化,新建线程启动可视化程序
if(bUseViewer)
{
//如果指定了,程序的运行过程中需要运行可视化部分
//新建viewer
mpViewer = new Viewer(this, //又是这个
mpFrameDrawer, //帧绘制器
mpMapDrawer, //地图绘制器
mpTracker, //追踪器
strSettingsFile); //配置文件的访问路径
//新建viewer线程
mptViewer = new thread(&Viewer::Run, mpViewer);
//给运动追踪器设置其查看器
mpTracker->SetViewer(mpViewer);
}
12.设置各进程之间的指针(通信)
//Set pointers between threads
//设置进程间的指针
mpTracker->SetLocalMapper(mpLocalMapper);
mpTracker->SetLoopClosing(mpLoopCloser);
mpLocalMapper->SetTracker(mpTracker);
mpLocalMapper->SetLoopCloser(mpLoopCloser);
mpLoopCloser->SetTracker(mpTracker);
mpLoopCloser->SetLocalMapper(mpLocalMapper);
二,真正开始slam的程序接口
1.双目启动函数
cv::Mat System::TrackStereo(const cv::Mat &imLeft, //左侧图像
const cv::Mat &imRight, //右侧图像
const double ×tamp) //时间戳
1.1 判断输入数据类型是否正确
if(mSensor!=STEREO)
{
//不合法那就退出
cerr << "ERROR: you called TrackStereo but input sensor was not set to STEREO." << endl;
exit(-1);
}
1.2 检查是否有运行模式改变(纯定位模型--定位建图模式)
1.2.1 变为纯定位模式
mpLocalMapper->RequestStop();
mpTracker->InformOnlyTracking(true);// 定位时,只跟踪
1.2.1恢复定位建图模式
mpTracker->InformOnlyTracking(false);
mpLocalMapper->Release();
1.3检查是否有重置操作
mpTracker->Reset();
1.4 真正进行跟踪建图的程序
cv::Mat Tcw = mpTracker->GrabImageStereo(imLeft,imRight,timestamp);
2.rgbd启动函数(步骤同上)
3.单目启动函数(步骤同上)
三 .保存各种数据