ORBSLAM system类代码架构

目录

一、System 构造函数及其初始化构造函数步骤

读取配置文件

  2.创建一个字典,并在文件中读取字典

3.新建一个关键帧数据库

4.创建地图

5.创建帧绘制器与地图绘制器

    6.创建追踪进程(主进程)构造函数

7.创建局部建图构造函数

8.创建一个新线程,运行局部建图

9.创建回环检测构造函数

10.创建一个新线程,启动回环检测程序

11.判断是否可视化,若可视化,新建线程启动可视化程序

12.设置各进程之间的指针(通信)

二,真正开始slam的程序接口

1.双目启动函数

1.1 判断输入数据类型是否正确

1.2 检查是否有运行模式改变(纯定位模型--定位建图模式)

1.3检查是否有重置操作

1.4 真正进行跟踪建图的程序

2.rgbd启动函数(步骤同上)

3.单目启动函数(步骤同上)

三 .保存各种数据


一、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 构造函数

  1. 读取配置文件

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 &timestamp)    //时间戳

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.单目启动函数(步骤同上)

三 .保存各种数据

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苹果香蕉柠檬c

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值