一、摘要
ORB-SLAM是一个基于特征点的实时单目SLAM系统,在大规模的、小规模的、室内室外的环境都可以运行。该系统对剧烈运动也很鲁棒,支持宽基线的闭环检测和重定位,包括全自动初始化。该系统包含了所有SLAM系统共有的模块:跟踪(Tracking)、建图(Mapping)、重定位(Relocalization)、闭环检测(Loop closing)。由于ORB-SLAM系统是基于特征点的SLAM系统,故其能够实时计算出相机的轨线,并生成场景的稀疏三维重建结果。ORB-SLAM2在ORB-SLAM的基础上,还支持标定后的双目相机和RGB-D相机。
ORB-SLAM主要分为三个线程进行,也就是论文中的下图所示的,分别是Tracking、LocalMapping和LoopClosing。
提便宜
二、系统框架
首先从mono_kitti.cc(单目相机)这个主程序来看整个代码。程序框架为:
(1)首先使用LoadImages读取图片目录和时间戳文件
(2)创建ORB_SLAM2::System对象
(3)循环读取数据
(3.1)读取图片
(3.2)读取时间戳
(3.3)将图片传给SLAM系统
(4)关闭SLAM系统
(5)将相机轨线保存到硬盘中
三、 SLAM系统的创建
(1)创建了ORB词袋的对象
(2)创建了关键帧的数据库
(3)创建地图对象
(4)创建两个显示窗口
(5)初始化Tracking对象
(6)初始化Local Mapping对象,并开启线程运行
(7)初始化Loop Closing对象,并开启线程运行
(8)初始化窗口,开启线程显示图像和地图点
四、主程序部分分析
1.读取文件
/*读取文件目录*/
if(argc != 4)
{
cerr << endl << "Usage: ./mono_kitti path_to_vocabulary path_to_settings path_to_sequence" << endl;
return 1;
}
// 检索图片路径
vector<string> vstrImageFilenames;
vector<double> vTimestamps;
//load函数,从第三个传入参数装载图像和时间戳,vstrImageFilenames是装有图像地址+名字的vector,vTimestamps是times.txt里每一行的时间组成的vector
LoadImages(string(argv[3]), vstrImageFilenames, vTimestamps);
//有几张图片
int nImages = vstrImageFilenames.size();
程序运行需要传入三个参数:① 字典词包的路径; ② 系统中装有一些如相机参数、viewer窗口的参数的配置文件,格式为YAML; ③数据集的路径。
LoadImages函数
void LoadImages(const string