ORB-SLAM2代码学习2 System.cc

本文介绍ORB-SLAM2系统的核心组件及工作流程,包括System类的构造函数、跟踪函数及关键帧数据库等重要模块。文章还详细解析了不同传感器类型下的跟踪过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

System 类

System类是ORB-SLAM2系统的主类,通过调用其他模块实现跟踪、局部建图、闭环等功能。主要有四个函数 System、TrackStereo、TrackRGBD、TrackMonocular。
其中System是SLAM系统的构造函数,包括所有功能模块和所有线程的初始化,而TrackStereo、TrackRGBD和TrackMonocular分别是双目、RGBD和单目的数据入口,使用过程中,先调用System函数生成SLAM系统的对象,然后根据传感器类型,调用相应的入口函数,就可以执行SLAM的流程了。

System 构造函数

构造函数中和流程相关的一共有四个参数,分别是

  1. strVocFile: ORB词袋数据。词袋是在做闭环检测和重定位时候做检索用的,从历史关键帧中检索出和当前帧最相似的一帧,以进行位姿匹配。

  2. strSettingsFile: 配置文件的路径。配置文件中存放了相机参数和用户显示界面的设置

  3. sensor: 传感器类型,这是一个枚举变量,一共有三种,分别是MONOCULAR、STEREO和RGBD,分别代表单目、双目和RGBD。

  4. bUseViewer: true代表启动显示界面,false代表不显示

流程

1)首先输出一些提示信息和传感器类型
2)打开配置文件(.yaml格式),使用cv::FileStorage进行读操作

cv::FileStorage fsSettings(strSettingsFile.c_str(),   //将配置文件名转换成为字符串
                                cv::FileStorage::READ);  //只读

加载失败会提示并退出
3)加载ORB字典
为什么加载ORB词袋

	//建立一个新的ORB字典
    //使用无参构造方法构造对象,使用System类中定义的ORBVocabulary类的类指针*mpVocabulary 在堆区存储对象的位置
    //ORBVocabulary类来源于DBoW2中,能够快速稳定计算两帧图像的相似程度
    mpVocabulary = new ORBVocabulary();
    //使用指针调用类函数加载词包,并返回bool值判断是否加载成功
    bool bVocLoad = mpVocabulary->loadFromTextFile(strVocFile);

4)创建关键帧数据库,主要保存ORB描述子倒排索引(即根据描述子查找拥有该描述子的关键帧)

//利用词袋初始化关键帧数据库(用于重定位和回环检测),存入关键帧数据库指针mpKeyFrameDatabase
    mpKeyFrameDatabase = new KeyFrameDatabase(*mpVocabulary);

5)创建一个Map类,存储指向所有关键帧和地图点的指针mpMap
6)创建两个窗口,帧绘制器mpFrameDrawer和地图绘制器mpMapDrawer,这里的帧绘制器和地图绘制器将会被可视化的Viewer所使用
7)初始化Tracking线程,即创建Tracking对象

mpTracker = new Tracking(this, mpVocabulary, mpFrameDrawer, mpMapDrawer,
                             mpMap, mpKeyFrameDatabase, strSettingsFile, mSensor);

8)初始化局部地图和闭环线程,并打开对应的线程

	mpLocalMapper = new LocalMapping(mpMap, mSensor==MONOCULAR);   //初始化局部地图
    mptLocalMapping = new thread(&ORB_SLAM2::LocalMapping::Run,mpLocalMapper);  //打开对应的线程
    mpLoopCloser = new LoopClosing(mpMap, mpKeyFrameDatabase, mpVocabulary, mSensor!=MONOCULAR);  //初始化闭环流程
    mptLoopClosing = new thread(&ORB_SLAM2::LoopClosing::Run, mpLoopCloser);    //打开对应的线程

9)打开显示试图和线程
10)通过线程的set函数给各个线程之间建立关联

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

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

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

Track函数(TrackStereo、TrackRGBD和TrackMonocular)

System 对象所在的主线程就是跟踪线程,针对不同的传感器类型有3个用于跟踪的函数,其内部实现就是调用成员变量 mpTracker 的GrabImageMonocular ( GrabImageStereo 或 GrabImageRGBD )方法,他们有一个共同类型的返回值,cv::Mat,该值以齐次矩阵的形式记录了相机的位姿估计Tcw。如果跟丢了,那么这些接口将返回一个空的cv::Mat。

TrackStrereo函数
从途中可以看出,每次输入数据以后,会执行三种操作:

1)判断是否需要进入或者退出纯定位模式,如果需要则执行

2)判断是否需要重启tracking,如果需要则执行

3)执行双目的跟踪程序。GrabImageStereo共有三个参数,分别是左目、右目和时间戳

TrackRGBD
整体流程和双目一样,唯一的区别是此处调用的入口是RGB函数的入口,它的三个参数分别是像素图、深度图和时间戳
TrackMonocular
整体流程仍然和双目一样,区别是入口变成了单目的入口,它的两个参数分别是像素图和时间戳。

Shutdown

退出程序函数,关闭回环检测和建图线程,如果开启视图线程,关闭视图线程。

保存

SaveTrajectoryTUM 按照TUM格式保存相机运行轨迹并保存到指定的文件中
SaveKeyFrameTrajectoryTUM 保存关键帧的轨迹
SaveTrajectoryKITTI 按照KITTI数据集的格式将相机的运动轨迹保存到文件中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值