ORB-SLAM3的Tracking线程,主要从一下几个方面进行讲解:ORB-SLAM3初始化、传感器输入模块、Tracking线程子模块、Tracking线程代码详解。
其中包括
①ORB-SLAM3整个系统初始化的代码是如何实现
②单目、双目、RBB-D以及结合IMU的输入的情况
③Tracking线程是怎么样处理数据的,代码逻辑
④按照Tracking线程每一步实现的功能
ORB-SLAM3在github上开源,开源网址
.h头文件和cc/cpp源文件
运行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"
跟踪线程的代码局部建图线程的代码闭环与地图合并线程的代码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 | 序列名,在跟踪线程和局部建图线程用得到 |
//初始化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代表序列名,图像帧的序列
//参数 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;
// 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);
函数按照顺序执行
