ORB_SLAM3:System类构造函数梳理及自己的理解

ORB_SLAM3::System SLAM(argv[1], argv[2], ORB_SLAM3::System::IMU_MONOCULAR, true);    // 其中initFr=0

1、读取yaml配置文件的File.version,如果配置文件中无该内容,将settings_ 设为nullptr;然后读取yaml配置文件的System.LoadAtlasFromFile和System.LoadAtlasFromFile,将对应的值分别赋值给成员变量mStrLoadAtlasFromFile和mStrLoadAtlasFromFile,activeLC代表是否激活回环,默认是开着的,但是会根据配置文件中的loopClosing值确定;

2、创建一个新的ORB字典mpVocabulary,就是初始化一个k分支、深度为d的树,可以容纳k^{d}个单词,设置单词权重计算方式(TF_IDF)和两张图像向量的差异得分计算方式(L1_NORM);

3、读取预训练好的ORB字典ORBvoc.txt,读取这个文件需要等一段时间,网上有做优化的,将该文件变成二进制文件,能够读的快一点。该过程主要就是将训练好的词典读取到容器m_nodes和
m_words中,最上面的那个节点id为0;

      ORBvoc.txt文件的第一行:分支数(k=10)   深度(d=6)   评分类型(0)    权重类型(0)

      ORBvoc.txt文件的第二行:父节点id     是否是叶子(word)节点    该节点的描述子     节点的权重(word才有)

std::vector<Node*> m_words; 
std::vector<Node> m_nodes;      // Node是一个结构体,包括节点id、权重(weight)、children、parent、描述子(descriptor)和word_id等。

4、创建关键帧数据库:

mpKeyFrameDatabase = new KeyFrameDatabase(*mpVocabulary);    // 就是二维容器mvInvertedFile预留出字典中单词的个数,里面的内容在回环检测线程中设置;
std::vector< list<KeyFrame*> > mvInvertedFile;               // 该容器的序号为字典中单词的顺序,list容器对应的为包含该单词的关键帧指针。

      1)当成员变量mStrLoadAtlasFromFile为空时,创建地图集,初始化mpCurrentMap,并将其设置为活跃地图(成员变量mIsInUse为true),所有的地图存入容器mspMaps中,地图集中只有一个活跃地图;

      2)当成员变量mStrLoadAtlasFromFile非空时,加载地图集:bool isRead = LoadAtlas(FileType::BINARY_FILE);然后创建地图集:mpAtlas->CreateNewMap()。

5、创建用于显示帧的类mpFrameDrawer,将viewer线程的mState设为SYSTEM_NOT_READY,意为系统没有准备好,一般就是在启动后加载配置文件和词典文件时候的状态。初始化左右目显示图像mIm和mImRight为480x640的黑色图像。创建用于显示地图的类mpMapDrawer,就是读取yaml配置文件的Viewer对应的一些参数;

6、创建跟踪线程(主线程),不会立刻开启,会在对图像和imu预处理后在main主线程中执行。初始化一些参数,将跟踪的mState设为NO_IMAGES_YET,读取yaml配置文件的Camera和ORBextractor对应的参数,最后读取IMU参数。

b_parse_imu = ParseIMUParamFile(fSettings);    // 创建mpImuCalib对象,并设置噪声协方差Cov和随机游走协方差CovWalk。

最后创建mpImuPreintegratedFromLastKF对象,就是将mpImuCalib的噪声协方差Cov和随机游走协方差CovWalk赋值给Nga和NgaWalk,初始化预积分的参数(Initialize(b_);)即dR设置为单位矩阵,其余参数全部设置为0;

7、创建localmapping线程就是初始化一些参数,然后开启LocalMapping线程;

8、创建LoopClosing线程就是初始化一些参数,然后开启LoopClosing线程;

9、设置线程间的指针,就是线程之间可以相互调用变量和函数,这样能够更方便的共享数据;

10、最后创建显示线程,就是初始化一些参数,然后读取配置文件yaml中的Camera和Viewer相关参数。开启显示线程,此时已经开启了3个线程,tracking线程在main主线程中执行。

猜你喜欢

转载自blog.csdn.net/qq_44530706/article/details/130187541