ORB_SLAM2 学习笔记(1)——总框架
说明:笔记主要参考视觉slam十四讲以及该博主的讲解一步步带你看懂orbslam2源码
感谢各位前辈的无私奉献。
orb_slam2总共三个线程
(1)Tracking:负责提取orb特征;估计相机位姿;判断关键帧的插入。
(2)Local Mapping: 负责处理新的关键帧;进行局部优化更新位姿;创建新的地图点更新局部地图;剔除多余关键帧。
(3)Loop Closing: 负责回环检测,工具:DBOW视觉词袋;全局地图优化,减少累积误差。
orb_slam2系统的特点:
(1)ORB特征点用于系统各个环节;
(2)使用共视图(covisibility graph):观察到地图相同点的帧越多得分越高,使得在大环境下仍能保持是实时性。
(3)后端Loop Closing 线程只对位姿(pose)进行优化,提高了处理效率。
(4)拥有良好视角和光照不变性的实时重定位。
(5)计算方法上,平面与非平面模型自动切换,即估计位姿时可通过本质矩阵(E)/ 基础矩阵(F)与 单应矩阵(H)之间的自动切换。
(6)能够及时的剔除多余的地图点(Map Point)和关键帧(Keyframe),对于优化时的计算量大大减少,也因此提高了系统长时间运行的鲁棒性与实时性。
(7)提供了单目,双目,RGB-D,Stereo多个版本,其中单目最为复杂。
以下以单目为例:
orb_slam2变量命名原则:
m: 代表类成员变量(member)
t: 线程类型变量(thread)
l: 代表list类型变量
n: 代表int类型变量
p: 代表指针类型变量(pointer)
b: 代表bool类型变量
v: 代表vector类型变量
s: 代表set 类型变量
三线程在程序中的位置:
Trackin位于主线程之中(main函数);Local Mapping 和 Loop Closing 位于主线程的系统初始化中。
(1)开始创建一个系统(文件mono_euroc.cc中):
// Create SLAM system. It initializes all system threads and gets ready to process frames.两参数分别为图片和时间
ORB_SLAM2::System SLAM(argv[1],argv[2],ORB_SLAM2::System::MONOCULAR,true);
下面函数用于对数据集中图片和时间的提取(文件momo_tum.cc中):
//vstrImageFilenames存储图片,vTimestamps存储对应的时间轴
LoadImages(strFile, vstrImageFilenames, vTimestamps)
下面函数负责实时跟踪输入图片,极其重要的函数(文件momo_tum.cc中):
// Pass the image to the SLAM system整个系统的核心所在,负责实时跟踪输入图片,
SLAM.TrackMonocular(im,tframe);
下面函数用于关闭线程,系统运行结束(文件momo_tum中):
SLAM.Shutdown();
最后下面函数用于保存slam的相机跟踪轨迹(保留关键帧,不是全部帧轨迹,同位于momo_tum.cc中)
SLAM.SaveKeyFrameTrajectoryTUM("KeyFrameTrajectory.txt");