IMU 预积分(仅供参考)

IMU Pre-Integration

本文章记录在学习 VIO 的过程中对 IMU 预积分的一些理解和公式的证明,也看了很多的文章和论文,知识点和证明过于复杂,特此记录,方便复习回顾,参考文献和网址也已经在文章最后给出,大家也可以自行查阅。

0. 部分先验知识

ω=[ω1ω2ω3]=[0ω3ω2ω30ω1ω2ω10]so(3).

ab=ba,a,bR3

exp(ϕ)=I+sin(ϕ)ϕϕ+1cos(ϕ)ϕ2(ϕ)2.

exp(ϕ)I+ϕTaylor Expansion approx

(exp(ϕ)p)ϕ=limδϕ0exp((ϕ+δϕ))pexp(ϕ)pδϕ1:=limδϕ0exp((J1δϕ))exp(ϕ)pexp(ϕ)pδϕ2:limδϕ0(I+(J1δϕ))exp(ϕ)pexp(ϕ)pδϕ3:=limδϕ0(J1δϕ)exp(ϕ)pδϕ4:=limδϕ0(exp(ϕ)p)J1δϕδϕ5:=(Rp)J1

1.0 预积分定义

1.1 引出预积分

​ 与传统IMU的运动学积分不同,预积分可以将一段时间内的IMU测量数据累计起来,建立预积分测量,因而十分适合以关键帧为基础单元的激光或视觉SLAM系统。

​ IMU 的真实值为 ω,a , 测量值为 ω~, a~, 则有:

ω~b=ωb+bg+nga~b=qbw(aw+gw)+ba+na

​ 上标 g 表示 gyro, a 表示 accw 表示在世界坐标系 world, b 表示 imu 机体坐标系 bodyPVQ 对时间的导数可写成:

p˙wbt=vtwv˙tw=atwq˙wbt=qwbt[012ωbt]

​ 预积分的过程可以用如下图来示意:

image

​ 从第 i 时刻的 PVQIMU 的测量值进行积分得到第 j 时刻的 PVQ:

pwbj=pwbi+viwΔt+t[i,j](qwbtabtgw)δt2vjw=viw+t[i,j](qwbtabtgw)δtqwbj=t[i,j]qwbt[012ωbt]δt

问题:每次 qwbt 优化更新后,都需要重新进行积分,运算量较大。

​ 一个很简单的公式转换,就可以将积分模型转为预积分模型:

qwbt=qwbiqbibt

​ 那么,PVQ 积分公式中的积分项则变成相对于第 i 时刻的姿态,而不是相对于世界坐标系的姿态:

pwbj=pwbi+viwΔt12gwΔt2+qwbit[i,j](qbibtabt)δt2vjw=viwgwΔt+qwbit[i,j](qbibtabt)δtqwbj=qwbit[i,j]qbibt[012ωbt]δt

1.2 预积分量

​ 预积分量仅仅跟 IMU 测量值有关,它将一段时间内的 IMU 数据直接积分起来就得到了预积分量:

αbibj=t[i,j](qbibtabt)δt2βbibj=t[i,j](qbibtabt)δtqbibj=t[i,j]qbibt[012ωbt]δt

​ 其中 a 表示的是位移的增量,b 表 示的是速度的增量,q 表示的是旋转的增量。很显然,对加速度进行一次积分即得到了速度增量,对加速度进行两次积分即得到了位移增量。

​ 将上面三个量分别带入公式(5)重新整理下 PVQ 的积分公式,有:

[pwbjvjwqwbjbjabjg]=[pwbi+viwΔt12gwΔt2+qwbiαbibjviwgwΔt+qwbiβbibjqwbiqbibjbiabig]

2.0 IMU 的预积分误差

2.1 定义

定义:一段时间内 IMU 构建的预积分量作为测量值,对两时刻之间的状态量进行约束

[rprqrvrbarbg]15×1=[qbiw(pwbjpwbiviwΔt+12gwΔt2)αbibj2[qbjbi(qbiwqwbj)]xyzqbiw(vjwviw+gwΔt)βbibjbjabiabjgbig]

​ 其实就是将公式(7) 中的等式单独拿出来,然后做了一个差的运算,作为误差项。例如公式 (7) 中的第一行:

pwbj=pwbi+viwΔt12gwΔt2+qwbiαbibjqwbiαbibj=pwbjpwbi+viwΔt12gwΔt2αbibj=qbiw(pwbjpwbi+viwΔt12gwΔt2)rp=qbiw(pwbjpwbi+viwΔt12gwΔt2)αbibj

​ 公式 (10) 中的其他项也是如此

​ 上面误差中位移, 速度, 偏置都是直接相减得到。第二项是关于四元 数的旋转误差, 其中 []xyz 表示只取四元数的虚部 (x,y,z) 组成的三维向量。

2.2 预积分的离散形式

​ 这里使用 mid-point 方法,即两个相邻时刻 kk+1 的位姿是用两个时刻的测量值 a, ω 的平 均值来计算:

ω=12((ωbkbkg)+(ωbk+1bkg))qbibk+1=qbibk[112ωδt]a=12(qbibk(abkbka)+qbibk+1(abk+1bka))αbibk+1=αbibk+βbibkδt+12aδt2βbibk+1=βbibk+aδtbk+1a=bka+nbkaδtbk+1g=bkg+nbkgδt

2.3 预积分量的方差

question: 一个 IMU 数据作为测量值的噪声方差我们能够标定。现在,一段时间内多个 IMU 数据积分形成的预积分量的方差呢?

  • Covariance Propagation
    已知一个变量 y=Ax,xN(0,Σx), 则有 Σy=AΣxA

Σy=E((Ax)(Ax))=E(AxxA)=AΣxA

​ 所以,要推导预积分量的协方差,我们需要知道 imu 噪声和预积分量之间的线性递推关系。

​ 假设已知了相邻时刻误差的线性传递方程:

ηik=Fk1ηik1+Gk1nk1

​ 比如: 状态量误差为 ηik=[δθik,δvik,δpik] , 测量噪声为 nk=[nkg,nka]。 

​ 误差的传递由两部分组成:当前时刻的误差传递给下一时刻,当前时刻测量噪声传递给下一时刻。

​ 协方差矩阵可以通过递推计算得到:

Σik=Fk1Σik1Fk1+Gk1ΣnGk1

​ 其中, Σn 是测量噪声的协方差矩阵, 方差从 i 时刻开始进行递推, Σii=0

2.4 状态误差线性递推公式的推导

image

state variables in error kalman filter

2.4.1 简介

​ 通常对于状态量之间的递推关系是非线性的方程如 xk=f(xk1,uk1), 其中状态量为 x,u 为系统的输入量。

​ 我们可以用两种方法来推导状态误差传递的线性递推关系:

  • 一种是基于一阶泰勒展开的误差递推方程。
  • 一种是基于误差随时间变化的递推方程。

2.4.2 基于一阶泰勒展开的误差递推方程

​ 令状态量为 x=x^+δx, 其中, 真值为 x^,δx 。另外, 输入量 u 的噪声为 n

​ 基于泰勒展开的误差传递(应用于 EKF 的协方差预测)

​ 非线性系统 xk=f(xk1,uk1) 的状态误差的线性递推关系如下:

δxk=Fδxk1+Gnk1

​ 其中, F 是状态量 $\mathrm{x}{k} $ 对状态量 xk1 的雅克比矩阵, G 是状态量 $ \mathrm{x}\mathbf{u}_{k-1} $ 的雅克比矩阵。

证明:对非线性状态方程进行一阶泰勒展开有:

xk=f(xk1,uk1)x^k+δxk=f(x^k1+δxk1,u^k1+nk1)x^k+δxk=f(x^k1,u^k1)+Fδxk1+Gnk1

2.4.3 基于误差随时间变化的递推方程

如果我们能够推导状态误差随时间变化的导数关系,比如:

δ˙x=Aδx+Bn

则误差状态的传递方程为:

δxk=δxk1+δ˙xk1Δtδxk=(I+AΔt)δxk1+BΔtnk1

对上面式子作个简单展开即可得到:

δxk=δxk1+δ˙xk1Δtδxk=δxk1+(Aδxk1+Bnk1)Δtδxk=δxk1+Aδxk1Δt+Bnk1Δtδxk=(I+AΔt)δxk1+BΔtnk1

这两种推导方式的可以看出有:

F=I+AΔt,G=BΔt

2.4.4 对比分析

​ 第一种方法不是很好么,为什么会想着去弄误差随时间的变化呢 ? 这是因为 VIO 系统中已经知道了状态的导数和状态之间的转移矩阵。
​ 如: 我们已经知道速度和状态量之间的关系:

v˙=Rab+g

​ 那我们就可以推导速度的误差和状态误差之间的关系,再每一项上都加上各自的误差就有:

v˙+δ˙v=R(I+[δθ]×)(ab+δab)+g+δgδv˙=Rδab+R[δθ]×(ab+δab)+δgδv˙=RδabR[ab]×δθ+δg

​ 由此就能以此类推,写出整个 AB 其他方程了。

2.5 预积分的误差递推公式推导

​ 首先回顾预积分的误差递推公式,将测量噪声也考虑进模型:

ω=12((ωbk+nkgbkg)+(ωbk+1+nk+1gbkg))qbibk+1=qbibk[112ωδt]a=12(qbibk(abk+nkabka)+qbibk+1(abk+1+nk+1abka))αbibk+1=αbibk+βbibkδt+12aδt2βbibk+1=βbibk+aδtbk+1a=bka+nbkaδtbk+1g=bkg+nbkgδt

​ 确定误差传递的状态量,噪声量,然后开始构建传递方程。

  • 预积分误差传递的形式:

    用前面一阶泰勒展开的推导方式,我们希望能推导出如下的形式:

    [δαbk+1bk+1δθbk+1bk+1δβbk+1bk+1δbk+1aδbk+1g]=F[δαbk+1bkδθbk+1bkδβbk+1bkδbkaδbkg]+G[nkankgnk+1ank+1gnbkanbkg]

    F,G 为两个时刻间的协方差传递矩阵

F=[If12Iδt14(qbibk+qbibk+1)δt2f150I[ω]×00Iδt0f32I12(qbibk+qbibk+1)δtf35000I00000I]G=[14qbibkδt2g1214qbibk+1δt2g1400012Iδt012Iδt0012qbibkδtg3212qbibk+1δtg34000000Iδt000000Iδt]

其中的系数为:

f12=αbibk+1δθbkbk=14(Rbibk[abkbka]×δt2+Rbibk+1[(abk+1bka)]×(I[ω]×δt)δt2)f32=βbibk+1δθbkbk=12(Rbibk[abkbka]×δt+Rbibk+1[(abk+1bka)]×(I[ω]×δt)δt)f15=αbibk+1δbkg=14(Rbibk+1[(abk+1bka)]×δt2)(δt)f35=βbibk+1δbkg=12(Rbibk+1[(abk+1bka)]×δt)(δt)g12=αbibk+1nkg=g14=αbibk+1nk+1g=14(Rbibk+1[(abk+1bka)]×δt2)(12δt)g32=βbibk+1nkg=g34=βbibk+1nk+1g=12(Rbibk+1[(abk+1bka)]×δt2)(12δt)

  • 证明:

公式简化约定,考虑到公式的编辑篇幅,为了对一些求导公式进行简化,这里做一些简单的约定, 比如求导公式:

xaδθ=limδθ0Rabexp([δθ]×)xbRabxbδθ

后续直接简写为 :

xaδθ=Rabexp([δθ]×)xbδθ

雅克比矩阵 F 的推导:

β 对各状态量的雅克比推导,即 F 第三行,速度预积分量 β 的递推计算形式:

βbibk+1=βbibk+aδt=βbibk+12(qbibk(abkbka)+qbibk+1(abk+1bka))δt

f33 : 对上一时刻速度预积分量的 Jacobian

f33=βbibk+1δβbkbk=I3×3

f32 : 对角度预积分量的 Jacobian
首先将速度预积分量 β 的递推计算形式写成如下形式:

βbibk+1=βbibk+12(qbibk(abkbka)+qbibk[112ωδt](abk+1bka))δt

f32 : 对角度预积分量的Jacobian
那么,速度的预积分量对角度预积分量的 Jacobian:

βbibk+1δθbkbk=aδtδθbkbk

其中分子和一写成:

aδt=12qbibk[112δθbkbk](abkbka)δt+12qbibk[112δθbkbk][112ωδt](abk+1bka)δt=12Rbibkexp([δθbkbk]×)(abkbka)δtPart 1+12Rbibkexp([δθbkbk]×)exp([ωδt]×)(abk+1bka)δtPart 2

Part1 对应的的雅克比为:

Rbibkexp([δθbkbk]×)(abkbka)δtδθbkbk=Rbibk(I+[δθbkbk]×)(abkbka)δtδθbkbk=Rbibk[(abkbka)δt]×δθbkbkδθbkbk=Rbibk[(abkbka)δt]×

Part2 对应的雅可比为:

Rbibkexp([δθbkbk]×)exp([ωδt]×)(abk+1bka)δtδθbkbk=Rbibk(I+[δθbkbk]×)exp([ωδt]×)(abk+1bka))δtδθbkbk=Rbibk[exp([ωδt]×)(abk+1bka)δt]×δθbkbkδθbkbk=Rbibkexp([ωδt]×)[(abk+1bka)δt]×exp([ωδt]×)δθbkbkδθbkbk=Rbibk+1[(abk+1bka)δt]×exp([ωδt]×)Rbibk+1[(abk+1bka)δt]×(I[ωδt]×)

将上面两部分综合起来就能得到

f32=βbibk+1δθbkbk=12(Rbibk[abkbka]×δt+Rbibk+1[(abk+1bka)]×(I[ω]×δt)δt)

f35 : 速度预积分量对 k 时刻角速度 biasJacobian
递推公式如下:

ω=12((ωbkbkg)+(ωbk+1bkg))=12(ωbk+ωbk+1)bkgβbibk+1=βbibk+12(qbibk(abkbka)+qbibk[112ωδt](abk+1bka))δt

只有括号中的公式部分和角速度 bias 有关系, 因此雅克比的推导只考括号中的公式部分。

f35=βbibk+1δbkg=12qbibk[112ωδt][112δbkgδt](abk+1bka)δtδbkg=12Rbibk+1exp([δbkgδt]×)(abk+1bka)δtδbkg=12Rbibk+1(I+[δbkgδt]×)(abk+1bka)δtδbkg=12Rbibk+1([(abk+1bka)δt]×)(δbkgδt)δbkg=12(Rbibk+1[(abk+1bka)]×δt)(δt)

旋转预积分量的 Jacobian,即 F 第二行,旋转预积分的递推公式为:

ω=12((ωbkbkg)+(ωbk+1bkg))qbibk+1=qbibk[112ωδt]=qbibk[112(12(ωbk+ωbk+1)bkg)δt]

f22 : 前一时刻的旋转误差 δθbkbk 如何影响当前旋转误差 δθbk+1bk+1。假设两个时刻的真值为 qbibk+1qbibk , 两个时刻间的增量真值为 qbkbk+1 。推导过程只考虑一个变量, 即旋转误差δθbkbk的影响, 而不 考虑测量值角速度 bias 误差影响。可以假设

qbkbk+1[112ωδt]

另外, 三元组四元数相乘有如下性质:

qpq=[q]L[q]Rp=[pwRpv]

其中 R 是和 q 对应的旋转矩阵, pwp 的实部, pvp 的虚部。
下面开始详细推导:

qbibk+1[112δθbk+1bk+1]=qbibk[112δθbkbk][112ωδt][12]=qbk+1bk+1]qbibk[112δθbkbk][112ωδt]=qbk+1bk[112δθbkbk][112ωδt][112ωδt][112δθbkbk][112ωδt]=[112Rδθbkbk]

只考虑公式中的虚部:

δθbk+1bk+1=Rδθbkbk=exp([ωδt]×)δθbkbk(I[ωδt]×)δθbkbk

那么, 第 k+1 时刻的旋转预积分的误差相对于第 k 时刻的 Jacobian 为:

f22=δθbk+1bk+1δθbkbk=I[ωδt]×

渔已授完,F, G 中的其他鱼靠大家去捞了...

posted @   weihao-ysgs  阅读(2022)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示