-
- Examples里面存放的分别是基于单目、双目、RGBD的实例程序
- include文件夹存放的是头文件,ORB-SLAM2可以被当作一个库来使用,很多函数都可以直接调用
- src文件夹存放的是和include对应的源文件
- Thirdparty存放的是用到的第三方库
- Vocabulary存放的是回环检测中BoW用到的视觉词典
- build.sh,只要配置好了本地环境,运行一下build.sh就行了
System.cc
构造函数system()对SLAM系统初始化,传入ORB字典文件路径、配置文件路径、传感器类型。
1. 首先判断传感器类型是单目、双目还是RGB-D。
2. 然后通过cv::FileStorage fsSetting()传入配置文件路径的读取配置文件,并由isOpened()判断文件是否存在。
3. 若存在,则通过ORBVocabulary()加载ORB字典到mpVocabulary变量,然后通过loadFromTextFile()判断加载是否成功。
4. 接着创建地图Map(),创建视图FrameDrawer()用来显示创建的地图,创建画图器MapDrawer()。
5. 初始化三个线程Tracking()、LocalMapping()、LoopClosing()。并通过thread()开启local mapping和loop closing线程。同时初始化显示线程Viewer()并启动该线程。
6. 最后通过setLocalMapper()等方法设置线程之间的指针。
TrackStereo()、TrackRGBD()、TrackMonocular()方法:首先判断输入传感器类型是否对应正确的方法,然后检查模型,如果是mbActivateLocalizationMode则休眠1000ms直到停止局部建图。如果是mbDeactivateLocalizationMode则重新开启局部建图的线程。然后分别通过GrabImageStereo(imRectLeft,imRectRight)、GrabImageRGBD(im,depthmap)、GrabImageMonocular(im)开启对应的tracking线程。
SaveTrajectoryTUM()方法求数据集中每一帧的位姿:GetAllKeyFrames()获得所有关键帧vpKFs——sort()对关键帧排序——vpKFs[0]->GetPoseInverse()获得第一帧相对于世界坐标系的位姿——遍历所有帧的位姿和参考帧【如果当前帧追踪失败则丢弃,继续追踪下一帧——追踪成功则将当前参考帧设为关键帧——追踪成功但是关键帧不好,则获取当前关键帧相对于上一帧的位姿,并将上一帧设为关键帧,依次不断的判断关键帧的质量,直到选取合适的关键帧——将关键帧的位姿乘第一帧相对于世界坐标的位姿得到关键帧相对于世界坐标的位姿——在将关键帧相对于世界坐标的位姿乘当前帧相对于关键帧的位姿得到当前帧相对于世界坐标的位姿——取当前帧相对于世界坐标位姿的R和t——转换为四元数——存入文件中】——关闭文件
SaveKeyFrameTrajectoryTUM()方法求数据集中每一关键帧的位姿。
rgb_tum.cc
1. LoadImages()加载图像——判断rgb图是否存在——判断rgb图与depth图数量是否对应相同。
2. ORB_SLAM2::System SLAM()初始化,创建SLAM系统,并初始化各个线程。
3. 遍历每一对RGB图和depth图【读取RGB图和depth图,读取时间戳(vTimestamps存储了时间戳,实际上就是存储了数据文件的每一幅图像的采集时间)——判断文件是否读取成功——SLAM.TrackRGB()将图片转给system处理,在这里从主线程进入tracking线程