认真看代码ORB_SLAM3===1

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)来恢复位姿 

你可能感兴趣的:(slam,c++,开发语言)