当前位置: 首页 > news >正文

ORB-SLAM2关键点总结

1.ORB-SLAM2的总体框架是怎样的

ORB-SLAM2一共有三个线程,分别是Tracking、Local Mapping、Loop Closing线程,,其中Tracking负责完成关键点提取,并进行帧间匹配,同时初步选取关键帧;Local Mapping线程主要进行关键点筛选和地图点剔除,同时回环进行一个局部优化;Loop Closing线程主要进行检测。

2.ORB-SLAM2怎样进行初始化

ORB-SLAM2在进行跟踪前需要先完成初始化,初始化包括相机初始帧位姿,新建地图,新建关键帧等,ORB-SLAM2一共提供三种接口,分别为单目,双目,RGBD,其中单目初始化最为复杂,具体步骤如下:

(1)寻找匹配点:对前两帧图像提取ORB特征关键点,进行特征匹配,如果匹配点个数小于100认为匹配失败;

(2)由匹配点恢复位姿:利用八点法同时计算基础矩阵和本质矩阵,通过计算评分比选择合适的结果来作为初始位姿

(3)创建初始地图:根据前两帧位姿,利用三角法恢复三维地图点,创建初始如图,将这两帧都设为关键帧,并完成关键帧与关键帧,关键帧与地图点的关联,对上述两个关键帧和地图点进行一次全局BA,并选择地图点深度的中位数作为单位尺度1来进行地图的尺寸初始化 

其中,单目初始化深度是根据三角化完成的,因此只有纯旋转是不够的,还需要进行平移。

双目和RGBD初始化不同的是,初始化不需要三角化来恢复深度,而是通过计算左右目的差别得到深度和采取特定的传感器,因此只需要一个关键帧图像,不具有上面(3)中关键帧间关联和全局BA的操作

3.ORB-SLAM2是如何进行Tracking的

Tracking的目的是兼顾计算速度和鲁棒性使得当前帧中的特征点可以跟踪匹配到上一帧,在ORB-SLAM2中一共使用了三种模型,分别是(1)运动模型;(2)关键帧模型;(3)重定位模型

(1)运动模型:假设相机运动是匀速的,根据上一帧的速度和位姿估计当前帧的位姿,然后进行跟踪匹配,也就是把地图点再投影到当前帧进行匹配,然后就可以根据BA来进行优化了,相当于经典的PnP。如果帧与帧之间都采用暴力匹配的话,运行速度会受到很大限制,因此作者采用跟踪匹配加速了匹配过程(就是将上一帧的特征点投影到下一帧中,然后在投影点的附近区域进行搜索)

(2)关键帧模型:和上一个关键帧匹配,采用BOW进行匹配加速

(3)重定位模型:和所有关键帧匹配,采用BOW进行匹配加速

这几个模型的使用规则是,(1)不好则使用(2),(2)不好则使用(3)        ·

在完成上述三个模型的匹配后,程序还会将局部地图点投影到当前帧中实现一个匹配,目的是对局部地图和局部关键帧进行更新(用于优化,以提升速度)

4.ORB_SLAM2如何选取关键帧

关键帧的选取标准是:

(1)距离上一次重定位至少距离20帧

(2)局部建图线程空闲,或者距离上一次加入关键帧过去了20帧,防止图像重叠度太高,并且局部建图线程有空闲处理新的关键帧。如果需要关键帧插入,而Local Mapping建图线程忙,则发送信号到Local Mapping建图线程,停止局部地图优化,使得新的关键帧可以被及时处理

(3)当前跟踪至少50个点,确保了跟踪定位的精确度

(4)当前帧跟踪到Local Map中参考帧的地图点数量少于90%,确保关键帧之间有明显的视觉变化

这里只是判断是否需要将当前帧加入到关键帧,并没有真正加入到全局地图,因为Tracking线程的主要作用就是局部定位,而处理地图中的关键帧、地图点,以及如何加入、如何删除的工作是在Local Mapping线程进行的

5.ORB-SLAM2中有哪些(非线性/后端)优化的相关操作

一共有五种,分别是局部BA优化、全局BA优化、闭环位姿优化、全局位姿优化、单帧BA优化

(1)局部BA优化:运行在Local Mapping线程,在剔除关键帧之前进行局部地图优化,当新的关键帧加入到convisibility graph时,作者在关键帧附近进行一次局部优化,优化目标是最小化重投影误差

(2)全局BA优化:用于单目初始化的CreateInitialMapMonocular函数以及闭环优化的RunGlobalBundleAdjustment函数(在闭环结束前新开一个线程,用于全剧优化)

(3)闭环位姿优化:当检测到闭环时,闭环连接的两个关键帧的位姿需要通过SIM3/SE3优化,以使得其尺度一致。优化求解两帧之间的相似变换矩阵,使得二维对应点的投影误差小

(4)全局位姿优化:这相当于《视觉SLAM十四讲》中的Pose Graph,值得注意的是如果是单目的话这里优化的是Sim3,如果是双目或者RGBD的话这里优化的SE3,残差定义为e_{ij} =LogSim3(S_{ij}S_{jw}S_{iw}^{-1} ),ORB SLAM2中优化的对象是Essential Graph,Essential Graph指的是所有的关键帧顶点,但是优化边大大减少,包括spanning tree(生成树)和共视权重θ > 100 的边,以及闭环连接边,闭环调整CorrectLoop过程中的优化。

(5)单帧BA优化:只优化当前帧pose,地图点固定,用于LocalTracking中运动模型跟踪、参考帧跟踪、地图跟踪TrackLocalMap、重定位,每进行过一次PnP投影操作将地图点投影到当前平面上之后,都会进行一次PoseOptimization位姿优化,通过BA优化重投影误差

上面几张图把问题描述得非常清楚,红色的是优化的对象,灰色的是固定的对象,通过对比就能知道各个优化方法之间的区别。

6.ORB-SLAM2维护了哪些图

(1)Covisibility Graph:共视图,是一个无向有权图,该图中每个顶点就是关键帧,如果两个关键帧有相同的地图点(即它们有共视点),就把这两个顶点连接起来,连接边的权重就是两个关键帧共享的3D点的个数。局部BA优化依赖的就是一个局部的共视图,全局BA优化依赖的就是一个全局的共视图,总之共视图在ORB-SLAM2里用的很多。

(2)Essential Graph:为了在优化阶段减小计算量,ORB-SLAM2作者提出了Essential Graph的概念,主要用它来进行全局位姿优化。它是共视图的子集,即Covisibity Graph的最小生成树(MST)。该图中顶点是关键帧,但只连接某个关键帧和与之拥有最多共享的地图点的关键帧,这样能够连接所有的顶点,但是边会减少很多。
(3)Spanning Graph:生成树,是代价最小的全联通图,Essential Graph就是基于Sanning Graph生成的。
如下图所示可以观察他们的区别:

7. ORB SLAM2中是如何对地图点进行筛选的?

在Local Mapping线程中在进行局部BA之前会先对地图点进行剔除,剔除规则如下:
(1)该地图点是坏点,直接从检查列表去掉;
(2)跟踪(匹配上)到该地图点的普通帧帧数(Increase Found)小于应该观测到该地图点的普通帧数量(25%*Increase Visible),即比值mnFound/mnVisible小于0.25,设置为坏点,并从检查列表去掉。比值低说明这样的地图点该地图点虽在视野范围内,但很少被普通帧检测到
(3)从添加该地图点的关键帧算起,当前关键帧至少是第三个添加该地图点的关键帧的条件下,看到该地图点的帧数<=2(双目和RGBD模式是帧数<=3),设置为坏点,并从检查列表去掉;因此在地图点刚建立的阶段,要求比较严格,很容易被剔除;而且单目的要求更严格,需要三帧都看到;
(4)若从添加该地图点的关键帧算起,一共有了大于三个关键帧,还存在列表中,则说明该地图点是高质量的,从检查列表中去掉。

总而言之就是太少帧看到的地图点是坏点都要剔除掉,而看得多的则是高质量点

8. ORB SLAM2中是如何对关键帧进行剔除的?

候选的关键帧是LocalMapping中当前处理的关键帧的共视关键帧,不包括第一帧关键帧与当前关键帧。如果一个关键帧检测到的90%的地图点,在其他不少于三个具有相同或更精确尺度的关键帧里面都被检测到,就认定该关键帧冗余(该关键帧的存在提供的地图点观测信息有限),并剔除。

9. ORB SLAM2中Loop Closing的具体实现流程是怎样的?

首先是通过回环检测(Bow得分)和共视关系检查从所有关键帧中筛选出一组和当前帧有可能形成闭环的候选帧,然后利用相似求解器Sim3Solver求解出候选帧与当前帧之间的相似变换(注意这里是单目相似变换,而双目或者RGBD是刚体变换),利用相似变换找出更多的匹配地图点,然后进行闭环位姿优化(对应5中的回答),如果优化结果较好的话就不再判断其他候选帧。然后就是闭环矫正,通过就出来的相似变换对当前帧进行位姿调整并且传播到当前帧相连的关键帧,回环两侧的关键帧完成对齐,然后利用调整过的位姿更新这些相连关键帧对应的地图点,同时在Covisibility Graph里面增加闭环边,然后进行Essential Graph的优化(即全局位姿优化),当前帧与闭环匹配帧之间的边不进行优化,最后再来一个全局BA优化即完成了Loop Closing的全部流程。

10.什么是Sim3优化

Sim3优化是单目特有的优化方式,因为单目尺度具有不确定性,对于空间点坐标有如下相似变换:

于是我们建立了一个相似变换群Sim(3)

其对应的李代数如下

相比于欧式群的李代数其多了一个σ,变成了一个七维向量,而不是六维,关联Sim(3) 和s i m ( 3 )的仍是指数映射和对数映射,指数映射为

其中

微分求导模型和扰动求导模型对其同样适用。Sim3优化其实就是Pose Graph优化,其优化目标残差是

其优化效果如下:

11.如何理解视觉重投影误差

对于单目视觉来说,3D点是通过两帧图像恢复得到的。3D点通过相机位姿重新投影到相机平面,与其对应像素点之间的像素差被称为重投影误差,也算是观察误差,投影的相机平面一般都是使用归一化平面。最终要优化的是重投影误差,理想情况下像素差是0。

12.简述PnP原理,适用的场景是什么?

答:PnP是已知n个3D点坐标和其对应的2D相机投影点坐标,求解相机位姿,其中至少需要3对点(3D-2D)可求解(平移+旋转一共6个自由度)。

其中求解方法有:DLT(直接线性变换法,至少6对点,因为旋转平移矩阵3*4个未知量),P3P(余弦定理、三角形相似),EPnP等

13.关键帧的删除

在局部建图线程,检查到当前关键帧为冗余关键帧了(里面有90%的地图点都被至少其他三帧观察到过,就会设置为冗余关键帧进行删除

14. 解释SLAM中的绑架问题

绑架问题就是重定位,是指机器人在缺少之前位置信息的情况下,如何去确定当前位姿。例如当机器人被安置在一个已经构建好地图的环境中,但是并不知道它在地图中的相对位置,或者在移动过程中,由于传感器的暂时性功能故障或相机的快速移动,都导致机器人先前的位置信息的丢失,在这种情况下如何重新确定自己的位置。
初始化绑架可以阐述为一种通常状况初始化问题,可使用蒙特卡洛估计器,即粒子滤波方法,重新分散粒子到三维位形空间里面,被里程信息和随机扰动不断更新,初始化粒子聚集到/收敛到可解释观察结果的区域。追踪丢失状态绑架,即在绑架发生之前,系统已经保存当前状态,则可以使用除视觉传感器之外的其他的传感器作为候补测量设备

参考链接:https://blog.csdn.net/weixin_46135347/article/details/120160599

https://www.cnblogs.com/linglingdog/p/15874424.html

https://blog.csdn.net/weixin_44580210/article/details/90760584

相关文章:

ORB-SLAM2关键点总结

1.ORB-SLAM2的总体框架是怎样的 ORB-SLAM2一共有三个线程&#xff0c;分别是Tracking、Local Mapping、Loop Closing线程&#xff0c;&#xff0c;其中Tracking负责完成关键点提取&#xff0c;并进行帧间匹配&#xff0c;同时初步选取关键帧&#xff1b;Local Mapping线程主要…...

拱式桥安全结构健康监测解决方案

拱式桥作为一种常见的桥梁结构&#xff0c;其拱形设计不仅美观&#xff0c;还具有较高的承载能力。然而&#xff0c;随着使用年限的增加和环境因素的影响&#xff0c;拱式桥的结构健康和稳定需要持续监测和评估。自动化监测技术的应用&#xff0c;可以提升拱式桥的监测效率和准…...

windows和linux安装mysql5.7.31保姆级教程

一&#xff0c;资源如下&#xff0c;里面有windows和linux版的安装软件&#xff0c;内含Visual C2013中文版windows系统插件 windows资源地址&#xff1a;https://download.csdn.net/download/l1o3v1e4ding/89725150 linux&#xff08;centos&#xff09;资源地址&#xff1a;…...

如何使用 PowerShell 脚本来自动化 Windows 开发流程的教程(包括理论介绍和实践示例)

PowerShell 是一种强大的任务自动化和配置管理框架&#xff0c;它为系统管理员和开发人员提供了管理 Windows 操作系统和应用程序的能力。下面是一个关于如何使用 PowerShell 脚本来自动化 Windows 开发流程的教程&#xff0c;包括理论介绍和实践示例。 第一部分&#xff1a;理…...

CTFHub技能树-信息泄露-HG泄漏

目录 漏洞产生原因 解题过程 当开发人员使用 Mercurial 进行版本控制&#xff0c;对站点自动部署。如果配置不当,可能会将.hg 文件夹直接部署到线上环境。这就引起了 hg 泄露漏洞。 漏洞产生原因 Mercurial(hg)是一种分布式版本控制系统&#xff0c;它与Git类似也可以用于管…...

OpenCV结构分析与形状描述符(18)比较两个轮廓相似度的函数matchShapes()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 比较两个形状。 该函数用于比较两个形状。所有三个实现的方法都使用了 Hu 不变矩&#xff08;参见 HuMoments&#xff09; 函数原型 double c…...

CCS811二氧化碳传感器详解(STM32)

目录 一、介绍 二、传感器原理 1.原理图 2.引脚描述 3.工作原理介绍 三、程序设计 main.c文件 ccs811.h文件 ccs811.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 CCS811模块是一种气体传感器&#xff0c;可以测量环境中TVOC(总挥发性有机物质)浓度和eCO2…...

Navicat 17 新特性 | 聚焦 MongoDB

随着 Navicat 17 的盛大发布&#xff0c;其一系列创新特性赢得了广大用户的热烈反响。它不仅在模型设计上实现了突破性优化&#xff0c;提升了查询与配置的效率&#xff0c;还大幅优化了用户界面的交互体验&#xff0c;原生支持国产平台与操作系统&#xff0c;同时增强 BI 能力…...

openssl的使用

1、编译 Github下载&#xff1a;https://github.com/openssl/openssl 官网下载&#xff1a;https://openssl-library.org/source/index.html 官网历史版本&#xff1a;https://www.openssl.org/source/old/ 1.1 Windows下编译 我的文章&#xff1a;OPC UA使用 Openssl库编译…...

ICETEK-DM6437-AICOM—— DMA直接存储器访问设计

#一、设计目的&#xff1a; 1 进一步了解 ICETEK-DM6437-AF 的内部存储器空间的分配及指令寻址方式&#xff1a; 内部存储器空间分配&#xff1a;研究 ICETEK-DM6437-AF 的存储器架构&#xff0c;包括但不限于片内 SRAM、片外 DRAM 和其他存储器模块。了解这些存储器的大小、起…...

【AcWing】快速排序的Go实现

快速排序的Go实现 这一部分参考了AcWing当中使用Go语言实现快速排序的题解&#xff1a;https://www.acwing.com/activity/content/code/content/296206/。 其中有很多部分非常值得参考&#xff0c;故写一个博客进行记录。 Code package mainimport "fmt"func qui…...

使用C++11的`std::future`和`std::promise`实现异步网络通信

使用C11的std::future和std::promise实现异步网络通信 在现代C编程中&#xff0c;异步编程是一个重要的主题。C11引入了std::future和std::promise&#xff0c;为异步编程提供了强大的工具。本文将详细介绍如何使用std::future和std::promise实现异步网络通信&#xff0c;并提…...

【C++登堂入室】类与对象(上)

目录 一、面向过程和面向对象初步认识 二、类的引入 三、类的定义 四、类的访问限定符及封装 4.1 访问限定符 4.2 封装 五、类的作用域 六、类的实例化 七、类对象模型 7.1如何计算类对象的大小 7.2 类对象的存储方式猜测 7.3 结构体内存对齐规则 八、this指针 …...

【西电电装实习】5. 无人机模块及作用、上位机的操作

文章目录 前言一、硬件结构电源、电源电压测试电路晶振外围陀螺仪信号放大电路及天线空心杯&#xff08;电极&#xff09;驱动电路 软件设置整机装配PID 参数设置公式 参考文献 前言 西电电装实习&#xff0c;无人机原理图、上位机的调节方法 一、硬件结构 电源、电源电压测试…...

有关WSL和docker的介绍

目录标题 如何利用在windows上配置docker实现linux和windows容器修改WSL默认安装&#xff08;也就是linux子系统&#xff09;目录到其他盘 如何利用在windows上配置docker实现linux和windows容器 wsl的基本命令&#xff1a;参考网页 docker入门到实践&#xff1a;参考网页 官方…...

以太坊入门

1. 以太坊简介 Vitalik Buterin 在 2013 年 11 月提出了以太坊的概念&#xff0c;其关键思想是&#xff1a;开发一种图灵完备&#xff08;Turing-Complete) 的语言&#xff0c;以允许开发用于区块链和去中心化应用的任意程序&#xff08;智能合约&#xff09;。该概念与比特比相…...

秃姐学AI系列之:实战Kaggle比赛:狗的品种识别(ImageNet Dogs)

目录 前置准备 整理数据集 图片增广 读取数据集 微调预训练模型 训练函数 训练和验证模型 Kaggle提交结果 前置准备 常规导包 import os import torch import torchvision from torch import nn from d2l import torch as d2l 使用小规模数据样本 d2l.DATA_HUB[dog…...

图神经网络介绍3

1. 图同构网络&#xff1a;Weisfeiler-Lehman 测试与图神经网络的表达力 本节介绍一个关于图神经网络表达力的经典工作&#xff0c;以及随之产生的另一个重要的模型——图同构网络。图同构问题指的是验证两个图在拓扑结构上是否相同。Weisfeiler-Lehman 测试是一种有效的检验两…...

浅谈 React Fiber

想象一下&#xff0c;你正在搭建一个乐高积木城堡。 传统的搭建方式&#xff1a;一次性把所有积木拼好&#xff0c;如果中途发现某个地方拼错了&#xff0c;就需要拆掉重新拼。这个过程就像 React 15 之前的版本&#xff0c;一旦开始渲染&#xff0c;就很难中断&#xff0c;效…...

Winform实现石头剪刀布小游戏

1、电脑玩家类 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace RockScissorsClothApp {public class Computer{public Card Play(){Random random new Random();int num random.Next(0, 3…...

计算机的错误计算(九十)

摘要 计算机的错误计算&#xff08;八十九&#xff09;探讨了反双曲余切函数 acoth(x)在 附近的计算精度问题。本节讨论绝对值为大数的反双曲余切函数值的计算精度问题。 Acoth(x) 函数的定义为&#xff1a; 其中 x 的绝对值大于 1 . 例1. 计算 acoth(1.000000000002e15) .…...

对游戏语音软件Oopz遭遇DDoS攻击后的一些建议

由于武汉天气太热&#xff0c;因此周末两天就没怎么出门。一直在家打《黑神话&#xff1a;悟空》&#xff0c;结果卡在广智这里一直打不过去&#xff0c;本来想找好友一起讨论下该怎么过&#xff0c;但又没有好的游戏语音软件。于是在网上搜索了一些信息&#xff0c;并偶然间发…...

解锁Android开发利器:MVVM架构_android的mvvm

// 从网络或其他数据源获取天气数据return Weather(city, "25C") }} 2.定义View&#xff1a;class WeatherActivity : AppCompatActivity() { private lateinit var viewModel: WeatherViewModel override fun onCreate(savedInstanceState: Bundle?) {super.onCre…...

llama.cpp demo

git clone https://github.com/ggerganov/llama.cpp cd llama.cpp 修改Makefile使能mfma参数 MK_CFLAGS -mfma -mf16c -mavx MK_CXXFLAGS -mfma -mf16c -mavx 安装python3依赖 cat ./requirements/requirements-convert_legacy_llama.txt numpy~1.26.4 sentencepie…...

OpenCV结构分析与形状描述符(19)查找二维点集的最小面积外接旋转矩形函数minAreaRect()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 找到一个包围输入的二维点集的最小面积旋转矩形。 该函数计算并返回指定点集的最小面积边界矩形&#xff08;可能是旋转的&#xff09;。开发者…...

[SWPU2019]Web1 超详细教程

老规矩先看源码&#xff0c;没找到啥提示&#xff0c;后面就是登录口对抗 弱口令试了几个不行&#xff0c;就注册了个账户登录进去 可以发布广告&#xff0c;能造成xss&#xff0c;但是没啥用啊感觉 查看广告信息的时候&#xff0c;注意到url当中存在id参数&#xff0c;可能存…...

【区块链通用服务平台及组件】基于向量数据库与 LLM 的智能合约 Copilot

智能合约是自动执行、无需信任的代码&#xff0c;可以在区块链上运行&#xff0c;确保了数据和程序的透明性和不可篡改性。然而&#xff0c; 智能合约的编写、调试和优化仍然是一个具有挑战性的过程&#xff0c;因为它需要高度的技术专长&#xff0c;且发布后的智能合约代码通常…...

mfc140u.dll丢失有啥方法能够进行修复?分享几种mfc140u.dll丢失的解决办法

你是否曾遇到过这样的情况&#xff1a;当你满怀期待地打开一个应用程序时&#xff0c;却被一个错误提示拦住了去路&#xff0c;提示信息中指出 mfc140u.dll 文件丢失。这个问题可能会让你感到困惑和无助&#xff0c;但是不要担心&#xff0c;本文将为你详细解读 mfc140u.dll 丢…...

【PyQt6 应用程序】在用户登录界面实现密码密文保存复用

在开发现代应用程序中,为用户提供既安全又便捷的登录体验是至关重要的。特别是在那些需要用户认证的应用中,实现一个功能丰富且用户友好的登录界面不仅能增强用户满意度,还能提升整体的安全性。基于PyQt6框架和QtDesigner,本文将展示如何在已有的用户登录页面基础上,进一步…...

赋能百业:多模态处理技术与大模型架构下的AI解决方案落地实践

赋能百业:多模态处理技术与大模型架构下的AI解决方案落地实践 AI 语音交互大模型其实有两种主流的做法: All in LLM多个模块组合, ASR+LLM+TTS实际应用中,这两种方案并不是要对立存在的,像永劫无间这种游戏的场景,用户要的是低延迟,无障碍交流。并且能够触发某些动作技…...