第4章:ESKF与IMU驱动系统的误差状态运动学1(Error-State Kalman Filter
and IMU-Driven System Error Kinematics
)
Unleashing Robotics: Mastering Quaternion Kinematics with Python - Chapter4(原创系列教程)
第4章:ESKF与IMU驱动系统的误差状态运动学1(Error-State Kalman Filter and IMU-Driven System Error Kinematics)
本系列教程禁止转载,主要是为了有不同见解的同学可以方便联系我,我的邮箱 fanzexuan135@163.com
终于讲到ESKF了,由于本章内容太多,超过blog字数限制,我分开两部分讲解,正文开始:
4.1 为什么要写这一章节
通过前三章的学习,你已经具备了进入这个复杂且最重要内容的基础知识,开始吧。
我们希望使用Hamilton四元数表示空间中的方向或姿态,为一个集成了加速度计和陀螺仪读数(带有bias和噪声)的惯性系统编写误差状态方程。
加速度计和陀螺仪读数通常来自惯性测量单元(IMU)。集成IMU读数会导致推算定位系统,随时间漂移。避免漂移的方法是将这些信息与绝对位置读数(如GPS或视觉)融合。
误差状态卡尔曼滤波器(ESKF)是我们可以用于此目的的工具之一。在卡尔曼滤波范式中,ESKF最显著的优点有:
-
方向误差状态是最小的(即参数数量与自由度相同),避免了过参数化(或冗余)及其导致的协方差矩阵奇异的风险,这通常是由于强加约束而导致的。
-
误差状态系统始终在原点附近操作,因此远离可能的参数奇异性、万向锁问题等,保证了线性化的有效性始终成立。
-
误差状态始终很小,这意味着所有二阶乘积都可以忽略。这使得计算Jacobian矩阵变得非常容易和快速。有些Jacobian矩阵甚至可能是常数或等于可用的状态量。
-
误差动力学是缓慢的,因为所有大信号动力学都已集成到标称状态中。这意味着我们可以以低于预测的频率应用KF校正(这是观察误差的唯一方法)。
4.2 误差状态卡尔曼滤波器解释
在误差状态滤波器公式中,我们讨论真实状态、标称状态和误差状态值,真实状态表示为标称状态和误差状态的合适组合(线性和、四元数乘积或矩阵乘积)。我们认为标称状态是大信号(可以非线性方式积分),而误差状态是小信号(因此可以线性积分并适合线性高斯滤波)。
误差状态滤波器可以解释如下。一方面,高频IMU数据uₘ被集成到标称状态x中。这个标称状态没有考虑噪声项w和其他可能的模型缺陷。因此,它会累积误差。这些误差被收集在误差状态δx中,并用误差状态卡尔曼滤波器(ESKF)估计,这一次纳入了所有噪声和扰动。误差状态由小信号量组成,其演化函数由(时变)线性动态系统正确定义,其动态、控制和测量矩阵是根据标称状态的值计算的。与标称状态的积分并行,ESKF预测误差状态的高斯估计。它只预测,因为目前没有其他测量信息可用于校正这些估计。滤波器校正是在到达IMU以外的信息(例如GPS、视觉等)时执行的,这些信息能够使误差可观察,并且通常发生在比积分阶段低得多的频率。这种校正提供了误差状态的后验高斯估计。在此之后,将误差状态的均值注入标称状态,然后重置为零。误差状态的协方差矩阵被方便地更新以反映这种重置。系统就这样永远运行下去。
下面我们通过一个具体的四足机器人的应用案例,来说明ESKF在实际系统中的应用。这个案例来自Bledt等人2018年IROS的论文[1],他们提出了一种使用IMU和腿部运动学的四足机器人状态估计方法。
该方法的核心是一个ESKF,其中IMU提供标称状态的预测,而腿部运动学提供位置和速度的观测值用于校正。具体来说:
-
标称状态包括机器人的位置、速度、方向(四元数)、IMU偏差。它通过积分IMU数据来传播。
-
误差状态包括上述标称状态的误差。它在每个IMU积分步骤中也被传播,但使用线性化的动力学。
-
当一条腿着地时,根据腿部运动学计算的足端位置,可以估计出机器人的位置和速度。这个信息被用作ESKF的观测值来校正误差状态。
-
校正后的误差状态被注入标称状态,并重置误差状态及其协方差。
下面是一个简化版的Python代码,展示了这个过程:
# 标称状态传播
def predict_nominal_state(nominal_state, imu_data, dt):
# 使用IMU数据和积分时间步长dt传播标称状态
# ...
# 误差状态传播
def predict_error_state(nominal_state, error_state_cov, dt):
# 计算误差状态的线性化动力学矩阵F和G
# 传播误差状态协方差: P = F * P * F.T + G * Q * G.T
# ...
return error_state_cov
# ESKF校正步骤
def correct_eskf(nominal_state, error_state_cov, leg_odometry):
# 计算观测值和观测矩阵H
# 计算卡尔曼增益: K = P * H.T * (H * P * H.T + R)^-1
# 更新误差状态: dx = K * (leg_odometry - predicted_odometry)
# 注入误差状态到标称状态: nominal_state += dx
# 更新误差状态协方差: P = (I - K * H) * P
# 重置误差状态: dx = 0
# ...
return nominal_state, error_state_cov
# 主循环
while True:
# IMU积分
predict_nominal_state(nominal_state, imu_data, dt)
error_state_cov = predict_error_state(nominal_state, error_state_cov, dt)
# 如果有腿部里程计信息,执行ESKF校正
if leg_odometry_available:
nominal_state, error_state_cov = correct_eskf(nominal_state, error_state_cov, leg_odometry)
这个例子展示了如何使用ESKF融合IMU和腿部里程计信息,以估计四足机器人的状态。这部分细节不懂没关系,下面小节会详细介绍,主要是让你了解ESKF的核心思想:使用IMU进行标称状态预测,使用其他传感器信息校正误差状态,然后将误差注入标称状态并重置。
ESKF是一种强大的技术,可以融合IMU和其他传感器,以获得准确和鲁棒的状态估计。它在足式机器人和其他移动机器人中得到了广泛的应用。掌握ESKF的原理和实现,对于从事这些机器人的状态估计工作非常重要。
参考文献:
[1] Bledt, Gerardo, et al. “Contact model fusion for event-based locomotion in unstructured terrains.” 2018 IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS). IEEE, 2018.
4.3 连续时间的系统运动学
所有涉及的变量定义总结在表3中。关于约定,有两个重要的决定值得一提:
- 角速率 ω \boldsymbol{\omega} ω 是相对于标称四元数局部定义的。这允许我们直接使用陀螺仪测量值 ω m \boldsymbol{\omega}_m ωm,因为它们提供机体参考的角速率。
- 角度误差 δ θ \delta \boldsymbol{\theta} δθ 也是相对于标称方向局部定义的。这不一定是最佳的处理方式,但它对应于大多数IMU集成工作中的选择——我们可以称之为经典方法。有证据表明[2],全局定义的角度误差具有更好的性质。这也将在本文的第7节中探讨,但这里的大部分发展、示例和算法都基于这个局部定义的角度误差。
以下是所有变量的定义表:
真实值 | 标称值 | 误差值 | 组合关系 | 测量值 | 噪声 | |
---|---|---|---|---|---|---|
完整状态 | x t \mathbf{x}_t xt | x \mathbf{x} x | δ x \delta \mathbf{x} δx | x t = x ⊕ δ x \mathbf{x}_t = \mathbf{x} \oplus \delta \mathbf{x} xt=x⊕δx | ||
位置 | p t \mathbf{p}_t pt | p \mathbf{p} p | δ p \delta \mathbf{p} δp | p t = p + δ p \mathbf{p}_t = \mathbf{p} + \delta \mathbf{p} pt=p+δp | ||
速度 | v t \mathbf{v}_t vt | v \mathbf{v} v | δ v \delta \mathbf{v} δv | v t = v + δ v \mathbf{v}_t = \mathbf{v} + \delta \mathbf{v} vt=v+δv | ||
四元数 | q t \mathbf{q}_t qt | q \mathbf{q} q | δ q \delta \mathbf{q} δq | q t = q ⊗ δ q \mathbf{q}_t = \mathbf{q} \otimes \delta \mathbf{q} qt=q⊗δq | ||
旋转矩阵 | R t \mathbf{R}_t Rt | R \mathbf{R} R | δ R \delta \mathbf{R} δR | R t = R δ R \mathbf{R}_t = \mathbf{R} \delta \mathbf{R} Rt=RδR | ||
角度向量 | δ θ \delta \boldsymbol{\theta} δθ | δ q = e δ θ / 2 , δ R = e [ δ θ ] × \delta \mathbf{q} = e^{\delta \boldsymbol{\theta}/2}, \delta \mathbf{R} = e^{[\delta \boldsymbol{\theta}]_\times} δq=eδθ/2,δR=e[δθ]× | ||||
加速度计偏差 | a b , t \mathbf{a}_{b,t} ab,t | a b \mathbf{a}_b ab | δ a b \delta \mathbf{a}_b δab | a b , t = a b + δ a b \mathbf{a}_{b,t} = \mathbf{a}_b + \delta \mathbf{a}_b ab,t=ab+δab | a w \mathbf{a}_w aw | |
陀螺仪偏差 | ω b , t \boldsymbol{\omega}_{b,t} ωb,t | ω b \boldsymbol{\omega}_b ωb | δ ω b \delta \boldsymbol{\omega}_b δωb | ω b , t = ω b + δ ω b \boldsymbol{\omega}_{b,t} = \boldsymbol{\omega}_b + \delta \boldsymbol{\omega}_b ωb,t=ωb+δωb | ω w \boldsymbol{\omega}_w ωw | |
重力向量 | g t \mathbf{g}_t gt | g \mathbf{g} g | δ g \delta \mathbf{g} δg | g t = g + δ g \mathbf{g}_t = \mathbf{g} + \delta \mathbf{g} gt=g+δg | ||
加速度 | a t \mathbf{a}_t at | a m \mathbf{a}_m am | a n \mathbf{a}_n an | |||
角速率 | ω t \boldsymbol{\omega}_t ωt | ω m \boldsymbol{\omega}_m ωm | ω n \boldsymbol{\omega}_n ωn |
4.3.1 真实状态的运动学
真实的运动学方程为:
p ˙ t = v t v ˙ t = a t q ˙ t = 1 2 q t ⊗ ω t a ˙ b , t = a w ω ˙ b , t = ω w g ˙ t = 0 \begin{aligned} \dot{\mathbf{p}}_t &= \mathbf{v}_t \\ \dot{\mathbf{v}}_t &= \mathbf{a}_t \\ \dot{\mathbf{q}}_t &= \frac{1}{2} \mathbf{q}_t \otimes \boldsymbol{\omega}_t \\ \dot{\mathbf{a}}_{b,t} &= \mathbf{a}_w \\ \dot{\boldsymbol{\omega}}_{b,t} &= \boldsymbol{\omega}_w \\ \dot{\mathbf{g}}_t &= \mathbf{0} \end{aligned} p˙tv˙tq˙ta˙b,tω˙b,tg˙t=vt=at=21qt⊗ωt=aw=ωw=0
这里,真实加速度 a t \mathbf{a}_t at 和角速率 ω t \boldsymbol{\omega}_t ωt 是通过IMU以机体坐标系下的带噪声的传感器读数 a m \mathbf{a}_m am 和 ω m \boldsymbol{\omega}_m ωm 的形式获得的,即
a m = R t ⊤ ( a t − g t ) + a b , t + a n ω m = ω t + ω b , t + ω n \begin{aligned} \mathbf{a}_m &= \mathbf{R}_t^\top (\mathbf{a}_t - \mathbf{g}_t) + \mathbf{a}_{b,t} + \mathbf{a}_n \\ \boldsymbol{\omega}_m &= \boldsymbol{\omega}_t + \boldsymbol{\omega}_{b,t} + \boldsymbol{\omega}_n \end{aligned} amωm=Rt⊤(at−gt)+ab,t+an=ωt+ωb,t+ωn
其中 R t = R { q t } \mathbf{R}_t = \mathbf{R}\{\mathbf{q}_t\} Rt=R{qt}。有了这些,真实值可以分离出来:
a t = R t ( a m − a b , t − a n ) + g t ω t = ω m − ω b , t − ω n \begin{aligned} \mathbf{a}_t &= \mathbf{R}_t (\mathbf{a}_m - \mathbf{a}_{b,t} - \mathbf{a}_n) + \mathbf{g}_t \\ \boldsymbol{\omega}_t &= \boldsymbol{\omega}_m - \boldsymbol{\omega}_{b,t} - \boldsymbol{\omega}_n \end{aligned} atωt=Rt(am−ab,t−an)+gt=ωm−ωb,t−ωn
代入上面的式子,得到运动学系统:
p ˙ t = v t v ˙ t = R t ( a m − a b , t − a n ) + g t q ˙ t = 1 2 q t ⊗ ( ω m − ω b , t − ω n ) a ˙ b , t = a w ω ˙ b , t = ω w g ˙ t = 0 \begin{aligned} \dot{\mathbf{p}}_t &= \mathbf{v}_t \\ \dot{\mathbf{v}}_t &= \mathbf{R}_t (\mathbf{a}_m - \mathbf{a}_{b,t} - \mathbf{a}_n) + \mathbf{g}_t \\ \dot{\mathbf{q}}_t &= \frac{1}{2} \mathbf{q}_t \otimes (\boldsymbol{\omega}_m - \boldsymbol{\omega}_{b,t} - \boldsymbol{\omega}_n) \\ \dot{\mathbf{a}}_{b,t} &= \mathbf{a}_w \\ \dot{\boldsymbol{\omega}}_{b,t} &= \boldsymbol{\omega}_w \\ \dot{\mathbf{g}}_t &= \mathbf{0} \end{aligned} p˙tv˙tq˙ta˙b,tω˙b,tg˙t=vt=Rt(am−ab,t−an)+gt=21qt⊗(ωm−ωb,t−ωn)=aw=ωw=0
我们可以将其表示为 x ˙ t = f t ( x t , u , w ) \dot{\mathbf{x}}_t = \mathbf{f}_t(\mathbf{x}_t, \mathbf{u}, \mathbf{w}) x˙t=ft(xt,u,w)。这个系统具有状态 x t \mathbf{x}_t xt,由IMU带噪声读数 u m \mathbf{u}_m um 驱动,并受白高斯噪声 w \mathbf{w} w 的扰动,它们都定义为
x t = [ p t v t q t a b , t ω b , t g t ] , u = [ a m − a n ω m − ω n ] , w = [ a w ω w ] \mathbf{x}_t = \begin{bmatrix} \mathbf{p}_t \\ \mathbf{v}_t \\ \mathbf{q}_t \\ \mathbf{a}_{b,t} \\ \boldsymbol{\omega}_{b,t} \\ \mathbf{g}_t \end{bmatrix}, \quad \mathbf{u} = \begin{bmatrix} \mathbf{a}_m - \mathbf{a}_n \\ \boldsymbol{\omega}_m - \boldsymbol{\omega}_n \end{bmatrix}, \quad \mathbf{w} = \begin{bmatrix} \mathbf{a}_w \\ \boldsymbol{\omega}_w \end{bmatrix} xt= ptvtqtab,tωb,tgt ,u=[am−anωm−ωn],w=[awωw]
需要注意的是,在上述公式中,重力向量 g t \mathbf{g}_t gt 将由滤波器估计。它有一个恒定的演化方程 g ˙ t = 0 \dot{\mathbf{g}}_t = \mathbf{0} g˙t=0,这对应于已知恒定的量。该系统从固定且任意已知的初始方向 q t ( t = 0 ) = q 0 \mathbf{q}_t(t=0)=\mathbf{q}_0 qt(t=0)=q0 开始,它通常不在水平面内,因此初始重力向量通常是未知的。为简单起见,通常取 q 0 = ( 1 , 0 , 0 , 0 ) \mathbf{q}_0=(1,0,0,0) q0=(1,0,0,0),因此 R 0 = R { q 0 } = I \mathbf{R}_0=\mathbf{R}\{\mathbf{q}_0\}=\mathbf{I} R0=R{q0}=I。我们估计在 q 0 \mathbf{q}_0 q0 帧中表示的 g t \mathbf{g}_t gt,而不是在水平帧中表示的 q t \mathbf{q}_t qt,这样方向的初始不确定性就转移到了重力方向的初始不确定性上。我们这样做是为了提高线性度:事实上,方程 v ˙ t = R t ( a m − a b , t − a n ) + g t \dot{\mathbf{v}}_t = \mathbf{R}_t (\mathbf{a}_m - \mathbf{a}_{b,t} - \mathbf{a}_n) + \mathbf{g}_t v˙t=Rt(am−ab,t−an)+gt 现在在 g t \mathbf{g}_t gt 中是线性的, g t \mathbf{g}_t gt 携带了所有的不确定性,而初始方向 q 0 \mathbf{q}_0 q0 是已知的,没有不确定性,因此 q t \mathbf{q}_t qt 从无不确定性开始。一旦估计出重力向量,就可以恢复水平面,并且如果需要,可以重新调整整个状态和恢复的运动轨迹以反映估计的水平面。参见[3]了解进一步的理由。当然这是可选的,读者可以自由地从系统中删除所有与重力相关的方程,并采用更经典的方法,即考虑 g ≡ ( 0 , 0 , − 9.8 x x ) \mathbf{g} \equiv (0,0,−9.8xx) g≡(0,0,−9.8xx),其中xx是实验现场重力向量的适当小数位,以及不确定的初始方向 q 0 \mathbf{q}_0 q0。
4.3.2 标称状态运动学
标称状态运动学对应于没有噪声或扰动的建模系统,
p ˙ = v v ˙ = R ( a m − a b ) + g q ˙ = 1 2 q ⊗ ( ω m − ω b ) a ˙ b = 0 ω ˙ b = 0 g ˙ = 0 \begin{aligned} \dot{\mathbf{p}} &= \mathbf{v} \\ \dot{\mathbf{v}} &= \mathbf{R}(\mathbf{a}_m - \mathbf{a}_b) + \mathbf{g} \\ \dot{\mathbf{q}} &= \frac{1}{2} \mathbf{q} \otimes (\boldsymbol{\omega}_m - \boldsymbol{\omega}_b) \\ \dot{\mathbf{a}}_b &= \mathbf{0} \\ \dot{\boldsymbol{\omega}}_b &= \mathbf{0} \\ \dot{\mathbf{g}} &= \mathbf{0} \end{aligned} p˙v˙q˙a˙bω˙bg˙=v=R(am−ab)+g=21q⊗(ωm−ωb)=0=0=0
4.3.3 误差状态运动学
目标是确定误差状态的线性化动力学。对于每个状态方程,我们写出其组合关系(表3中),求解误差状态并简化所有二阶无穷小量。我们在这里给出完整的误差状态动态系统,然后进行评论和证明。
δ p ˙ = δ v δ v ˙ = − R [ a m − a b ] × δ θ − R δ a b + δ g − R a n δ θ ˙ = − [ ω m − ω b ] × δ θ − δ ω b − ω n δ a ˙ b = a w δ ω ˙ b = ω w δ g ˙ = 0 \begin{aligned} \delta\dot{\mathbf{p}} &= \delta\mathbf{v} \\ \delta\dot{\mathbf{v}} &= -\mathbf{R}[\mathbf{a}_m - \mathbf{a}_b]_\times \delta\boldsymbol{\theta} - \mathbf{R}\delta\mathbf{a}_b + \delta\mathbf{g} - \mathbf{R}\mathbf{a}_n \\ \delta\dot{\boldsymbol{\theta}} &= -[\boldsymbol{\omega}_m - \boldsymbol{\omega}_b]_\times \delta\boldsymbol{\theta} - \delta\boldsymbol{\omega}_b - \boldsymbol{\omega}_n \\ \delta\dot{\mathbf{a}}_b &= \mathbf{a}_w \\ \delta\dot{\boldsymbol{\omega}}_b &= \boldsymbol{\omega}_w \\ \delta\dot{\mathbf{g}} &= \mathbf{0} \end{aligned} δp˙δv˙δθ˙δa˙bδω˙bδg˙=δv=−R[am−ab]×δθ−Rδab+δg−Ran=−[ωm−ωb]×δθ−δωb−ωn=aw=ωw=0
位置、两个偏差和重力误差的方程 δ p ˙ = δ v \delta\dot{\mathbf{p}} = \delta\mathbf{v} δp˙=δv, δ a ˙ b = a w \delta\dot{\mathbf{a}}_b = \mathbf{a}_w δa˙b=aw, δ ω ˙ b = ω w \delta\dot{\boldsymbol{\omega}}_b = \boldsymbol{\omega}_w δω˙b=ωw 和 δ g ˙ = 0 \delta\dot{\mathbf{g}} = \mathbf{0} δg˙=0 是从线性方程导出的,它们的误差状态动力学是微不足道的。
例如,考虑真实位置方程 p ˙ t = v t \dot{\mathbf{p}}_t = \mathbf{v}_t p˙t=vt 和标称位置方程 p ˙ = v \dot{\mathbf{p}} = \mathbf{v} p˙=v,它们的组合 p t = p + δ p \mathbf{p}_t = \mathbf{p} + \delta \mathbf{p} pt=p+δp 来自表格,求解 δ p ˙ \delta\dot{\mathbf{p}} δp˙ 以得到 δ p ˙ = δ v \delta\dot{\mathbf{p}} = \delta\mathbf{v} δp˙=δv。
速度和方向误差的方程 δ v ˙ = − R [ a m − a b ] × δ θ − R δ a b + δ g − R a n \delta\dot{\mathbf{v}} = -\mathbf{R}[\mathbf{a}_m - \mathbf{a}_b]_\times \delta\boldsymbol{\theta} - \mathbf{R}\delta\mathbf{a}_b + \delta\mathbf{g} - \mathbf{R}\mathbf{a}_n δv˙=−R[am−ab]×δθ−Rδab+δg−Ran 和 δ θ ˙ = − [ ω m − ω b ] × δ θ − δ ω b − ω n \delta\dot{\boldsymbol{\theta}} = -[\boldsymbol{\omega}_m - \boldsymbol{\omega}_b]_\times \delta\boldsymbol{\theta} - \delta\boldsymbol{\omega}_b - \boldsymbol{\omega}_n δθ˙=−[ωm−ωb]×δθ−δωb−ωn 需要对非线性方程 v ˙ t = R t ( a m − a b , t − a n ) + g t \dot{\mathbf{v}}_t = \mathbf{R}_t (\mathbf{a}_m - \mathbf{a}_{b,t} - \mathbf{a}_n) + \mathbf{g}_t v˙t=Rt(am−ab,t−an)+gt 和 q ˙ t = 1 2 q t ⊗ ( ω m − ω b , t − ω n ) \dot{\mathbf{q}}_t = \frac{1}{2} \mathbf{q}_t \otimes (\boldsymbol{\omega}_m - \boldsymbol{\omega}_{b,t} - \boldsymbol{\omega}_n) q˙t=21qt⊗(ωm−ωb,t−ωn) 进行一些非平凡的处理,以获得线性化的动力学。它们的证明在下面两节中给出。
方程 δ v ˙ = − R [ a m − a b ] × δ θ − R δ a b + δ g − R a n \delta\dot{\mathbf{v}} = -\mathbf{R}[\mathbf{a}_m - \mathbf{a}_b]_\times \delta\boldsymbol{\theta} - \mathbf{R}\delta\mathbf{a}_b + \delta\mathbf{g} - \mathbf{R}\mathbf{a}_n δv˙=−R[am−ab]×δθ−Rδab+δg−Ran:线性速度误差。 我们希望确定 δ v ˙ \delta\dot{\mathbf{v}} δv˙,即速度误差的动力学。我们从以下关系开始
R t = R ( I + [ δ θ ] × ) + O ( ∥ δ θ ∥ 2 ) v ˙ = R a B + g \begin{aligned} \mathbf{R}_t &= \mathbf{R}(\mathbf{I} + [\delta\boldsymbol{\theta}]_\times) + \mathcal{O}(\|\delta\boldsymbol{\theta}\|^2) \\ \dot{\mathbf{v}} &= \mathbf{R}\mathbf{a}_B + \mathbf{g} \end{aligned} Rtv˙=R(I+[δθ]×)+O(∥δθ∥2)=RaB+g
其中第一个方程是 R t \mathbf{R}_t Rt 的小信号近似,在第二个方程中我们重写了 v ˙ = R ( a m − a b ) + g \dot{\mathbf{v}} = \mathbf{R}(\mathbf{a}_m - \mathbf{a}_b) + \mathbf{g} v˙=R(am−ab)+g,但引入了 a B \mathbf{a}_B aB 和 δ a B \delta \mathbf{a}_B δaB,定义为机体坐标系中的大信号和小信号加速度,
a B ≜ a m − a b δ a B ≜ − δ a b − a n \begin{aligned} \mathbf{a}_B &\triangleq \mathbf{a}_m - \mathbf{a}_b \\ \delta \mathbf{a}_B &\triangleq -\delta \mathbf{a}_b - \mathbf{a}_n \end{aligned} aBδaB≜am−ab≜−δab−an
这样我们就可以将惯性坐标系中的真实加速度写成大小信号项的组合,
a t = R t ( a B + δ a B ) + g + δ g \mathbf{a}_t = \mathbf{R}_t(\mathbf{a}_B + \delta \mathbf{a}_B) + \mathbf{g} + \delta \mathbf{g} at=Rt(aB+δaB)+g+δg
我们通过以两种不同形式(左右两边的发展)写出 v ˙ t \dot{\mathbf{v}}_t v˙t 的表达式 v ˙ t = R t ( a m − a b , t − a n ) + g t \dot{\mathbf{v}}_t = \mathbf{R}_t (\mathbf{a}_m - \mathbf{a}_{b,t} - \mathbf{a}_n) + \mathbf{g}_t v˙t=Rt(am−ab,t−an)+gt 来进行处理,其中 O ( ∥ δ θ ∥ 2 ) \mathcal{O}(\|\delta\boldsymbol{\theta}\|^2) O(∥δθ∥2) 项已被忽略,
v ˙ + δ v ˙ = v ˙ t = R ( I + [ δ θ ] × ) ( a B + δ a B ) + g + δ g R a B + g + δ v ˙ = R a B + R δ a B + R [ δ θ ] × a B + R [ δ θ ] × δ a B + g + δ g \begin{aligned} \dot{\mathbf{v}} + \delta\dot{\mathbf{v}} &= \dot{\mathbf{v}}_t = \mathbf{R}(\mathbf{I} + [\delta\boldsymbol{\theta}]_\times)(\mathbf{a}_B + \delta \mathbf{a}_B) + \mathbf{g} + \delta \mathbf{g} \\ \mathbf{R}\mathbf{a}_B + \mathbf{g} + \delta\dot{\mathbf{v}} &= \mathbf{R}\mathbf{a}_B + \mathbf{R}\delta \mathbf{a}_B + \mathbf{R}[\delta\boldsymbol{\theta}]_\times \mathbf{a}_B + \mathbf{R}[\delta\boldsymbol{\theta}]_\times \delta \mathbf{a}_B + \mathbf{g} + \delta \mathbf{g} \end{aligned} v˙+δv˙RaB+g+δv˙=v˙t=R(I+[δθ]×)(aB+δaB)+g+δg=RaB+RδaB+R[δθ]×aB+R[δθ]×δaB+g+δg
这导致了从左右两边移除 R a B + g \mathbf{R}\mathbf{a}_B + \mathbf{g} RaB+g 后的结果
δ v ˙ = R δ a B + R [ δ θ ] × a B + R [ δ θ ] × δ a B + δ g \delta\dot{\mathbf{v}} = \mathbf{R}\delta \mathbf{a}_B + \mathbf{R}[\delta\boldsymbol{\theta}]_\times \mathbf{a}_B + \mathbf{R}[\delta\boldsymbol{\theta}]_\times \delta \mathbf{a}_B + \delta \mathbf{g} δv˙=RδaB+R[δθ]×aB+R[δθ]×δaB+δg
消去二阶项并重组一些叉积(利用 [ a ] × b = − [ b ] × a [\mathbf{a}]_\times \mathbf{b} = -[\mathbf{b}]_\times \mathbf{a} [a]×b=−[b]×a),我们得到
δ v ˙ = R δ a B − R [ a B ] × δ θ + δ g \delta\dot{\mathbf{v}} = \mathbf{R}\delta \mathbf{a}_B - \mathbf{R}[\mathbf{a}_B]_\times \delta\boldsymbol{\theta} + \delta \mathbf{g} δv˙=RδaB−R[aB]×δθ+δg
然后,回想 a B ≜ a m − a b \mathbf{a}_B \triangleq \mathbf{a}_m - \mathbf{a}_b aB≜am−ab 和 δ a B ≜ − δ a b − a n \delta \mathbf{a}_B \triangleq -\delta \mathbf{a}_b - \mathbf{a}_n δaB≜−δab−an,
δ v ˙ = R ( − [ a m − a b ] × δ θ − δ a b − a n ) + δ g \delta\dot{\mathbf{v}} = \mathbf{R}(-[\mathbf{a}_m - \mathbf{a}_b]_\times \delta\boldsymbol{\theta} - \delta \mathbf{a}_b - \mathbf{a}_n) + \delta \mathbf{g} δv˙=R(−[am−ab]×δθ−δab−an)+δg
经过适当的重新整理,导致线性速度误差的动力学,
δ v ˙ = − R [ a m − a b ] × δ θ − R d e l t a a b + δ g − R a n \delta\dot{\mathbf{v}} = -\mathbf{R}[\mathbf{a}_m - \mathbf{a}_b]_\times \delta\boldsymbol{\theta} - \mathbf{R}\\delta \mathbf{a}_b + \delta \mathbf{g} - \mathbf{R}\mathbf{a}_n δv˙=−R[am−ab]×δθ−Rdeltaab+δg−Ran
为了进一步清理这个表达式,我们通常可以假设加速度计噪声是白的、不相关的和各向同性的,
E [ a n ] = 0 E [ a n a n ⊤ ] = σ a 2 I \begin{aligned} \mathbb{E}[\mathbf{a}_n] &= \mathbf{0} \\ \mathbb{E}[\mathbf{a}_n\mathbf{a}_n^\top] &= \sigma_a^2\mathbf{I} \end{aligned} E[an]E[anan⊤]=0=σa2I
即协方差椭球是以原点为中心的球体,这意味着它的均值和协方差矩阵在旋转下是不变的(证明: E [ R a n ] = R E [ a n ] = 0 \mathbb{E}[\mathbf{R}\mathbf{a}_n] = \mathbf{R}\mathbb{E}[\mathbf{a}_n] = \mathbf{0} E[Ran]=RE[an]=0 和 E [ ( R a n ) ( R a n ) ⊤ ] = R E [ a n a n ⊤ ] R ⊤ = R σ a 2 I R ⊤ = σ a 2 I \mathbb{E}[(\mathbf{R}\mathbf{a}_n)(\mathbf{R}\mathbf{a}_n)^\top] = \mathbf{R}\mathbb{E}[\mathbf{a}_n\mathbf{a}_n^\top]\mathbf{R}^\top = \mathbf{R}\sigma_a^2\mathbf{I}\mathbf{R}^\top = \sigma_a^2\mathbf{I} E[(Ran)(Ran)⊤]=RE[anan⊤]R⊤=Rσa2IR⊤=σa2I)。然后我们可以重新定义加速度计噪声向量,绝对不会产生任何后果,根据
a n ← R a n \mathbf{a}_n \leftarrow \mathbf{R}\mathbf{a}_n an←Ran
这给出了
δ v ˙ = − R [ a m − a b ] × δ θ − R δ a b + δ g − a n \delta\dot{\mathbf{v}} = -\mathbf{R}[\mathbf{a}_m - \mathbf{a}_b]_\times \delta\boldsymbol{\theta} - \mathbf{R}\delta \mathbf{a}_b + \delta \mathbf{g} - \mathbf{a}_n δv˙=−R[am−ab]×δθ−Rδab+δg−an
方程 δ θ ˙ = − [ ω m − ω b ] × δ θ − δ ω b − ω n \delta\dot{\boldsymbol{\theta}} = -[\boldsymbol{\omega}_m - \boldsymbol{\omega}_b]_\times \delta\boldsymbol{\theta} - \delta\boldsymbol{\omega}_b - \boldsymbol{\omega}_n δθ˙=−[ωm−ωb]×δθ−δωb−ωn:方向误差。 我们希望确定 δ θ ˙ \delta\dot{\boldsymbol{\theta}} δθ˙,即角度误差的动力学。我们从以下关系开始
q ˙ t = 1 2 q t ⊗ ω t q ˙ = 1 2 q ⊗ ω \begin{aligned} \dot{\mathbf{q}}_t &= \frac{1}{2} \mathbf{q}_t \otimes \boldsymbol{\omega}_t \\ \dot{\mathbf{q}} &= \frac{1}{2} \mathbf{q} \otimes \boldsymbol{\omega} \end{aligned} q˙tq˙=21qt⊗ωt=21q⊗ω
它们分别是四元数导数的真实定义和标称定义。
与加速度一样,为了清晰起见,我们将角速率中的大小信号项分组,
ω ≜ ω m − ω b δ ω ≜ − δ ω b − ω n \begin{aligned} \boldsymbol{\omega} &\triangleq \boldsymbol{\omega}_m - \boldsymbol{\omega}_b \\ \delta \boldsymbol{\omega} &\triangleq -\delta \boldsymbol{\omega}_b - \boldsymbol{\omega}_n \end{aligned} ωδω≜ωm−ωb≜−δωb−ωn
这样 ω t \boldsymbol{\omega}_t ωt 就可以写成一个标称部分和一个误差部分,
ω t = ω + δ ω \boldsymbol{\omega}_t = \boldsymbol{\omega} + \delta \boldsymbol{\omega} ωt=ω+δω
我们通过两种不同的方式(左右两边的发展)来计算 q ˙ t \dot{\mathbf{q}}_t q˙t,
( q ⊗ δ q ) ˙ = q ˙ t = 1 2 q t ⊗ ω t q ˙ ⊗ δ q + q ⊗ δ q ˙ = 1 2 q ⊗ δ q ⊗ ω t \begin{aligned} \dot{(\mathbf{q} \otimes \delta \mathbf{q})} &= \dot{\mathbf{q}}_t = \frac{1}{2} \mathbf{q}_t \otimes \boldsymbol{\omega}_t \\ \dot{\mathbf{q}} \otimes \delta \mathbf{q} + \mathbf{q} \otimes \delta\dot{\mathbf{q}} &= \frac{1}{2} \mathbf{q} \otimes \delta \mathbf{q} \otimes \boldsymbol{\omega}_t \end{aligned} (q⊗δq)˙q˙⊗δq+q⊗δq˙=q˙t=21qt⊗ωt=21q⊗δq⊗ωt
简化前导 q \mathbf{q} q 并分离出 δ q ˙ \delta\dot{\mathbf{q}} δq˙,我们得到
p ˙ t = v t v ˙ t = R t ( a m − a b , t − a n ) + g t q ˙ t = 1 2 q t ⊗ ( ω m − ω b , t − ω n ) a ˙ b , t = a w ω ˙ b , t = ω w g ˙ t = 0 \begin{aligned} \dot{\mathbf{p}}_t &= \mathbf{v}_t \\ \dot{\mathbf{v}}_t &= \mathbf{R}_t (\mathbf{a}m - \mathbf{a}{b,t} - \mathbf{a}_n) + \mathbf{g}_t \\ \dot{\mathbf{q}}_t &= \frac{1}{2} \mathbf{q}_t \otimes (\boldsymbol{\omega}m - \boldsymbol{\omega}{b,t} - \boldsymbol{\omega}n) \ \dot{\mathbf{a}}{b,t} &= \mathbf{a}w \ \dot{\boldsymbol{\omega}}{b,t} &= \boldsymbol{\omega}_w \ \dot{\mathbf{g}}_t &= \mathbf{0} \end{aligned} p˙tv˙tq˙t=vt=Rt(am−ab,t−an)+gt=21qt⊗(ωm−ωb,t−ωn) a˙b,t=aw ω˙b,t=ωw g˙t=0
这导致一个标量等式和一个向量等式
0 = δ ω ⊤ δ θ + O ( ∣ δ θ ∣ 2 ) δ θ ˙ = δ ω − [ ω ] × δ θ − 1 2 [ δ ω ] × δ θ + O ( ∥ δ θ ∥ 2 ) \begin{aligned} 0 &= \delta\boldsymbol{\omega}^\top \delta\boldsymbol{\theta} + \mathcal{O}(|\delta\boldsymbol{\theta}|^2) \\ \delta\dot{\boldsymbol{\theta}} &= \delta\boldsymbol{\omega} - [\boldsymbol{\omega}]_\times \delta\boldsymbol{\theta} - \frac{1}{2}[\delta\boldsymbol{\omega}]_\times \delta\boldsymbol{\theta} + \mathcal{O}(\|\delta\boldsymbol{\theta}\|^2) \end{aligned} 0δθ˙=δω⊤δθ+O(∣δθ∣2)=δω−[ω]×δθ−21[δω]×δθ+O(∥δθ∥2)
第一个方程导致 δ ω ⊤ δ θ = O ( ∥ δ θ ∥ 2 ) \delta\boldsymbol{\omega}^\top \delta\boldsymbol{\theta} = \mathcal{O}(\|\delta\boldsymbol{\theta}\|^2) δω⊤δθ=O(∥δθ∥2),它由二阶无穷小量形成,不是很有用。第二个方程在忽略所有二阶项后得出
δ θ ˙ = − [ ω ] × δ θ + δ ω \delta\dot{\boldsymbol{\theta}} = -[\boldsymbol{\omega}]_\times \delta\boldsymbol{\theta} + \delta\boldsymbol{\omega} δθ˙=−[ω]×δθ+δω
最后,回想 δ ω ≜ − δ ω b − ω n \delta \boldsymbol{\omega} \triangleq -\delta \boldsymbol{\omega}_b - \boldsymbol{\omega}_n δω≜−δωb−ωn,我们得到角度误差的线性化动力学,
δ
θ
˙
=
−
[
ω
m
−
ω
b
]
×
δ
θ
−
δ
ω
b
−
ω
n
\delta\dot{\boldsymbol{\theta}} = -[\boldsymbol{\omega}_m - \boldsymbol{\omega}_b]_\times \delta\boldsymbol{\theta} - \delta\boldsymbol{\omega}_b - \boldsymbol{\omega}_n
δθ˙=−[ωm−ωb]×δθ−δωb−ωn
上面使用的符号说明:
- a n \mathbf{a}_n an: 加速度计噪声向量
- E [ ⋅ ] \mathbb{E}[\cdot] E[⋅]: 期望值运算符
- σ a 2 \sigma_a^2 σa2: 加速度计噪声的方差
- I \mathbf{I} I: 单位矩阵
- R \mathbf{R} R: 旋转矩阵
- δ v ˙ \delta\dot{\mathbf{v}} δv˙: 速度误差的导数
- a m \mathbf{a}_m am: 测量加速度
- a b \mathbf{a}_b ab: 加速度偏置
- [ ⋅ ] × [\cdot]_\times [⋅]×: 向量到反对称矩阵的变换
- δ a b \delta\mathbf{a}_b δab: 加速度偏置误差
- δ g \delta\mathbf{g} δg: 重力加速度误差
- δ θ ˙ \delta\dot{\boldsymbol{\theta}} δθ˙: 方向误差的导数
- ω m \boldsymbol{\omega}_m ωm: 测量角速度
- ω b \boldsymbol{\omega}_b ωb: 角速度偏置
- δ ω b \delta\boldsymbol{\omega}_b δωb: 角速度偏置误差
- ω n \boldsymbol{\omega}_n ωn: 角速度噪声
- q t \mathbf{q}_t qt: 真实四元数
- q \mathbf{q} q: 标称四元数
- ⊗ \otimes ⊗: 四元数乘法
4.4 离散时间的系统运动学
上面的微分方程需要积分成差分方程,以考虑离散时间间隔 Δ t > 0 \Delta t > 0 Δt>0。积分方法可能有所不同。在某些情况下,人们将能够使用精确的闭式解。在其他情况下,可以采用不同精度的数值积分。下一章讲解关于积分方法的相关细节。
积分需要针对以下子系统进行:
- 标称状态。
- 误差状态。
(a) 确定性部分:状态动力学和控制。
(b) 随机部分:噪声和扰动。
4.4.1 标称状态运动学
我们可以将标称状态的差分方程写成
p ← p + v Δ t + 1 2 ( R ( a m − a b ) + g ) Δ t 2 v ← v + ( R ( a m − a b ) + g ) Δ t q ← q ⊗ q { ( ω m − ω b ) Δ t } a b ← a b ω b ← ω b g ← g \begin{aligned} \mathbf{p} &\leftarrow \mathbf{p} + \mathbf{v} \Delta t + \frac{1}{2} (\mathbf{R}(\mathbf{a}_m - \mathbf{a}_b) + \mathbf{g}) \Delta t^2 \\ \mathbf{v} &\leftarrow \mathbf{v} + (\mathbf{R}(\mathbf{a}_m - \mathbf{a}_b) + \mathbf{g}) \Delta t \\ \mathbf{q} &\leftarrow \mathbf{q} \otimes \mathbf{q}\{(\boldsymbol{\omega}_m - \boldsymbol{\omega}_b) \Delta t\} \\ \mathbf{a}_b &\leftarrow \mathbf{a}_b \\ \boldsymbol{\omega}_b &\leftarrow \boldsymbol{\omega}_b \\ \mathbf{g} &\leftarrow \mathbf{g} \end{aligned} pvqabωbg←p+vΔt+21(R(am−ab)+g)Δt2←v+(R(am−ab)+g)Δt←q⊗q{(ωm−ωb)Δt}←ab←ωb←g
其中 x ← f ( x , ∙ ) \mathbf{x} \leftarrow f(\mathbf{x}, \bullet) x←f(x,∙) 表示类型为 x k + 1 = f ( x k , ∙ k ) \mathbf{x}_{k+1} = f(\mathbf{x}_k, \bullet_k) xk+1=f(xk,∙k) 的时间更新, R ≜ R { q } \mathbf{R} \triangleq \mathbf{R}\{\mathbf{q}\} R≜R{q} 是与当前标称方向 q \mathbf{q} q 相关的旋转矩阵,而 q { v } \mathbf{q}\{\mathbf{v}\} q{v} 是根据(101)与旋转 v \mathbf{v} v 相关的四元数。
我们也可以使用更精确的积分,如四阶龙格库塔法(下章讲解,下周更新)。
4.4.2 误差状态运动学
确定性部分按正常积分,随机部分的积分导致随机脉冲(后面章节讲解这个概念),因此,
δ p ← δ p + δ v Δ t δ v ← δ v + ( − R [ a m − a b ] × δ θ − R δ a b + δ g ) Δ t + v i δ θ ← R ⊤ { ( ω m − ω b ) Δ t } δ θ − δ ω b Δ t + θ i δ a b ← δ a b + a i δ ω b ← δ ω b + ω i δ g ← δ g \begin{aligned} \delta \mathbf{p} &\leftarrow \delta \mathbf{p} + \delta \mathbf{v} \Delta t \\ \delta \mathbf{v} &\leftarrow \delta \mathbf{v} + (-\mathbf{R}[\mathbf{a}_m - \mathbf{a}_b]_\times \delta\boldsymbol{\theta} - \mathbf{R}\delta \mathbf{a}_b + \delta \mathbf{g})\Delta t + \mathbf{v}_i \\ \delta\boldsymbol{\theta} &\leftarrow \mathbf{R}^\top\{(\boldsymbol{\omega}_m - \boldsymbol{\omega}_b)\Delta t\}\delta\boldsymbol{\theta} - \delta\boldsymbol{\omega}_b \Delta t + \boldsymbol{\theta}_i \\ \delta \mathbf{a}_b &\leftarrow \delta \mathbf{a}_b + \mathbf{a}_i \\ \delta\boldsymbol{\omega}_b &\leftarrow \delta\boldsymbol{\omega}_b + \boldsymbol{\omega}_i \\ \delta \mathbf{g} &\leftarrow \delta \mathbf{g} \end{aligned} δpδvδθδabδωbδg←δp+δvΔt←δv+(−R[am−ab]×δθ−Rδab+δg)Δt+vi←R⊤{(ωm−ωb)Δt}δθ−δωbΔt+θi←δab+ai←δωb+ωi←δg
这里, v i \mathbf{v}_i vi, θ i \boldsymbol{\theta}_i θi, a i \mathbf{a}_i ai 和 ω i \boldsymbol{\omega}_i ωi 是施加到速度、方向和偏差估计的随机脉冲,由白高斯过程建模。它们的均值为零,它们的协方差矩阵是通过在步长 Δ t \Delta t Δt 上积分 a n \mathbf{a}_n an, ω n \boldsymbol{\omega}_n ωn, a w \mathbf{a}_w aw 和 ω w \boldsymbol{\omega}_w ωw 的协方差得到的,
V i = σ a ~ n 2 Δ t 2 I [ m 2 / s 2 ] Θ i = σ ω ~ n 2 Δ t 2 I [ r a d 2 ] A i = σ a w 2 Δ t I [ m 2 / s 4 ] Ω i = σ ω w 2 Δ t I [ r a d 2 / s 2 ] \begin{aligned} \mathbf{V}_i &= \sigma_{\tilde{a}_n}^2 \Delta t^2 \mathbf{I} \quad [\mathrm{m}^2/\mathrm{s}^2] \\ \boldsymbol{\Theta}_i &= \sigma_{\tilde{\omega}_n}^2 \Delta t^2 \mathbf{I} \quad [\mathrm{rad}^2] \\ \mathbf{A}_i &= \sigma_{a_w}^2 \Delta t \mathbf{I} \quad [\mathrm{m}^2/\mathrm{s}^4] \\ \boldsymbol{\Omega}_i &= \sigma_{\omega_w}^2 \Delta t \mathbf{I} \quad [\mathrm{rad}^2/\mathrm{s}^2] \end{aligned} ViΘiAiΩi=σa~n2Δt2I[m2/s2]=σω~n2Δt2I[rad2]=σaw2ΔtI[m2/s4]=σωw2ΔtI[rad2/s2]
其中 σ a ~ n [ m / s 2 ] \sigma_{\tilde{a}_n} [\mathrm{m}/\mathrm{s}^2] σa~n[m/s2], σ ω ~ n [ r a d / s ] \sigma_{\tilde{\omega}_n} [\mathrm{rad}/\mathrm{s}] σω~n[rad/s], σ a w [ m / s 4 ] \sigma_{a_w} [\mathrm{m}/\mathrm{s}^4] σaw[m/s4] 和 σ ω w [ r a d / s 2 ] \sigma_{\omega_w} [\mathrm{rad}/\mathrm{s}^2] σωw[rad/s2] 将根据IMU数据表中的信息或从实验测量中确定。
这部分使用的符号说明:
- δ p \delta \mathbf{p} δp: 位置误差
- δ v \delta \mathbf{v} δv: 速度误差
- Δ t \Delta t Δt: 时间步长
- R \mathbf{R} R: 旋转矩阵
- [ ⋅ ] × [\cdot]_\times [⋅]×: 向量到反对称矩阵的变换
- δ θ \delta\boldsymbol{\theta} δθ: 方向误差
- δ a b \delta \mathbf{a}_b δab: 加速度偏置误差
- δ g \delta \mathbf{g} δg: 重力加速度误差
- ω m \boldsymbol{\omega}_m ωm: 测量角速度
- ω b \boldsymbol{\omega}_b ωb: 角速度偏置
- δ ω b \delta\boldsymbol{\omega}_b δωb: 角速度偏置误差
- v i \mathbf{v}_i vi: 施加到速度估计的随机脉冲
- θ i \boldsymbol{\theta}_i θi: 施加到方向估计的随机脉冲
- a i \mathbf{a}_i ai: 施加到加速度偏置估计的随机脉冲
- ω i \boldsymbol{\omega}_i ωi: 施加到角速度偏置估计的随机脉冲
- V i \mathbf{V}_i Vi: v i \mathbf{v}_i vi的协方差矩阵
- Θ i \boldsymbol{\Theta}_i Θi: θ i \boldsymbol{\theta}_i θi的协方差矩阵
- A i \mathbf{A}_i Ai: a i \mathbf{a}_i ai的协方差矩阵
- Ω i \boldsymbol{\Omega}_i Ωi: ω i \boldsymbol{\omega}_i ωi的协方差矩阵
- σ a ~ n \sigma_{\tilde{a}_n} σa~n: 速度积分过程的加速度噪声标准差
- σ ω ~ n \sigma_{\tilde{\omega}_n} σω~n: 方向积分过程的角速度噪声标准差
- σ a w \sigma_{a_w} σaw: 加速度偏置游走噪声标准差
- σ ω w \sigma_{\omega_w} σωw: 角速度偏置游走噪声标准差
4.4.3 误差状态雅可比矩阵和扰动矩阵
雅可比矩阵可以通过简单地检查上一节中的误差状态差分方程获得。
为了以紧凑的形式写出这些方程,我们考虑标称状态向量 x \mathbf{x} x,误差状态向量 δ x \delta \mathbf{x} δx,输入向量 u m \mathbf{u}_m um,以及扰动脉冲向量 i \mathbf{i} i,如下所示,
x = [ p v q a b ω b g ] , δ x = [ δ p δ v δ θ δ a b δ ω b δ g ] , u m = [ a m ω m ] , i = [ v i θ i a i ω i ] \mathbf{x} = \begin{bmatrix} \mathbf{p} \\ \mathbf{v} \\ \mathbf{q} \\ \mathbf{a}_b \\ \boldsymbol{\omega}_b \\ \mathbf{g} \end{bmatrix}, \quad \delta \mathbf{x} = \begin{bmatrix} \delta \mathbf{p} \\ \delta \mathbf{v} \\ \delta \boldsymbol{\theta} \\ \delta \mathbf{a}_b \\ \delta \boldsymbol{\omega}_b \\ \delta \mathbf{g} \end{bmatrix}, \quad \mathbf{u}_m = \begin{bmatrix} \mathbf{a}_m \\ \boldsymbol{\omega}_m \end{bmatrix}, \quad \mathbf{i} = \begin{bmatrix} \mathbf{v}_i \\ \boldsymbol{\theta}_i \\ \mathbf{a}_i \\ \boldsymbol{\omega}_i \end{bmatrix} x= pvqabωbg ,δx= δpδvδθδabδωbδg ,um=[amωm],i= viθiaiωi
误差状态系统现在是
δ x ← f ( x , δ x , u m , i ) = F x ( x , u m ) ⋅ δ x + F i ⋅ i \delta \mathbf{x} \leftarrow f(\mathbf{x}, \delta \mathbf{x}, \mathbf{u}_m, \mathbf{i}) = \mathbf{F}_x(\mathbf{x}, \mathbf{u}_m) \cdot \delta \mathbf{x} + \mathbf{F}_i \cdot \mathbf{i} δx←f(x,δx,um,i)=Fx(x,um)⋅δx+Fi⋅i
ESKF预测方程写为:
δ x ^ ← F x ( x , u m ) ⋅ δ x ^ P ← F x P F x ⊤ + F i Q i F i ⊤ \begin{aligned} \hat{\delta \mathbf{x}} &\leftarrow \mathbf{F}_x(\mathbf{x}, \mathbf{u}_m) \cdot \hat{\delta \mathbf{x}} \\ \mathbf{P} &\leftarrow \mathbf{F}_x \mathbf{P} \mathbf{F}_x^\top + \mathbf{F}_i \mathbf{Q}_i \mathbf{F}_i^\top \end{aligned} δx^P←Fx(x,um)⋅δx^←FxPFx⊤+FiQiFi⊤
其中 δ x ∼ N { δ x ^ , P } \delta \mathbf{x} \sim \mathcal{N}\{\hat{\delta \mathbf{x}}, \mathbf{P}\} δx∼N{δx^,P}; F x \mathbf{F}_x Fx 和 F i \mathbf{F}_i Fi 是 f ( ) f() f() 关于误差和扰动向量的雅可比矩阵; Q i \mathbf{Q}_i Qi 是扰动脉冲的协方差矩阵。
上述雅可比矩阵和协方差矩阵的表达式如下所述。所有与状态相关的值都直接从标称状态中提取。
F x = ∂ f ∂ δ x ∣ x , u m = [ I I Δ t 0 0 0 0 0 I − R [ a m − a b ] × Δ t − R Δ t 0 I Δ t 0 0 R ⊤ { ( ω m − ω b ) Δ t } 0 − I Δ t 0 0 0 0 I 0 0 0 0 0 0 I 0 0 0 0 0 0 I ] \mathbf{F}_x = \frac{\partial f}{\partial \delta \mathbf{x}}\bigg|_{\mathbf{x},\mathbf{u}_m} = \begin{bmatrix} \mathbf{I} & \mathbf{I}\Delta t & \mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{0} \\ \mathbf{0} & \mathbf{I} & -\mathbf{R}[\mathbf{a}_m - \mathbf{a}_b]_\times \Delta t & -\mathbf{R}\Delta t & \mathbf{0} & \mathbf{I}\Delta t \\ \mathbf{0} & \mathbf{0} & \mathbf{R}^\top\{(\boldsymbol{\omega}_m - \boldsymbol{\omega}_b)\Delta t\} & \mathbf{0} & -\mathbf{I}\Delta t & \mathbf{0} \\ \mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{I} & \mathbf{0} & \mathbf{0} \\ \mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{I} & \mathbf{0} \\ \mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{I} \end{bmatrix} Fx=∂δx∂f x,um= I00000IΔtI00000−R[am−ab]×ΔtR⊤{(ωm−ωb)Δt}0000−RΔt0I0000−IΔt0I00IΔt000I
F i = ∂ f ∂ i ∣ x , u m = [ 0 0 0 0 I 0 0 0 0 I 0 0 0 0 I 0 0 0 0 I 0 0 0 0 ] , Q i = [ V i 0 0 0 0 Θ i 0 0 0 0 A i 0 0 0 0 Ω i ] \mathbf{F}_i = \frac{\partial f}{\partial \mathbf{i}}\bigg|_{\mathbf{x},\mathbf{u}_m} = \begin{bmatrix} \mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{0} \\ \mathbf{I} & \mathbf{0} & \mathbf{0} & \mathbf{0} \\ \mathbf{0} & \mathbf{I} & \mathbf{0} & \mathbf{0} \\ \mathbf{0} & \mathbf{0} & \mathbf{I} & \mathbf{0} \\ \mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{I} \\ \mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{0} \end{bmatrix}, \quad \mathbf{Q}_i = \begin{bmatrix} \mathbf{V}_i & \mathbf{0} & \mathbf{0} & \mathbf{0} \\ \mathbf{0} & \boldsymbol{\Theta}_i & \mathbf{0} & \mathbf{0} \\ \mathbf{0} & \mathbf{0} & \mathbf{A}_i & \mathbf{0} \\ \mathbf{0} & \mathbf{0} & \mathbf{0} & \boldsymbol{\Omega}_i \end{bmatrix} Fi=∂i∂f x,um= 0I000000I000000I000000I0 ,Qi= Vi0000Θi0000Ai0000Ωi
请特别注意, F x \mathbf{F}_x Fx 是系统的转移矩阵,可以用多种方式以不同的精度进行近似。我们在这里展示了它最简单的形式之一(欧拉形式)。
还请注意,由于误差 δ x \delta \mathbf{x} δx 的均值初始化为零,线性方程 δ x ^ ← F x ( x , u m ) ⋅ δ x ^ \hat{\delta \mathbf{x}} \leftarrow \mathbf{F}_x(\mathbf{x}, \mathbf{u}_m) \cdot \hat{\delta \mathbf{x}} δx^←Fx(x,um)⋅δx^ 总是返回零。你当然应该在你的代码中跳过这一行。但我建议你还是写出来,只是注释掉,这样你就确定没有忘记任何东西。
最后请注意,你不应该跳过协方差预测 P ← F x P F x ⊤ + F i Q i F i ⊤ \mathbf{P} \leftarrow \mathbf{F}_x \mathbf{P} \mathbf{F}_x^\top + \mathbf{F}_i \mathbf{Q}_i \mathbf{F}_i^\top P←FxPFx⊤+FiQiFi⊤!!实际上,项 F i Q i F i ⊤ \mathbf{F}_i \mathbf{Q}_i \mathbf{F}_i^\top FiQiFi⊤ 不为零,因此这个协方差在不断增长——正如在任何预测步骤中一样。
4.5 用IMU融合互补传感器数据
在获得IMU以外的信息时,如GPS或视觉,我们继续校正ESKF。在一个设计良好的系统中,这应该使IMU偏差可观察并允许ESKF正确估计它们。有无数种可能性,最流行的是GPS + IMU,单目视觉 + IMU,以及双目视觉 + IMU。近年来,视觉传感器与IMU的结合吸引了大量关注,因此产生了大量科学活动。这些视觉 + IMU设置在GPS拒止环境中非常有趣,可以在移动设备(通常是智能手机)上实现,但也可以在无人机和其他小型、敏捷的平台上实现。
虽然IMU信息迄今为止用于对ESKF进行预测,但这些其他信息用于校正滤波器,从而观察IMU偏差误差。校正包括三个步骤:
- 通过滤波器校正观察误差状态,
- 将观察到的误差注入标称状态,并且
- 重置误差状态。
这些步骤将在以下部分中展开。
4.5.1 通过滤波器校正观察误差状态
像往常一样,假设我们有一个传感器,它提供依赖于状态的信息,例如
y = h ( x t ) + v \mathbf{y} = h(\mathbf{x}_t) + \mathbf{v} y=h(xt)+v
其中 h ( ) h() h() 是系统状态(真实状态)的一般非线性函数,而 v \mathbf{v} v 是具有协方差 V \mathbf{V} V 的白高斯噪声,
v ∼ N { 0 , V } \mathbf{v} \sim \mathcal{N}\{\mathbf{0}, \mathbf{V}\} v∼N{0,V}
我们的滤波器正在估计误差状态,因此滤波器校正方程
K = P H ⊤ ( H P H ⊤ + V ) − 1 δ x ^ ← K ( y − h ( x ^ t ) ) P ← ( I − K H ) P \begin{aligned} \mathbf{K} &= \mathbf{P}\mathbf{H}^\top(\mathbf{H}\mathbf{P}\mathbf{H}^\top + \mathbf{V})^{-1} \\ \hat{\delta \mathbf{x}} &\leftarrow \mathbf{K}(\mathbf{y} - h(\hat{\mathbf{x}}_t)) \\ \mathbf{P} &\leftarrow (\mathbf{I} - \mathbf{K}\mathbf{H})\mathbf{P} \end{aligned} Kδx^P=PH⊤(HPH⊤+V)−1←K(y−h(x^t))←(I−KH)P
需要雅可比矩阵 H \mathbf{H} H 关于误差状态 δ x \delta \mathbf{x} δx 定义,并在最佳真实状态估计 x ^ t = x ⊕ δ x ^ \hat{\mathbf{x}}_t = \mathbf{x} \oplus \hat{\delta \mathbf{x}} x^t=x⊕δx^ 处求值。由于误差状态均值在此阶段为零(我们还没有观察到它),我们有 x ^ t = x \hat{\mathbf{x}}_t = \mathbf{x} x^t=x,并且我们可以使用标称误差 x \mathbf{x} x 作为求值点,导致
H ≡ ∂ h ∂ δ x ∣ x \mathbf{H} \equiv \frac{\partial h}{\partial \delta \mathbf{x}}\bigg|_\mathbf{x} H≡∂δx∂h x
4.5.2 用于滤波器校正的雅可比矩阵计算
上面的雅可比矩阵可以用多种方式计算。最直观的一种是利用链式法则,
H ≜ ∂ h ∂ δ x ∣ x = ∂ h ∂ x t ∣ x ∂ x t ∂ δ x ∣ x = H x X δ x \mathbf{H} \triangleq \frac{\partial h}{\partial \delta \mathbf{x}}\bigg|_\mathbf{x} = \frac{\partial h}{\partial \mathbf{x}_t}\bigg|_\mathbf{x} \frac{\partial \mathbf{x}_t}{\partial \delta \mathbf{x}}\bigg|_\mathbf{x} = \mathbf{H}_x \mathbf{X}_{\delta x} H≜∂δx∂h x=∂xt∂h x∂δx∂xt x=HxXδx
这里, H x ≜ ∂ h ∂ x t ∣ x \mathbf{H}_x \triangleq \frac{\partial h}{\partial \mathbf{x}_t}\Big|_\mathbf{x} Hx≜∂xt∂h x 是 h ( ) h() h() 关于其自身参数的标准雅可比矩阵(即在常规EKF中使用的雅可比矩阵)。链式法则的第一部分取决于所使用的特定传感器的测量函数,这里不作介绍。
第二部分, X δ x ≜ ∂ x t ∂ δ x ∣ x \mathbf{X}_{\delta x} \triangleq \frac{\partial \mathbf{x}_t}{\partial \delta \mathbf{x}}\Big|_\mathbf{x} Xδx≜∂δx∂xt x,是真实状态关于误差状态的雅可比矩阵。这一部分可以在这里推导,因为它只取决于ESKF的状态组合。我们有导数,
X δ x = [ ∂ ( p + δ p ) ∂ δ p ∂ ( v + δ v ) ∂ δ v 0 ∂ ( q ⊗ δ q ) ∂ δ θ ∂ ( a b + δ a b ) ∂ δ a b 0 ∂ ( ω b + δ ω b ) ∂ δ ω b ∂ ( g + δ g ) ∂ δ g ] \mathbf{X}_{\delta x} = \begin{bmatrix} \frac{\partial(\mathbf{p}+\delta \mathbf{p})}{\partial \delta \mathbf{p}} & & & & & \\ & \frac{\partial(\mathbf{v}+\delta \mathbf{v})}{\partial \delta \mathbf{v}} & & & & \\ & & \mathbf{0} & & & \\ & & & \frac{\partial(\mathbf{q} \otimes \delta \mathbf{q})}{\partial \delta \boldsymbol{\theta}} & & \\ & & & & \frac{\partial(\mathbf{a}_b+\delta \mathbf{a}_b)}{\partial \delta \mathbf{a}_b} & \\ & & & & & \mathbf{0} \\ & & & & & & \frac{\partial(\boldsymbol{\omega}_b+\delta \boldsymbol{\omega}_b)}{\partial \delta \boldsymbol{\omega}_b} \\ & & & & & & & \frac{\partial(\mathbf{g}+\delta \mathbf{g})}{\partial \delta \mathbf{g}} \end{bmatrix} Xδx= ∂δp∂(p+δp)∂δv∂(v+δv)0∂δθ∂(q⊗δq)∂δab∂(ab+δab)0∂δωb∂(ωb+δωb)∂δg∂(g+δg)
这导致所有恒等的 3 × 3 3 \times 3 3×3 块(例如, ∂ ( p + δ p ) ∂ δ p = I 3 \frac{\partial(\mathbf{p}+\delta \mathbf{p})}{\partial \delta \mathbf{p}} = \mathbf{I}_3 ∂δp∂(p+δp)=I3),除了四元数项 Q δ θ = ∂ ( q ⊗ δ q ) ∂ δ θ \mathbf{Q}_{\delta \theta} = \frac{\partial(\mathbf{q} \otimes \delta \mathbf{q})}{\partial \delta \boldsymbol{\theta}} Qδθ=∂δθ∂(q⊗δq) 之外的 4 × 3 4 \times 3 4×3 。因此我们有如下形式,
X δ x ≜ ∂ x t ∂ δ x ∣ x = [ I 6 0 0 0 Q δ θ 0 0 0 I 9 ] \mathbf{X}_{\delta x} \triangleq \frac{\partial \mathbf{x}_t}{\partial \delta \mathbf{x}}\bigg|_\mathbf{x} = \begin{bmatrix} \mathbf{I}_6 & \mathbf{0} & \mathbf{0} \\ \mathbf{0} & \mathbf{Q}_{\delta \theta} & \mathbf{0} \\ \mathbf{0} & \mathbf{0} & \mathbf{I}_9 \end{bmatrix} Xδx≜∂δx∂xt x= I6000Qδθ000I9
使用链式法则,以及极限 δ q ⟶ δ θ → 0 [ 1 1 2 δ θ ] \delta \mathbf{q} \underset{\delta\boldsymbol{\theta} \to \mathbf{0}}{\longrightarrow} \begin{bmatrix} 1 \\ \frac{1}{2}\delta\boldsymbol{\theta} \end{bmatrix} δqδθ→0⟶[121δθ],四元数项 Q δ θ \mathbf{Q}_{\delta \theta} Qδθ 可以推导如下,
Q δ θ ≜ ∂ ( q ⊗ δ q ) ∂ δ θ ∣ q = ∂ ( q ⊗ δ q ) ∂ δ q ∣ q ∂ δ q ∂ δ θ ∣ δ θ ^ = 0 = ∂ ( [ q ] L δ q ) ∂ δ q ∣ q ∂ [ 1 1 2 δ θ ] ∂ δ θ ∣ δ θ ^ = 0 = [ q ] L 1 2 [ 0 0 0 1 0 0 0 1 0 0 0 1 ] \begin{aligned} \mathbf{Q}_{\delta \theta} &\triangleq \frac{\partial(\mathbf{q} \otimes \delta \mathbf{q})}{\partial \delta \boldsymbol{\theta}}\bigg|_\mathbf{q} \\ &= \frac{\partial(\mathbf{q} \otimes \delta \mathbf{q})}{\partial \delta \mathbf{q}}\bigg|_\mathbf{q} \frac{\partial \delta \mathbf{q}}{\partial \delta \boldsymbol{\theta}}\bigg|_{\hat{\delta\boldsymbol{\theta}}=\mathbf{0}} \\ &= \frac{\partial([\mathbf{q}]_L \delta \mathbf{q})}{\partial \delta \mathbf{q}}\bigg|_\mathbf{q} \frac{\partial \begin{bmatrix} 1 \\ \frac{1}{2}\delta\boldsymbol{\theta} \end{bmatrix}}{\partial \delta \boldsymbol{\theta}}\bigg|_{\hat{\delta\boldsymbol{\theta}}=\mathbf{0}} \\ &= [\mathbf{q}]_L \frac{1}{2} \begin{bmatrix} 0 & 0 & 0 \\ 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix} \end{aligned} Qδθ≜∂δθ∂(q⊗δq) q=∂δq∂(q⊗δq) q∂δθ∂δq δθ^=0=∂δq∂([q]Lδq) q∂δθ∂[121δθ] δθ^=0=[q]L21 010000100001
这导致
Q δ θ = 1 2 [ − q x − q y − q z q w − q z q y q z q w − q x − q y q x q w ] \mathbf{Q}_{\delta \theta} = \frac{1}{2} \begin{bmatrix} -q_x & -q_y & -q_z \\ q_w & -q_z & q_y \\ q_z & q_w & -q_x \\ -q_y & q_x & q_w \end{bmatrix} Qδθ=21 −qxqwqz−qy−qy−qzqwqx−qzqy−qxqw
4.6 将观察到的误差注入标称状态
在ESKF更新之后,标称状态用观察到的误差状态更新,使用适当的组合(求和或四元数乘积,见表格),
x ← x ⊕ δ x ^ \mathbf{x} \leftarrow \mathbf{x} \oplus \hat{\delta \mathbf{x}} x←x⊕δx^
即
p ← p + δ p ^ v ← v + δ v ^ q ← q ⊗ q { δ θ ^ } a b ← a b + δ a ^ b ω b ← ω b + δ ω ^ b g ← g + δ g ^ \begin{aligned} \mathbf{p} &\leftarrow \mathbf{p} + \hat{\delta \mathbf{p}} \\ \mathbf{v} &\leftarrow \mathbf{v} + \hat{\delta \mathbf{v}} \\ \mathbf{q} &\leftarrow \mathbf{q} \otimes \mathbf{q}\{\hat{\delta\boldsymbol{\theta}}\} \\ \mathbf{a}_b &\leftarrow \mathbf{a}_b + \hat{\delta \mathbf{a}}_b \\ \boldsymbol{\omega}_b &\leftarrow \boldsymbol{\omega}_b + \hat{\delta\boldsymbol{\omega}}_b \\ \mathbf{g} &\leftarrow \mathbf{g} + \hat{\delta \mathbf{g}} \end{aligned} pvqabωbg←p+δp^←v+δv^←q⊗q{δθ^}←ab+δa^b←ωb+δω^b←g+δg^
4.7 ESKF重置
在误差注入标称状态之后,误差状态均值
δ
x
^
\hat{\delta \mathbf{x}}
δx^ 被重置。
在误差状态卡尔曼滤波器(ESKF)中,每次有新的观测数据更新之后,我们需要对状态估计进行重置操作。重置操作的目的是将估计误差注入到标称状态中,使得误差状态均值恢复到0附近。这样做的原因是为了避免误差状态发散,因为卡尔曼滤波器是基于小误差假设的。
ESKF中的重置操作包括两个步骤:
- 将估计的误差均值 δ x ^ \hat{\delta \mathbf{x}} δx^ 重置为0。
- 更新误差协方差矩阵 P \mathbf{P} P,使其与新的误差状态保持一致。
让我们称误差重置函数为 g ( ) g() g()。它写成如下形式,
δ x ← g ( δ x ) = δ x ⊟ δ x ^ \delta \mathbf{x} \leftarrow g(\delta \mathbf{x}) = \delta \mathbf{x} \boxminus\hat{\delta \mathbf{x}} δx←g(δx)=δx⊟δx^
其中 ⊟ \boxminus ⊟ 表示 ⊕ \oplus ⊕ 的逆组合。ESKF误差重置操作因此是,
δ x ^ ← 0 P ← G P G ⊤ \begin{aligned} \hat{\delta \mathbf{x}} &\leftarrow \mathbf{0} \\ \mathbf{P} &\leftarrow \mathbf{G} \mathbf{P} \mathbf{G}^\top \end{aligned} δx^P←0←GPG⊤
其中 G \mathbf{G} G 是雅可比矩阵,定义为
G ≜ ∂ g ∂ δ x ∣ δ x ^ \mathbf{G} \triangleq \frac{\partial g}{\partial \delta \mathbf{x}}\bigg|_{\hat{\delta \mathbf{x}}} G≜∂δx∂g δx^
与上面的更新雅可比类似,这个雅可比在所有对角块上都是单位矩阵,除了在方向误差处。我们给出完整的表达式,并在下一节中推导方向误差块,
G = [ I 6 0 0 0 I − [ 1 2 δ θ ^ ] × 0 0 0 I 9 ] \mathbf{G} = \begin{bmatrix} \mathbf{I}_6 & \mathbf{0} & \mathbf{0} \\ \mathbf{0} & \mathbf{I} - [\frac{1}{2}\hat{\delta\boldsymbol{\theta}}]_\times & \mathbf{0} \\ \mathbf{0} & \mathbf{0} & \mathbf{I}_9 \end{bmatrix} G= I6000I−[21δθ^]×000I9
在大多数情况下,误差项 δ θ ^ \hat{\delta\boldsymbol{\theta}} δθ^ 可以忽略,这里精确的G可能有助于减少长期漂移,提高里程计系统的精度。
4.7.1 关于方向误差的重置操作的雅可比矩阵
我们想要获得新的角度误差 δ θ + \delta\boldsymbol{\theta}^+ δθ+ 关于旧误差 δ θ \delta\boldsymbol{\theta} δθ 和观察到的误差 δ θ ^ \hat{\delta\boldsymbol{\theta}} δθ^ 的表达式。考虑以下事实:
- 误差重置时真实方向不变,即 q t + = q t \mathbf{q}_t^+ = \mathbf{q}_t qt+=qt。这给出:
q + ⊗ δ q + = q ⊗ δ q \mathbf{q}^+ \otimes \delta \mathbf{q}^+ = \mathbf{q} \otimes \delta \mathbf{q} q+⊗δq+=q⊗δq
- 观察到的误差均值已经注入到标称状态中:
q + = q ⊗ δ q ^ \mathbf{q}^+ = \mathbf{q} \otimes \hat{\delta \mathbf{q}} q+=q⊗δq^
结合这两个恒等式,我们得到 δ q + \delta \mathbf{q}^+ δq+ 的表达式,
δ q + = ( q + ) ∗ ⊗ q ⊗ δ q = ( q ⊗ δ q ^ ) ∗ ⊗ q ⊗ δ q = δ q ^ ∗ ⊗ δ q = [ δ q ^ ∗ ] L ⋅ δ q \delta \mathbf{q}^+ = (\mathbf{q}^+)^* \otimes \mathbf{q} \otimes \delta \mathbf{q} = (\mathbf{q} \otimes \hat{\delta \mathbf{q}})^* \otimes \mathbf{q} \otimes \delta \mathbf{q} = \hat{\delta \mathbf{q}}^* \otimes \delta \mathbf{q} = [\hat{\delta \mathbf{q}}^*]_L \cdot \delta \mathbf{q} δq+=(q+)∗⊗q⊗δq=(q⊗δq^)∗⊗q⊗δq=δq^∗⊗δq=[δq^∗]L⋅δq
考虑到 δ q ^ ∗ ≈ [ 1 − 1 2 δ θ ^ ] \hat{\delta \mathbf{q}}^* \approx \begin{bmatrix} 1 \\ -\frac{1}{2}\hat{\delta\boldsymbol{\theta}} \end{bmatrix} δq^∗≈[1−21δθ^],上述恒等式可以展开为
[ 1 1 2 δ θ + ] [ 1 1 2 δ θ ^ ⊤ − 1 2 δ θ ^ I − [ 1 2 δ θ ^ ] × ] ⋅ [ 1 1 2 δ θ ] + O ( ∣ δ θ ∣ 2 ) \begin{aligned} \begin{bmatrix} 1 & \frac{1}{2}\delta\boldsymbol{\theta}^+ \end{bmatrix} \begin{bmatrix} 1 & \frac{1}{2}\hat{\delta\boldsymbol{\theta}}^\top \\ -\frac{1}{2}\hat{\delta\boldsymbol{\theta}} & \mathbf{I} - [\frac{1}{2}\hat{\delta\boldsymbol{\theta}}]_\times \end{bmatrix} \cdot \begin{bmatrix} 1 \\ \frac{1}{2}\delta\boldsymbol{\theta} \end{bmatrix}+ \mathcal{O}(|\delta\boldsymbol{\theta}|^2) \end{aligned} [121δθ+][1−21δθ^21δθ^⊤I−[21δθ^]×]⋅[121δθ]+O(∣δθ∣2)
这给出了一个标量方程和一个向量方程,
1 4 δ θ ^ ⊤ δ θ = O ( ∥ δ θ ∥ 2 ) δ θ + = − δ θ ^ + ( I − [ 1 2 δ θ ^ ] × ) δ θ + O ( ∥ δ θ ∥ 2 ) \begin{aligned} \frac{1}{4}\hat{\delta\boldsymbol{\theta}}^\top \delta\boldsymbol{\theta} &= \mathcal{O}(\|\delta\boldsymbol{\theta}\|^2) \\ \delta\boldsymbol{\theta}^+ &= -\hat{\delta\boldsymbol{\theta}} + \left(\mathbf{I} - [\frac{1}{2}\hat{\delta\boldsymbol{\theta}}]_\times\right)\delta\boldsymbol{\theta} + \mathcal{O}(\|\delta\boldsymbol{\theta}\|^2) \end{aligned} 41δθ^⊤δθδθ+=O(∥δθ∥2)=−δθ^+(I−[21δθ^]×)δθ+O(∥δθ∥2)
其中第一个不是很有信息量,因为它只是无穷小量的关系。从第二个方程可以看出 δ θ ^ + = 0 \hat{\delta\boldsymbol{\theta}}^+ = \mathbf{0} δθ^+=0,这是我们从重置操作中期望的。雅可比矩阵由简单检查得到,
∂ δ θ + ∂ δ θ = I − [ 1 2 δ θ ^ ] × \frac{\partial \delta\boldsymbol{\theta}^+}{\partial \delta\boldsymbol{\theta}} = \mathbf{I} - [\frac{1}{2}\hat{\delta\boldsymbol{\theta}}]_\times ∂δθ∂δθ+=I−[21δθ^]×
这部分我们主要在讨论如何根据观测到的方向误差 δ θ ^ \hat{\delta\boldsymbol{\theta}} δθ^ 来重置和更新真实的方向误差 δ θ \delta\boldsymbol{\theta} δθ。我们想求出新的误差 δ θ + \delta\boldsymbol{\theta}^+ δθ+ 关于旧误差 δ θ \delta\boldsymbol{\theta} δθ 和观测误差 δ θ ^ \hat{\delta\boldsymbol{\theta}} δθ^ 的表达式,以及它们之间的雅可比矩阵。这对于误差状态卡尔曼滤波很重要,因为它需要根据观测来更新状态估计。
我们从两个基本事实出发:
- 真实方向在重置时不变,即 q t + = q t \mathbf{q}_t^+ = \mathbf{q}_t qt+=qt
- 观测误差 δ θ ^ \hat{\delta\boldsymbol{\theta}} δθ^ 已被注入到标称状态 q + \mathbf{q}^+ q+ 中
利用这两个事实,我们可以推导出新的误差 δ q + \delta\mathbf{q}^+ δq+ (四元数形式)与旧误差 δ q \delta\mathbf{q} δq 和观测误差 δ q ^ \hat{\delta\mathbf{q}} δq^ 的关系:
δ q + = δ q ^ ∗ ⊗ δ q = [ δ q ^ ∗ ] L ⋅ δ q \delta \mathbf{q}^+ = \hat{\delta \mathbf{q}}^* \otimes \delta \mathbf{q} = [\hat{\delta \mathbf{q}}^*]_L \cdot \delta \mathbf{q} δq+=δq^∗⊗δq=[δq^∗]L⋅δq
其中 [ δ q ^ ∗ ] L [\hat{\delta \mathbf{q}}^*]_L [δq^∗]L 是 δ q ^ ∗ \hat{\delta \mathbf{q}}^* δq^∗ 的左乘算子。接下来通过一系列展开,我们可以得到 δ θ + \delta\boldsymbol{\theta}^+ δθ+ 关于 δ θ \delta\boldsymbol{\theta} δθ 和 δ θ ^ \hat{\delta\boldsymbol{\theta}} δθ^ 的表达式:
δ θ + = − δ θ ^ + ( I − [ 1 2 δ θ ^ ] × ) δ θ + O ( ∥ δ θ ∥ 2 ) \delta\boldsymbol{\theta}^+ = -\hat{\delta\boldsymbol{\theta}} + \left(\mathbf{I} - \left[\frac{1}{2}\hat{\delta\boldsymbol{\theta}}\right]_\times\right)\delta\boldsymbol{\theta} + \mathcal{O}(\|\delta\boldsymbol{\theta}\|^2) δθ+=−δθ^+(I−[21δθ^]×)δθ+O(∥δθ∥2)
从这个表达式中,我们可以看出 δ θ ^ + = 0 \hat{\delta\boldsymbol{\theta}}^+ = \mathbf{0} δθ^+=0,这正是我们重置操作所期望的。
最后,通过对上式取导数,我们可以得到 δ θ + \delta\boldsymbol{\theta}^+ δθ+ 对 δ θ \delta\boldsymbol{\theta} δθ 的雅可比矩阵:
∂ δ θ + ∂ δ θ = I − [ 1 2 δ θ ^ ] × \frac{\partial \delta\boldsymbol{\theta}^+}{\partial \delta\boldsymbol{\theta}} = \mathbf{I} - \left[\frac{1}{2}\hat{\delta\boldsymbol{\theta}}\right]_\times ∂δθ∂δθ+=I−[21δθ^]×
这个雅可比矩阵在卡尔曼滤波的误差状态传播中非常有用。
这样我们就解决了如何根据观测到的方向误差来更新真实的方向误差估计,并给出了具体的数学表达式和推导过程。其中使用的主要符号说明如下:
- q t \mathbf{q}_t qt: 真实四元数
- q \mathbf{q} q: 标称四元数
- δ q \delta\mathbf{q} δq: 四元数误差
- δ q ^ \hat{\delta\mathbf{q}} δq^: 观测到的四元数误差
- ⊗ \otimes ⊗: 四元数乘法
- ∗ * ∗: 四元数共轭
- [ ⋅ ] L [\cdot]_L [⋅]L: 左乘算子
- [ ⋅ ] × [\cdot]_\times [⋅]×: 向量到反对称矩阵的变换
- δ θ \delta\boldsymbol{\theta} δθ: 向量形式的方向误差
- δ θ ^ \hat{\delta\boldsymbol{\theta}} δθ^: 观测到的方向误差
第5章将探讨使用全局定义的角度误差的ESKF。第4章的差异将在第5章中体现。
参考文献:
[1] Bledt, Gerardo, et al. “Contact model fusion for event-based locomotion in unstructured terrains.” 2018 IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS). IEEE, 2018.
[2] Li, Mingyang, and Anastasios I. Mourikis. “High-precision, consistent EKF-based visual-inertial odometry.” The International Journal of Robotics Research 32.6 (2013): 690-711.
[3] Lupton, Todd, and Salah Sukkarieh. “Efficient integration of inertial observations into visual SLAM without initialization.” 2009 IEEE/RSJ International Conference on Intelligent Robots and Systems. IEEE, 2009.