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

运行官方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 lockcon(mmutexconnections);这句话就是加锁,锁的有效性仅限于大括号{}之内,也就是说,程序运行出大括号之后就释放锁了.因此可以看到有一些代码中加上了看似莫名其妙的大括号.
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)方法.
传感器类型用于跟踪的成员函数  


浅谈模拟电路之电路零点
比亚迪实力演绎纯电动物流车进化历程
为什么说云正在改变制造业和分销商流程
区块链是如何让数据和加密扯上关系的
dfrobot20A电流传感器简介
ORB-SLAM2的变量命名规则代码运行流程简析
小米是如何成功逆转的?因为做对了这3点
ST推出新系列高精度LED驱动器STP16xPP05/STP
微型杀人机器就在我们身边!灭蚊灯有用吗?
2课:单片机引脚介绍
配电室运行环境是如何实时监测和远程控制调节的
软核和硬核的意思
倍捷连接器晋升Peter Austin为高级副总裁
什么是中断响应次序?什么是中断处理次序?
三相桥式整流电路
什么是硬件什么是软件_硬件和软件的区别
城市地铁积水监测预警系统
广明源家用LED植物补光产品推荐
明基HDR爱眼显示器好不好用
从IP到芯片,耐能KL520智能物联网专用AI SoC芯品首发