ORB-SLAM2代码学习

cerr与cout的区别
1、cout经过缓冲后输出,默认情况下是显示器。这是一个被缓冲的输出,是标准输出,并且可以重新定向。
2、cerr不经过缓冲而直接输出,一般用于迅速输出出错信息,是标准错误,默认情况下被关联到标准输出流,但它不被缓冲,也就说错误消息可以直接发送到显示器,而无需等到缓冲区或者新的换行符时,才被显示。一般情况下不被重定向。
cerr主要作用在于当程序栈空间用完之后,仍具有输出功能,可以显示紧急的错误信息
 

        if(ttrack<T)
        //把进程挂起一段时间,单位是秒
            usleep((T-ttrack)*1e6);

使用click函数,精确到毫秒(推荐使用这种)
计算算法程序的执行时间,使用clock()函数,返回值是长整型long
函数原型为: clock_t clock(void);
其中clock_t的定义为:typedef long clock_t;说明 clock_t就是长整型

实际上这个函数返回的不是时间,这个函数只是一个计数器,时间每过千分之一秒(就是毫秒)就加1(这个定义在time.h中)
#define CLOCKS_PER_SEC 1000
这个数值不能增加,因为在标准C/C++中,最小的计时单位就是一毫秒。

#include <stdio.h>
#include <time.h>
using namespace std;
void myTime() {
	clock_t start = clock();
	cout<<"开始时间:"<<start<<endl;
	long i=100000000;
	while(i--);
	clock_t end = clock();
	cout<<"结束时间:"<<end<<endl;
	cout<<"算法执行持续时间:"<<end-start<<"毫秒"<<endl;
}
void main(){
	myTime();
}

(1)首先使用LoadImages读取图片目录和时间戳文件
(2)创建ORB_SLAM2::System对象
(3)循环读取数据
(3.1)读取图片
(3.2)读取时间戳
(3.3)将图片传给SLAM系统
(4)关闭SLAM系统
(5)将相机轨线保存到硬盘中

函数中,我们创建了一个ORB_SLAM2::System的对象SLAM,这个时候就会进入到SLAM系统的主接口System.cc。这个代码是所有调用SLAM系统的主入口。

ORB_SLAM的三大模块:Tracking、Mapping和LoopClosing

对象的实例化过程中,我们创建了以下对象:
(1)创建了ORB词袋的对象
(2)创建了关键帧的数据库
(3)创建地图对象
(4)创建两个显示窗口
(5)初始化Tracking对象
(6)初始化Local Mapping对象,并开启线程运行
(7)初始化Loop Closing对象,并开启线程运行
(8)初始化窗口,开启线程显示图像和地图点

在这个实例化的过程中,我们开启了三个线程,分别是Local Mapping、Loop Closing和窗口显示的线程
 

Tracking的运行:

我们在循环读取图片的时候,调用了一个SLAM.TrackMonocular()函数,这个函数就是在主线程里调用Tracking的函数入口了。所以Tracking是运行在主线程中,并且在每次读取一帧新的图像时运行一次。程序将读取的图片转成灰度图,然后对帧进行特征点检测,就直接调用Tracking.cc中的Track()函数,进行跟踪。另外要注意的是,由于使用的是单目相机,所以在跟踪时需要判断是否初始化或有没有前序关键帧,如果没有,使用mpIniORBextractor的参数进行特征点检测。

Local Mapping:

关键帧(keyframe)

  • tracking线程对每一帧进行跟踪,挑选出其中质量高、信息丰富的帧作为关键帧送给localmapping线程
  • 关键帧的选取采用“宽进严出”的策略,tracking线程在选取关键帧的时候条件比较宽松,localmapping线程再对冗余的关键帧进行剔除

地图点(mappoint)

是一些3D点,主要包含以下几个信息
1.位置
2.能被哪些关键帧观测到
3.最佳描述子
4.平均观测方向和观测范围
地图点的生成
对于单目相机,只有tracking线程的单目初始化和localmapping线程的CreateNewMapPoints生成了地图点。而双目和深度相机由于有深度信息,所以在跟踪时也能生成地图点。

1. 处理新插入的关键帧——ProcessNewKeyFrame

2. 剔除新加入的地图点中不好的点——MapPointCulling

3. 利用三角化生成新的地图点——CreateNewMapPoints

4. 融合当前关键帧和相邻两级共视关键帧之间的地图点——SearchInNeighbors

5. 冗余关键帧的剔除——KeyFrameCulling

6.把关键帧送给LoopClosing线程做回环检测

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不做笔记的程序员不是好的码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值