ORB-SLAM2代码笔记:system和tracking
system
- System::System()系统构造函数,启动其他线程
初始化字典、帧绘制器、地图绘制器、地图、关键帧Database、确定传感器类型。
用上面做参数初始化跟踪线程、局部建图线程并运行、闭环线程并运行,viewer线程以及线程间指针。 - cv::Mat System::TrackStereo()
cv::Mat System::TrackRGBD()
cv::Mat System::TrackMonocular()
三种不同单目、双目、RGB-D图像类型的跟踪接口
判断是否激活定位模式,如果激活定位模式时局部建图线程停止工作,如果取消定位模式则开始建图,估计相机位姿并返回,分为三种的原因是位姿估计的部分不同,调用不同的函数。
system中还有: - void System::ActivateLocalizationMode()激活定位模式
- void System::DeactivateLocalizationMode()取消定位模式
- bool System::MapChanged()判断是否地图有较大的改变
- void System::Reset()准备执行复位
- void System::Shutdown()退出 终止线程
- void System::SaveTrajectoryTUM(const string &filename)按照TUM格式保存相机运行轨迹并保存到指定的文件中
- void System::SaveKeyFrameTrajectoryTUM(const string &filename)保存关键帧轨迹
void System::SaveTrajectoryKITTI(const string &filename)按照KITTI数据集的格式将相机的运动轨迹保存到文件中
- int System::GetTrackingState()获取追踪状态
- vector<MapPoint*> System::GetTrackedMapPoints()获取追踪到的地图的
- vector<cv::KeyPoint> System::GetTrackedKeyPointsUn()获取追踪到的关键帧的点
Tracking
-
Tracking::Tracking()构造函数
从配置文件中加载相机参数、相机内参矩阵、图像矫正系数,提取特征点。分单目双目和RGB-D两种情况获取深度 -
void Tracking::SetLocalMapper(LocalMapping *pLocalMapper)设置局部建图器
-
void Tracking::SetLoopClosing(LoopClosing *pLoopClosing) 设置回环检测器
-
void Tracking::SetViewer(Viewer *pViewer) 设置可视化查看器
-
计算位姿
1.转灰度图
2.构造Frame
3.Track();
4.返回位姿-
双目 cv::Mat Tracking::GrabImageStereo(
const cv::Mat &imRectLeft, //左侧图像
const cv::Mat &imRectRight, //右侧图像
const double ×tamp) //时间戳 -
RGB-D cv::Mat Tracking::GrabImageRGBD(
const cv::Mat &imRGB, //彩色图像
const cv::Mat &imD, //深度图像
const double ×tamp) //时间戳 -
单目 cv::Mat Tracking::GrabImageMonocular(
const cv::Mat &im, //单目图像
const double ×tamp)
-
-
void Tracking::Track()
包含两部分:估计运动、跟踪局部地图
1.判断是否已经初始化:双目(包括RGBD)或单目
2.判断:有地图更新和只定位两种模式- 三种跟踪模型 运动模型(匀速),参考帧模型、重定位模型,先看速度矩阵mVelocity是否为空,优先使用运动模型(速度最快),否则使用参考帧模型,如果上一帧跟踪状态失败,使用重定位找回相机位姿
TrackWithMotionModel();
TrackReferenceKeyFrame();
Relocalization();
- 三种跟踪模型 运动模型(匀速),参考帧模型、重定位模型,先看速度矩阵mVelocity是否为空,优先使用运动模型(速度最快),否则使用参考帧模型,如果上一帧跟踪状态失败,使用重定位找回相机位姿
-
bool Tracking::TrackWithMotionModel()
-
bool Tracking::TrackReferenceKeyFrame()关键帧模型
将当前帧的描述子转化为BoW向量
通过特征点的BoW加快当前帧与参考帧之间的特征点匹配 -
void Relocalization()重定位就是在已经生成的关键帧数据库中搜索看看当前帧和谁最相近,而方法就是先用BoW匹配,然后进行PnP求解,最后使用RANSAC迭代。