ORB-SLAM2算法单目流程

ORB-SLAM系列算法框架比较复杂,下面来梳理一下单目算法的流程。

一:单目初始化

单目初始化也就是单目的地图初始化。流程如下:

* Step 1:(未创建)得到用于初始化的第一帧,初始化需要两帧

* Step 2:(已创建)如果当前帧特征点数大于100,则得到用于单目初始化的第二帧

* Step 3:在mInitialFrame与mCurrentFrame中找匹配的特征点对

这里单目初始化阶段寻找两帧之间的特征点匹配对时采用“划圆划分方格”的方式进行。

* Step 4:如果初始化的两帧之间的匹配点太少,重新初始化

* Step 5:通过H模型或F模型进行单目初始化,得到两帧间相对运动、初始MapPoints

估计H矩阵和F矩阵是通过从匹配特征点对中随机选择了8对匹配特征点为一组,一共8组。这里采用了多线程计算。计算得分来选择是使用H矩阵还是F矩阵,平面倾向于单应矩阵H,非平面偏向于基础矩阵F。

分解H或F矩阵求解会得到4种R和t的组合,选出最佳组合的方法是:若某一组合使恢复得到的3D点位于相机正前方的数量最多,那么该组合就是最佳组合。

这里得到的两帧间的相对运动t是一个单位向量,并没有确定整个SLAM过程的尺度。

* Step 6:删除那些无法进行三角化的匹配点

* Step 7将三角化得到的3D点包装成MapPoints

这里的3D点在分解H或F步骤就已经三角化计算出。

二:跟踪线程 (每一帧)

ORB-SLAM2中的跟踪分为三种形式,分别是:参考关键帧跟踪、恒速模型跟踪、重定位跟踪、局部地图跟踪。

其中 参考关键帧跟踪、恒速模型跟踪、重定位跟踪叫做第一阶段跟踪(初步的跟踪)。

参考关键帧跟踪

场景:地图刚初始化成功后、恒速模型跟踪失败后。

跟踪方式:通过词袋进行特征匹配,通过最小化重投影误差的方式进行求解位姿。

这里参考关键帧分为两种:在这里是距离当前帧最近的关键帧作为参考关键帧。
另外一种是在跟踪局部地图中:与当前帧共视程度最高的一级共视关键帧。

恒速模型跟踪

场景:地图初始化成功后的正常场景下都是恒速模型跟踪。

跟踪方式:通过参考关键帧更新上一帧位姿(关键帧位姿会更新),根据之前估计的速度得到当前帧初始位姿,用上一帧的地图点进行投影跟踪(化圆),如果匹配点不够,则扩大半径搜索。

这里双目和RGBD相机会生成临时地图点的操作。

上一帧是普通帧,单目中普通帧和关键帧中都不会进行三角化操作产生地图点,所以上一帧的地图点的来源主要是

1.通过恒速跟踪模型从最新的关键帧传递而来的。

2.在局部地图跟踪环节,从上一帧的局部关键帧的局部地图点投影而来。

单目相机中关键帧中的地图点是通过局部建图线程产生的,双目和RGBD相机在创建关键帧的时候也会产生地图点。

重定位跟踪

场景:跟踪失败的情况下。

跟踪方式: 先通过词袋进行快速匹配,在关键帧数据库中寻找相似的候选关键帧,再EPNP算法求解一个相对准确的初始位姿,之后再反复进行投影匹配和BA优化位姿。

局部地图跟踪

局部地图跟踪属于第二阶段跟踪,目的是使跟踪的定位更加准确。

场景:第一阶段跟踪后进行。

跟踪方式:将当前帧的局部关键帧对应的局部地图点投影到该帧中(地图点投影,跟恒速模型跟踪方式一样),得到更多的特征点匹配关系,对第一阶段的位姿再次进行优化。

 在新增关键帧时,会产生一些地图点。

三:局部建图线程 (关键帧)

该线程的目的是让已有的关键帧之间产生更多的联系,产生更多可靠的地图点,优化共视关键帧的位姿及其地图点,使得跟踪更加稳定,参与闭环的关键帧位姿更加准确。

* 处理新的关键帧

局部地图中的关键帧来自跟踪线程,这些关键帧会进入一个队列中,等待局部建图线程的处理。

内容包括:处理列表中的关键帧,包括计算BoW、更新观测、描述子、共视图,插入到地图等。

* 剔除不合格的地图点

* 生成新的地图点

在局部建图线程中,会在共视关键帧之间重新进行特征匹配、三角化,生成新的地图点,这对稳定的跟踪非常重要。这是单目模式下除初始化环节外生成地图点的唯一方式

* 检查融合当前关键帧和相邻帧的地图点

* 关键帧的剔除

在跟踪线程中关键帧的创建是比较频繁的,在这里会进行冗余关键帧的删除,提高局部BA的速度。

* 局部地图BA

进行局部关键帧和局部地图点的BA优化。

顶点:待优化的局部关键帧和局部地图点。

边:局部地图点和观测到它的关键帧的观测关系,为二元边。

四:闭环线程

Loopclosing中的关键帧是LocalMapping发送过来的,LocalMapping是Tracking中发过来的,在LocalMapping中通过 InsertKeyFrame 将关键帧插入闭环检测队列mlpLoopKeyFrameQueue。

寻找并验证闭环候选关键帧

这里确定闭环候选关键帧的条件比较复杂,先寻找与当前关键帧具有共同单词但不共视的关键帧(通过词袋匹配)叫做“候选关键帧”。然后去才找到这些候选关键帧的前10个共视关键帧,构成“”。取得分超过一定阈值的组叫做“子候选组”。子候选组中的得分最高的关键帧作为“闭环候选关键帧”。

闭环线程中每次闭环检测都会产生一些子候选组,如果这次闭环检测中的子候选组中和上次闭环检测中的子候选组中存在同一个关键帧,那么这个子候选组的“连续性”+1。第一个连续长度满足要求的子候选组的候选闭环关键帧用于后续的闭环矫正。

sim(3)位姿计算

对每一个闭环候选关键帧用sim(3)求解器进行迭代匹配,然后利用这个sim(3)变换作为初值,和当前帧寻找更多的匹配关系,然后用更多的匹配关系反过来对sim(3)进行BA优化

sim(3)位姿传播和矫正

通过sim(3)变换求解出当前闭环帧的位姿,认为这个位姿是比较准确的,将这个位姿传播给共视关键帧以及共视关键帧地图点,来修正它们的坐标。

闭环矫正

进行本质图优化,优化本质图中所有关键帧的位姿

闭环全局BA优化

step1:优化执行全局BA,优化所有关键帧位姿和地图中的地图点

step2:遍历并更新全局地图中的所有生成树中的关键帧位姿。

在执行全局BA时,局部建图线程仍然工作,可能产生新的关键帧,这些关键帧位姿并不准确,因此通过生成树来传播位姿。

step3:遍历每个地图点并用更新的关键帧位姿更新地图点位置。

这里通过地图点的更新后的参考关键帧位姿来更新地图点的位置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/830484.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

直播间怎么提高流量?巨量千川官方真实投流助力获客轻松翻倍

随着互联网的快速发展,直播已经成为了一种极具吸引力和互动性的娱乐和营销方式。然而,如何提高直播间的流量,(直播间流量:kxs7667)吸引更多观众成为了每个直播主都关注的重要问题。与此同时,巨量千川官方真实投流作为一…

如何在WordPress中设置网站的SEO标题和描述

在WordPress中,想要让你的网站在搜索引擎结果中脱颖而出,设置优秀的SEO标题和描述至关重要。这不仅可以帮助搜索引擎更好地理解你的网站内容,还可以吸引更多的点击率和流量。而选择一款合适的SEO插件是实现这一目标的关键之一。让我们来看看两…

pgvector扩展在IvorySQL Oracle兼容模式下的应用实践

向量数据库是生成式人工智能(GenAI)的关键组成部分。作为PostgreSQL的重要扩展,pgvector支持高达16000维的向量计算能力,使得PostgreSQL能够直接转化为高效的向量数据库。 IvorySQL基于PostgreSQL开发,因此它同样支持添加pgvector扩展。在Ora…

部署YUM仓库及NFS共享服务

YUM yum仓库常用类型: 本地源仓库:baserulfile:// 在线源仓库:baserulhttp:// ftp源仓库:baseru:ftp:// 实验: 首先安装软件 [rootlocalhost yum.repos.d]# cd /mnt/Packages/ [rootloca…

基于FPGA的数字信号处理(3)--什么是浮点数?

科学计数法 你可能不了解「浮点数」&#xff0c;但你一定了解「科学记数法」。 10进制科学记数法把一个数表示成a与10的n次幂相乘的形式&#xff08;1≤|a|<10&#xff0c;a不为分数形式&#xff0c;n为整数&#xff09;&#xff0c;例如&#xff1a; 19970000000000 1.9…

2024-04学习笔记

1.sql优化-子查询改为外连接 1.改之前 改之前是这样&#xff0c;那针对查出来的每一条数据&#xff0c;都要执行一次箭头所指的函数 执行的sql很慢 2.改之后 改之后是这样&#xff0c;整体做外连接&#xff0c;不用每一条都再执行一次查询 执行时间缩短了好几倍 2.Mybatis中…

Mysql基础(四)DML之insert语句

一 insert 语句 强调&#xff1a; 本文介绍的内容很基础,仅做记录用,参考价值较少 ① 总述 目的&#xff1a; 增加rows记录1、完整格式insert [into] 表名[字段名1[, 字段名2]] value[s](值1, 值2);备注&#xff1a;指定部分字段添加,没有被指定的字段要么会自动增长,要…

MySQL中SELECT语句的执行过程

2.1.1. 一条SELECT语句的执行过程 MySQL 的架构共分为两层&#xff1a;Server 层和存储引擎层 Server层负责建立连接、分析和执行SQL存储引擎层负责数据的存储和提取&#xff0c;支持 InnoDB、MyISAM、Memory 等多个存储引擎&#xff0c;MySQL5.5以后默认使用InnoDB&#xff0…

Nacos、OpenFeign、网关 笔记

一、远程调用 1.1配置RestTemplate配置类 package com.hmall.cart.config;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate;Configuration public c…

【06016传感器原理与应用】第3章 力学量传感器 期末复习自考复习

第3章 力学量传感器 定义&#xff1a;将力/压力等力学量信号变成电信号的装置 称为力学量传感器。 力学传感器的分类&#xff1a; 应用普遍的&#xff1a;电阻式、压电式、电容式、电感式、谐振式、变磁阻式、光纤式等等。传统的如弹簧&#xff1a;成本低、不需电源&#xff…

Docker-compose的介绍与用法

Docker-compose Docker Compose 是一个开源的容器编排工具&#xff0c;由 Docker 官方开发。它允许开发者定义一个或多个 Docker 容器作为单个服务&#xff0c;并将这些服务组合成一个项目。这些定义被保存在一个 YAML 文件中&#xff0c;称为 docker-compose.yml。 使用 Dock…

C#命名空间常用函数

在C#中&#xff0c;不同命名空间下有各种常用函数&#xff0c;下面列举一些常见的函数及其对应的命名空间&#xff1a; System命名空间&#xff1a; Console.WriteLine()&#xff1a;用于向控制台输出信息。Convert.ToInt32()&#xff1a;用于将其他数据类型转换为整数类型。 S…

个人图床解决方案(PicGo+对象存储, 几乎免费)

个人图床解决方案(PicGo对象存储) 原先我的解决方案是github做图床,套一层Cloudflare的cdn来加速国内访问, 但国内访问仍然过慢, 特别是一些图很多的文章, 加载非常慢. 所以我想着改善一下, 在对比了一些解决方案之后, 我选择了PicGo缤纷云搭建主图床, 部分图片放在 去不图床,…

在STM32上实现嵌入式人工智能应用

引言 随着微控制器的计算能力不断增强&#xff0c;人工智能&#xff08;AI&#xff09;开始在嵌入式系统中扮演越来越重要的角色。STM32微控制器由于其高性能和低功耗的特性&#xff0c;非常适合部署轻量级AI模型。 本文将探讨如何在STM32平台上实现深度学习应用&#xff0c;…

JAVA:maven-->>检查 所有依赖 与 环境 兼容

内容 为了确保你项目中的所有依赖都彼此兼容&#xff0c;并与你的环境相适应&#xff0c;你可以利用 Maven 的依赖管理功能。Maven 有助于解决、升级&#xff0c;并对齐所有库的版本&#xff0c;以避免任何不一致或冲突。以下是检查兼容性的步骤&#xff1a; ### 检查兼容性的…

Elasticsearch 索引的分片和副本是什么意思,如何扩展分片

文章目录 前言Elasticsearch 索引的分片和副本是什么意思&#xff0c;如何扩展分片示例:1. 设置 5个分片&#xff0c;每个分片一个副本的命令2. 将5个分片扩展到10个分片 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&…

TCP相关问题总结

文章目录 TCP连接建立过程1. TCP三次握手2. TCP四次挥手3. TCP为什么是三次握手4. TCP为什么是四次挥手 TCP流量控制TCP拥塞控制1. 为什么需要拥塞控制2. 控制手段 TCP连接建立过程中出现丢包 TCP连接建立过程 1. TCP三次握手 首先client端发出连接请求&#xff0c;并且请求同…

Qt下使用7Z源码进行压缩和解压缩

7Z压缩是一款常用的压缩算法和工具&#xff0c;本文主要介绍一款在qt环境下进行编译的压缩方法。 本人测试是可以正常跑通的&#xff0c;具体代码部分请下载&#xff1a;下载链接&#xff0c;提取码&#xff1a;ev9t 7z源码网址&#xff1a;7-Zip 7z简介&#xff1a; 7z 是…

Python多线程并不是真的并行执行

Python多线程虽然能够利用多个CPU核执行计算&#xff0c;但并不能真正执行多线程并行计算。因为在Python中&#xff0c;有一个全局解释锁&#xff08;GlobalInterpreter Lock&#xff0c;GIL&#xff09;&#xff0c;该锁的存在使得在同一个时间只有一个线程执行任务&#xff0…

rocketmq dashboard控制台中topic状态无法展示

现象 在使用rocketmq控制台查看topic状态和订阅状态时&#xff0c;出现错误和没有信息的情况。 原因 rocketmq控制台版本问题&#xff0c;最新版本为1.0.1&#xff0c;支持rocketmq5版本&#xff0c;如果使用rocketmq4版本的服务无法兼容对应的数据。同理1.0.0版本也无法兼容ro…