ORB SLAM2学习笔记之mono_kitti(二)

本文深入解析SLAM系统的核心组件System类,详细阐述了System构造函数的功能,包括传感器类型设定、线程初始化、词袋加载等,并介绍了关键帧数据库、地图、跟踪、局部建图、回环闭合等模块的初始化过程。

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

一、流程—Part 2

  1. System.h的架构

  2. System 类
    二、实例化SLAM—System构造函数
    一、流程—Part 2
    本篇博客将主要记录用来实例化SLAM系统的System类的一些用法。

  3. System.h的架构
    System.h中包含了七个类,分别是Viewer,FrameDrawer,Map,Tracking,LocalMapping,LoopClosing的声明,和System类的定义,就像描述的一样,这些类组成了一个系统。

class Viewer;
class FrameDrawer;
class Map;
class Tracking;
class LocalMapping;
class LoopClosing;
class System;

  1. System 类
    System 类中的public成员包含一个sensor枚举和一些成员函数,主要有:

① sensor枚举

// Input sensor
enum eSensor{
MONOCULAR=0,
STEREO=1,
RGBD=2
};
1
2
3
4
5
6
0,1,2分别代表传感器的类型。

② System构造函数

System(const string &strVocFile, const string &strSettingsFile, const eSensor sensor, const bool bUseViewer = true);
1
读入词包路径,读入YAML配置文件,设置SLAM为mono状态,启用viewer的线程。

③ Tracking函数

cv::Mat TrackStereo(const cv::Mat &imLeft, const cv::Mat &imRight, const double &timestamp);
cv::Mat TrackRGBD(const cv::Mat &im, const cv::Mat &depthmap, const double &timestamp);
cv::Mat TrackMonocular(const cv::Mat &im, const double &timestamp);
1
2
3
针对不同传感器不同的Tracking。输入图像可以使rgb的也可以是grayscale的(最终读进去都会转化为grayscale的),函数返回值为camera的位姿pose。

④ 定位模式函数

void ActivateLocalizationMode();
void DeactivateLocalizationMode();
1
2
调用前者终止mapping线程,开启定位模式,调用后者重启mapping线程。

⑤ 重启与终止函数

void Reset();
void Shutdown();
1
2
前者可以清空map,后者可以终止所有线程,在 保存相机轨迹之前 需要调用此函数。

⑥ SaveTrajectory 函数

void SaveTrajectoryTUM(const string &filename);
void SaveKeyFrameTrajectoryTUM(const string &filename);
void SaveTrajectoryKITTI(const string &filename);
1
2
3
把相机轨迹存成相应数据集的格式,调用此函数时先shutdown SLAM系统,mono_kittti中save函数用的是SaveKeyFrameTrajectoryTUM,这个函数看起来像是只能用于TUM数据集,但三种传感器均适合。

除上述这些外,private成员里还有一些其他的变量就不一一列举,之后学习后再记录,大致看了一下,基本是各个类的指针,在成员函数中作为其他类的接口使用,可能用于线程之间互相通信吧。

二、实例化SLAM—System构造函数
前面说到System构造函数用于实例化一个SLAM系统,开启局部建图(Local Mapping),回环检测(Loop Closing),和可视化界面(Viewer)的线程。

首先,函数将形参一一传递到System类中的成员变量,用于之后的计算。
sensor → mSensor
static_cast<Viewer*>(NULL) → mpViewer
mbReset 设置为 false
mbActivateLocalizationMode 设置为 false
mbDeactivateLocalizationMode 设置为 false

sensor是传进来的形参,是前面枚举体中三种传感器的一个,这里为MONOCULAR,它传递给了mSensor,这是一个System类的隐含成员变量,两种变量类型一样。
mpViewer是System类的隐含成员变量,Viewer类指针,这里赋空。
mbReset,mbActivateLocalizationMode,mbDeactivateLocalizationMode均为bool型,赋false。

读取传进来的文件路径:
//Check settings file
cv::FileStorage fsSettings(strSettingsFile.c_str(), cv::FileStorage::READ);
if(!fsSettings.isOpened())
{
cerr << "Failed to open settings file at: " << strSettingsFile << endl;
exit(-1);
}

//Load ORB Vocabulary
cout << endl << "Loading ORB Vocabulary. This could take a while..." << endl;

mpVocabulary = new ORBVocabulary();
bool bVocLoad = mpVocabulary->loadFromTextFile(strVocFile);
if(!bVocLoad)
{
    cerr << "Wrong path to vocabulary. " << endl;
    cerr << "Falied to open at: " << strVocFile << endl;
    exit(-1);
}
cout << "Vocabulary loaded!" << endl << endl;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
从strSettingsFile这个途径中读取文件,类型为只读,接下来创建一个新类ORBVocabulary,用一个mpVocabulary指针指向它,调用类内的函数 loadFromTextFile() 将 strVocFile(字典路径)装载进去。(ORBVocabulary类是 typedef 成的,来源于 DBoW2 的TemplatedVocabulary类,类参数为 FORB::TDescriptor 和 FORB,现在还不知道什么意思,之后学习后会记录)

初始化各种线程和数据库
①用词袋初始化关键帧数据库( 用于 重定位 和 回环检测 )

②初始化一个Map类,该类用于存储指向所有 关键帧 和 地图点 的指针

③初始化画图工具,用于可视化。

④初始化 Tracking线程 ,主线程 ,使用this指针(只初始化不启动,启动在 main 函数里 TrackMonocular() 启动)

⑤初始化 Local Mapping线程 并启动(这里mSensor传入MONOCULAR)

⑥初始化 Loop Closing线程 并启动(这里mSensor传入的不是MONOCULAR)

⑦初始化 Viewer线程 并启动,也使用了this指针;给 Tracking线程设置Viewer

⑧三个线程每两个线程之间设置指针

//Create KeyFrame Database
mpKeyFrameDatabase = new KeyFrameDatabase(*mpVocabulary);

//Create the Map
mpMap = new Map();

//Create Drawers. These are used by the Viewer
mpFrameDrawer = new FrameDrawer(mpMap);
mpMapDrawer = new MapDrawer(mpMap, strSettingsFile);

//Initialize the Tracking thread
//(it will live in the main thread of execution, the one that called this constructor)
mpTracker = new Tracking(this, mpVocabulary, mpFrameDrawer, mpMapDrawer,
                         mpMap, mpKeyFrameDatabase, strSettingsFile, mSensor);

//Initialize the Local Mapping thread and launch
mpLocalMapper = new LocalMapping(mpMap, mSensor==MONOCULAR);
mptLocalMapping = new thread(&ORB_SLAM2::LocalMapping::Run,mpLocalMapper);

//Initialize the Loop Closing thread and launch
mpLoopCloser = new LoopClosing(mpMap, mpKeyFrameDatabase, mpVocabulary, mSensor!=MONOCULAR);
mptLoopClosing = new thread(&ORB_SLAM2::LoopClosing::Run, mpLoopCloser);

//Initialize the Viewer thread and launch
if(bUseViewer)
{
    mpViewer = new Viewer(this, mpFrameDrawer,mpMapDrawer,mpTracker,strSettingsFile);
    mptViewer = new thread(&Viewer::Run, mpViewer);
    mpTracker->SetViewer(mpViewer);
}

//Set pointers between threads
mpTracker->SetLocalMapper(mpLocalMapper);
mpTracker->SetLoopClosing(mpLoopCloser);

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
接下来就是这几个线程的工作过程了,感觉有必要看一下有关多线程方面的知识了,还要看一下词袋怎么用来回环检测的,然后看看每个线程如何工作的,互相之间又是通信的。

版权声明:本文为CSDN博主「幽冥小龙」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43527185/article/details/83717066

### ORB_SLAM2 使用 KITTI 数据集 的运行配置教程 #### 一、环境准备 为了成功运行 ORB_SLAM2KITTI 数据集,需确保开发环境中已正确安装必要的依赖项。这包括但不限于 OpenCV、Eigen 库以及其他可能涉及的第三方库[^1]。 #### 、编译与安装 ORB_SLAM2 在开始之前,需要完成 ORB_SLAM2 的本地化构建过程。如果遇到任何错误或者希望重新初始化项目,则可以按照以下方法清理旧有构建文件并重新执行 CMake 构建流程: ```bash rm -rf Thirdparty/DBoW2/build/ rm -rf Thirdparty/g2o/build/ rm -rf ORB_SLAM2/build/ rm -rf Examples/ROS/ORB_SLAM2/build/ mkdir build && cd build cmake .. make -j8 ``` 上述命令会彻底清除之前的构建缓存,并通过 `CMake` 配置新的构建目标[^4]。 #### 三、下载 KITTI 数据集 KITTI 是一个广泛使用的自动驾驶场景数据集合,其中包含了多种传感器采集到的信息(如摄像头图像)。对于本案例而言,主要关注的是单目相机序列部分。可以从官方站点获取对应的数据包,并将其解压至指定目录下以便后续加载使用。 #### 四、启动 ORB_SLAM2 单目模式处理 KITTI 数据流 当一切准备工作就绪之后,在 ROS 环境中可以通过如下指令来调用预定义好的参数设置文件以及词典资源来进行 SLAM 处理操作: ```bash rosrun ORB_SLAM2 Mono \ Vocabulary/ORBvoc.txt \ Examples/Monocular/KITTI00-02.yaml ``` 此命令中的各个选项分别代表不同的功能模块或输入源设定值;具体来说,“Mono”表示采用单一镜头作为视觉输入方式之一;而“.yaml”格式文档则存储着关于摄像机内参等相关属性的关键数值信息表单[^2]。 #### 五、常见问题排查指南 尽管遵循以上步骤通常能够顺利完成整个实验环节,但在实际应用过程中仍可能出现某些异常状况导致进程终止等问题发生。针对这种情况可参照已有经验总结出来的解决方案尝试修复——例如调整时间戳匹配逻辑等措施均有助于克服此类障碍物带来的困扰[^3]。 ```python # 示例 Python 脚本用于验证时间同步机制是否正常工作 import numpy as np timestamps = np.loadtxt('times.txt') # 加载时间戳列表 if timestamps.size != expected_size: raise ValueError("Timestamp mismatch detected!") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值