ORB-SLAM3的Tracking线程,主要从一下几个方面进行讲解:ORB-SLAM3初始化、传感器输入模块、Tracking线程子模块、Tracking线程代码详解。
其中包括
①ORB-SLAM3整个系统初始化的代码是如何实现
②单目、双目、RBB-D以及结合IMU的输入的情况
③Tracking线程是怎么样处理数据的,代码逻辑
④按照Tracking线程每一步实现的功能
文章目录
- 一、ORB-SLAM3初始化
- 1、开源网址
- 2、ORB-SLAM3代码主要文件夹
- 3、整个系统初始化
- 4、初始化函数System::System()主要完成工作
- (1)检查SLAM 系统传感器初始化类型,需要用到 sensor
- (2)检查传感器配置文件,也就是相机标定参数等,需要用到 strSettingsFile
- (3)实例化 ORB 词典对象,并加载 ORB 词典
- (4)根据ORB 词典实例对象,创建关键 DataBase
- (5)创建Altas,也就是多地图系统
- (6)IMU 初始化设置,如果需要
- (7)利用Atlas 创建 Drawer,包括 FrameDrawer 和 MapDrawer:
- (8)初始化 Tracking 线程
- (9)初始化局部地图 LocalMapping 线程,并加载;
- (10)初始化闭环 LoopClosing 线程,并加载;
- (11)初始化用户可视化线程,并加载;
- (12)将上述实例化的对象指针,传入需要用到的线程,方便进行数据共享
一、ORB-SLAM3初始化
1、开源网址
ORB-SLAM3在github上开源,开源网址
2、ORB-SLAM3代码主要文件夹
- Examples和Example_old根据传感器类型,分别存放新的和旧的代码实例
- include和src分别存放代码的
.h
头文件和cc/cpp
源文件 - Thirdparty存放了DBOW2、Sophus和g2o。DBOW2是词袋模型,Sophus是李代数库,g2o是图优化库
- Vocabulary存放ORB词典
3、整个系统初始化
(1)头文件
运行ORB-SLAM3的第一步是初始化。初始化ORB-SLAM3是通过System.cc
开始,其对应的头文件为System.h
,以下为System.h
的部分源码:
#include "Tracking.h"
#include "FrameDrawer.h"
#include "MapDrawer.h"
#include "Atlas.h"
#include "LocalMapping.h"
#include "LoopClosing.h"
#include "KeyFrameDatabase.h"
#include "ORBVocabulary.h"
#include "Viewer.h"
#include "ImuTypes.h"
#include "Settings.h"
- Tracking.h是Tracking.cc的头文件,即
跟踪线程
的代码 - LocalMapping.h是LocalMapping.cc的头文件,即
局部建图线程
的代码 - LoopClosinng.h是LoopClosinng.cc的头文件,即
闭环与地图合并线程
的代码
System文件相当于初始化代码的入口,Tracking、LocalMapping和LoopClosinng都会用到;
FrameDrawer.h就是建图会使用到,地图画出来;
Atlas.h就是多地图;KeyFrameDatabase.h就是关键帧的数据库,包括关键帧的构建和数据格式;
ORBVocabulary.h就是ORB的词典;
Viewer.h对应展示的界面;
ImuTypes.h就是IMU定义的数据格式和各种函数和内方法;
Settings.h就是参数配置和结构
函数 | 功能 |
---|---|
brief | 系统的构造函数,将会启动其他的线程 |
param strVocFile | 词袋文件所在路径 |
param strSettingsFile | 配置文件所在路径 |
param sensor | 传感器类型 |
param bUseViewer | 是否使用可视化界面 |
param initFr initFr | 表示初始化的id,开始设置为0 |
param strSequence | 序列名,在跟踪线程和局部建图线程用得到 |
(2)Sustem函数
//初始化SLAM系统
//发起局部建图
//局部线程闭环检测,开启视图线程
System(const string &strVocFile,
const string &strSettingsFile,
const eSensor sensor,
const bool bUseViewer,
const int initFr,
const string &strSequence = std::string());
System中有string类型的strVocFile
,这个对应词袋文件的路径;
strSettingsFile
对应配置文件的路径,eSensor
对应传感器的类型sensor,六种传感器的类型输入(单目、双目、RGB-D和以 及这三种分别与和IMU结合);
bool型的bUseViewer
代表是否显示可视化的界面,默认为true;
int类型initFr
代表初始化的帧,默认为0;
string型的strSequence
代表序列名,图像帧的序列
4、初始化函数System::System()主要完成工作
(1)检查SLAM 系统传感器初始化类型,需要用到 sensor
(2)检查传感器配置文件,也就是相机标定参数等,需要用到 strSettingsFile
(3)实例化 ORB 词典对象,并加载 ORB 词典
(4)根据ORB 词典实例对象,创建关键 DataBase
(5)创建Altas,也就是多地图系统
(6)IMU 初始化设置,如果需要
(7)利用Atlas 创建 Drawer,包括 FrameDrawer 和 MapDrawer:
(8)初始化 Tracking 线程
(9)初始化局部地图 LocalMapping 线程,并加载;
(10)初始化闭环 LoopClosing 线程,并加载;
(11)初始化用户可视化线程,并加载;
//参数 bUseViewer 在这里用到
mpViewer = new Viewer(this, mpFrameDrawer,mpMapDrawer,mpTracker strSettingsFile);
mptViewer = new thread(&Viewer::Run,mpViewer);
mpTracker->SetViewer(mpViewer);
mpLoopCloser->mpViewer=mpViewer;
mpViewer->both = mpFrameDrawer->both;
(12)将上述实例化的对象指针,传入需要用到的线程,方便进行数据共享
// Tracking需要用到mpLocalMapper和闭环mpLoopCloser
mpTracker->SetLocalMapper(mpLocalMapper);
mpTracker->SetloopClosing(mpLoopCloser);
//LocalMapper需要用到Tracking和闭环mpLoopCloser
mpLocalMapper->SetTracker(mpTracker);
mpLocalMapper->SetTracker(mpLoopCloser);
//mpLoopCloser需要用到Tracking和LocalMapper
mpLoopCloser->SetTracker(mpTracker);
mpLoopCloser->SetLocalMapper(mpLocalMapper);
函数按照顺序执行