深入理解卡尔曼滤波器(2): 一维卡尔曼滤波器

深入理解卡尔曼滤波器(2): 一维卡尔曼滤波器

在这里插入图片描述

声明: 本文图文均来源于https://www.kalmanfilter.net/,如有侵权请联系删除。

本文由微信公众号【DeepDriving】整理,由于全文内容较多所以分成3部分发出来。关注公众号【DeepDriving】,后台回复关键字【卡尔曼滤波器】可获取全文PDF。

一个简单的例子

估计金条的重量

我们先从一个简单的例子开始,在这个例子中我们将会去估计一个静态系统,所谓静态系统就是在一定的时间内其状态不会改变的系统。

在这个例子中,我们将估计一个金条的重量。首先假设我们使用的是一个无偏差的秤,也就是没有系统误差,但是测量值是包含随机误差的。这里的系统就是金条,系统的状态就是金条的重量。系统的动态模型是恒定的,因为我们假设金条的重量在短时间内不会发生变化。为了估计系统的状态,我们可以进行多次测量,然后对测量值求平均。

在这里插入图片描述

经过 N N N次测量,估计值 x N , N x_{N,N} xN,N是之前所有测量值的平均值:

x ^ N , N = 1 N ( z 1 + z 2 + … + z N − 1 + z N ) = 1 N ∑ n = 1 N ( z n ) \hat{x}_{N,N}= \frac{1}{N} \left( z_{1}+ z_{2}+ \ldots + z_{N-1}+ z_{N} \right) = \frac{1}{N} \sum _{n=1}^{N} \left( z_{n} \right) x^N,N=N1(z1+z2++zN1+zN)=N1n=1N(zn)

在上式中,

  • x x x表示金条重量的真实值;
  • z n z_{n} zn表示第 n n n次的测量值;
  • x ^ n , n \hat{x}_{n,n} x^n,n表示第 n n n次对 x x x的估计值,估计是在采用了第 n n n次的测量值 z n z_{n} zn后做出的;
  • x ^ n , n − 1 \hat{x}_{n,n-1} x^n,n1表示之前对 x x x的估计值,是在第 n − 1 n-1 n1次时采用了测量值 z n − 1 z_{n-1} zn1后做出的;
  • x ^ n + 1 , n \hat{x}_{n+1,n} x^n+1,n表示对 x x x未来状态的估计值,这个估计是在第 n n n次时得到测量值 z n z_{n} zn后做出的,也就是说 x ^ n + 1 , n \hat{x}_{n+1,n} x^n+1,n是一个预测状态值。由于在本例中动态模型是恒定的,所以有 x n + 1 , n = x n , n x_{n+1,n}=x_{n,n} xn+1,n=xn,n

对上式进行一些数学变换:

x ^ N , N = 1 N ∑ n = 1 N ( z n ) = 1 N ( ∑ n = 1 N − 1 ( z n ) + z N ) = 1 N ∑ n = 1 N − 1 ( z n ) + 1 N z N = 1 N N − 1 N − 1 ∑ n = 1 N − 1 ( z n ) + 1 N z N = N − 1 N 1 N − 1 ∑ n = 1 N − 1 ( z n ) + 1 N z N = N − 1 N x ^ N − 1 , N − 1 + 1 N z N = x ^ N − 1 , N − 1 − 1 N x ^ N − 1 , N − 1 + 1 N z N = x ^ N − 1 , N − 1 + 1 N ( z N − x ^ N − 1 , N − 1 ) \begin{align*} \hat{x}_{N,N} &= \frac{1}{N} \sum _{n=1}^{N} \left( z_{n} \right) \\ &= \frac{1}{N} \left( \sum _{n=1}^{N-1} \left( z_{n} \right) + z_{N} \right) \\ &= \frac{1}{N} \sum _{n=1}^{N-1} \left( z_{n} \right) + \frac{1}{N} z_{N} \\ &= \frac{1}{N}\frac{N-1}{N-1} \sum _{n=1}^{N-1} \left( z_{n} \right) + \frac{1}{N} z_{N} \\ &= \frac{N-1}{N}{\frac{1}{N-1} \sum _{n=1}^{N-1} \left( z_{n} \right)} + \frac{1}{N} z_{N} \\ &= \frac{N-1}{N}{\hat{x}_{N-1,N-1}} + \frac{1}{N} z_{N} \\ &= \hat{x}_{N-1,N-1}- \frac{1}{N}\hat{x}_{N-1,N-1}+ \frac{1}{N} z_{N} \\ &= \hat{x}_{N-1,N-1}+ \frac{1}{N} \left( z_{N}- \hat{x}_{N-1,N-1} \right) \end{align*} x^N,N=N1n=1N(zn)=N1(n=1N1(zn)+zN)=N1n=1N1(zn)+N1zN=N1N1N1n=1N1(zn)+N1zN=NN1N11n=1N1(zn)+N1zN=NN1x^N1,N1+N1zN=x^N1,N1N1x^N1,N1+N1zN=x^N1,N1+N1(zNx^N1,N1)

通过前面的知识,我们知道 x ^ N − 1 , N − 1 \hat{x}_{N-1,N-1} x^N1,N1是第 N − 1 N-1 N1次时对 x x x的估计值,现在我们需要基于 x ^ N − 1 , N − 1 \hat{x}_{N-1,N-1} x^N1,N1在第 N N N次时对状态 x x x进行预测从而得到 x ^ N , N − 1 \hat{x}_{N,N-1} x^N,N1。由于是一个静态系统,所以有 x ^ N , N − 1 = x ^ N − 1 , N − 1 \hat{x}_{N,N-1}=\hat{x}_{N-1,N-1} x^N,N1=x^N1,N1,那么上式就可以写为

x ^ N , N = x ^ N , N − 1 + 1 N ( z n − x ^ N , N − 1 ) \hat{x}_{N,N} = \hat{x}_{N,N-1} + \frac{1}{N} \left( z_{n} - \hat{x}_{N,N-1} \right) x^N,N=x^N,N1+N1(znx^N,N1)

上面这个公式是卡尔曼滤波器的5个方程之一,被称为状态更新方程,它的含义如下:

在这里插入图片描述

在本例中,系数 1 N \frac{1}{N} N1是一个特定的值。在卡尔曼滤波器中,这个系数被称为卡尔曼增益(Kalman Gain),记作 K n K_{n} Kn,其下标 n n n表示卡尔曼增益会随着迭代而变化。在深入卡尔曼滤波器之前,我们先用 α n \alpha_{n} αn代替 K n K_{n} Kn,那么状态更新方程可以写为

x ^ n , n = x ^ n , n − 1 + α n ( z n − x ^ n , n − 1 ) \hat{x}_{n,n}= \hat{x}_{n,n-1}+ \alpha _{n} \left( z_{n}-\hat{x}_{n,n-1} \right) x^n,n=x^n,n1+αn(znx^n,n1)

这里的 ( z n − x ^ n , n − 1 ) \left( z_{n}-\hat{x}_{n,n-1} \right) (znx^n,n1)被称为测量残差,也叫更新项。更新意味着包含了新的信息,也就是新的测量值。

在本例中,系数 1 N \frac{1}{N} N1会随着 N N N的变大而变小。那么怎么理解这个状态更新方程呢?在开始的时候,我们没有足够的信息来估计金条的重量,只能基于测量值对状态做出估计,也就是更多地采用测量值。随着迭代次数增多,系数 1 N \frac{1}{N} N1越来越小,每次的测量值的权重也就越来越小,当迭代次数足够多的时候,新的测量值对估计值的影响已经可以忽略不计了。

在状态更新方程中,我们还需要有一个初始值。在本例中,在进行第一次测量前我们可以通过猜测来粗略估计一下金条的重量,这个初始猜测(Initial Guess)值也就是第一个估计值。在这个特定的例子中,初始猜测值可以是任何值,因为 α 1 = 1 \alpha_{1}=1 α1=1,初始猜测值在第一次迭代时就被消掉了。

根据状态更新方程,估计算法的流程如下图所示:

在这里插入图片描述

我们对金条进行10次称重,然后根据上面的估计算法对金条的重量做出估计,得到的结果如下表所示:

n n n12345678910
α n \alpha_{n} αn1 1 2 \frac{1}{2} 21 1 3 \frac{1}{3} 31 1 4 \frac{1}{4} 41 1 5 \frac{1}{5} 51 1 6 \frac{1}{6} 61 1 7 \frac{1}{7} 71 1 8 \frac{1}{8} 81 1 9 \frac{1}{9} 91 1 10 \frac{1}{10} 101
z n z_{n} zn10309891017100910139791008104210121011
x n , n ^ \hat{x_{n,n}} xn,n^10301009.510121011.251011.61006.171006.131010.8710111011
x n + 1 , n ^ \hat{x_{n+1,n}} xn+1,n^10301009.510121011.251011.61006.171006.131010.8710111011

将这些数据可视化:

在这里插入图片描述

可以看到,我们的估计算法可以很好地对测量数据进行平滑滤波,并且朝着真值方向逐渐收敛。

一维卡尔曼滤波器

在前面称金条重量的例子中,我们通过多次测量然后求平均的方法去估计金条的重量。通过对数据的可视化可以方便地看到,测量值存在随机测量误差。通常我们用方差 σ 2 \sigma^{2} σ2来描述这种随机误差,测量误差的方差实际上就是测量的不确定度,一般由测量设备的生产厂商提供。在一些文献中,测量的不确定度也称为测量误差,我们用 r r r来表示。估计值与真实值之间的差别被称为估计误差,可以看到,随着测量次数的增加,估计误差越来越小最后收敛为零。实际中我们并不知道估计误差到底是多少,但是我们可以知道估计值的不确定度,这个不确定度我们用 p p p来表示。

前面介绍了状态更新方程,在卡尔曼滤波器中,系数 α n \alpha_{n} αn是在每一次迭代过程中动态计算的,被称为卡尔曼增益,用 K n K_{n} Kn来表示。卡尔曼增益方程的表达式如下:

K n = U n c e r t a i n t y i n E s t i m a t e U n c e r t a i n t y i n E s t i m a t e + U n c e r t a i n t y i n M e a s u r e m e n t = p n , n − 1 p n , n − 1 + r n K_{n} = \frac{Uncertainty \quad in \quad Estimate}{Uncertainty \quad in \quad Estimate \quad + \quad Uncertainty \quad in \quad Measurement} \\ = \frac{p_{n,n-1}}{p_{n,n-1}+r_{n}} Kn=UncertaintyinEstimate+UncertaintyinMeasurementUncertaintyinEstimate=pn,n1+rnpn,n1

其中, p n , n − 1 p_{n,n-1} pn,n1是外推的估计不确定度 , r n r_{n} rn是当前的测量不确定度。可以知道,卡尔曼增益的值域为 0 ≤ K n ≤ 1 0 \leq K_{n} \leq 1 0Kn1。卡尔曼增益这个公式是怎么来的呢?接下来我们详细推导一下。

给定当前的测量值 z n z_{n} zn和先前的估计值 x ^ n , n − 1 \hat{x}_{n,n-1} x^n,n1,我们的目的是要找到一组参数将 z n z_{n} zn x ^ n , n − 1 \hat{x}_{n,n-1} x^n,n1组合到一起得到当前最优的估计值 x ^ n , n \hat{x}_{n,n} x^n,n,也就是需要给它们赋予最优的权重:

x ^ n , n = k z n + ( 1 − k ) x ^ n , n − 1 \hat{x}_{n,n} = kz_{n} + (1-k)\hat{x}_{n,n-1} x^n,n=kzn+(1k)x^n,n1

这个最优状态估计的方差为

p n , n = k 2 r n + ( 1 − k ) 2 p n , n − 1 p_{n,n} = k^{2}r_{n} + (1 - k)^{2}p_{n,n-1} pn,n=k2rn+(1k)2pn,n1

因为我们是要找一个最优估计,那么就希望 p n , n p_{n,n} pn,n最小,也就是要找到一个 k k k值,使得 p n , n p_{n,n} pn,n最小。为了找到这个 k k k值,我们对 p n , n p_{n,n} pn,n求关于 k k k的导数,并且设导数为零:

d p n , n d k = 2 k r n − 2 ( 1 − k ) p n , n − 1 = 0 \frac{dp_{n,n}}{dk} = 2kr_{n} - 2(1 - k)p_{n,n-1} = 0 dkdpn,n=2krn2(1k)pn,n1=0

可得

k r n = p n , n − 1 − k p n , n − 1 kr_{n} = p_{n,n-1} - kp_{n,n-1} \\ krn=pn,n1kpn,n1

k p n , n − 1 + k r n = p n , n − 1 kp_{n,n-1} + kr_{n} = p_{n,n-1} kpn,n1+krn=pn,n1

k = p n , n − 1 p n , n − 1 + r n k = \frac{p_{n,n-1}}{p_{n,n-1} + r_{n}} k=pn,n1+rnpn,n1

到这里,一维卡尔曼增益的公式就推导出来了!

让我们重写一下状态更新方程

x ^ n , n = x ^ n , n − 1 + K n ( z n − x ^ n , n − 1 ) = ( 1 − K n ) x ^ n , n − 1 + K n z n \hat{x}_{n,n} = \hat{x}_{n,n-1}+ K_{n} \left( z_{n}- \hat{x}_{n,n-1} \right) \\ = \left( 1-K_{n} \right) \hat{x}_{n,n-1}+ K_{n}z_{n} x^n,n=x^n,n1+Kn(znx^n,n1)=(1Kn)x^n,n1+Knzn

可以看到,卡尔曼增益 K n K_{n} Kn就是一个赋给测量值的权重,而 ( 1 − K n ) \left( 1-K_{n} \right) (1Kn)则是赋给估计值的权重。当测量的不确定度很小而估计的不确定度很大的时候,卡尔曼增益接近于1,此时测量值的权重很大,相当于更相信测量值;反之,当测量的不确定度很大而估计的不确定度很小的时候,卡尔曼增益接近于0,此时估计值的权重很大,相当于更相信估计值。

下面的公式是估计不确定度的更新方程:

p n , n =   ( 1 − K n ) p n , n − 1 p_{n,n}=~ \left( 1-K_{n} \right) p_{n,n-1} pn,n= (1Kn)pn,n1

其中, K n K_{n} Kn是卡尔曼增益; p n , n − 1 p_{n,n-1} pn,n1是在先前滤波器估计期间计算的估计不确定度; p n , n p_{n,n} pn,n是当前状态估计的不确定度。这个方程用于更新当前状态估计的不确定度,也叫做协方差更新方程。从这个公式可以知道,由于 ( 1 − K n ) ≤ 1 \left( 1-K_{n} \right) \leq 1 (1Kn)1,估计值的不确定度将会随着迭代次数的增加而变得越来越小。

在这个例子中,我们采用的系统动态模型是恒定模型,所以状态外推方程

x n + 1 , n = x n , n x_{n+1,n}=x_{n,n} xn+1,n=xn,n

同样的,估计不确定度外推方程(也叫作协方差外推方程)为

p n + 1 , n = p n , n p_{n+1,n}= p_{n,n} pn+1,n=pn,n

下面的表格对一维卡尔曼滤波器的5个方程进行了总结(针对恒定模型):

方程表达式方程名
x ^ n , n =   x ^ n , n − 1 + K n ( z n − x ^ n , n − 1 ) \hat{x}_{n,n}=~ \hat{x}_{n,n-1}+ K_{n} \left( z_{n}- \hat{x}_{n,n-1} \right) x^n,n= x^n,n1+Kn(znx^n,n1)状态更新方程
x n + 1 , n = x n , n x_{n+1,n}=x_{n,n} xn+1,n=xn,n状态外推方程
K n = p n , n − 1 p n , n − 1 + r n K_{n}= \frac{p_{n,n-1}}{p_{n,n-1}+r_{n}} Kn=pn,n1+rnpn,n1卡尔曼增益方程
p n , n =   ( 1 − K n ) p n , n − 1 p_{n,n}=~ \left( 1-K_{n} \right) p_{n,n-1} pn,n= (1Kn)pn,n1协方差更新方程
p n + 1 , n = p n , n p_{n+1,n}= p_{n,n} pn+1,n=pn,n协方差外推方程

卡尔曼滤波器算法的框图如下所示:

在这里插入图片描述

我们来梳理一下算法的流程:

  • 步骤0: 初始化

    卡尔曼滤波器需要初始化两个参数:系统状态 x ^ 1 , 0 \hat{x}_{1,0} x^1,0和状态的不确定度 p 1 , 0 p_{1,0} p1,0。初始化完成后,滤波器将会基于这个初始状态去做预测。

  • 步骤1: 测量

    测量会给系统提供两个参数:系统状态的测量值 z n z_{n} zn和测量的不确定度 r n r_{n} rn

  • 步骤2: 状态更新

    状态更新过程的输入为:

    • 测量值 z n z_{n} zn
    • 测量的不确定度 r n r_{n} rn
    • 先前的系统状态估计值 x ^ n , n − 1 \hat{x}_{n,n-1} x^n,n1
    • 先前估计的不确定度 p n , n − 1 p_{n,n-1} pn,n1

    基于这些输入数据,状态更新过程将会计算卡尔曼增益 K n K_{n} Kn,然后提供两个输出:

    • 当前的系统状态估计 x ^ n , n \hat{x}_{n,n} x^n,n
    • 当前状态估计的不确定度 p n , n p_{n,n} pn,n
  • 步骤3: 预测

    预测过程基于系统的动态模型将当前系统状态和当前系统状态估计的不确定度外推到下一个系统状态。本次迭代预测过程的输出,在滤波器的下一次迭代过程中就变成了先前的系统状态估计和估计的不确定度了。

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
二维扩展卡尔曼滤波器(Extended Kalman Filter,EKF)是对卡尔曼滤波器的扩展,用于非线性系统的状态估计。卡尔曼滤波器是一种递归滤波算法,通过观测数据和系统模型来估计系统的状态。然而,对于非线性系统,卡尔曼滤波器的线性化假设不再成立,因此需要使用扩展卡尔曼滤波器来处理非线性系统。 在二维扩展卡尔曼滤波器中,系统的状态和观测向量都是二维的。与普通的卡尔曼滤波器类似,扩展卡尔曼滤波器也通过预测和更新两个步骤来进行状态估计。预测步骤使用系统模型(通常是非线性的)来预测当前时刻的状态,并计算预测误差协方差矩阵。更新步骤使用观测数据来校正预测的状态,并更新状态估计和误差协方差矩阵。 在预测和更新步骤中,需要对系统模型进行线性化,即通过在当前状态点处对非线性函数进行一阶泰勒展开来近似非线性函数。这样可以得到线性化的系统模型和观测模型,然后可以使用卡尔曼滤波器的预测和更新公式进行状态估计。 需要注意的是,二维扩展卡尔曼滤波器是一种近似方法,对于高度非线性的系统,可能会存在估计误差较大的情况。此外,对于更复杂的非线性系统,还可以考虑使用其他扩展卡尔曼滤波器的变种,如无迹卡尔曼滤波器(Unscented Kalman Filter,UKF)或粒子滤波器(Particle Filter)等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DeepDriving

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值