ORB-SLAM2的三大线程几乎都是每个部分对应一个函数,非常清晰。函数名起的都十分贴切,望文就能生义,我们更应该关注的是里面的关键帧地图点这些变量是怎么流转的。
Tracking线程的流程就是:首先输入一帧图像,然后实际上接着进行5步。初始化(实际上相机刚开始需要初始化过程)、图像预处理(提取ORB特征点)、初始位姿估计(根据前一张图片或者附近的一张图片估计当前帧的位姿)、基于当前帧的位姿构建当前帧的局部地图(当前帧附近的很小的一部分地图)、是否生成新的关键帧
PS:通过追踪局部帧的地图而建图,实际上后面有专门负责建设局部地图的线程,所以这里的局部地图并没有用来建图,只是用来优化当前帧的位姿
一、跟踪线程各成员函数/变量
1、跟踪状态
(1)枚举类型eTrackingState
Tracking类中定义枚举类型eTrackingState,表示跟踪状态,系统创建时设值SYSTEM_NOT_READY,加载好后设值NO_IMAGES_YET,对于单目视觉至少有两帧图像才能成功,对于双目视觉需要一帧图像就鞥初始化成功,如果一帧图像的特征点过少也不能初始化成功
| 值 | 意义 |
|---|---|
| SYSTEM_NOT_READY | 系统没有准备好,一般就是在启动后加载配置文件和词典文件时候的状态 |
| NO_IMAGES_YET | 还没有接收到输入图像 |
| NOT_INITIALIZED | 接收到图像但未初始化成功 |
| OK | 跟踪成功 |
| LOST | 跟踪失败 |
(2)Tracking类的成员变量
Tracking类的成员变量mState和mLastProcessedState分别表示当前帧的跟踪状态和上一帧的跟踪状态
| 成员变量 | 访问控制 | 意义 |
|---|---|---|
| eTrackingState mState | public | 当前帧mCurrentFrame的跟踪状态 |
| eTrackingState mLastProcessedState | public | 前一帧mLastFrame的跟踪状态 |
(3)跟踪状态流程

2、初始化

初始化部分只在系统开始的几帧有,初始化分为:单目初始化、双目初始化。
单目初始化帧initializer比较复杂,需要两帧之间匹配,双目初始化和RGBD初始化就没那么复杂了,实际上双目初始化和RGBD初始化都只需要一个条件:只要左目图像能找到超过500个特征点那就算双目初始化成功
双目相机和RGBD相机的输入经过预处理提取特征点,是以同样的方式进行处理的
| 成员函数/变量 | 访问控制 | 意义 |
|---|---|---|
| Frame mCurrentFrame | public | 当前帧 |
| KeyFrame* mpReferenceKF | protected | 参考关键帧 初始化成功的帧会被设为参考关键帧 |
| std::vector<KeyFrame*> mvpLocalKeyFrames | protected | 局部关键帧列表,初始化成功后向其中添加局部关键帧 |
| std::vector<MapPoint*> mvpLocalMapPoints | protected | 局部地图点列表,初始化成功后向其中添加局部地图点 |
此博客参考ncepu_Chen的《5小时让你假装大概看懂ORB-SLAM2源码》

本文详细解析ORB-SLAM2中跟踪线程的工作流程,包括关键帧地图点变量流转、跟踪状态变化及初始化过程。针对单目、双目及RGBD三种不同情况的初始化进行了对比说明。
5192

被折叠的 条评论
为什么被折叠?



