1、从Cmake开始
① realsense模块可以选装
② C++11 改 C++17
error: ‘decay_t’ is not a member of ‘std’;
‘slots_reference’ that depend on a template parameter
③ examples太多,选择一个就好了,我选的是【mono_kitti】
④ C++11 改成了 C++17,Examples里面需要用std::chrono::steady_clock::now();
删掉COMPILEDWITHC11这个宏,直接用steady_clock就好了
⑤ 如果要用opecv4, ./3rdParty/DBoW2 也要连接到opencv4
2、开始看Example:mono_kitti.cc
① 读图像没啥好说的
② 创建一个System对象 SLAM (构造函数在System.cc 里面)
构造 前面的暂时还看不懂,先看后面的
创建用于显示的两个对象 mpFrameDrawer mpMapDrawer
创建 mpTracker 对象,主线程
创建 局部地图 mpLocalMapper 对象, 开启 mptLocalMapping 线程
创建 闭环对象 mpLoopCloser, 开启闭环线程 mptLoopClosing
三个对象相互关联的指针
③ 主循环:根据图像 SLAM.TrackMonocular()
④ SLAM.Shutdown(); SLAM.SaveKeyFrameTrajectoryTUM("KeyFrameTrajectory.txt");
3、TrackMonocular(img,imgtime,imu,imgfilename) 【System.cc】
① 检查模式、图像是否需要resize、是否为单定位模式(关闭局部地图线程)
② 是否需要重置地图()
③ Vio则需要获取IMU数据
④ 计算相机位姿 Sophus::SE3f Tcw = mpTracker->GrabImageMonocular(imToFeed,timestamp,filename);
⑤ 更新跟踪状态和参数
4、GrabImageMonocular(imToFeed,timestamp,filename)【Tracking.cc】
① 图像转换 灰度图
② Frame对象构造 mCurrentFrame 三类构造函数 双目 RGBD 单目
③ Track();
④ 返回位姿
5、Track【Tracking.cc】主要包括两个部分 估计运动、跟踪局部地图
① 如局部建图里认为IMU有问题,则重置当前活跃地图
② 从Atlas中取出当前active的地图,处理时间戳异常的情况
③ IMU模式下设置IMU的Bias参数,还要保证上一帧存在
④ IMU模式且没有创建地图的情况下对IMU数据进行预积分 PreintegrateIMU()
⑤ 判断地图id是否更新了,没有更新则更新地图id和标志位
⑥ 判断是否完成初始化 选择进入 Initialization() 或者 Track()
⑦ Track过程
1、检查并更新上一帧被替换的MapPoints,局部建图线程则可能会对原有的地图点进行替换.
2、运动模型是空的并且imu未初始化 或 刚完成重定位,跟踪参考关键帧;否则恒速模型跟踪
如果运动模型为空并且imu未初始化,说明是刚开始第一帧跟踪,或者已经跟丢了。
如果当前帧紧紧地跟着在重定位的帧的后面,我们用重定位帧(mnLastRelocFrameId)来恢复位姿
⑧
⑨