【视觉SLAM:八、后端Ⅱ】

news2025/1/5 23:05:06

视觉SLAM后端的核心任务是估计相机的轨迹和场景的三维结构,这需要解决非线性优化问题。为了保证效率和精度,后端主要依赖以下两种方法:滑动窗口法(基于局部优化的策略)和位姿图优化(基于全局优化的策略)。以下从滑动窗口滤波和优化、位姿图的构建与优化等角度进行详细介绍。

滑动窗口滤波和优化

实际环境下的BA结构

视觉SLAM后端中,捆绑调整(BA, Bundle Adjustment) 是最常见的优化方法。它通过最小化所有观测点的重投影误差来优化相机位姿和地图点的三维位置。然而,实际环境下直接对整个轨迹和地图点进行全局BA有以下问题:

  • 计算复杂度高:观测数量随时间线性增长,优化所有关键帧和地图点的计算量难以承受。
  • 实时性要求:SLAM通常需要实时更新相机位姿,无法等待全局优化完成。

因此,后端通常采用局部优化结构,即在一个有限的窗口内进行优化,滑动窗口法是一种高效的实现。

滑动窗口法

  • 滑动窗口的核心思想
    滑动窗口法是一种局部优化策略,它只在最近的若干帧内进行优化,而对更早的帧进行边缘化处理。这种方法有效降低了优化的维度,同时保留了对当前状态的高精度估计。

  • 滑动窗口的基本流程

    • 选取窗口内的关键帧:窗口包含当前帧和最近的若干关键帧,通常大小为固定数量(如10-20帧)。
    • 构建优化问题:对窗口内的相机位姿、地图点进行联合优化,最小化重投影误差。
    • 边缘化早期关键帧:将窗口外的关键帧边缘化,生成约束条件,减少优化变量的数量。
  • 优化目标
    滑动窗口法的优化目标是最小化以下代价函数: E = ∑ i , j ρ ( ∥ z i j − π ( K [ R i ∣ t i ] P j ) ∥ 2 ) E=\sum_{i,j}\rho\left(\|\mathbf{z}_{i}^{j}-\pi(\mathbf{K}[\mathbf{R}_{i}|\mathbf{t}_{i}]\mathbf{P}_{j})\|^{2}\right) E=i,jρ(zijπ(K[Riti]Pj)2)

    • z i j z_i^j zij:第 𝑖 个关键帧中观测到第 𝑗 个地图点的2D坐标。
    • P j \mathbf{P}_j Pj :地图点的三维坐标。
    • [ R i ∣ t i ] [\mathbf{R}_i|\mathbf{t}_i] [Riti]:第 𝑖 个相机的位姿。
    • ρ ( ⋅ ) \rho(\cdot) ρ():鲁棒核函数,用于减小异常值的影响。
  • 滑动窗口法的优点

    • 计算效率高:只优化窗口内的关键帧,优化维度远小于全局BA。
    • 实时性强:适合嵌入式或资源有限的系统,实现实时位姿估计。
    • 局部优化结果稳定:在局部窗口内保证较高的精度,适合动态场景。

位姿图

位姿图是SLAM后端优化的另一种重要方法,适用于更大规模的优化问题。它将SLAM中的相机位姿表示为图中的顶点,观测关系表示为图中的边,通过优化图结构来获取全局一致的轨迹和地图。

位姿图的意义

  • 什么是位姿图
    • 顶点:每个顶点表示一个相机位姿,通常用六维的 (𝑅,𝑡) 或李代数形式 𝜉∈𝑠𝑒(3) 表示。
    • 边:每条边表示两个相机位姿之间的相对运动约束,约束可以来自于视觉里程计(如相邻帧的匹配)、回环检测、IMU等。
  • 位姿图在SLAM中的作用
    • 在局部优化(如滑动窗口)基础上,位姿图优化通过全局约束(如回环检测)消除累积误差,获取全局一致的相机轨迹。
    • 位姿图能够同时优化多种约束,融合多传感器数据,提升系统鲁棒性。

位姿图的优化

  • 优化目标
    位姿图的优化目标是最小化所有边的误差: E = ∑ i , j ρ ( ∥ e i j ∥ 2 ) E=\sum_{i,j}\rho\left(\|\mathbf{e}_{ij}\|^2\right) E=i,jρ(eij2)
    • e i j \mathrm{eij} eij :第 𝑖i和 𝑗 个相机之间的误差,定义为: e i j = T i j − ( T i − 1 ⋅ T j ) \mathbf{e}_{ij}=\mathbf{T}_{ij}-(\mathbf{T}_i^{-1}\cdot\mathbf{T}_j) eij=Tij(Ti1Tj)
      其中, T i , T j \mathrm{T}_i,\mathrm{T}_j Ti,Tj 是相机的位姿, T i j \mathbf{T}_{ij} Tij 是两帧间的相对位姿。
  • 优化方法
    位姿图优化属于非线性最小二乘问题,通常使用高斯-牛顿法或列文伯格-马夸尔特法(LM法)。在实际应用中,常使用稀疏线性代数库(如g2o、Ceres Solver)进行高效求解。
  • 误差约束的来源
    • 视觉里程计:相邻关键帧之间的相对位姿。
    • 回环检测:闭环帧之间的相对位姿约束。
    • IMU约束:来自惯性传感器的位姿约束。
    • GPS约束:如果有GPS数据,可以将绝对位置信息作为约束。

位姿图优化的优点

  • 全局一致性:通过全局优化消除累积误差,确保相机轨迹和地图点的一致性。
  • 多源信息融合:支持引入视觉、IMU、GPS等多种信息进行联合优化。
  • 鲁棒性强:通过鲁棒核函数减小异常值对优化的影响。

滑动窗口与位姿图的对比

特性滑动窗口法位姿图优化
优化范围局部窗口(最近若干帧)全局(所有关键帧)
实时性实时性强计算量大,通常离线优化
累积误差无法完全消除累积误差可消除累积误差
使用场景动态场景下的实时SLAM离线处理或需全局一致性的任务

总结

视觉SLAM后端的两种核心优化方法:

  • 滑动窗口法:适合实时应用,通过局部优化实现高效、精确的位姿估计。
  • 位姿图优化:通过全局约束(如回环检测)消除累积误差,实现全局一致的相机轨迹。

在实际SLAM系统中,这两种方法往往结合使用:前端实时使用滑动窗口优化相机轨迹,后端通过位姿图优化消除全局误差,提升系统的全局精度和一致性。

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

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

相关文章

Doris 2.1 Deleting Data 学习笔记

1 Deleting Data with DELETE Command 1.1 Delete by Specifying a Filter Predicate DELETE FROM table_name [table_alias] [PARTITION partition_name | PARTITIONS (partition_name [

基于51单片机(STC12C5A60S2)和8X8彩色点阵屏(WS2812B驱动)的小游戏《贪吃蛇》(普中开发板矩阵按键控制)

目录 系列文章目录前言一、效果展示二、原理分析三、各模块代码1、定时器02、矩阵按键3、8X8彩色点阵屏 四、主函数总结 系列文章目录 前言 《贪吃蛇》,一款经典的、怀旧的小游戏,单片机入门必写程序。 以《贪吃蛇》为载体,熟悉各种屏幕的使…

爆肝1个月:DDR4 的信号完整性(万字长文SI)

前言: 大学里面,总有很多课程,很浪费时间,学了没点用处,问过老师,为什么信号完整性,示波器使用等课程不开呢,这种是对工作真实有帮助的? 老师:因为老师…

使用Xjar给SpringBoot项目jar包加密

1. 新建一个SpringBoot项目 2. 在pom文件添加依赖&#xff0c;github地址&#xff1a;https://github.com/core-lib/xjar <dependencies><!-- 添加 XJar 依赖 --><dependency><groupId>com.github.core-lib</groupId><artifactId>xjar&l…

UNI-APP_i18n国际化引入

官方文档&#xff1a;https://uniapp.dcloud.net.cn/tutorial/i18n.html vue2中使用 1. 新建文件 locale/index.js import en from ./en.json import zhHans from ./zh-Hans.json import zhHant from ./zh-Hant.json const messages {en,zh-Hans: zhHans,zh-Hant: zhHant }…

AI大模型系列之七:Transformer架构讲解

目录 Transformer网络是什么&#xff1f; 输入模块结构&#xff1a; 编码器模块结构&#xff1a; 解码器模块: 输出模块结构&#xff1a; Transformer 具体是如何工作的&#xff1f; Transformer核心思想是什么&#xff1f; Transformer的代码架构 自注意力机制是什么…

【Linux】:多线程(读写锁 自旋锁)

✨ 倘若南方知我意&#xff0c;莫将晚霞落黄昏 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;Linux—登神长阶 ⛺️ 欢迎关注&#xff1a;&#x1f44d;点赞 &#…

SELECT的使用

目录 1、SQL的查询命令 1.1 SELECT语句 1.2 投影查询 1.3 选择查询 1.4 聚合函数查询 1.5 简单分组查询(GROUP BY) 1.6 内连接查询 1.7 外连接查询 1.8 子查询 1. 无关子查询 2. 相关子查询 带exists的相关子查询&#xff1a; 1.9 集合查询 1. UNION(并) 2. INT…

Vue项目结构推荐(复杂国际化项目与一般项目结构)

Vue项目结构推荐 一、一般项目结构二、复杂国际化项目结构总结/建议 下面结构是基于Vue和TypeScript开发的项目结构下src包下的结构&#xff0c;若只用到vue与js。则去掉typescript部分的包即可。 一、一般项目结构 assets&#xff1a;存放静态资源&#xff0c;如图片、字体、样…

BOC调制信号matlab性能仿真分析,对比功率谱,自相关性以及抗干扰性

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2022a 3.部分核心程序 &#xff08;完整版代码包含详细中文注释和操作步骤视频&#xff09…

电影院售票 - 策略模式(Strategy Pattern)

策略模式&#xff08;Strategy Pattern&#xff09; 策略模式&#xff08;Strategy Pattern&#xff09;策略模式概述策略模式结构图策略模式主要包含的角色 talk is cheap&#xff0c; show you my code总结 策略模式&#xff08;Strategy Pattern&#xff09; 策略模式&…

重学 Android 自定义 View 系列(十):带指针的渐变环形进度条

前言 该篇文章根据前面 重学 Android 自定义 View 系列(六)&#xff1a;环形进度条 拓展而来。 最终效果如下&#xff1a; 1. 扩展功能 支持进度顺时针或逆时针显示在进度条末尾添加自定义指针图片使用线性渐变为进度条添加颜色效果 2. 关键技术点解析 2.1 进度方向控制的…

【北京迅为】iTOP-4412全能版使用手册-第七十章 Linux内核移植

iTOP-4412全能版采用四核Cortex-A9&#xff0c;主频为1.4GHz-1.6GHz&#xff0c;配备S5M8767 电源管理&#xff0c;集成USB HUB,选用高品质板对板连接器稳定可靠&#xff0c;大厂生产&#xff0c;做工精良。接口一应俱全&#xff0c;开发更简单,搭载全网通4G、支持WIFI、蓝牙、…

CG顶会论文阅读|《科技论文写作》硕士课程报告

文章目录 一、基本信息1.1 论文基本信息1.2 课程基本信息1.3 博文基本信息 二、论文评述&#xff08;中英双语&#xff09;2.1 研究问题&#xff08;Research Problem&#xff09;2.2 创新点&#xff08;Innovation/Contribution&#xff09;2.3 优点&#xff08;Why this pape…

.NET周刊【12月第4期 2024-12-22】

国内文章 dotnet 简单使用 ICU 库进行分词和分行 https://www.cnblogs.com/lindexi/p/18622917 本文将和大家介绍如何使用 ICU 库进行文本的分词和分行。 dotnet 简单聊聊 Skia 里的 SKFontMetrics 的各项属性作用 https://www.cnblogs.com/lindexi/p/18621674 本文将和大…

git 问题解决记录

在用git上传文件到仓库中出现了2个问题 第一个问题&#xff1a; 需要修改git的代理端口与电脑自己的代理服务器设置中的端口和VPN的端口保持一致&#xff0c; 比如我的端口是7897&#xff0c;就设置 git config --global http.proxy http://127.0.0.1:7897 git config --glo…

XML结构快捷转JSON结构API集成指南

XML结构快捷转JSON结构API集成指南 引言 在当今的软件开发世界中&#xff0c;数据交换格式的选择对于系统的互操作性和效率至关重要。JSON&#xff08;JavaScript Object Notation&#xff09;和XML&#xff08;eXtensible Markup Language&#xff09;是两种广泛使用的数据表…

Oracle 创建本地用户,授予权限,创建表并插入数据

目录 一. 用户的种类二. 切换session为PDB三. 创建用户并授予权限四. 创建表空间五. 为用户分配默认表空间并指定表空间配额六. 通过创建的用户进行登录七. 创建脚本&#xff0c;简化登录八. 查看用户信息九. 创建表&#xff0c;并插入数据9.1 查看当前用户的schema9.2 插入数据…

系统设计——大文件传输方案设计

摘要 大文件传输是指通过网络将体积较大的文件从一个位置发送到另一个位置的过程。这些文件可能包括高清视频、大型数据库、复杂的软件安装包等&#xff0c;它们的大小通常超过几百兆字节&#xff08;MB&#xff09;甚至达到几个吉字节&#xff08;GB&#xff09;或更大。大文…

【老白学 Java】简单位移动画

简单位移动画 文章来源&#xff1a;《Head First Java》修炼感悟。 上一篇文章中&#xff0c;老白利用内部类的特性完成了多个事件的处理&#xff0c;感觉还不错。 为了更深入理解内部类&#xff0c;本篇文章继续使用内部类创建一个画板&#xff0c;完成简单的位移动画&#x…