ORB-SLAM2源码解读(2.1):Tracking

【一文足以系列】ORB SLAM2完整详细算法流程 逻辑详细且严密的讲述了ORBSLAM2的算法流程 阅读详情

Tracking是SLAM的灵魂,更像是前端里程计VO,这里Tracking的主要任务两方面:(1)完成相机位姿估计(2)跟踪局部地图

思路:TrackLocalMap()在当前帧和局部地图之间找到尽可能多的对应关系,优化当前帧的位姿。对每一帧都进行跟踪

第一次接触这么大的工程,发现之前接触的真的好弱鸡,总结下来是:先看基本流程图+从头到尾啃一遍代码+总结

这里要感谢吴博和吃水的鱼和蚁族的坚持的博客,大神的博客给了很大的启发。

下面重点研究单目作传感器

Tracking线程代码主要有两部分:Track()函数为主线,各部分成员函数为分支。第一部分主要讲Track()函数部分代码,下一讲详细介绍各分支代码及原理。


基本流程框架:

1、单目初始化 MonocularInitialization()

2、相机位姿跟踪:(1)跟踪运动模型TrackWithMotionModel()(2)跟踪关键帧TrackReferenceKeyFrame()(3)重定位Relocalization()

3、跟踪局部地图 TrackLocalMap()

流程图1:

流程图2

 Trackingçº¿ç¨æ´ä½æµç¨å¾


Tracking线程主要函数代码逻辑

MonocularInitialization()

最初的两帧进行对极约束和全局BA优化,计算两帧位姿、三角化得到地图点深度

1、创建单目初始器mpInitializer,用Frame()函数构造第一帧mInitialFrame
2、如果当前帧特征点数大于100,则得到用于单目初始化的第二帧
3、在mInitialFrame与mCurrentFrame中找匹配的特征点对
4、如果初始化的两帧之间的匹配点太少,重新初始化
5、通过H模型或F模型进行单目初始化,得到两帧间相对运动、初始MapPoints
6、CreateInitialMapMonocular()将三角化得到的3D点包装成MapPoints

TrackWithMotionModel()

假设匀速运动,用上一帧位姿和速度估计当前帧位姿。方法:上一帧地图点投影到当前帧,完成匹配。

1、假设:两帧间相对运动不变,根据上一帧位姿和速度用PnP估计当前帧位姿。
2、SearchByProjection()在将上一帧的地图点投影到当前固定大小范围的帧平面上,如果匹配点少,那么扩大两倍的采点范围
3、PoseOptimization()优化相机位姿,BA算法,最小二乘法。
4、优化位姿后剔除outlier的mvpMapPoints

TrackReferenceKeyFrame()

关键帧中查找BOW相近的帧,进行匹配优化位姿。方法:关键帧BOW向量与当前帧进行匹配

1、mCurrentFrame.ComputeBoW()将当前帧的描述子转为BOW向量,加块匹配速度
2、matcher.SearchByBoW()通过特征点的BoW加快当前帧与参考帧之间的特征点匹配
3、mCurrentFrame.SetPose(mLastFrame.mTcw)将上一帧的位姿态作为当前帧位姿的初始值
4、PoseOptimization通过优化3D-2D的重投影误差来获得位姿
5、剔除优化后的outlier匹配点(MapPoints)

Relocalization()

重定位,之前所有关键帧中查找与当前帧有充足匹配点的候选帧,Ransac迭代,PnP求解位姿

1、计算当前帧特征点的Bow映射
2、找到与当前帧相似的候选关键帧,mpKeyFrameDB->DetectRelocalizationCandidates(&mCurrentFrame)
3、通过EPnP算法估计姿态
4、通过PoseOptimization对姿态进行优化求解
5、如果内点较少,则通过投影的方式对之前未匹配的点进行匹配,再进行优化求解

TrackLocalMap()

投影,从已经生成的地图点中找到更多对应关系。

1、UpdateLocalMap()更新局部关键帧mvpLocalKeyFrames和局部地图点mvpLocalMapPoints
2、SearchLocalPoints()在局部地图中查找与当前帧匹配的MapPoints
3、PoseOptimization()更新局部所有MapPoints后对位姿再次优化
4、更新当前帧的MapPoints被观测程度,并统计跟踪局部地图的效果

NeedNewKeyFrame

判断是否需要生成新的关键帧,确定关键帧的标准

1. 在上一次进行重定位之后,过了20帧数据,或关键帧数小于20个,不满足不能生成
2. 在上一个关键帧插入之后,过了20帧,或 局部建图是空闲状态,不满足不能生成。
3. 当前帧跟踪到大于若干个点,不满足不能生成
4. 当前帧的跟踪点数小于90%的参考关键帧跟踪点数,并且当前帧跟踪点数大于15,不满足不能生成

 


具体流程:

一、Tracking的两个模式

1、仅追踪模式(mbOnlyTracking):局部地图不工作,只追踪地图现有地图点

2、同时定位与建图( !mbOnlyTracking ):追踪线程同时有局部建图和回环检测。

二、Tracking的四种状态

NO_IMAGES_YET表示当前没有图片,NOT_INITIALIZED表示当前没有初始化追踪线程,OK证明当前追踪线程完好,LOST证明当前追踪线程丢失——注意这里的线程状态都是指当前帧处理之前的状态。

处于NO_IMAGES_YET,当新的一帧来临时,将线程状态改变为NOT_INITIALIZED。

处于

ORB-SLAM2源码解读(1):系统入口System    先要拿大名鼎鼎的ORB-SLAM系统框图镇楼,看着这张图能够完美的串起来整个流程。 ORB-SLAM分三个线程,分别是Tracking、LocalMapping和LoopClosing。 (1)Tracking:在主线程上,输入视频流,输出相机位姿并跟踪局部地图。提取ORB特征子,根据上一帧进行位姿估计或全局重定位,然后跟踪局部地图优化位姿,确定新的关键帧。 (2)LocalMapp... 阅读详情

相关推荐

【ORB_SLAM2源码解读】System::TrackRGBD Tracking::GrabImageRGBD Frame::Frame Track

视频地址:https://space.bilibili.com/222855903 代码地址: https://github.com/slamshizhanjiaocheng

小秋 AI SLAM 入门实战教程 1566

【ORB_SLAM2源码解读】Tracking::StereoInitialization() rgbd_tum 生成世界坐标系下的三维点完成双目和RGBD初始化操作

文章目录Frame::UnprojectStereovoid MapPoint::UpdateNormalAndDepth()void Map::AddMapPoint(MapPoint *pMP) 接下来是双目和RGBD的初始化, 首先判断上面创建的当前帧的特征点的是否大于500mCurrentFrame.N>500 如果大于500首先给这个帧设置一个位置姿态mCurrentFrame.SetPose(cv::Mat::eye(4,4,CV_32F)) [1, 0, 0, 0; 0, 1, 0, 0

小秋 AI SLAM 入门实战教程 3608

(01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化

通过上一篇博客对闭环线程中的Optimizer::OptimizeEssentialGraph→本质图优化进行了详细讲解。今天主要讲解ORB-SLAM2中的最后一个BA优化(g2o),即函数Optimizer::GlobalBundleAdjustemnt→全局优化。该函数在两个地方有被调用:①src/Tracking.cc 文件中的Tracking::CreateInitialMapMonocular() 函数;

江南才尽江南山,年少无知年少狂! 1858

闲鱼x-sign、x-mini-wua、x-umt三字段协同验证机制解析

在移动客户端风控体系中,设备标识与行为签名是保障接口安全的核心技术。x-sign并非传统时间戳+密钥的静态签名,而是融合设备特征、运行时状态与服务端动态因子的多阶段位运算结果;x-mini-wua作为小程序轻量水印,依赖主App注入的短时效sessionKey与截断时间戳;x-umt则通过设备硬件与网络环境联合编码实现强绑定。三者构成‘设备—环境—行为’三位一体的交叉验证链路,广泛应用于电商API防护、二手平台数据采集及自动化运营等场景。本文基于Android/iOS真机逆向与Frida动态分析,揭示其生成

weixin_30457551的博客 422

链路聚合Eth-trunk以及华为交换机配置实例

链路聚合简介 以太网链路聚合Eth-Trunk简称链路聚合,它通过将多条以太网物理链路捆绑在一起成为一条逻辑链路,从而实现增加链路带宽的目的。同时,这些捆绑在一起的链路通过相互间的动态备份,可以有效地提高链路的可靠性。 目的: 随着网络规模不断扩大,用户对骨干链路的带宽和可靠性提出越来越高的要求。在传统技术中,常用更换高速率的接口板或更换支持高速率接口板的设备的方式来增加带宽,但这种方案需要付出高额的费用,而且不够灵活。 采用链路聚合技术可以在不进行硬件升级的条件下,通过将多个物理接口捆绑为一个逻辑接口

ChaseAug的博客 2万+

gitlab远程子仓库配置SSH - 保姆级教程

在网上搜索了一些方法,但是不够详细,走了好多弯路,所以记录下配置SSH的详细过程吧。

是菠萝的博客 1万+

从网格划分到结果解读:一次完整的子弹侵彻LS-DYNA仿真避坑指南

本文详细解析了子弹侵彻LS-DYNA仿真中的关键技术与避坑指南,涵盖网格优化、对称边界条件设置、沙漏控制参数调整及结果可信度验证。通过HyperMesh网格划分和LS-DYNA高级参数配置,帮助工程师提升仿真精度与效率,确保计算结果物理可信。

weixin_29816689的博客 406

基于FPGA的图像预处理系统(图)

 北京机械工业学院 韩娟娟 邓文怡 娄小平 由于获取图像的工具或手段的影响,使获取图像无法完全体现原始图像的全部信息。因此,对图像进行预处理就显得非常重要。预处理的目的是改善图像数据,抑制不需要的变形或者增强某些对于后续处理来说比较重要的图像特征。通常根据预处理目的的不同,把预处理技术归为图像增强技术和图像分割技术两类。图像对比度处理是空间域图像增强的一种方法。由于图像灰度范围狭窄会使

lyzhangxianglove的专栏 1780

[信号与系统]一阶与二阶连续时间系统和离散时间系统

定义:一阶连续时间系统由一阶线性常系数微分方程描述: dy(t)dt+ay(t)=bx(t) \frac{dy(t)}{dt} + a y(t) = b x(t) dtdy(t)​+ay(t)=bx(t)时间常数:时间常数 τ=1a\tau = \frac{1}{a}τ=a1​ 是系统响应速度的衡量指标。时间常数越小,系统响应越快。冲激响应:一阶系统的冲激响应是指数衰减或增长的形式。例如,对于一个单位冲激输入,响应为: h(t)=bae−at h(t) = \frac{b}{a} e^{-at} h(t)=

Andius的博客 2122

H5 获取手机GPS坐标

只要手机有GPS模块,可以用HTML5的Geolocation接口获取 在HTML5中,geolocation作为navigator的一个属性出现,它本身是一个对象,拥有三个方法: getCurrentPosition watchPosition clearWatch 1.简单 function getLocation(){ if(navigator.geolocation){ //判断是否有这个对象 navigator.geoloc

达拉崩巴斑得贝迪卜多比鲁翁_ 4669

【人工智能】Spring AI项目在定义 `response_format` 的 Invalid schema for response_format ‘custom_schema‘

确保。

奶爸的编程之路,也就一周冷个三天 562

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

上一篇: ORB-SLAM2中的C++技巧(一)
下一篇: ORB-SLAM2源码解读(2.2):单目初始化、匀速运动模型跟踪、跟踪参考关键帧、跟踪局部地图
try_again_later
try_again_later 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄9年 1061粉丝 203原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值