VINS-Mono-后端优化 (三:视觉雅可比推导)

2023-11-10 18:28

本文主要是介绍VINS-Mono-后端优化 (三:视觉雅可比推导),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

用逆深度是因为这样可以在优化中从优化3个变量降低到1个,降低优化的维度加快求解速度
用逆深度是因为当距离很远的时候, 1 x \frac{1}{x} x1 x x x 就会无穷大,而3D点很近的情况也一般不会有,这也是为了数值稳定性

用逆深度的话就要和其中一帧进行绑定,这个就是和观测到该点的第一帧进行绑定,这样才能表示一个3D点信息

划窗中维护的全部都是IMU下的位姿,所以相机要通过外参变换到IMU坐标系下

在这里插入图片描述
这里就构成了视觉误差,需要求关于优化变量的雅可比矩阵,这里约束了第 i i i 帧和第 j j j 帧的 IMU 的姿态,同时还会优化相机和IMU的外参,这个也是紧耦合的特点之一(上一节同时优化 IMU预积分自身的零偏Ba也是紧耦合特点之一),3D点(逆深度)也是要优化,总共就是4个参数

转换公式如下:
i i i 帧归一化坐标系 -> 第 j j j 帧相机系, 1 λ \frac{1}{\lambda} λ1,就是深度, λ \lambda λ 是逆深度
在这里插入图片描述
将旋转和平移分开后如下:
在这里插入图片描述

将刚刚第 i i i 帧相机系下的3D点进行归一化,然后和光流追踪到的匹配点进行残差计算,这就获得了视觉重投影误差
在这里插入图片描述

计算残差对优化量的雅可比

有带时间延时估计的雅可比计算和不带时间估计的雅可比计算
这里先讲不带时间延时的雅可比计算

这里的误差项是2维的,坐标点是3维的
要求误差对旋转的雅可比只能通过链式求导的方式
∂ r ∂ p j ⋅ ∂ p j ∂ x \frac{\partial r}{\partial p_{j}}·\frac{\partial p_{j}}{\partial x} pjrxpj

∂ r ∂ p j \frac{\partial r}{\partial p_{j}} pjr 是2×3维的,对平移 x , y , z x,y,z x,y,z 进行求导
= [ 1 z 0 − x z 2 0 1 z − y z 2 ] =\begin{bmatrix}\frac{1}{z}&0&-\frac{x}{z^{2}} \\ 0&\frac{1}{z}&-\frac{y}{z^{2}} \end{bmatrix} =[z100z1z2xz2y]

这里的误差也有协方差矩阵,提点的置信度是设定为1.5个像素不变
残差也得乘上置信度

计算 p j p_{j} pj T T T 的雅可比

平移 x , y , z x,y,z x,y,z 的公式为
在这里插入图片描述

T T T 包含旋转 R R R 和平移 t t t

i i i 时刻求导

i i i 时刻的变量也是要优化的量,所以当然也要求导

p w b i p_{wb_{i}} pwbi 求导

∂ p j ∂ p w b i = R b c T ⋅ R w b j T \frac{\partial p_{j}}{\partial p_{wb_{i}}}=R^{T}_{bc}·R^{T}_{wb_{j}} pwbipj=RbcTRwbjT

R w b i R_{wb_{i}} Rwbi 求导

∂ p j ∂ R w b i \frac{\partial p_{j}}{\partial R_{wb_{i}}} Rwbipj
先把公式中有 R w b i R_{wb_{i}} Rwbi 的项提取出来

= R b c T R w b j T R w b i ( R b c P c i + p b c ) =R^{T}_{bc}R^{T}_{wb_{j}}R_{wb_{i}}(R_{bc}P^{c_{i}}+p_{bc}) =RbcTRwbjTRwbi(RbcPci+pbc)
= A R w b i b =AR_{wb_{i}}b =ARwbib

后面那一串 b b b 乘完后是向量,所以可以对李代数进行扰动求导(纯旋转矩阵是不能对李代数求导的,因为矩阵无法对向量求导,这里是乘完后是个向量,所以可以用向量来表示旋转的扰动量,然后用导数的定义来进行求导)

∂ A R w b i b ∂ ϕ = A R w b i e x p ( ϕ ∧ ) b − A R w b i b ϕ \frac{\partial AR_{wb_{i}}b}{\partial \phi}=\frac{AR_{wb_{i}}exp(\phi^{\wedge})b-AR_{wb_{i}}b}{\phi} ϕARwbib=ϕARwbiexp(ϕ)bARwbib
= A R w b i ( I + ϕ ∧ ) b − A R w b i b ϕ =\frac{AR_{wb_{i}}(I+\phi^{\wedge})b-AR_{wb_{i}}b}{\phi} =ϕARwbi(I+ϕ)bARwbib
= A R w b i ϕ ∧ b ϕ =\frac{AR_{wb_{i}}\phi^{\wedge}b}{\phi} =ϕARwbiϕb
根据反对成矩阵的性质
= − A R w b i b ∧ ϕ ϕ =\frac{-AR_{wb_{i}}b^{\wedge}\phi}{\phi} =ϕARwbibϕ
= − A R w b i b ∧ =-AR_{wb_{i}}b^{\wedge} =ARwbib

那个信息矩阵乘完第一步也得乘进来这里这个第2步的雅可比矩阵

j j j 时刻进行求导

p w b j p_{wb_{j}} pwbj 求导

∂ p j ∂ p w b j = − R b c T ⋅ R w b j T \frac{\partial p_{j}}{\partial p_{wb_{j}}}=-R^{T}_{bc}·R^{T}_{wb_{j}} pwbjpj=RbcTRwbjT

R w b j R_{wb_{j}} Rwbj 求导

把和 R w b j R_{wb_{j}} Rwbj 有关的项提取出来
= R b c T R w b j T ( R w b i R b c P c i + R w b i p b c + p w b i − p w b j ) =R^{T}_{bc}R^{T}_{wb_{j}}(R_{wb_{i}}R_{bc}P^{c_{i}}+R_{wb_{i}}p_{bc}+p_{wb_{i}}-p_{wb_{j}}) =RbcTRwbjT(RwbiRbcPci+Rwbipbc+pwbipwbj)
= A R w b j T b =AR^{T}_{wb_{j}}b =ARwbjTb

R w b j T R^{T}_{wb_{j}} RwbjT 是只能左乘的,但是我们现在要算他右乘的扰动方向,因为方向会不同,用左乘的求导结果加个负号就是右乘的结果,这里推导直接用右乘,所以要加个逆把这个转置消掉来进行推导
= A ( R w b j e x p ( ϕ ∧ ) ) − 1 b − A ( R w b j ) − 1 b =A(R_{wb_{j}}exp(\phi^{\wedge}))^{-1}b-A(R_{wb_{j}})^{-1}b =A(Rwbjexp(ϕ))1bA(Rwbj)1b
= A ( I − ϕ ∧ ) R w b j T b − A ( R w b j ) − 1 b =A(I-\phi^{\wedge})R^{T}_{wb_{j}}b-A(R_{wb_{j}})^{-1}b =A(Iϕ)RwbjTbA(Rwbj)1b
= − A ϕ ∧ R w b j T b =-A\phi^{\wedge}R^{T}_{wb_{j}}b =AϕRwbjTb
= A ( R w b j T b ) ∧ ϕ =A(R^{T}_{wb_{j}}b)^{\wedge}\phi =A(RwbjTb)ϕ
消去 ϕ \phi ϕ
= A ( R w b j T b ) ∧ =A(R^{T}_{wb_{j}}b)^{\wedge} =A(RwbjTb)

后面的 R w b j T b R^{T}_{wb_{j}}b RwbjTb 实际就是 3D 点在 第 j j j 帧 IMU系下的位姿,按照展开前的刚体变换来理解一下就好了

对 IMU-相机 的外参求导$

p b c p_{bc} pbc 求导

= R b c T R w b j T R w b i − R b c T =R^{T}_{bc}R^{T}_{wb_{j}}R_{wb_{i}}-R^{T}_{bc} =RbcTRwbjTRwbiRbcT

R b c R_{bc} Rbc 求导

代码中的 r i c = R b c , t i c = t b c ric=R_{bc},tic=t_{bc} ric=Rbc,tic=tbc Q = R w b Q=R_{wb} Q=Rwb

导数是符合加法的 ( f ( x ) + g ( x ) ) ′ = f ′ ( x ) + g ′ ( x ) (f(x)+g(x))^{'}=f^{'}(x)+g^{'}(x) (f(x)+g(x))=f(x)+g(x)

加法后面的求导结果 = ( R b c T b ) =(R^{T}_{bc}b) =(RbcTb) ,这个推导和上面类似,就不详细写了

加法前面的求导稍微复杂一点
= ( R b c e x p ( ϕ ∧ ) ) − 1 R w b j T R w b i R b c T e x p ( ϕ ∧ ) P c i − R b c T R w b j T R w b i R b c T P c i =(R_{bc}exp(\phi^{\wedge}))^{-1}R^{T}_{wb_{j}}R_{wb_{i}}R^{T}_{bc}exp(\phi^{\wedge})P^{c_{i}}-R^{T}_{bc}R^{T}_{wb_{j}}R_{wb_{i}}R^{T}_{bc}P^{c_{i}} =(Rbcexp(ϕ))1RwbjTRwbiRbcTexp(ϕ)PciRbcTRwbjTRwbiRbcTPci

下面暂时省略写后面它自身

= ( I − ϕ ∧ ) R b c T R w b j T R w b i R b c T ( I + ϕ ∧ ) P c i =(I-\phi^{\wedge})R^{T}_{bc}R^{T}_{wb_{j}}R_{wb_{i}}R^{T}_{bc}(I+\phi^{\wedge})P^{c_{i}} =(Iϕ)RbcTRwbjTRwbiRbcT(I+ϕ)Pci
= ( I − ϕ ∧ ) A ( I + ϕ ∧ ) P c i =(I-\phi^{\wedge})A(I+\phi^{\wedge})P^{c_{i}} =(Iϕ)A(I+ϕ)Pci
= ( A − ϕ ∧ A ) ( I + ϕ ∧ ) P c i =(A-\phi^{\wedge}A)(I+\phi^{\wedge})P^{c_{i}} =(AϕA)(I+ϕ)Pci
= ( A + A ϕ ∧ − ϕ ∧ A − ϕ ∧ A ϕ ∧ ) P c i − A P c i =(A+A\phi^{\wedge}-\phi^{\wedge}A-\phi^{\wedge}A \phi^{\wedge})P^{c_{i}}-AP^{c_{i}} =(A+AϕϕAϕAϕ)PciAPci

其中 ϕ ∧ A ϕ ∧ \phi^{\wedge}A \phi^{\wedge} ϕAϕ 是二阶,是相对于一阶的无穷小,这里只讨论一阶的展开且 ϕ \phi ϕ 本身就是小量,所以直接约掉

= ( A ϕ ∧ − ϕ ∧ A ) ⋅ P c i =(A\phi^{\wedge}-\phi^{\wedge}A)·P^{c_{i}} =(AϕϕA)Pci
= − A P ∧ ϕ + ( A P ) ∧ ϕ =-AP^{\wedge}\phi+(AP)^{\wedge}\phi =APϕ+(AP)ϕ
约掉 ϕ \phi ϕ
= − A P ∧ + ( A P ) ∧ =-AP^{\wedge}+(AP)^{\wedge} =AP+(AP)

对逆深度 λ \lambda λ 求导

∂ p j ∂ P c i ∂ P c i ∂ λ \frac{\partial p_{j}}{\partial P^{c_{i}}}\frac{\partial P^{c_{i}}}{\partial \lambda} PcipjλPci

前面的 ∂ p j ∂ P c i = R b c T R w b j T R w b i R b c \frac{\partial p_{j}}{\partial P^{c_{i}}}=R^{T}_{bc}R^{T}_{wb_{j}}R_{wb_{i}}R_{bc} Pcipj=RbcTRwbjTRwbiRbc

P c i = 1 λ ⋅ p P^{c_{i}}=\frac{1}{\lambda} ·p Pci=λ1p p p p 是归一化相机系下的3D点

∂ P c i ∂ λ = − 1 λ 2 ⋅ p \frac{\partial P^{c_{i}}}{\partial \lambda}=-\frac{1}{\lambda^{2}}·p λPci=λ21p

这个 − 1 λ 2 -\frac{1}{\lambda^{2}} λ21 是个系数,移到哪里都可以

零空间漂移处理

优化的时候会固定滑窗中的第一帧的xyz和yaw角,因为IMU约束的是相对位姿,且IMU的4个不可观自由度就是 y a w 、 x 、 y 、 z yaw、x、y、z yawxyz,绝对位姿是没有约束的,所以可能会产生在 4自由度的 0 空间漂移的情况,fusion中的GPS就是约束绝对位姿的。

VINS中的固定是先计算第一帧的yaw和xyz的偏移量,然后把后面的帧都减去这个偏移量,偏移回之前的位置,这样的做法就类似ORB中的固定第一帧的位姿,不过这里是减去第一帧的偏移量,其实就是滑窗中的整条轨迹调整回偏移前的位置,这样就保证不受 0 空间的影响。

和 yaw相关的量都会受影响,就是和旋转向量的量都会受影响, P , V P,V P,V 受影响,零偏 B a , B g Ba,Bg Ba,Bg ,外参 T b c Tbc Tbc 不受影响

前面会把旋转矩阵变成rpy,然后把yaw的角度差取出来构成新的偏移旋转矩阵,因为只是yaw发生漂移

这篇关于VINS-Mono-后端优化 (三:视觉雅可比推导)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/384472

相关文章

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

MySQL不使用子查询的原因及优化案例

《MySQL不使用子查询的原因及优化案例》对于mysql,不推荐使用子查询,效率太差,执行子查询时,MYSQL需要创建临时表,查询完毕后再删除这些临时表,所以,子查询的速度会受到一定的影响,本文给大家... 目录不推荐使用子查询和JOIN的原因解决方案优化案例案例1:查询所有有库存的商品信息案例2:使用EX

MySQL中my.ini文件的基础配置和优化配置方式

《MySQL中my.ini文件的基础配置和优化配置方式》文章讨论了数据库异步同步的优化思路,包括三个主要方面:幂等性、时序和延迟,作者还分享了MySQL配置文件的优化经验,并鼓励读者提供支持... 目录mysql my.ini文件的配置和优化配置优化思路MySQL配置文件优化总结MySQL my.ini文件

正则表达式高级应用与性能优化记录

《正则表达式高级应用与性能优化记录》本文介绍了正则表达式的高级应用和性能优化技巧,包括文本拆分、合并、XML/HTML解析、数据分析、以及性能优化方法,通过这些技巧,可以更高效地利用正则表达式进行复杂... 目录第6章:正则表达式的高级应用6.1 模式匹配与文本处理6.1.1 文本拆分6.1.2 文本合并6

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

MySQL高性能优化规范

前言:      笔者最近上班途中突然想丰富下自己的数据库优化技能。于是在查阅了多篇文章后,总结出了这篇! 数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 数据库对象的命名要能做到见名识意,并且最后不要超过32个字符 临时库表必须以tmp_为前缀并以日期为后缀,备份