• OpenVINS与MSCKF_VIO RK4积分对比


    VIO系统在使用IMU测量值进行状态预测时,需要将连续时间的微分方程离散化为差分方程,离散化的本质是积分,根据数值积分近似程度不同,常用的有欧拉法、中点法和四阶龙格库塔法等,OpenVINS和MSCKF_VIO虽然都使用RK4积分,但具体代码实现却有所区别。

    一、MSCKF_VIO RK4积分


    姿态使用JPL四元数表示,MSCKF_VIO姿态不使用RK4积分,而是直接使用Zeroth Order Quaternion Integrator积分器,输入是 t n t_n tn时刻的角速度测量值,得到 t n + Δ t {t_n} + \Delta t tn+Δt t n + Δ t 2 {t_n} + \frac{\Delta t}{2} tn+2Δt时刻的姿态,
    ω = ω m t n − b g w b q t n + Δ t = [ ω ∣ ω ∣ sin ⁡ ( ∣ ω ∣ 2 Δ t ) cos ⁡ ( ∣ ω ∣ 2 Δ t ) ] ⊗ w b q t n = ( cos ⁡ ( ∣ ω ∣ 2 Δ t ) ⋅ I 4 × 4 + 1 ∣ ω ∣ sin ⁡ ( ∣ ω ∣ 2 Δ t ) ⋅ Ω ( ω ) ) w b q t n w b q t n + Δ t 2 = [ ω ∣ ω ∣ sin ⁡ ( ∣ ω ∣ 4 Δ t ) cos ⁡ ( ∣ ω ∣ 4 Δ t ) ] ⊗ w b q t n = ( cos ⁡ ( ∣ ω ∣ 4 Δ t ) ⋅ I 4 × 4 + 1 ∣ ω ∣ sin ⁡ ( ∣ ω ∣ 4 Δ t ) ⋅ Ω ( ω ) ) w b q t n

    ω=ωmtnbgwbqtn+Δt=[ω|ω|sin(|ω|2Δt)cos(|ω|2Δt)]wbqtn=(cos(|ω|2Δt)I4×4+1|ω|sin(|ω|2Δt)Ω(ω))wbqtnwbqtn+Δt2=[ω|ω|sin(|ω|4Δt)cos(|ω|4Δt)]wbqtn=(cos(|ω|4Δt)I4×4+1|ω|sin(|ω|4Δt)Ω(ω))wbqtn" role="presentation">ω=ωmtnbgwbqtn+Δt=[ω|ω|sin(|ω|2Δt)cos(|ω|2Δt)]wbqtn=(cos(|ω|2Δt)I4×4+1|ω|sin(|ω|2Δt)Ω(ω))wbqtnwbqtn+Δt2=[ω|ω|sin(|ω|4Δt)cos(|ω|4Δt)]wbqtn=(cos(|ω|4Δt)I4×4+1|ω|sin(|ω|4Δt)Ω(ω))wbqtn
    ωwbqtn+Δtwbqtn+2Δt=ωmtnbg= ωωsin(2ωΔt)cos(2ωΔt) wbqtn=(cos(2ωΔt)I4×4+ω1sin(2ωΔt)Ω(ω))wbqtn= ωωsin(4ωΔt)cos(4ωΔt) wbqtn=(cos(4ωΔt)I4×4+ω1sin(4ωΔt)Ω(ω))wbqtn

    输入 t n t_n tn时刻的加速度测量值,对位置和速度进行RK4积分
    v 0 = v t n k 1 = [ p ˙ 1 v ˙ 1 ] = [ v 0 R { w b q t n } ⊤ ( a m t n − b a ) + g ] k 2 = [ p ˙ 2 v ˙ 2 ] = [ v 0 + Δ t 2 v ˙ 1 R { w b q t n + Δ t 2 } ⊤ ( a m t n − b a ) + g ] k 3 = [ p ˙ 3 v ˙ 3 ] = [ v 0 + Δ t 2 v ˙ 2 R { w b q t n + Δ t 2 } ⊤ ( a m t n − b a ) + g ] k 4 = [ p ˙ 4 v ˙ 4 ] = [ v 0 + Δ t v ˙ 3 R { w b q t n + Δ t } ⊤ ( a m t n − b a ) + g ]

    v0=vtnk1=[p˙1v˙1]=[v0R{wbqtn}(amtnba)+g]k2=[p˙2v˙2]=[v0+Δt2v˙1R{wbqtn+Δt2}(amtnba)+g]k3=[p˙3v˙3]=[v0+Δt2v˙2R{wbqtn+Δt2}(amtnba)+g]k4=[p˙4v˙4]=[v0+Δtv˙3R{wbqtn+Δt}(amtnba)+g]" role="presentation" style="position: relative;">v0=vtnk1=[p˙1v˙1]=[v0R{wbqtn}(amtnba)+g]k2=[p˙2v˙2]=[v0+Δt2v˙1R{wbqtn+Δt2}(amtnba)+g]k3=[p˙3v˙3]=[v0+Δt2v˙2R{wbqtn+Δt2}(amtnba)+g]k4=[p˙4v˙4]=[v0+Δtv˙3R{wbqtn+Δt}(amtnba)+g]
    v0k1k2k3k4=vtn=[p˙1v˙1]=[v0R{wbqtn}(amtnba)+g]=[p˙2v˙2]=[v0+2Δtv˙1R{wbqtn+2Δt}(amtnba)+g]=[p˙3v˙3]=[v0+2Δtv˙2R{wbqtn+2Δt}(amtnba)+g]=[p˙4v˙4]=[v0+Δtv˙3R{wbqtn+Δt}(amtnba)+g]

    [ q t n + Δ t p t n + Δ t v t n + Δ t ] = [ w b q t n + Δ t p t n + Δ t 6 ( p ˙ 1 + 2 p ˙ 2 + 2 p ˙ 3 + p ˙ 4 ) v t n + Δ t 6 ( v ˙ 1 + 2 v ˙ 2 + 2 v ˙ 3 + v ˙ 4 ) ]

    [qtn+Δtptn+Δtvtn+Δt]" role="presentation" style="position: relative;">[qtn+Δtptn+Δtvtn+Δt]
    =
    [wbqtn+Δtptn+Δt6(p˙1+2p˙2+2p˙3+p˙4)vtn+Δt6(v˙1+2v˙2+2v˙3+v˙4)]" role="presentation" style="position: relative;">[wbqtn+Δtptn+Δt6(p˙1+2p˙2+2p˙3+p˙4)vtn+Δt6(v˙1+2v˙2+2v˙3+v˙4)]
    qtn+Δtptn+Δtvtn+Δt = wbqtn+Δtptn+6Δt(p˙1+2p˙2+2p˙3+p˙4)vtn+6Δt(v˙1+2v˙2+2v˙3+v˙4)

    二、OpenVINS RK4积分


    输入 t n t_n tn t n + 1 t_{n+1} tn+1时刻的角速度和加速度测量值,计算角加速度和加加速度(jerk)
    α = ( ω m t n + 1 − b g ) − ( ω m t n − b g ) Δ t j = ( a m t n + 1 − b a ) − ( a m t n − b a ) Δ t \boldsymbol{\alpha} = \frac{(\boldsymbol{\omega}_{m_{t_{n+1}}} - \mathbf{b}_g) - (\boldsymbol{\omega}_{m_{t_{n}}} - \mathbf{b}_g)}{\Delta t} \\ \mathbf{j} = \frac{(\mathbf{a}_{m_{t_{n+1}}} - \mathbf{b}_a) - (\mathbf{a}_{m_{t_{n}}} - \mathbf{b}_a)}{\Delta t} \\ α=Δt(ωmtn+1bg)(ωmtnbg)j=Δt(amtn+1ba)(amtnba)

    姿态使用JPL四元数表示,姿态积分时有一个trick,积分并不是从 t n t_n tn时刻的姿态开始的,而是从0姿态开始
    v 0 = v t n q 0 = w b q t n Δ q 0 = [ 0 0 0 1 ] k 1 = [ Δ q ˙ 1 p ˙ 1 v ˙ 1 ] = [ 1 2 Ω ( ω m t n − b g ) Δ q 0 v 0 R { Δ q 0 ⊗ q 0 } ⊤ ( a m t n − b a ) − g ] Δ q 1 = norm ( Δ q 0 + Δ t 2 Δ q ˙ 1 ) k 2 = [ Δ q ˙ 2 p ˙ 2 v ˙ 2 ] = [ 1 2 Ω ( ω m t n − b g + Δ t 2 α ) Δ q 1 v 0 + Δ t 2 v ˙ 1 R { Δ q 1 ⊗ q 0 } ⊤ ( a m t n − b a + Δ t 2 j ) − g ] Δ q 2 = norm ( Δ q 0 + Δ t 2 Δ q ˙ 2 ) k 3 = [ Δ q ˙ 3 p ˙ 3 v ˙ 3 ] = [ 1 2 Ω ( ω m t n − b g + Δ t 2 α ) Δ q 2 v 0 + Δ t 2 v ˙ 2 R { Δ q 2 ⊗ q 0 } ⊤ ( a m t n − b a + Δ t 2 j ) − g ] Δ q 3 = norm ( Δ q 0 + Δ t Δ q ˙ 3 ) k 4 = [ Δ q ˙ 4 p ˙ 4 v ˙ 4 ] = [ 1 2 Ω ( ω m t n − b g + Δ t α ) Δ q 3 v 0 + Δ t v ˙ 3 R { Δ q 3 ⊗ q 0 } ⊤ ( a m t n − b a + Δ t j ) − g ]

    v0=vtnq0=wbqtnΔq0=[0001]k1=[Δq˙1p˙1v˙1]=[12Ω(ωmtnbg)Δq0v0R{Δq0q0}(amtnba)g]Δq1=norm(Δq0+Δt2Δq˙1)k2=[Δq˙2p˙2v˙2]=[12Ω(ωmtnbg+Δt2α)Δq1v0+Δt2v˙1R{Δq1q0}(amtnba+Δt2j)g]Δq2=norm(Δq0+Δt2Δq˙2)k3=[Δq˙3p˙3v˙3]=[12Ω(ωmtnbg+Δt2α)Δq2v0+Δt2v˙2R{Δq2q0}(amtnba+Δt2j)g]Δq3=norm(Δq0+ΔtΔq˙3)k4=[Δq˙4p˙4v˙4]=[12Ω(ωmtnbg+Δtα)Δq3v0+Δtv˙3R{Δq3q0}(amtnba+Δtj)g]" role="presentation" style="position: relative;">v0=vtnq0=wbqtnΔq0=[0001]k1=[Δq˙1p˙1v˙1]=[12Ω(ωmtnbg)Δq0v0R{Δq0q0}(amtnba)g]Δq1=norm(Δq0+Δt2Δq˙1)k2=[Δq˙2p˙2v˙2]=[12Ω(ωmtnbg+Δt2α)Δq1v0+Δt2v˙1R{Δq1q0}(amtnba+Δt2j)g]Δq2=norm(Δq0+Δt2Δq˙2)k3=[Δq˙3p˙3v˙3]=[12Ω(ωmtnbg+Δt2α)Δq2v0+Δt2v˙2R{Δq2q0}(amtnba+Δt2j)g]Δq3=norm(Δq0+ΔtΔq˙3)k4=[Δq˙4p˙4v˙4]=[12Ω(ωmtnbg+Δtα)Δq3v0+Δtv˙3R{Δq3q0}(amtnba+Δtj)g]
    v0q0Δq0k1Δq1k2Δq2k3Δq3k4=vtn=wbqtn=[0001]= Δq˙1p˙1v˙1 = 21Ω(ωmtnbg)Δq0v0R{Δq0q0}(amtnba)g =norm(Δq0+2ΔtΔq˙1)= Δq˙2p˙2v˙2 = 21Ω(ωmtnbg+2Δtα)Δq1v0+2Δtv˙1R{Δq1q0}(amtnba+2Δtj)g =norm(Δq0+2ΔtΔq˙2)= Δq˙3p˙3v˙3 = 21Ω(ωmtnbg+2Δtα)Δq2v0+2Δtv˙2R{Δq2q0}(amtnba+2Δtj)g =norm(Δq0+ΔtΔq˙3)= Δq˙4p˙4v˙4 = 21Ω(ωmtnbg+Δtα)Δq3v0+Δtv˙3R{Δq3q0}(amtnba+Δtj)g

    [ q t n + Δ t p t n + Δ t v t n + Δ t ] = [ norm ( Δ q 0 + Δ t 6 ( Δ q ˙ 1 + 2 Δ q ˙ 2 + 2 Δ q ˙ 3 + Δ q ˙ 4 ) ) ⊗ w b q t n p t n + Δ t 6 ( p ˙ 1 + 2 p ˙ 2 + 2 p ˙ 3 + p ˙ 4 ) v t n + Δ t 6 ( v ˙ 1 + 2 v ˙ 2 + 2 v ˙ 3 + v ˙ 4 ) ]

    [qtn+Δtptn+Δtvtn+Δt]" role="presentation" style="position: relative;">[qtn+Δtptn+Δtvtn+Δt]
    =
    [norm(Δq0+Δt6(Δq˙1+2Δq˙2+2Δq˙3+Δq˙4))wbqtnptn+Δt6(p˙1+2p˙2+2p˙3+p˙4)vtn+Δt6(v˙1+2v˙2+2v˙3+v˙4)]" role="presentation" style="position: relative;">[norm(Δq0+Δt6(Δq˙1+2Δq˙2+2Δq˙3+Δq˙4))wbqtnptn+Δt6(p˙1+2p˙2+2p˙3+p˙4)vtn+Δt6(v˙1+2v˙2+2v˙3+v˙4)]
    qtn+Δtptn+Δtvtn+Δt = norm(Δq0+6Δt(Δq˙1+2Δq˙2+2Δq˙3+Δq˙4))wbqtnptn+6Δt(p˙1+2p˙2+2p˙3+p˙4)vtn+6Δt(v˙1+2v˙2+2v˙3+v˙4)


    @leatherwang
    二零二二年九月十二日

  • 相关阅读:
    Docker in Docker原理与实战
    标准库unsafe:带你突破golang中的类型限制
    牛牛的等差数列(思维 + 线段树)
    微信公众号后台管理
    IODE海洋数据门户平台简述
    Spring_IOC
    tcpdump进行IP抓包
    EIP-3664合约研究笔记04--Metacore平台功能分析
    【uniapp】uniapp开发app在线预览pdf文件
    vivo z1换电池笔记
  • 原文地址:https://blog.csdn.net/hzwwpgmwy/article/details/126816415