运行官方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的源码:
运行程序rgbd_tum时传入了一个重要的配置文件TUM1.yaml,其中保存了相机参数和ORB特征提取参数:
阅读代码之前你应该知道的事情 变量命名规则 ORB-SLAM2中的变量遵循一套命名规则: 1、变量名的第一个字母为m表示该变量为某类的成员变量. 2、变量名的第一、二个字母表示数据类型: ·p表示指针类型 ·n表示int类型 ·b表示bool类型 ·s表示std::set类型 ·v表示std::vector类型 ·l表示std::list类型 ·KF表示KeyFrame类型 这种将变量类型写进变量名的命名方法叫做匈牙利命名法. 理解多线程 为什么要使用多线程? 1、加快运算速度:
开两个线程同时计算两个矩阵,在多核处理器上会加快运算速度 2. 因为系统的随机性,各步骤的运行顺序是不确定的 . Tracking线程不产生关键帧时,LocalMapping和LoopClosing线程基本上处于空转的状态 . 而Tracking线程产生关键帧的频率和时机不是固定的,因此需要3个线程同时运行,LocalMapping和LoopClosing线程不断循环查询Tracking线程是否产生关键帧,产生了的话就处理.
多线程中的锁 为防止多个线程同时操作同一变量造成混乱,引入锁机制: 将成员函数本身设为私有变量(private或protected),并在操作它们的公有函数内加锁.
一把锁在某个时刻只有一个线程能够拿到,如果程序执行到某个需要锁的位置,但是锁被别的线程拿着不释放的话,当前线程就会暂停下来;直到其它线程释放了这个锁,当前线程才能拿走锁并继续向下执行. 什么时候加锁和释放锁? unique_lock
SLAM主类System System类是ORB-SLAM2系统的主类,先分析其主要的成员函数和成员变量:
构造函数 System(const string &strVocFile, string &strSettingsFile, const eSensor sensor, const bool bUseViewer=true): 构造函数
LocalMapping和LoopClosing线程在System类中有对应的std::thread线程成员变量,为什么Tracking线程没有对应的std::thread成员变量? 因为Tracking线程就是主线程,而LocalMapping和LoopClosing线程是其子线程,主线程通过持有两个子线程的指针(mptLocalMapping和mptLoopClosing)控制子线程. (ps: 虽然在编程实现上三大主要线程构成父子关系,但逻辑上我们认为这三者是并发的,不存在谁控制谁的问题).
跟踪函数
System对象所在的主线程就是跟踪线程,针对不同的传感器类型有3个用于跟踪的函数,其内部实现就是调用成员变量mpTracker的GrabImageMonocular(GrabImageStereo或GrabImageRGBD)方法.
传感器类型用于跟踪的成员函数
审核编辑:刘清
-
传感器
+关注
关注
2545文章
50411浏览量
750782 -
SLAM
+关注
关注
23文章
414浏览量
31753
原文标题:ORB-SLAM2代码运行流程
文章出处:【微信号:3D视觉工坊,微信公众号:3D视觉工坊】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论