【视觉SLAM:八、后端Ⅱ】
视觉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[Ri∣ti]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] [Ri∣ti]:第 𝑖 个相机的位姿。
- ρ ( ⋅ ) \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∑ρ(∥eij∥2)- 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−(Ti−1⋅Tj)
其中, T i , T j \mathrm{T}_i,\mathrm{T}_j Ti,Tj 是相机的位姿, T i j \mathbf{T}_{ij} Tij 是两帧间的相对位姿。
- 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−(Ti−1⋅Tj)
- 优化方法
位姿图优化属于非线性最小二乘问题,通常使用高斯-牛顿法或列文伯格-马夸尔特法(LM法)。在实际应用中,常使用稀疏线性代数库(如g2o、Ceres Solver)进行高效求解。 - 误差约束的来源
- 视觉里程计:相邻关键帧之间的相对位姿。
- 回环检测:闭环帧之间的相对位姿约束。
- IMU约束:来自惯性传感器的位姿约束。
- GPS约束:如果有GPS数据,可以将绝对位置信息作为约束。
位姿图优化的优点
- 全局一致性:通过全局优化消除累积误差,确保相机轨迹和地图点的一致性。
- 多源信息融合:支持引入视觉、IMU、GPS等多种信息进行联合优化。
- 鲁棒性强:通过鲁棒核函数减小异常值对优化的影响。
滑动窗口与位姿图的对比
特性 | 滑动窗口法 | 位姿图优化 |
---|---|---|
优化范围 | 局部窗口(最近若干帧) | 全局(所有关键帧) |
实时性 | 实时性强 | 计算量大,通常离线优化 |
累积误差 | 无法完全消除累积误差 | 可消除累积误差 |
使用场景 | 动态场景下的实时SLAM | 离线处理或需全局一致性的任务 |
总结
视觉SLAM后端的两种核心优化方法:
- 滑动窗口法:适合实时应用,通过局部优化实现高效、精确的位姿估计。
- 位姿图优化:通过全局约束(如回环检测)消除累积误差,实现全局一致的相机轨迹。
在实际SLAM系统中,这两种方法往往结合使用:前端实时使用滑动窗口优化相机轨迹,后端通过位姿图优化消除全局误差,提升系统的全局精度和一致性。
相关文章:
【视觉SLAM:八、后端Ⅱ】
视觉SLAM后端的核心任务是估计相机的轨迹和场景的三维结构,这需要解决非线性优化问题。为了保证效率和精度,后端主要依赖以下两种方法:滑动窗口法(基于局部优化的策略)和位姿图优化(基于全局优化的策略&…...
【大模型实战篇】LLaMA Factory微调ChatGLM-4-9B模型
1. 背景介绍 虽然现在大模型微调的文章很多,但纸上得来终觉浅,大模型微调的体感还是需要自己亲自上手实操过,才能有一些自己的感悟和直觉。这次我们选择使用llama_factory来微调chatglm-4-9B大模型。 之前微调我们是用两块3090GPU显卡&…...
多个DataV遍历生成
DataV是数据可视化工具 与Echart类似 相对Echart图标边框 装饰可选官网DataV 安装 npm install kjgl77/datav-vue3main.ts import DataVVue3 from kjgl77/datav-vue3 app.use(DataVVue3)多个DataV遍历生成 Vue3viteDataV为例:<template><div w50rem h25rem flex&qu…...
【JavaWeb后端学习笔记】MySQL的常用函数(字符串函数,数值函数,日期函数,流程函数)
MySQL函数 1、字符串函数2、数值函数3、日期函数4、流程函数 1、字符串函数 函数说明concat(s1, s2, …, sn)字符串拼接,将 s1, s2, …, sn 拼接成一个字符串lower(str)将字符串 str 全部转为小写upper(str)将字符串 str 全部转为大写lpad(str, n, pad)左填充&…...
开源AI智能名片2+1链动模式O2O商城小程序在流量留存与转化中的深度应用与优化策略
摘要 在数字化时代,企业面临的市场竞争日益激烈,传统的营销手段已难以满足当前市场的多样化需求。开源AI智能名片21链动模式O2O商城小程序作为一种创新的数字化营销工具,凭借其开源特性、AI智能名片功能、21链动模式以及O2O商城小程序的优势…...
API多并发识别、C#文字识别
在当今数字化转型的浪潮中,信息处理的速度和准确性成为了企业在市场中立足的关键因素之一。特别是在大数据时代,海量的信息需要被快速、精确的解析和利用,因此,这正是文字识别技术大放异彩的舞台。翔云平台针对市场需求࿰…...
JVM和异常
Java 虚拟机(Java Virtual Machine,简称 JVM) 概述 JVM 是运行 Java 字节码的虚拟计算机,它是 Java 程序能够实现 “一次编写,到处运行(Write Once, Run Anywhere)” 特性的关键所在。Java 程…...
设计模式 创建型 单例模式(Singleton Pattern)与 常见技术框架应用 解析
单例模式(Singleton Pattern)是一种创建型设计模式,旨在确保某个类在应用程序的生命周期内只有一个实例,并提供一个全局访问点来获取该实例。这种设计模式在需要控制资源访问、避免频繁创建和销毁对象的场景中尤为有用。 一、核心…...
idea( 2022.3.2)打包报错总结
一 报错 class lombok.javac.apt.LombokProcessor (in unnamed module 0x4fe64d23) cannot access class com.sun.tools.javac.processing.JavacProcessingEnvironment (in module jdk.compiler) because module jdk.compiler does not export com.sun.tools.javac.processing …...
基于SpringBoot在线竞拍平台系统功能实现十一
## 一、前言介绍:1.1 项目摘要 随着网络技术的飞速发展和电子商务的普及,竞拍系统作为一种新型的在线交易方式,已经逐渐深入到人们的日常生活中。传统的拍卖活动需要耗费大量的人力、物力和时间,从组织拍卖、宣传、报名、竞拍到成…...
kubernetes学习-Service
kubernetes学习-Service 1. Service说明2. 功能3.Service类型3.1 NodePort3.1.1 创建web-service.yaml3.1.2 创建web-pod.yaml3.1.3 部署3.1.4 验证 3.2 ClusterIP3.2.1 创建web-clusterIp-service.yaml3.2.2 创建web-clusterIp-pod.yaml3.2.3 部署3.2.4 验证 3.3 LoadBalancer…...
【bluedroid】A2dp Source播放流程源码分析(4)
接上集分析:【bluedroid】A2dp Source播放流程源码分析(3)-CSDN博客 蓝牙和AUDIO之间的接口 蓝牙和audio之间的通信是通过socket,管理socket中的文件是UIPC,UIPC管理两条socket。 A2DP_CTRL_PATH /data/misc/bluedroid/.a2dp_ctrl A2DP_DATA_PATH /data/misc/bluedroid…...
vue3基础,小白从入门到精通
目录 一、vue.js 简述 二、 下载 vue.esm-browser.js 这个模块文件 三、创建第一个Vue程序 3.1创建代码过程 四、v-on 五、循环遍历(v-for) 六、判断语法(v-if和v-show) 6.1节点的动态属性v-bind 6.2 用v-bind实现CSS样式绑定 一、vue.js 简述 Vue 3 是一款流行的 J…...
Go 如何优雅退出进程
优雅退出设计步骤 在 Go 项目中,设计优雅退出(Graceful Shutdown)时,通常需要确保在收到退出信号时,程序能够安全地清理资源并优雅地退出。以下是常见的优雅退出设计步骤: 步骤 1:创建 contex…...
#Vue3篇: 无感刷新token的原理JSESSIONID无感刷新和JWT接口刷新
基于这个后端是怎么更新token的 为了理解后端是如何更新 Token 的,我们需要考虑一个典型的基于 Token 的身份验证流程,特别是涉及 JSESSIONID 和自定义 Token(如 JWT, JSON Web Token)的情况。 下面我将介绍两种常见的更新 Token …...
从零开始学桶排序:Java 示例与优化建议
目录 一、桶排序的工作原理 二、适用场景 三、桶排序的时间复杂度 四、Java 实现桶排序 桶排序(Bucket Sort)是一种基于分桶的排序算法,适用于输入数据分布较均匀的场景。它通过将元素分配到不同的“桶”中,然后对每个桶内的元…...
自定义luacheck校验规则
安装运行环境 安装环境及源码解析,参考:LuaCheck校验原理解析 自定义校验规则 从代码中可以看出,定义一条规则有以下关键点: 需要定义告警信息:由键值对组成,key为告警编码(不一定为纯数字&…...
Mac连接云服务器工具推荐
文章目录 前言步骤1. 下载2. 安装3. 常用插件安装4. 连接ssh测试5. 连接sftp测试注意:ssh和sftp的区别注意:不同文件传输的区别解决SSL自动退出 前言 Royal TSX是什么: Royal TSX 是一款跨平台的远程桌面和连接管理工具,专为 mac…...
【react】Redux的设计思想与工作原理
Redux 的设计理念 Redux 的设计采用了 Facebook 提出的 Flux 数据处理理念 在 Flux 中通过建立一个公共集中数据仓库 Store 进行管理,整体分成四个部分即: View (视图层)、Action (动作)、Dispatcher (派发器)、Stor…...
深入解析Android JNI:以Visualizer为例
深入解析Android JNI:以Visualizer为例 引言 Java Native Interface (JNI) 是Java平台提供的一种机制,允许Java代码与本地代码(如C/C++)进行交互。在Android开发中,JNI被广泛用于性能优化、访问底层系统API、以及复用现有的C/C++库。本文将通过Android中的Visualizer类,…...
Java基于SpringBoot的甘肃非物质文化网站的设计与实现,附源码
博主介绍:✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&…...
Unity小白工作心得(无限记录)
24届毕业,11月才找到工作在一家小公司。工作两个月了,遇到最大的问题就是探索新知识,每天都是摸索式前进,因为工作面临着交付,你不得不想尽办法解决问题然后交给上面,但其他程序员用的引擎不一样࿰…...
STC单片机内部常见寄存器及其作用
STC单片机内部常见寄存器及其作用 STC单片机是基于8051架构的增强型单片机,广泛应用于嵌入式系统中。其内部有多个特殊功能寄存器(SFR, Special Function Register),用于控制硬件模块(如定时器、串口、中断等…...
【亚马逊云】基于Amazon EC2实例部署 NextCloud 云网盘并使用 Docker-compose 搭建 ONLYOFFICE 企业在线办公应用软件
文章目录 1. 部署EC2实例2. 安装 Docker 服务3. 安装docker-compose4. 创建Docker-compose文件5. 创建nginx.conf文件6. 运行docker-compose命令开始部署7. 访问ONLYOFFICE插件8. 访问NextCloud云盘9. 下载并启用ONLYOFFICE插件10. 上传文件测试11. 所遇问题12. 参考链接 1. 部…...
vim、watch、cp和mv
一、vim使用技巧 vim主配置文件:/etc/vimrc (对所有用户都生效) vim子配置文件:vim ~/.vimrc (只对当前用户生效) 可写入: set nu 显示行号 ts2 tab键长度为两个空格(默认为8个空格…...
【Linux】:线程安全 + 死锁问题
📃个人主页:island1314 🔥个人专栏:Linux—登神长阶 ⛺️ 欢迎关注:👍点赞 👂🏽留言 😍收藏 💞 💞 💞 1. 线程安全和重入问题&…...
HarmonyOS Next 应用元服务开发-应用接续动态配置迁移保持迁移连续性
保证迁移连续性,由于迁移加载时,目标端拉起的应用可能执行过自己的迁移状态设置命令(如:冷启动时目标端在onCreate中设置了INACTIVE;热启动时对端已打开了不可迁移的页面,迁移状态为INACTIVE等情况…...
重装操作系统后 Oracle 11g 数据库数据还原
场景描述: 由于SSD系统盘损坏,更换硬盘后重装了操作系统,Oracle数据库之前安装在D盘(另一个硬盘),更换硬盘多添加一个盘符重装系统后盘符从D变成E,也就是之前的D:/app/... 变成了现在的 E:/app/...,重新安装…...
《Vue3实战教程》39:Vue3无障碍访问
如果您有疑问,请观看视频教程《Vue3实战教程》 无障碍访问 Web 无障碍访问 (也称为 a11y) 是指创建可供任何人使用的网站的做法——无论是身患某种障碍、通过慢速的网络连接访问、使用老旧或损坏的硬件,还是仅处于某种不方便的环境。例如,…...
Linux-Redis哨兵搭建
环境资源准备 主机名IP端口号角色vm1192.168.64.156379/26379mastervm2192.168.64.166379/26379slavevm3192.168.64.176379/26379slave 6379为redis服务暴露端口号、26379为sentinel暴露端口号。 安装Redis # 包文件下载 wget https://github.com/redis/redis/archive/7.2.2…...
数据分析思维(六):分析方法——相关分析方法
数据分析并非只是简单的数据分析工具三板斧——Excel、SQL、Python,更重要的是数据分析思维。没有数据分析思维和业务知识,就算拿到一堆数据,也不知道如何下手。 推荐书本《数据分析思维——分析方法和业务知识》,本文内容就是提取…...
Go基础之环境搭建
文章目录 1 Go1.1 简介1.1.1 定义1.1.2 特点用途 1.2 环境配置1.2.1 下载安装1.2.2 环境配置1.2.2.1 添加环境变量1.2.2.2 各个环境变量理解 1.2.3 验证环境变量 1.3 包管理工具 Go Modules1.3.1 开启使用1.3.2 添加依赖包1.3.3 配置国内包源1.3.3.1 通过 go env 配置1.3.3.2 修…...
Flume的安装和使用
一、安装Flume 1. 下载flume-1.7.0 http://mirrors.shu.edu.cn/apache/flume/1.7.0/apache-flume-1.7.0-bin.tar.gz 2. 解压改名 tar xvf apache-flume-1.7.0-bin.tar.gz mv apache-flume-1.7.0-bin flume 二、配置Flume 1. 配置sh文件 cp conf/flume-env.sh.template …...
原生js封装ajax请求以及css实现提示效果和禁止点击效果
<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0,user-scalableno"><title>本地模式网络切换</title>&l…...
idea 的 springboot项目spring-boot-devtools 自动编译 配置热部署
1,设置一 2,设置二 设置二(旧版本) CtrlShiftAlt/ 点击弹出框中Registry... 引入(如果报错,换不同的版本) <dependency><groupId>org.springframework.boot</groupId><a…...
算法 class 005 (对数器C语言实现)
对数器的概念: 用来测试你的算法是否正确。 怎么做呢? 1:比如,写个冒泡排序,作为对比的对象 2:生成一个随机数 数组,用来测试 3:用冒泡排序和你想要验证的那个排序算法,同…...
靶场搭建问题(技巧)总结
目录 DVWA靶场问题 待续、更新中...... DVWA靶场 问题 错误信息 Parse error: syntax error, unexpected ‘[’, expecting ‘)’ in C:\Softwares\phpstudy\PHPTutorial\WWW\dvwa\dvwa\includes\dvwaPage.inc.php on line 52 原因 phpstudy2018所使用的php版本过低,…...
Elasticsearch DSL版
文章目录 1.索引库操作创建索引库:删除索引库:查询索引库:修改索引库:总结 2.文档操作创建文档:查询文档:删除文档:全量修改文档:增量修改文档:总结 3.DSL查询语法&#…...
在K8S中,Pod请求另一个Pod偶尔出现超市或延迟,如何排查?
在Kubernetes中,当Pod请求另一个Pod时偶尔出现超时或延迟,可能是由于多种原因造成的。以下是一些建立的排查步骤: 1. 检查网络配置和插件: 确认你的kubernetes集群使用了合适的网络插件(如Calico、Flannel等…...
Echarts实现大屏可视化2
目录 一、效果展示 二、说明 2.1 销售额统计图表 2.2 全国热榜模块 三、边框图片【border-image】 3.1 使用场景 3.2 边框图片切图原理 3.3 边框图片语法【重要】 四、代码展示 4.1 展示页面 4.2 数据概览区域 4.3 监控区域 4.4 点位分布统计区域 4.5 设备数据统…...
HarmonyOS NEXT 应用开发练习:智能视频推荐
一、整体思路 本DEMO展示了如何在HarmonyOS NEXT平台上开发一个智能视频推荐应用。应用通过模拟的用户偏好数据,为用户推荐可能感兴趣的视频。用户可以通过滑动屏幕查看推荐的视频列表,并点击视频封面进入播放页面,本例中仅模拟点击效果&…...
FPGA(二)组成结构基础内容
1. FPGA的基本结构 FPGA主要由以下部分组成: (1)可编程逻辑单元(CLB):CLB是FPGA中最基本的逻辑单元,由查找表(LUT)和触发器组成,可实现任意逻辑功能。查找表…...
linux中执行命令
1.1 命令格式 命令格式: 主命令 选项 参数(操作对象) 命令分为两类: 内置命令( builtin ):由 shell 程序自带的命令 外部命令:有独立的可执行程序文件,文件名即命令…...
《Java 数据结构》
《Java 数据结构》 1. 概述 Java 数据结构是计算机科学中的一种基础概念,它涉及到数据的组织和存储方式,以便能够高效地访问和修改数据。在 Java 中,数据结构通常通过类和接口来实现,这些类和接口提供了用于操作数据的各种方法。…...
C# 设计模式(结构型模式):装饰器模式
C# 设计模式(结构型模式):装饰器模式 在软件开发中,面对需要扩展功能但又不想修改已有代码的情况时,装饰模式(Decorator Pattern)是一个非常有用的设计模式。装饰模式允许我们在不改变对象自身…...
ubuntu初始配置
ubuntu初始配置 vm下ubuntu安装vmtools安装常用工具ubuntu终端美化安装ssh使用apt安装时出现错误解决办法 vm下ubuntu安装vmtools //安装vmtools sudo apt-get install open-vm-tools //桌面组件提供了更好的集成体验,包括拖放文件和共享剪贴板等功能 sudo apt-get…...
Spark Runtime Filter
Runtime Filter 参考链接: https://docs.google.com/document/d/16IEuyLeQlubQkH8YuVuXWKo2-grVIoDJqQpHZrE7q04/edit?tabt.0https://www.modb.pro/db/557718https://issues.apache.org/jira/browse/SPARK-32268https://github.com/apache/spark/pull/35789https…...
《Vue3实战教程》42:Vue3TypeScript 与组合式 API
如果您有疑问,请观看视频教程《Vue3实战教程》 TypeScript 与组合式 API 这一章假设你已经阅读了搭配 TypeScript 使用 Vue 的概览。 为组件的 props 标注类型 使用 <script setup> 当使用 <script setup> 时,defineProps() 宏函数支…...
【Hadoop】Hadoop安全之Knox网关
目录 一、概述 2.1 knox介绍 2.2 版本信息 二、部署 三、验证Knox网关 3.1 Hdfs RESTFULL 3.2 HDFSUI 3.3 YARNUI 3.4 HBASEUI 一、概述 2.1 knox介绍 Apache Knox网关是一个用于与Apache Hadoop部署的REST api和ui交互的应用程序网关。Knox网关为所有与Apache Hadoop…...
UML之关联
关联指两个类之间的各种联系。UML使用各种单实线表示关联,这个单实线可以是直线(垂直的、水平的或者倾斜的)、折线甚至曲线。 事实上,关联也是展示类的属性的另一外的一种形式。例如在下图中,我们通过一条实线连接类B…...