重读ORB_SLAM之Tracking线程难点
1. 初始化
当获取第一帧图像与深度图后,首先设置第一帧位姿为4*4单位矩阵,然后为整个map添加关键帧与地图点。且更新地图点与关键帧的联系,例如地图点被哪个关键帧观测到,而此关键帧又包含哪些地图点。而且不得不为ORB的处理细节感动,每个地图点因为对应着不同关键帧的特征点,需要择优选取地图点最合适的描述子,pNewMP->ComputeDistinctiveDescriptors()。然后为localmapping线程添加关键帧,以及其他一些准备工作。
2. 正常定位建图模式
后续的定位工作,主要由四个函数完成,首先如果有速度信息,就会采取TrackWithMotionModel,没有速度信息或者重定位后的第一帧就会采用TrackReferenceKeyFrame(),当运动速度快,或者其他原因导致定位失败,会一直采用重定位方法。在跟踪当前帧成功后,还要在TrackLocalMap里继续对局部地图做跟踪以及优化位姿。这个localmap局部地图很有迷惑性,跟localMapping感觉很相似。但是两者有很大不同,localmap有两部分组成,一个是局部关键帧,一个是局部地图点。局部关键帧由与当前关键帧有共同观测点的其他关键帧组成,且包括其自身。如果localkeyframes不到80帧,则继续添加每个localkeyframes内的邻居关键帧,孩子与父关键帧。localMapping 则是根据传来的关键帧,经过计算,往整体的map中添加数据。localPoints就很容易理解了,把局部关键帧内所有的看到的地图点都添加进去。重定位函数Relocalization,就是在关键帧库里搜索能匹配上的关键帧,做相对位姿计算。
3. 只定位不建图模式
这种模式下,首先会进行重定位,然后根据mbVO 参数判断是进行正常的跟踪定位操作还是要结合重定位信息。mbVO为真表示当前图像和上一帧地图点匹配数目小于10,有可能是运动过快的原因。
- 假如上次定位显示,mbVO为0,则进行正常的定位跟踪,但是发现跟踪后mbVO在TrackWithMotionModel里被设置为1了,且定位是成功的,则进行正常的更新速度以及显示操作,如果mbVO仍然为0,则要先跟局部地图进行匹配跟踪,优化位姿,再进行后续操作。因为如果mbVO为1时,也就是跟上一帧地图点匹配较少时,可能得不到有效的局部地图信息。
- 在下次定位时,如果mbVO为1,则先进行TrackWithMotionModel跟踪,再进行重定位,为的是保证定位不会轻易丢失。但是如果运动速度仍然过快,mbVO 仍然为1,则下次任然重复步骤2。直到TrackWithMotionModel里设置mbVO为0,或者重定位成功把mbVO设置为0。
4. 结尾处理
此处有两个点比较难理解:
- 为什么会存在观测值小于1的地图点?
// Clean VO matches
for(int i=0; i<mCurrentFrame.N; i++)
{
MapPoint* pMP = mCurrentFrame.mvpMapPoints[i];
if(pMP)
if(pMP->Observations()<1)
{
mCurrentFrame.mvbOutlier[i] = false;
mCurrentFrame.mvpMapPoints[i]=static_cast<MapPoint*>(NULL);
}
}
梳理之后发现,在localMapping中,会对局部地图进行优化,会对地图点和关键帧的关系做出调整,有些地图点就会删掉某些observation。所以这里需要处理。
- 要删去一些临时地图点,这些点从哪里来的?
// Delete temporal MapPoints
for(list<MapPoint*>::iterator lit = mlpTemporalPoints.begin(), lend = mlpTemporalPoints.end(); lit!=lend; lit++)
{
MapPoint* pMP = *lit;
delete pMP;
}
mlpTemporalPoints.clear()
在TrackWithMotionModel里有一个UpdateLastFFrame函数,在纯定位模式下,会根据深度图新增一些临时地图点,为的是增加匹配点数,使位姿更准确。所以后面要把这些临时的地图点删去。
重读ORB_SLAM之Tracking线程难点的更多相关文章
- 重读ORB_SLAM之LocalMapping线程难点
1. 认清几个锁与布尔参数 线程的通信与相互影响在ORB比较复杂,需要好好缕清思路. 1.1 mbStopRequested,由RequestStop函数设定,主要是在回环线程里,在运行全局优化时,以 ...
- 重读ORB_SLAM之LoopClosing线程难点
1. DetectLoop 这里有个ConsistenGroup概念,比较难懂.这里是最让人迷惑的地方.一旦vbConsistentGroup为真,其他帧的spCanditateGroup就进不来了. ...
- ORB-SLAM2 论文&代码学习 ——Tracking 线程
本文要点: ORB-SLAM2 Tracking 线程 论文内容介绍 ORB-SLAM2 Tracking 线程 代码结构介绍 写在前面 上一篇文章中我们已经对 ORB-SLAM2 系统有了一个概览性 ...
- ORB-SLAM (四)tracking跟踪解析
初始化完成后,对于相机获取当前图像mCurrentFrame,通过跟踪匹配上一帧mLastFrame特征点的方式,可以获取一个相机位姿的初始值:为了兼顾计算量和跟踪鲁棒性,处理了三种模型: 1. Tr ...
- ORB-SLAM 代码笔记(三)tracking原理
ORB视觉里程计主体在tracking线程中
- 转:SLAM算法解析:抓住视觉SLAM难点,了解技术发展大趋势
SLAM(Simultaneous Localization and Mapping)是业界公认视觉领域空间定位技术的前沿方向,中文译名为“同步定位与地图构建”,它主要用于解决机器人在未知环境运动时的 ...
- ORB-SLAM2 论文&代码学习 —— LocalMapping 线程
转载请注明出处,谢谢 原创作者:Mingrui 原创链接:https://www.cnblogs.com/MingruiYu/p/12360913.html 本文要点: ORB-SLAM2 Local ...
- ORB-SLAM2 论文&代码学习 —— LoopClosing 线程
转载请注明出处,谢谢 原创作者:Mingrui 原创链接:https://www.cnblogs.com/MingruiYu/p/12369339.html 本文要点: ORB-SLAM2 LoopC ...
- ORB-SLAM2-tracking线程
tracking线程 Tracking线程的主要工作是从图像中提取ORB特征,根据上一帧进行姿态估计或者进行通过全局重定位初始化位姿,然后跟踪已经重建的局部地图,优化位姿,再根据一些规则确定新的关键帧 ...
随机推荐
- Ubuntu18.04+CUDA9.0+cuDNN7.1.3+TensorFlow1.8 安装总结
Ubuntu18.04发行已经有一段时间了,正好最近Tensorflow也发布了1.8版本,于是决定两个一起装上,以下是安装总结,大致可 以分为5个步骤 确认当前软件和硬件环境.版本 更新显卡驱动,软 ...
- CS184.1X 计算机图形学导论(第三讲)
第一单元(介绍关于变换的数学知识) :基本二维变换 模型坐标系,世界坐标系 1.缩放 Scale(规模,比例) Sx表示在x方向上放大的倍数,Sy表示在y方向上放大的倍数,因此X坐标乘以Sx,Y坐标乘 ...
- linux shell 指令
一.文件比较运算符 1. e filename 如果 filename存在,则为真 如: [ -e /var/log/syslog ] 2. -d filename 如果 filename为目录,则为 ...
- SPOJ287 NETADMIN - Smart Network Administrator
传送门[洛谷] 常见套路? 关键点连新建汇点 流量1 源点1 原图中的边 二分流量. 二分+判满流 做完了. 附代码. #include<cstdio> #include<cstri ...
- python基础:1.位、字节、字的关系
1.位,简称b,或bit,比特,数据存储的最小单位.每个二进制数字0或1就是一个位(bit),网络通信常用bps,bit per second ,每秒传输多少位 2.字节,简称byte, 1byte ...
- boost algorithm
BOost Algorithm provides algorithms that complement the algorithms from the standard library. Unlike ...
- SGU 194 Reactor Cooling (无源上下界网络流)
The terrorist group leaded by a well known international terrorist Ben Bladen is buliding a nuclear ...
- Delphi TextFile读取文本文件
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...
- [LightOJ1070]Algebraic Problem
题目:Algebraic Problem 链接:https://vjudge.net/problem/LightOJ-1070 分析: 1)$ a^n+b^n = ( a^{n-1}+b^{n-1} ...
- [CSP-S模拟测试]:施工(DP+单调栈+前缀和)
题目描述 小$Y$家门前有一条街道,街道上顺序排列着$n$幢建筑,其中左起第$i$幢建筑的高度为$h_i$.小$Y$定义街道的不美观度为所有相邻建筑高度差的绝对值之和乘上常数$c$,为了改善街道环境, ...