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

三 .保存各种数据

 

### 集成ORB SLAM3与NAV2的关键要素 #### 1. 理解ORB SLAM3的功能特性 ORB SLAM3 是一种先进的视觉里程计和同步定位与建图(SLAM)系统,支持单目、双目以及RGB-D相机输入,并能够处理多地图环境。该系统的显著特点是可以在不同的环境中创建并切换多个局部地图[^1]。 ```cpp // Example of initializing ORB_SLAM3 system in C++ #include <ORBSLAM3/orb_slam3.h> int main(){ ORB_SLAM3::System SLAM(voc_file, settings_file, sensor_type); } ``` #### 2. 导航堆栈(Navigation Stack)中的角色——NAV2 NAV2(ROS Navigation stack version 2)旨在提供机器人自主导航的能力,它包含了路径规划、避障等功能模块。对于基于SLAM构建的地图,NAV2负责根据这些信息指导机器人的运动方向和速度控制[^2]。 #### 3. 数据流连接方式 要使ORB SLAM3与NAV2协同工作,需建立两者间的数据交换通道。通常做法是在ROS环境下运行这两个组件,通过发布订阅机制共享姿态估计结果和其他必要参数。具体来说: - **话题(Topic)**: 使用`/odom`, `/tf`, 和其他自定义的话题来传递位姿更新消息; - **服务(Service)**: 可以为特定操作如重置SLAM过程设置专门的服务接口; 这种架构允许ORB SLAM3专注于感知周围世界的变化并将变化反馈给NAV2用于决策制定[^3]. #### 4. 实现步骤概述 虽然这里不采用逐步说明的方式,但值得注意的是,在实际开发过程中涉及的主要方面包括但不限于: - 安装配置好依赖项(例如Pangolin库等) - 修改ORB SLAM源码使其适应ROS节点形式调用 - 编写适配层代码实现上述提到的消息通信逻辑
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

苹果香蕉柠檬c

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

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

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

打赏作者

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

抵扣说明:

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

余额充值