本章中,我们给一维卡尔曼滤波模型加入过程噪声。
真实世界中,系统动力模型总是有不确定性的。比如我们想测量一个电阻的阻值,我们假设它是不变的,即阻值不随测量过程而改变。但实际上阻值会随着环境温度的改变而轻微改变。再比如用雷达追踪弹道导弹时,导弹动态模型的不确定性会包含一些随机的加减速。对于飞行器之类的目标,模型不确定性更大,因为飞行员随时可能进行机动。
另一方面,当我们用GPS接收机计算一个固定物体的位置时,由于固定物体不会动所以动态模型不确定性为0. 动态模型的不确定性称为 过程噪声。一些文献中也叫模型噪声、驱动噪声、动态噪声或系统噪声。过程噪声也会带来估计误差。
上一个例子里,我们估计了大楼的高度。由于大楼高度客观上不会改变,我们没有考虑过程噪声。
过程噪声方差 用 表示。
协方差外插方程 应包含 过程噪声方差。
恒定动态模型的协方差外插方程为:
下面为加入了过程噪声后的一维卡尔曼滤波方程:
方程 | 方程名 | 文献中可能出现的其他名字 | |
---|---|---|---|
状态更新 | 卡尔曼增益 Kalman Gain | 权重方程 Weight Equation | |
状态更新 State Update | 滤波方程 Filtering Equation | ||
协方差更新 Covariance Update | 修正方程Corrector Equation | ||
状态预测 |
(恒定动态模型) (速度恒定动态模型) |
状态外插 State Extrapolation |
预测器方程 Predictor Equation 转移方程 Transition Equation 预测方程 Prediction Equation 动态模型 Dynamic Model 状态空间模型 State Space Model |
(恒定动态模型) (速度恒定动态模型) |
协方差外插 Covariance Extrapolation | 预测器协方差方程 Predictor Covariance Equation |
我们想估计一个水缸里的液体的温度。
假设在稳态情况下,液体温度是不变的。但是因为一些微小扰动可能导致液体温度的变化,我们可以用下面的方程描述系统的动态模型:
式中:
是恒定不变的温度
是一个方差为 的随机过程噪声
下表比较了真实液体温度和测量值。
在第一次迭代之前,我们必须先初始化卡尔曼滤波器,并预测下一个状态(即第一个状态)
我们不知道液体的真实温度是多少,猜测是60.
我们的猜测是不准确的,所以设它的误差 是100. 则初始化的估计方差为 :
这个方差非常大(滤波器收敛则很慢)。如果能更可靠地初始化的话,卡尔曼滤波会收敛得相对快一点。
由于我们的模型是恒定的,状态预测等于当前的估计:
状态预测方差的外插则为:
测量值:
由于测量误差( )是0.1,方差( )就是0.01:
计算卡尔曼增益:
卡尔曼增益几乎就是1. 故我们的预测误差远大于测量误差,预测的权重可以忽略不计,而测量的权重几乎就是1.
估计当前状态:
更新状态估计方差:
由于系统模型恒定,液体温度不变:
状态预测方差的外插为:
测量值:
由于测量误差( )是0.1,方差( )就是0.01:
计算卡尔曼增益:
卡尔曼增益是0.5,即预测和测量的权重相等。
估计当前状态:
更新状态估计方差:
由于系统模型恒定,液体温度不变:
状态预测方差的外插为:
后续迭代的计算结果汇总在下面的表里:
当前状态估计 ( , , ) | 预测 ( , ) | ||
---|---|---|---|
3 |
|
|
|
4 |
|
|
|
5 |
|
|
|
6 |
|
|
|
7 |
|
|
|
8 |
|
|
|
9 |
|
|
|
10 |
|
|
下图给出了卡尔曼增益的变化。
可见,卡尔曼增益逐渐下降,故卡尔曼滤波收敛了。
下图比较了真值、测量值和估计值。图中置信区间为95%。
置信区间的计算可以在这里找到介绍。
可见,估计值逐渐收敛到真值了,只是其对应的95%置信区间有些过大,说明估计不确定性较高。
我们用一维卡尔曼滤波测量了液体的温度。尽管系统动态模型含有随机过程噪声,卡尔曼滤波也给出了较为不错的估计。
类似上一个示例,我们估计缸中的液体的温度。本例里,系统的动态模型不是恒定的 - 液体在以0.1每秒的速度加热。
卡尔曼滤波参数和上一个示例类似:
注:尽管真实的动态模型不是恒定的(液体在加热中),我们暂且认为系统动态模型是恒定的(温度不变)。
下图对比了真实液体温度和测量值。
第0次迭代和上例类似。
第1次迭代前,我们必须初始化卡尔曼滤波,并且预测下一个时刻的状态(即第1个状态)
我们不知道缸中液体的真是温度,猜测是10.
这个猜测是不准确的,于是设估计误差 ( ) 为 100。初始化的估计方差就是误差方差 :
这个方差很高,如果选择更可靠的初始值卡尔曼滤波收敛会更快。
现在我们基于初始值来预测下一个状态。由于模型是恒定的,预测值就等于当前的估计值:
状态预测方差的外插为:
后续迭代的情况汇总在下面的表里:
当前状态估计 ( , , ) | 预测 ( , ) | ||
---|---|---|---|
1 |
|
|
|
2 |
|
|
|
3 |
|
|
|
4 |
|
|
|
5 |
|
|
|
6 |
|
|
|
7 |
|
|
|
8 |
|
|
|
9 |
|
|
|
10 |
|
|
下图中比较测量值、估计值以及真值。
可见,卡尔曼滤波没能给出一个合理的估计,其估计产生了滞后误差。在示例3里,用 滤波器估计加速中的飞行器时我们已经遇到过一次滞后误差。在示例4里我们通过将 滤波器更换为能处理加速度估计的 滤波器消除了滞后误差。
刚才的卡尔曼滤波中之所以产生滞后误差,有两个原因:
有两个方法能消除滞后误差:
另一个问题是估计值明明不对,但不确定性却很低(置信区间很窄)。这说明卡尔曼滤波盲目信任预测值,无法给出更准确的估计值。这些现象说明这是一个没设计好的卡尔曼滤波器。
本例中,我们用一个面向恒定模型的一维卡尔曼滤波器估计了一个正在加热中的液体的温度。我们观察到卡尔曼滤波的输出产生了滞后误差,这个滞后误差是由错误的动态模型所带来的。
合理的模型设计能够消除滞后误差。
与前一个示例类似,只有一点改变:由于动态模型不是很匹配,我们把过程噪声方差 从 0.0001 增大到 0.15.
第1次迭代前,我们必须初始化卡尔曼滤波,并且预测下一个时刻的状态(即第1个状态)
初始化过程和上例类似。
我们不知道缸中液体的真是温度,猜测是10.
这个猜测是不准确的,于是设估计误差 ( ) 为 100。初始化的估计方差就是误差方差 :
这个方差很高,如果选择更可靠的初始值卡尔曼滤波收敛会更快。
现在我们基于初始值来预测下一个状态。由于模型是恒定的,预测值就等于当前的估计值:
状态预测方差的外插为:
后续迭代的情况汇总在下面的表里:
当前状态估计 ( , , ) | 预测 ( , ) | ||
---|---|---|---|
1 |
|
|
|
2 |
|
|
|
3 |
|
|
|
4 |
|
|
|
5 |
|
|
|
6 |
|
|
|
7 |
|
|
|
8 |
|
|
|
9 |
|
|
|
10 |
|
|
下图中比较测量值、估计值以及真值。
可以看到,估计值跟上了测量值,滞后误差被消除了。
把过程不确定性加大能够消除稳态误差,但是由于模型仍然是不准的,过程不确定性变大会让卡尔曼滤波更相信测量,因此最终的估计值会几乎等于充满噪声的测量值,整个滤波的目的就达不到了。
我们看看卡尔曼增益的情况。
由于过程不确定性很大,测量值的权重远比估计值的权重高,即卡尔曼增益很高,最终收敛到了0.94.
好消息是本例中测量值都还不错,真值(绿线)基本都落在估计值的95%置信区间内了。
一个完美的卡尔曼滤波器要求系统的动态模型非常精确,尽量降低过程噪声。但有时候精确的模型就是无法获得的,比如飞机的飞行员随时都可能突然进行机动,从而大幅改变飞机的轨迹,这是无法预料和建模的,过程噪声就是很大。