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

【视觉SLAM:八、后端Ⅰ】

视觉SLAM的后端主要解决状态估计问题,它是优化相机轨迹和地图点的过程,从数学上看属于非线性优化问题。后端的目标是结合传感器数据,通过最优估计获取系统的状态(包括相机位姿和场景结构),在状态估计过程中通常引入概率模型,以最大化后验概率或最小化代价函数的方式求解。以下从概述、BA(Bundle Adjustment,捆绑调整)与图优化的角度,全面介绍视觉SLAM的后端实现。

概述

状态估计的概率解释

SLAM问题本质上是一个状态估计问题,常用贝叶斯滤波进行建模: p ( x t ∣ z 1 : t , u 1 : t ) ∝ p ( z t ∣ x t ) ∫ p ( x t ∣ x t − 1 , u t ) p ( x t − 1 ∣ z 1 : t − 1 , u 1 : t − 1 ) d x t − 1 p(\mathbf{x}_t|\mathbf{z}_{1:t},\mathbf{u}_{1:t})\propto p(\mathbf{z}_t|\mathbf{x}_t)\int p(\mathbf{x}_t|\mathbf{x}_{t-1},\mathbf{u}_t)p(\mathbf{x}_{t-1}|\mathbf{z}_{1:t-1},\mathbf{u}_{1:t-1})d\mathbf{x}_{t-1} p(xtz1:t,u1:t)p(ztxt)p(xtxt1,ut)p(xt1z1:t1,u1:t1)dxt1

  • x t \mathbf{x}_t xt :系统状态(如相机位姿)。
  • z t \mathbf{z}_t zt :观测(如图像特征点)。
  • u t \mathbf{u}_t ut :控制量或运动模型。

该公式表明,状态估计是基于当前观测、运动模型和历史状态的一种递归估计。

线性系统和卡尔曼滤波(KF)

  • 线性系统模型:卡尔曼滤波假设状态转移方程和观测方程是线性关系:
    x t = A t x t − 1 + B t u t + w t \mathbf{x}_t=\mathbf{A}_t\mathbf{x}_{t-1}+\mathbf{B}_t\mathbf{u}_t+\mathbf{w}_t xt=Atxt1+Btut+wt
    z t = H t x t + v t \mathbf{z}_t=\mathbf{H}_t\mathbf{x}_t+\mathbf{v}_t zt=Htxt+vt
    其中, w t \mathbf{w}_t wt v t \mathbf{v}_t vt是噪声,通常服从高斯分布。
  • 卡尔曼滤波提供了最优状态估计:
    • 预测:基于运动模型预测当前状态。
    • 更新:结合观测数据修正状态。

卡尔曼滤波具有很高的计算效率,但只能处理线性系统。

非线性系统和扩展卡尔曼滤波(EKF)

  • 在实际SLAM中,状态转移方程和观测方程通常是非线性的: x t = f ( x t − 1 , u t ) + w t \mathbf{x}_t=f(\mathbf{x}_{t-1},\mathbf{u}_t)+\mathbf{w}_t xt=f(xt1,ut)+wt
    z t = h ( x t ) + v t \mathbf{z}_t=h(\mathbf{x}_t)+\mathbf{v}_t zt=h(xt)+vt
  • EKF通过对非线性函数进行一阶线性化,将非线性问题近似为线性问题:
    • 使用雅可比矩阵线性化 𝑓(⋅) 和 ℎ(⋅)
    • 在每一步更新中,使用卡尔曼滤波进行递归估计。

EKF的讨论

  • 优点:
    • EKF可以处理非线性系统,适用于SLAM问题。
  • 局限性:
    • 一阶线性化导致近似误差,特别是在非线性程度较高时效果较差。
    • 计算复杂度较高,不适合大规模SLAM系统。

因此,在实际的视觉SLAM中,后端更多使用非线性优化方法,如捆绑调整(BA)与图优化。

BA与图优化

投影模型与BA代价函数

  • 投影模型
    在视觉SLAM中,2D观测点 z i \mathbf{z}_i zi 与3D地图点 P j \mathbf{P}_j Pj 的关系由投影模型描述: z i = π ( K [ R ∣ t ] P j ) \mathbf{z}_i=\pi(\mathbf{K}[\mathbf{R}|\mathbf{t}]\mathbf{P}_j) zi=π(K[Rt]Pj)
    • K:相机内参矩阵。
    • [ R ∣ t ] [\mathbf{R}|\mathbf{t}] [Rt]:相机位姿。
    • π(⋅):将3D点投影到图像平面。
  • BA代价函数
    BA的目标是最小化重投影误差,代价函数为: E = ∑ i , j ρ ( ∥ z i − π ( K [ R i ∣ t i ] P j ) ∥ 2 ) E=\sum_{i,j}\rho\left(\|\mathbf{z}_i-\pi(\mathbf{K}[\mathbf{R}_i|\mathbf{t}_i]\mathbf{P}_j)\|^2\right) E=i,jρ(ziπ(K[Riti]Pj)2)
    • ρ ( ⋅ ) \rho(\cdot) ρ():鲁棒核函数,用于减小异常值的影响。

BA的求解

BA是一个非线性最小二乘优化问题,通常使用高斯-牛顿法或列文伯格-马夸尔特(LM)法求解:

  • 高斯-牛顿法:直接使用二阶近似求解非线性问题,收敛快但对初值敏感。
  • LM方法:在梯度下降和高斯-牛顿之间平衡,鲁棒性更好。

具体流程:

  • 初始化相机位姿和地图点坐标。
  • 计算雅可比矩阵,并构造稀疏的线性方程。
  • 迭代更新位姿和地图点,直至误差收敛。

稀疏性与边缘化

  • 稀疏性
    BA问题的雅可比矩阵具有稀疏性,因为每个观测点仅依赖于特定的相机位姿和地图点。利用稀疏矩阵计算,可以显著提高优化效率。
  • 边缘化
    在SLAM中,为了减小计算量,会将旧的状态变量边缘化:
    • 将不再需要优化的变量(如历史关键帧)边缘化。
    • 通过边缘化保持稀疏结构,并降低优化问题的维度。

鲁棒核函数

实际观测中常有异常值(outliers),如错误匹配的特征点。为减小异常值对优化的影响,BA中引入鲁棒核函数:

  • 常见核函数有Huber核、Cauchy核等。
  • 核函数通过降低异常值的权重,使得优化结果更加鲁棒。

总结

视觉SLAM后端通过概率模型和非线性优化方法实现状态估计和地图构建。其核心任务是通过最大化后验概率或最小化重投影误差,优化相机轨迹和地图点位置。

  • 状态估计:从卡尔曼滤波(KF)到扩展卡尔曼滤波(EKF),提供递归的状态更新方案。
  • BA与图优化:通过非线性最小二乘优化(如BA),实现全局优化。
  • 鲁棒性和效率:利用稀疏矩阵计算、边缘化和鲁棒核函数,提升系统的计算效率和鲁棒性。

这种多层次的优化体系是视觉SLAM后端的核心,也是其能在复杂环境中实现鲁棒性能的关键。

相关文章:

【视觉SLAM:八、后端Ⅰ】

视觉SLAM的后端主要解决状态估计问题,它是优化相机轨迹和地图点的过程,从数学上看属于非线性优化问题。后端的目标是结合传感器数据,通过最优估计获取系统的状态(包括相机位姿和场景结构),在状态估计过程中…...

PaddleOCROCR关键信息抽取训练过程

步骤1:python版本3.8.20 步骤2:下载代码,安装依赖 git clone https://gitee.com/PaddlePaddle/PaddleOCR.git pip uninstall opencv-python -y # 安装PaddleOCR的依赖 ! pip install -r requirements.txt # 安装关键信息抽取任务的依赖 !…...

用Python操作字节流中的Excel文档

Python能够轻松地从字节流中加载文件,在不依赖于外部存储的情况下直接对其进行读取、修改等复杂操作,并最终将更改后的文档保存回字节串中。这种能力不仅极大地提高了数据处理的灵活性,还确保了数据的安全性和完整性,尤其是在网络…...

python 桶排序(Bucket Sort)

桶排序(Bucket Sort) 桶排序是一种分布式排序算法,适用于对均匀分布的数据进行排序。它的基本思想是:将数据分到有限数量的桶中,每个桶分别排序,最后将所有桶中的数据合并。 桶排序的步骤: 划…...

Elasticsearch:探索 Elastic 向量数据库的深度应用

Elasticsearch:探索 Elastic 向量数据库的深度应用 一、Elasticsearch 向量数据库简介 1. Elasticsearch 向量数据库的概念 Elasticsearch 本身是一个基于 Lucene 的搜索引擎,提供了全文搜索和分析的功能。随着技术的发展,Elasticsearch 也…...

【每日学点鸿蒙知识】属性变量key、waterflow卡顿问题、包无法上传、Video控件播放视频、Vue类似语法

1、HarmonyOS 属性变量常量是否可以作为object对象的key? a: object new Object() this.a[Constants.TEST_KEY] "456" 可以先定义,再赋值 2、首页点击回到waterflow的首节点,0~index全部节点被重建,导致卡顿 使用s…...

小程序中引入echarts(保姆级教程)

hello hello~ ,这里是 code袁~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 🦁作者简介:一名喜欢分享和记录学习的在校大学生…...

基于 Node.js 的 ORM(对象关系映射)工具——Sequelize介绍与使用,并举案例分析

便捷性介绍 支持多种数据库,包括 PostgreSQL、MySQL、MariaDB、SQLite 和 Microsoft SQL Server。Sequelize 提供了丰富的功能,帮助开发者用 JavaScript(或 TypeScript)代码操作数据库,而无需直接书写 SQL 语句。 Se…...

python 插入排序(Insertion Sort)

插入排序(Insertion Sort) 插入排序是一种简单的排序算法。它的基本思想是:将数组分为已排序部分和未排序部分,然后逐个将未排序部分的元素插入到已排序部分的正确位置。插入排序类似于整理扑克牌的过程。 插入排序的步骤&#…...

电子应用设计方案81:智能AI冲奶瓶系统设计

智能 AI 冲奶瓶系统设计 一、引言 智能 AI 冲奶瓶系统旨在为父母或照顾者提供便捷、准确和卫生的冲奶服务,特别是在夜间或忙碌时,减轻负担并确保婴儿获得适宜的营养。 二、系统概述 1. 系统目标 - 精确调配奶粉和水的比例,满足不同年龄段婴…...

JAVA高并发总结

JAVA高并发编程总结 在现代应用中,高并发编程是非常重要的一部分,尤其是在分布式系统、微服务架构、实时数据处理等领域。Java 提供了丰富的并发工具和技术,帮助开发者在多线程和高并发的场景下提高应用的性能和稳定性。以下是 Java 高并发编…...

【AIGC】使用Java实现Azure语音服务批量转录功能:完整指南

文章目录 引言技术背景环境准备详细实现1. 基础架构设计2. 实现文件上传功能3. 提交转录任务crul4. 获取转录结果 使用示例结果示例最佳实践与注意事项总结 引言 在当今数字化时代,将音频内容转换为文本的需求越来越普遍。无论是会议记录、视频字幕生成&#xff0c…...

arcgis模版空库怎么用(一)

这里以某个项目的数据为例: 可以看到,属性表中全部只有列标题,无数据内容 可能有些人会认为空库是用来往里面加入信息的,其实不是,正确的用法如下: 一、下图是我演示用的数据,我们可以看到其中…...

【电机控制】基于STC8H1K28的六步换向——方波驱动(软件篇)

【电机控制】基于STC8H1K28的六步换向——方波驱动(软件篇) 文章目录 [TOC](文章目录) 前言一、main.c二、GPIO.c三、PWMA.c四、ADC.c五、CMP.c六、Timer.c七、PMSM.c八、参考资料总结 前言 【电机控制】STC8H无感方波驱动—反电动势过零检测六步换向法 …...

小程序配置文件 —— 13 全局配置 - window配置

全局配置 - window配置 这里讲解根目录 app.json 中的 window 字段,window 字段用于设置小程序的状态栏、导航条、标题、窗口背景色; 状态栏:顶部位置,有网络信号、时间信息、电池信息等;导航条:有一个当…...

全球域名市场科普之域名交易平台介绍——Sedo与Afternic

关于Dynadot Dynadot是通过ICANN认证的域名注册商,自2002年成立以来,服务于全球108个国家和地区的客户,为数以万计的客户提供简洁,优惠,安全的域名注册以及管理服务。 Dynadot平台操作教程索引(包括域名邮…...

leetcode108:将有序数组转化为二叉搜索树

给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 平衡 二叉搜索树。 示例 1: 输入:nums [-10,-3,0,5,9] 输出:[0,-3,9,-10,null,5] 解释:[0,-10,5,null,-3,null,9] 也将被视为正确…...

截图技术方案

安卓截屏技术附带悬浮窗自动存储功能_安卓截图浮窗-CSDN博客 https://chat.baidu.com/search?dyTabStrMCwxMiwzLDEsMiwxMyw3LDYsNSw5&pdcsaitab&setypecsaitab&extParamsJson%7B%22apagelid%22%3A%2210990774271994514433%22%2C%22enter_type%22%3A%22a_ai_index%…...

程序员测试日常小工具

作为一名程序员,或者测试人员,日常工作最常用的工具有哪些,截图,截图漂浮,翻译,日期处理,api调用..., 当你拿到一串报文后,想要json转换时,是不是要打…...

Kubernetes: NetworkPolicy 的实践应用

一、Network Policy 是什么,在云原生领域有和作用 Network Policy 是 Kubernetes 官方提出来的一种网络策略的规范,用户通过编写符合对应规范的规则来控制 k8s 集群内 L3 和 L4 层的网络流量。 NetworkPolicy 主要的功能就是实现在云原生领域的容器网络管控它给用…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM&#xff09…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

uniapp 字符包含的相关方法

在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器

拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...