ORB-SLAM2-tracking线程
tracking线程
Tracking线程的主要工作是从图像中提取ORB特征,根据上一帧进行姿态估计或者进行通过全局重定位初始化位姿,然后跟踪已经重建的局部地图,优化位姿,再根据一些规则确定新的关键帧,将这些关键帧送给localmapping线程
1. 基本流程
首先从主线程system中的GrabImageMonocular()函数开始,进行图像的预处理和Frame的构造,Frame构造完成后真正进入Tracking。
↓↓↓主要看下面这张图↓↓↓
↑↑↑主要看上面这张图↑↑↑
2. 各部分详解
Tracking构造函数
Tracking线程在构造时主要是读取了一些参数,包括:
- 相机参数:
相机内参矩阵、
畸变校正矩阵、
双目摄像头基线、
相机的帧数、
颜色通道、
深度相机深度与距离的转化因子 - ORB特征提取相关参数:
每一帧提取的特征点数、
图像建立金字塔时的变化尺度、
尺度金字塔的层数、
提取fast特征点的默认阈值、
提取fast特征点的最小阈值(如果默认阈值提取不出足够fast特征点,则使用最小阈值)
具体代码如下
Tracking::Tracking(System *pSys, ORBVocabulary* pVoc, FrameDrawer *pFrameDrawer, MapDrawer *pMapDrawer, Map *pMap, KeyFrameDatabase* pKFDB, const string &strSettingPath, const int sensor):
mState(NO_IMAGES_YET), mSensor(sensor), mbOnlyTracking(false), mbVO(false), mpORBVocabulary(pVoc),
mpKeyFrameDB(pKFDB), mpInitializer(static_cast<Initializer*>(NULL)), mpSystem(pSys), mpViewer(NULL),
mpFrameDrawer(pFrameDrawer), mpMapDrawer(pMapDrawer), mpMap(pMap), mnLastRelocFrameId(0)
{
//读取相机内参数据
// Load camera parameters from settings file
cv::FileStorage fSettings(strSettingPath, cv::FileStorage::READ);//opencv的FileStorage类,用于实现数据的存取等操作
float fx = fSettings["Camera.fx"];
float fy = fSettings["Camera.fy"];
float cx = fSettings["Camera.cx"];
float cy = fSettings["Camera.cy"];
//生成相机内参矩阵
// |fx 0 cx|
// K = |0 fy cy|
// |0 0 1 |
cv::Mat K = cv::Mat::eye(3,3,CV_32F);
K.at<float>(0,0) = fx;
K.at<float>(1,1) = fy;
K.at<float>(0,2) = cx;
K.at<float>(1,2) = cy;
K.copyTo(mK);//把临时变量K中的数据copy到tracking类的成员变量中
// 图像畸变矫正系数(畸变部分可以参考十四讲的5.1.2)
// 通常只有鱼眼相机才进行校正,mono_kitti中并没有进行校正
// [k1 k2 p1 p2 k3]
cv::Mat DistCoef(4,1,CV_32F);
DistCoef.at<float>(0) = fSettings["Camera.k1"];
DistCoef.at<float>(1) = fSettings["Camera.k2"];
DistCoef.at<float>(2) = fSettings["Camera.p1"];
DistCoef.at<float