ORB-SLAM2 (单目)源码解读(1)

流程图

流程图

初始流程

首先调用mono_tum.cc 运行程序
有以下几块内容

  1. LoadImages (const string &strFile, vector &vstrImageFilenames,vector &vTimestamps);读取影像数据
  2. ORB_SLAM2::System SLAM (argv[1],argv[2],ORB_SLAM2::System::MONOCULAR,true); 系统的初始化、建立线程
  3. SLAM.TrackMonocular(im,tframe); 将每张影像传入单目处理函数
  4. vTimesTrack[ni]=ttrack; 计算处理所用的时间
  5. 等待加载下一帧
  6. 结束
  7. 将相机轨迹写入KeyFrameTrajectory.txt

输入参数有4个
Usage: ./mono_tum path_to_vocabulary path_to_settings path_to_sequence
分别对应:调用的程序、词袋、相机内参和特征提取器的参数 影像数据

调用的函数有3个

1、LoadImages (const string &strFile, vector &vstrImageFilenames,vector &vTimestamps);参数为:影像数据的文件名,输出为 时间戳和对应的影像名。
2、 ORB_SLAM2::System SLAM(argv[1],argv[2],ORB_SLAM2::System::MONOCULAR,true); 参数为:词袋、相机内参和特征提取器的参数、单目/双目/RGB-D,是否启动显示界面。
3、SLAM.TrackMonocular(im,tframe); 参数为 影像和对应的时间戳。

系统流程

接下来进入到system.cc,才算是真的进入到系统中。

首先,这个文件中有4个函数

  1. System
  2. TrackStereo
  3. TrackRGBD
  4. TrackMonocula

System是SLAM系统的构造函数,包括所有功能模块和所有线程的初始化,而TrackStereo、TrackRGBD和TrackMonocular分别是双目、RGBD和单目的数据入口。这里对应着mono_tum.cc的流程,先调用System初始化功能和线程,接着调用对应的单目入口函数TrackMonocula,就可以执行ORB-SLAM的流程了。

1、System构造函数介绍

1)初始化词袋

mpVocabulary = new ORBVocabulary();
bool bVocLoad = mpVocabulary->loadFromTextFile(strVocFile);
//参数为词袋文件名

2)检查相机参数

FileStorage fsSettings(strSettingsFile.c_str(), cv::FileStorage::READ);
//参数为相机参数和特征提取器文件的参数

3)初始化关键帧数据集

mpKeyFrameDatabase = new KeyFrameDatabase(*mpVocabulary);
//参数为词袋

4)创建地图

 mpMap = new Map();

5)创建用户显示界面

    mpFrameDrawer = new FrameDrawer(mpMap);
    mpMapDrawer = new MapDrawer(mpMap, strSettingsFile);
    //参数为创建的地图和相机参数文件

6)初始化位姿追踪线程

mpTracker = new Tracking(this, mpVocabulary, mpFrameDrawer, mpMapDrawer, mpMap, mpKeyFrameDatabase, strSettingsFile, mSensor);
//参数为:词袋、关键帧显示界面、地图显示界面、地图、关键帧数据集、相机参数文件、单目/双目/RBG-D

7)初始化局部地图,并打开相应线程

mpLocalMapper = new LocalMapping(mpMap, mSensor==MONOCULAR);
mptLocalMapping = new thread(&ORB_SLAM2::LocalMapping::Run,mpLocalMapper);
//参数为地图

8)初始化回环检测、并打开相应线程

mpLoopCloser = new LoopClosing(mpMap, mpKeyFrameDatabase, mpVocabulary, mSensor!=MONOCULAR);
mptLoopClosing = new thread(&ORB_SLAM2::LoopClosing::Run, mpLoopCloser);
//参数为地图、关键帧数据集、词袋

9)给各线程之间建立关联

mpTracker->SetLocalMapper(mpLocalMapper);
mpTracker->SetLoopClosing(mpLoopCloser);

mpLocalMapper->SetTracker(mpTracker);
mpLocalMapper->SetLoopCloser(mpLoopCloser);

mpLoopCloser->SetTracker(mpTracker);
mpLoopCloser->SetLocalMapper(mpLocalMapper);

2、TrackMonocular介绍

Monocular是单目相机的入口函数。
参数为时间戳和影像

流程分为两个检查模块

  1. 检查模式变更
  2. 检查重置

1)检查是否激活纯定位模式
是:停止地图构建,等待局部地图构建完成,开启纯定位模式

2)检查是否取消纯定位模式
是:关闭纯定位模式、重启局部地图构建

3)检查是否需要重置
是:开启重置

4)进行下一步

Mat Tcw = mpTracker->GrabImageMonocular(im,timestamp);
unique_lock<mutex> lock2(mMutexState);
mTrackingState = mpTracker->mState;
mTrackedMapPoints = mpTracker->mCurrentFrame.mvpMapPoints;
mTrackedKeyPointsUn = mpTracker->mCurrentFrame.mvKeysUn;
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值