ORB_SLAM2代码阅读(1)——系统简介
1、说明
本文以~/ORB_SLAM2/Examples/Stereo/stereo_kitti.cc 为起点一步步阅读ORB_SLAM2代码。由于本人也是初学,阅读代码过程中难免出现错误,希望各位谅解。
2、简介
ORB-SLAM是由Raul Mur-Artal,J. M. M. Montiel和Juan D. Tardos于2015年发表在IEEE Transactions on Robotics。ORB-SLAM是一个基于特征点的实时单目SLAM系统,在大规模的、小规模的、室内室外的环境都可以运行。该系统对剧烈运动也很鲁棒,支持宽基线的闭环检测和重定位,包括全自动初始化。该系统包含了所有SLAM系统共有的模块:跟踪(Tracking)、建图(Mapping)、重定位(Relocalization)、闭环检测(Loop closing)。由于ORB-SLAM系统是基于特征点的SLAM系统,故其能够实时计算出相机的轨线,并生成场景的稀疏三维重建结果。ORB-SLAM2在ORB-SLAM的基础上,还支持标定后的双目相机和RGB-D相机。
其系统结构图如下图所示:
可以看到ORB-SLAM主要分为三个线程进行,分别是Tracking、LocalMapping和LoopClosing。三个线程分别存放在对应的三个文件中,分别是Tracking.cpp、LocalMapping.cpp和LoopClosing.cpp文件中,很容易找到。
3、stereo_kitti.cc
stereo_kitti.cc 是针对KITTI数据集的双目ORB_SLAM示例。该示例比较简单,主要包括四部分:
- 载入图像 :根据命令行输入的参数,载入在相关文件夹下图像和时间戳。
LoadImages(string(argv[3]), vstrImageLeft, vstrImageRight, vTimestamps);
*注 :该过程只是将图像的名称保存在相应的vector变量中。 - 创建SLAM系统:根据命令行输入的参数创建SLAM系统并进行系统初始化。
ORB_SLAM2::System SLAM(argv[1],argv[2],ORB_SLAM2::System::STEREO,true);
其中:argv[1]表示词袋文件的路径,argv[2]表示配置文件的路径,ORB_SLAM2::System::STEREO表示创建SLAM系统为双目SLAM系统,true表示进行可视化操作。 - 传入图像进行追踪 :通过一个循环过程将图像传入SLAM系统中进行追踪。
SLAM.TrackStereo(imLeft,imRight,tframe);
- 停止SLAM系统并保存轨迹:通过
Shutdown()
函数停止SLAM系统中的所有线程,利用SaveTrajectoryKITTI()
函数来保存轨迹。
该示例主要内容就是这三部分,其他内容主要是相关变量的定义和追踪时间的统计过程。