ORB-SLAM2的变量命名规则代码运行流程简析

电子说

1.2w人已加入

描述

运行官方Demo

以TUM数据集为例,运行Demo的命令:  
 

 

./Examples/RGB-D/rgbd_tum Vocabulary/ORBvoc.txt Examples/RGB-D/TUM1.yaml PATH_TO_SEQUENCE_FOLDER ASSOCIATIONS_FILE

rgbd_tum.cc的源码:  

 

SLAM
SLAM

运行程序rgbd_tum时传入了一个重要的配置文件TUM1.yaml,其中保存了相机参数和ORB特征提取参数:  

 


SLAMSLAM阅读代码之前你应该知道的事情 变量命名规则 ORB-SLAM2中的变量遵循一套命名规则: 1、变量名的第一个字母为m表示该变量为某类的成员变量. 2、变量名的第一、二个字母表示数据类型: ·p表示指针类型 ·n表示int类型 ·b表示bool类型 ·s表示std::set类型 ·v表示std::vector类型 ·l表示std::list类型 ·KF表示KeyFrame类型 这种将变量类型写进变量名的命名方法叫做匈牙利命名法. 理解多线程 为什么要使用多线程? 1、加快运算速度:  

 

SLAM

开两个线程同时计算两个矩阵,在多核处理器上会加快运算速度 2. 因为系统的随机性,各步骤的运行顺序是不确定的 . Tracking线程不产生关键帧时,LocalMapping和LoopClosing线程基本上处于空转的状态 . 而Tracking线程产生关键帧的频率和时机不是固定的,因此需要3个线程同时运行,LocalMapping和LoopClosing线程不断循环查询Tracking线程是否产生关键帧,产生了的话就处理.

SLAM

 


SLAMSLAM多线程中的锁 为防止多个线程同时操作同一变量造成混乱,引入锁机制: 将成员函数本身设为私有变量(private或protected),并在操作它们的公有函数内加锁.  

 

SLAM

一把锁在某个时刻只有一个线程能够拿到,如果程序执行到某个需要锁的位置,但是锁被别的线程拿着不释放的话,当前线程就会暂停下来;直到其它线程释放了这个锁,当前线程才能拿走锁并继续向下执行.  什么时候加锁和释放锁? unique_lock lockCon(mMutexConnections);这句话就是加锁,锁的有效性仅限于大括号{}之内,也就是说,程序运行出大括号之后就释放锁了.因此可以看到有一些代码中加上了看似莫名其妙的大括号.  

SLAM

SLAM主类System System类是ORB-SLAM2系统的主类,先分析其主要的成员函数和成员变量:

SLAM

SLAM

构造函数 System(const string &strVocFile, string &strSettingsFile, const eSensor sensor, const bool bUseViewer=true): 构造函数  

SLAMSLAM

LocalMapping和LoopClosing线程在System类中有对应的std::thread线程成员变量,为什么Tracking线程没有对应的std::thread成员变量? 因为Tracking线程就是主线程,而LocalMapping和LoopClosing线程是其子线程,主线程通过持有两个子线程的指针(mptLocalMapping和mptLoopClosing)控制子线程. (ps: 虽然在编程实现上三大主要线程构成父子关系,但逻辑上我们认为这三者是并发的,不存在谁控制谁的问题).

跟踪函数

System对象所在的主线程就是跟踪线程,针对不同的传感器类型有3个用于跟踪的函数,其内部实现就是调用成员变量mpTracker的GrabImageMonocular(GrabImageStereo或GrabImageRGBD)方法.

SLAM

 传感器类型用于跟踪的成员函数   SLAM

审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分