《视觉SLAM十四讲》-- 后端 2

news2024/11/28 0:53:20

文章目录

    • 09 后端 2
      • 9.1 滑动窗口滤波和优化
        • 9.1.1 实际环境下的 BA 结构
        • 9.1.2 滑动窗口法
      • 9.2 位姿图
        • 9.2.1 位姿图的意义
        • 9.2.2 位姿图优化

09 后端 2

9.1 滑动窗口滤波和优化

9.1.1 实际环境下的 BA 结构

由于计算机算力的限制,我们必须控制 BA 的规模,一种简单的思路是仅保留离当前时刻最近的 N N N 个关键帧,去掉时间上更早的关键帧。于是,BA 被固定在一个时间窗口内,离开这个窗口的即被抛弃,称为 滑动窗口法

或者像 ORB-SLAM 2 那样,定义一种称为 共视图 的结构,即与当前相机存在共同观测的关键帧构成的图。在 BA 优化时,按照某些原则在共视图内取一些关键帧和路标进行优化。

在这里插入图片描述

9.1.2 滑动窗口法

(1)现在考虑一个滑动窗口,假设窗口内有 N N N 个关键帧,他们的位姿表达为(李代数形式):

x 1 , x 2 , . . . , x N \boldsymbol{x}_1, \boldsymbol{x}_2,...,\boldsymbol{x}_N x1,x2,...,xN

假设这个滑动窗口中还有 M M M 个路标点 y 1 , y 2 , . . . , y M \boldsymbol{y}_1, \boldsymbol{y}_2,...,\boldsymbol{y}_M y1,y2,...,yM,用上一讲中的 BA 方法来处理这个滑动窗口,包括建立图优化模型,构建海森矩阵,在边缘化所有路标点来加速求解。边缘化时,考虑关键帧的位姿:

[ x 1 , … , x N ] T ∼ N ( [ μ 1 , … , μ N ] T , Σ ) (9-1) \left[\boldsymbol{x}_{1}, \ldots, \boldsymbol{x}_{N}\right]^{\mathrm{T}} \sim N\left(\left[\boldsymbol{\mu}_{1}, \ldots, \boldsymbol{\mu}_{N}\right]^{\mathrm{T}}, \boldsymbol{\Sigma}\right) \tag{9-1} [x1,,xN]TN([μ1,,μN]T,Σ)(9-1)

其中 μ k \boldsymbol{\mu}_k μk 为第 k k k 个关键帧的位姿均值, Σ \boldsymbol{\Sigma} Σ 为所有关键帧的协方差矩阵。显然,均值部分就是 BA 迭代之后的结果, Σ \boldsymbol{\Sigma} Σ 是对整个 BA 的 H \boldsymbol{H} H 矩阵进行边缘化之后的结果。

(2)当窗口结构改变时:

① 先在窗口中新增一个关键帧,以及观测到的路标点;

② 把窗口中一个旧的关键帧删除,可能会删除他观测到的路标点。

  • 新增一个关键帧和路标点

将新的关键帧 x N + 1 \boldsymbol{x}_{N+1} xN+1 按照正常的 BA 流程处理即可。

  • 删除一个旧的关键帧

删除旧的关键帧时,就比较麻烦。比如删除 x 1 \boldsymbol{x}_1 x1 ,但 x 1 \boldsymbol{x}_1 x1 并不是孤立的,它会和其它帧观测到同样的路标,将 x 1 \boldsymbol{x}_1 x1 边缘化后将导致整个问题不再稀疏(破坏了路标部分的对角块结构)。

在这里插入图片描述

(3)滑动窗口法适合 VO 系统,而不适合大规模建图的系统。

9.2 位姿图

9.2.1 位姿图的意义

(1)随着时间的流逝,机器人的运动轨迹会越来越长,地图规模也会越来越大,BA 的计算效率就会下降。同时我们发现,经过若干次迭代后,收敛的特征点位置变化很小,发散的外点则已被剔除,因此在后续优化中没有必要再将收敛点考虑进来,而是只把他们当做位姿估计的约束。

(2)放开思路,我们完全可以构建一个只有轨迹的图优化,而位姿节点的边,可以由两个关键帧之间通过特征匹配之后得到的运动估计来给定初始值。一旦初始估计完成,就不再优化那些路标点的位置,而只关心相机位姿之间的联系。这样的方式,省去了大量特征点优化的计算,只保留了关键帧的轨迹,构建了所谓的 位姿图

在这里插入图片描述

通过舍弃对路标点的优化,提高计算效率。

9.2.2 位姿图优化

位姿图中的节点表示相机位姿,用 T 1 , T 2 , . . . , T n , \boldsymbol{T}_1,\boldsymbol{T}_2,...,\boldsymbol{T}_n, T1,T2,...,Tn, 表示,边则是两个位姿节点之间相对运动的估计,这个估计可以通过特征点法或直接法得到。假设我们估计了 T i \boldsymbol{T}_i Ti T j \boldsymbol{T}_j Tj 之间的相对运动 T i j \boldsymbol{T}_{ij} Tij,则有

T i T i j = T j \boldsymbol{T}_i \boldsymbol{T}_{ij}=\boldsymbol{T}_j TiTij=Tj

也即

T i j = T i − 1 T j (9-2) \boldsymbol{T}_{ij}=\boldsymbol{T}_i^{-1}\boldsymbol{T}_j \tag{9-2} Tij=Ti1Tj(9-2)

写成李代数形式

ξ i j = ξ i − 1 ∘ ξ j = ln ⁡ ( T i − 1 T j ) ∨ (9-3) \boldsymbol{\xi}_{i j}=\boldsymbol{\xi}_{i}^{-1} \circ \boldsymbol{\xi}_{j}=\ln \left(\boldsymbol{T}_{i}^{-1} \boldsymbol{T}_{j}\right)^{\vee} \tag{9-3} ξij=ξi1ξj=ln(Ti1Tj)(9-3)

将式(9-2)中的 Δ T i j \Delta \boldsymbol{T}_{ij} ΔTij 移至方程右侧,则

T i j − 1 T i − 1 T j = I (9-4) \boldsymbol{T}_{ij}^{-1}\boldsymbol{T}_i^{-1}\boldsymbol{T}_j=\boldsymbol{I} \tag{9-4} Tij1Ti1Tj=I(9-4)

但实际上,并不可能完全相等。定义

e i j = ln ⁡ ( T i j − 1 T i − 1 T j ) ∨ (9-5) \boldsymbol{e}_{ij}=\ln( \boldsymbol{T}_{ij}^{-1}\boldsymbol{T}_i^{-1}\boldsymbol{T}_j)^{\vee} \tag{9-5} eij=ln(Tij1Ti1Tj)(9-5)

我们需要优化的是 T i \boldsymbol{T}_i Ti T j \boldsymbol{T}_j Tj,也即 ξ i \boldsymbol{\xi}_i ξi ξ j \boldsymbol{\xi}_j ξj,因此需要求这两个变量关于 e i j \boldsymbol{e}_{ij} eij 的导数。分别左乘一个左扰动: δ ξ i \boldsymbol{\delta \xi}_i δξi δ ξ j \boldsymbol{\delta \xi}_j δξj

e ^ i j = ln ⁡ ( T i j − 1 T i − 1 exp ⁡ ( ( − δ ξ i ) ∧ exp ⁡ ( ( δ ξ j ) ∧ T j ) ∨ (9-6) \boldsymbol{\hat{e}}_{ij}=\ln( \boldsymbol{T}_{ij}^{-1}\boldsymbol{T}_i^{-1} \exp((-\boldsymbol{\delta \xi}_i)^{\wedge}\exp((\boldsymbol{\delta \xi}_j)^{\wedge} \boldsymbol{T}_j)^{\vee} \tag{9-6} e^ij=ln(Tij1Ti1exp((δξi)exp((δξj)Tj)(9-6)

根据伴随矩阵的性质:

exp ⁡ ( ( Ad ⁡ ( T ) ξ ) ∧ ) = T exp ⁡ ( ξ ∧ ) T − 1 (9-7) \exp \left((\operatorname{Ad}(\boldsymbol{T}) \boldsymbol{\xi})^{\wedge}\right)=\boldsymbol{T} \exp \left(\boldsymbol{\xi}^{\wedge}\right) \boldsymbol{T}^{-1} \tag{9-7} exp((Ad(T)ξ))=Texp(ξ)T1(9-7)

稍作改变(把 Ad ⁡ ( T ) \operatorname{Ad}(\boldsymbol{T}) Ad(T) 移到右侧,$ \boldsymbol{T}^{-1}$ 移到左侧)

exp ⁡ ( ξ ∧ ) T = T exp ⁡ ( ( Ad ⁡ ( T − 1 ) ξ ) ∧ ) (9-9) \exp \left(\boldsymbol{\xi}^{\wedge}\right) \boldsymbol{T}=\boldsymbol{T} \exp \left(\left(\operatorname{Ad}\left(\boldsymbol{T}^{-1}\right) \boldsymbol{\xi}\right)^{\wedge}\right) \tag{9-9} exp(ξ)T=Texp((Ad(T1)ξ))(9-9)

那么,式(9-6)可写为(从右往左化简)

e ^ i j = ln ⁡ ( T i j − 1 T i − 1 exp ⁡ ( ( − δ ξ i ) ∧ ) exp ⁡ ( δ ξ j ∧ ) T j ‾ ) ∨ = ln ⁡ ( T i j − 1 T i − 1 exp ⁡ ( ( − δ ξ i ) ∧ ) T j ‾ exp ⁡ ( ( Ad ⁡ ( T j − 1 ) δ ξ j ) ∧ ) ) ∨ = ln ⁡ ( T i j − 1 T i − 1 T j exp ⁡ ( ( − Ad ⁡ ( T j − 1 ) δ ξ i ) ∧ ) exp ⁡ ( ( Ad ⁡ ( T j − 1 ) δ ξ j ) ∧ ) ) ∨ ≈ ln ⁡ ( T i j − 1 T i − 1 T j [ I − ( Ad ⁡ ( T j − 1 ) δ ξ i ) ∧ + ( Ad ⁡ ( T j − 1 ) δ ξ j ) ∧ ] ) ∨ ≈ e i j + ∂ e i j ∂ δ ξ i δ ξ i + ∂ e i j ∂ δ ξ j δ ξ j (9-10) \begin{aligned} \hat{\boldsymbol{e}}_{i j} &=\ln \left(\boldsymbol{T}_{i j}^{-1} \boldsymbol{T}_{i}^{-1} \exp \left(\left(-\boldsymbol{\delta} \boldsymbol{\xi}_{i}\right)^{\wedge}\right) \underline{\exp \left(\delta \boldsymbol{\xi}_{j}^{\wedge}\right) \boldsymbol{T}_{j}}\right)^{\vee} \\ &=\ln \left(\boldsymbol{T}_{i j}^{-1} \boldsymbol{T}_{i}^{-1} \underline{\exp \left(\left(-\boldsymbol{\delta} \boldsymbol{\xi}_{i}\right)^{\wedge}\right) \boldsymbol{T}_{j}} \exp \left(\left(\operatorname{Ad}\left(\boldsymbol{T}_{j}^{-1}\right) \boldsymbol{\delta} \boldsymbol{\xi}_{j}\right)^{\wedge}\right)\right)^{\vee} \\ &=\ln \left(\boldsymbol{T}_{i j}^{-1} \boldsymbol{T}_{i}^{-1} \boldsymbol{T}_{j} \exp \left(\left(-\operatorname{Ad}\left(\boldsymbol{T}_{j}^{-1}\right) \boldsymbol{\delta} \boldsymbol{\xi}_{i}\right)^{\wedge}\right) \exp \left(\left(\operatorname{Ad}\left(\boldsymbol{T}_{j}^{-1}\right) \boldsymbol{\delta} \boldsymbol{\xi}_{j}\right)^{\wedge}\right)\right)^{\vee} \\ & \approx \ln \left(\boldsymbol{T}_{i j}^{-1} \boldsymbol{T}_{i}^{-1} \boldsymbol{T}_{j}\left[\boldsymbol{I}-\left(\operatorname{Ad}\left(\boldsymbol{T}_{j}^{-1}\right) \boldsymbol{\delta} \boldsymbol{\xi}_{i}\right)^{\wedge}+\left(\operatorname{Ad}\left(\boldsymbol{T}_{j}^{-1}\right) \boldsymbol{\delta} \boldsymbol{\xi}_{j}\right)^{\wedge}\right]\right)^{\vee} \\ & \approx \boldsymbol{e}_{i j}+\frac{\partial \boldsymbol{e}_{i j}}{\partial \boldsymbol{\delta} \boldsymbol{\xi}_{i}} \boldsymbol{\delta} \boldsymbol{\xi}_{i}+\frac{\partial \boldsymbol{e}_{i j}}{\partial \boldsymbol{\delta} \boldsymbol{\xi}_{j}} \boldsymbol{\delta} \boldsymbol{\xi}_{j} \end{aligned} \tag{9-10} e^ij=ln(Tij1Ti1exp((δξi))exp(δξj)Tj)=ln(Tij1Ti1exp((δξi))Tjexp((Ad(Tj1)δξj)))=ln(Tij1Ti1Tjexp((Ad(Tj1)δξi))exp((Ad(Tj1)δξj)))ln(Tij1Ti1Tj[I(Ad(Tj1)δξi)+(Ad(Tj1)δξj)])eij+δξieijδξi+δξjeijδξj(9-10)

其中,第四步将两个指数一阶泰勒展开,相乘后舍去二次项;第四步到第五步则使用了 BCH 近似。

按照李代数上的求导法则,我们得到了误差关于两个位姿的雅克比矩阵,即

∂ e i j ∂ δ ξ i = − J r − 1 ( e i j ) Ad ⁡ ( T j − 1 ) \frac{\partial \boldsymbol{e}_{i j}}{\partial \boldsymbol{\delta} \boldsymbol{\xi}_{i}}=-\mathcal{J}_{r}^{-1}\left(\boldsymbol{e}_{i j}\right) \operatorname{Ad}\left(\boldsymbol{T}_{j}^{-1}\right) δξieij=Jr1(eij)Ad(Tj1)
∂ e i j ∂ δ ξ j = J r − 1 ( e i j ) Ad ⁡ ( T j − 1 ) (9-11) \frac{\partial \boldsymbol{e}_{i j}}{\partial \boldsymbol{\delta} \boldsymbol{\xi}_{j}}=\mathcal{J}_{r}^{-1}\left(\boldsymbol{e}_{i j}\right) \operatorname{Ad}\left(\boldsymbol{T}_{j}^{-1}\right) \tag{9-11} δξjeij=Jr1(eij)Ad(Tj1)(9-11)

J r \mathcal{J}_{r} Jr 的形式比较复杂,通常取它的近似,

J r − 1 ( e i j ) ≈ I + 1 2 [ ϕ e ∧ ρ e ∧ 0 ϕ e ∧ ] (9-12) \mathcal{J}_{r}^{-1}\left(e_{i j}\right) \approx \boldsymbol{I}+\frac{1}{2}\left[\begin{array}{cc} \phi_{e}^{\wedge} & \rho_{e}^{\wedge} \\ 0 & \phi_{e}^{\wedge} \end{array}\right] \tag{9-12} Jr1(eij)I+21[ϕe0ρeϕe](9-12)

了解雅克比求导后,剩下的部分就是普通的图优化。 记所有的边(也就是位姿)为 E \mathcal{E} E,则总体目标函数为

min ⁡ 1 2 ∑ i , j ∈ E e i j T Σ i j − 1 e i j (9-13) \min \frac{1}{2} \sum_{i, j \in \mathcal{E}} \boldsymbol{e}_{i j}^{\mathrm{T}} \boldsymbol{\Sigma}_{i j}^{-1} \boldsymbol{e}_{i j} \tag{9-13} min21i,jEeijTΣij1eij(9-13)

然后再用高斯牛顿法或 L-M 法优化求解。

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

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

相关文章

【教3妹学编程-算法题】最大和查询

3妹:2哥,你有没有看到新闻“18岁父亲为4岁儿子落户现身亲子鉴定” 2哥 : 啥?18岁就当爹啦? 3妹:确切的说是14岁好吧。 2哥 : 哎,想我30了, 还是个单身狗。 3妹:别急啊, 2…

【用unity实现100个游戏之15】开发一个类保卫萝卜的Unity2D塔防游戏4(附项目源码)

文章目录 先看本次实现的最终效果前言把敌人和炮塔全部配置成预制体炮塔商店打开商店放置炮塔升级炮塔出售显示炮塔攻击范围显示玩家金额和血量关闭升级面板和商店功能源码完结 先看本次实现的最终效果 前言 本期紧接着上一篇,本期主要内容是实现商店、购买、出售、…

js的File对象,Blob和file相互转换

示例 <!DOCTYPE html> <html><head><meta charset"utf-8" /><meta name"viewport" content"widthdevice-width, initial-scale1" /><title>js的File对象&#xff0c;Blob和file相互转换</title><…

生成对抗网络Generative Adversarial Network,GAN

Basic Idea of GAN Generation&#xff08;生成器&#xff09;  Generation是一个neural network&#xff0c;它的输入是一个vector&#xff0c;它的输出是一个更高维的vector&#xff0c;以图片生成为例&#xff0c;输出就是一张图片&#xff0c;其中每个维度的值代表生…

中级程序员——uniapp和小程序面试题

&#x1f604;博主&#xff1a;小猫娃来啦 &#x1f604;文章核心&#xff1a;uniapp和小程序面试题 文章目录 用uniapp有遇到一些兼容性问题吗&#xff1f;uniapp最大的优点是什么&#xff1f;uniapp如何实现多端兼容&#xff1f;uniapp是如何做跨端适配的&#xff1f;常用的u…

lxml基本使用

lxml是python的一个解析库&#xff0c;支持HTML和XML的解析&#xff0c;支持XPath解析方式&#xff0c;而且解析效率非常高 XPath&#xff0c;全称XML Path Language&#xff0c;即XML路径语言&#xff0c;它是一门在XML文档中查找信息的语言&#xff0c;它最初是用来搜寻XML文…

打造智算中心新标杆,普洛斯数据中心荣获“2023年数据中心科技成果奖”一等奖

11月15&#xff0d;16日&#xff0c;由CDCC主办的2023第十一届数据中心标准大会在北京举行&#xff0c;大会同期举行“2023年数据中心科技成果奖”颁奖典礼。会上&#xff0c;普洛斯数据中心及美团联合申报的“智能算力中心弹性高效节能技术”荣获“2023年数据中心科技成果奖一…

数据服务化在京东平台API接口接入的实践

数据服务化在京东的实践 导读 本次分享的主题为数据服务化在京东的实践&#xff0c;主要包含三个模块&#xff1a;数据服务化的缘起、成长、如何将系统做得更好。 01 缘起&#xff1a;数据服务化从 0 到 1 1. 缘起 京东数据智能部负责维护数据资产和对外提供数据服务&#…

类BERT模型蒸馏原理

如果你曾经训练过 BERT 或 RoBERTa 等大型 NLP 模型&#xff0c;就就会知道这个过程非常漫长。 由于此类模型规模庞大&#xff0c;训练可能会持续数天。 当需要在小型设备上运行它们时&#xff0c;可能会发现你正在为当今不断提高的性能付出巨大的内存和时间成本。 幸运的是&a…

单片机语音芯片在工业控制中的应用优势

单片机语音芯片&#xff0c;这一智能化的代表产品&#xff0c;不仅在家庭和消费电子领域发挥着重要的作用&#xff0c;更为工业控制领域注入了新的活力。将单片机语音芯片与语音交互技术相结合&#xff0c;为工业设备的控制和监测提供了前所未有的解决方案。 首先&#xff0c;…

【Hello Go】Go语言运算符

Go语言运算符 算术运算符关系运算符逻辑运算符位运算符赋值运算符其他运算符运算符优先级 算术运算符 如果之前没有其他语言基础的小伙伴可以参考下我之前写的C语言运算符讲解 这里主要讲解下Go和C运算符的不同点 – 运算符 Go语言中只有后置 和后置– var a int 5a--fmt.P…

宏集干货 | 手把手教你通过CODESYS V3进行PLC编程(三)

来源&#xff1a;宏集科技 工业物联网 宏集干货 | 手把手教你通过CODESYS V3进行PLC编程&#xff08;三&#xff09; 教程背景 通过之前的教程&#xff0c;我们已经为大家演示了宏集MC-Prime控制器的连接、试运行和CODESYS的安装&#xff0c;并创建了一个计数器项目。在本期教…

小型内衣洗衣机什么牌子好?性价比高的迷你洗衣机推荐

现在洗内衣内裤也是一件较麻烦的事情了&#xff0c;在清洗过程中还要用热水杀菌&#xff0c;还要确保洗衣液是否有冲洗干净&#xff0c;还要防止细菌的滋生等等&#xff0c;所以入手一款小型的烘洗全套的内衣洗衣机是非常有必要的&#xff0c;专门的内衣洗衣机可以最大程度减少…

用护眼灯到底好不好?适合小学生用的五款护眼台灯推荐

如果不想家里的孩子年纪小小的就戴着眼镜&#xff0c;从小就容易近视&#xff0c;那么护眼灯的选择就非常重要了&#xff0c;但是市场上那么多品类&#xff0c;价格也参差不齐&#xff0c;到底怎么选呢&#xff1f;大家一定要看完本期内容。为大家推荐五款护眼台灯。 一、书客护…

几种典型的深度学习算法:(CNN、RNN、GANS、RL)

以下是几种典型的深度学习算法&#xff1a; 1、卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09;&#xff1a;主要用于图像和视频等视觉任务。通过使用卷积层、池化层和全连接层等不同类型的神经网络层&#xff0c;CNN 可以学习图像中的特征并…

Apache DolphinScheduler在通信行业的多集群统一建设与管理实践

背景介绍 为什么我们考虑构建统一的调度平台&#xff1f; 主要原因是&#xff1a;我们公司的大数据中心目前拥有七个大数据集群&#xff0c;这些集群分布在不同的机房&#xff0c;例如内蒙、南京、苏州和广州。而且&#xff0c;这些机房之间的网络并不互通。如果每个集群都独立…

校园跑腿小程序源码系统+多校园版+取快递+食堂超市跑腿+外卖 带完整的搭建教程

大家好啊&#xff0c;又到了罗峰给大家分享源码的时间啦。今天要给大家分享的是一款校园跑腿小程序源码系统。这款系统功能十分强大&#xff0c;开发了多校园版。众所周知&#xff0c;校园跑腿的发展是从外卖配送一点点演变过来的&#xff0c;而校园跑腿的基础性服务项目就是帮…

智慧城市安全监控的新利器

在传统的城市管理中&#xff0c;井盖的监控一直是一个难题&#xff0c;而井盖异动传感器的出现为这一问题提供了有效的解决方案。它具有体积小、重量轻、安装方便等特点&#xff0c;可以灵活地应用于各种类型的井盖&#xff0c;实现对城市基础设施的全方位监控。 智能井盖监测终…

如何创建react项目

可以直接通过react脚手架进行创建 首先确保自己是否安装了create-react-app npm install -g create-react-app 如果安装不成功有可能是有缓存&#xff0c;可以先清除缓存再重新安装 npm cache clean --force 安装成功后就可以使用脚手架创建自己的项目,my-react就是我的项…

求臻医学:当MRD遇到肺癌 见招拆招,斩草除根

当MRD遇到肺癌→见招拆招&#xff0c;斩草除根 浅谈MRD在肺癌中的应用 新辅助治疗后&#xff0c;可以通过MRD来辅助评估预后&#xff0c;一般MRD阴性与新辅助治疗后的pCR (病理完全缓解)相关&#xff0c;达到MRD阴性或pCR的惠者预后更好. MRD在肺癌中可潜在解决的问题点1.术…