本章介绍 滤波器和 滤波器,这类滤波器常用来对时间序列数据进行平滑。 滤波器和 滤波器在原理上和卡尔曼滤波高度相关。
现在介绍第一个简单示例。本例对一个静态系统的状态进行估计。所谓静态系统,是指在合理时间范围内系统状态不会自发改变的系统。例如一座塔便是一个静态系统,高度便是其状态之一,它不随时间改变而变化。
本例中,我们估计一根金条的重量。假定我们用来称金条的秤是无偏的,即称重结果没有系统性偏差,但是有随机噪声。
金条就是我们所关心的系统,金条的重量就是该系统的状态。该系统的动态模型是恒定的,因为我们假定金条的重量(在短时间内)不会发生变化。
为了估计出该系统的状态(金条重量),我们可以对其进行多次称重,然后取多次测量结果的平均值。
在时刻 ,估计值 便是所有之前测量的平均值:
是金条重量的真值 | |
是 时刻对金条重量的测量值 | |
是在 时刻,使用了 时刻的测量值 ,对 的估计值 | |
是在 时刻对未来状态( 时刻)的预测,记为 ,或者说外插 | |
是在 时刻,使用了 时刻的测量值 ,对 的估计值 | |
是一个先验估计 - 在 时刻对 时刻的系统状态所进行的预测(译注:对第n个时刻而言, 是先验估计, 是预测) |
由于金条的重量不随时间改变而改变,系统动态模型在本例中是静态的(恒定),因此有 .
上面求平均的表达式虽然在数学层面是正确的,但是它不具备可实现性。这是因为根据平均值的定义,为了估计 ,我们需要存储下所有的历史测量值,这对内存开销巨大。并且每次获得了新的测量值后都需要完全重新从第一次测量开始计算,这对CPU算力也消耗巨大。
现实一点的考虑是,最好只需存储上一时刻的估计值 ,并在新的测量完成后更新它即可。下图描述了这个思路:
把上述求平均的表达式在数学上等效变换一下,可以得到:
注解 | |
---|---|
求平均公式: 个测量的和再除以 | |
前 个测量的和再加上最近一次的测量值整体除以 | |
乘进去展开 | |
给求和项同时乘以并除以 | |
调整顺序 橘黄色的项就是上一时刻的估计值 |
|
把求和项用上一时刻的估计值替换掉 | |
把 乘进 的分子,并拆项 | |
提出 |
就是在 时刻使用 时刻的测量值,对 的状态估计。
接下来使用 时刻的估计值 计算 (对 时刻 的预测)。即把 外插至 时刻。
由于系统模型是静态的,当前时刻对 的预测就等于上一时刻对 的估计:.
基于上述推导,对当前时刻状态 的估计可以写成:
上式即为卡尔曼滤波的五个方程之一。称为状态更新方程。其意为:
系数 是本例特定的。后面会具体谈到这个系数的重要性,但此刻可以先指出,在卡尔曼滤波的语境中,这个系数被称作卡尔曼增益,符号为 . 其具有下标 意味着卡尔曼增益随着每次迭代都会改变。
的提出是Rudolf Kalman重要的贡献之一。
在进展到卡尔曼滤波之前,我们先不用 ,而是用希腊字母 来表示这个系数。
所以状态更新方程可以写作:
这一项被称为“测量残差”,也叫更新量。更新量包含新的信息。
本例中,随着 的增加, 会下降。在一开始,因为没有足够的信息,第一次估计完全是基于第一次的测量值的()。随着迭代进行,每次后续测量的权重都在下降,并且会逐渐变得可以忽略不计。
继续讲示例。在进行第一次测量之前,我们可以根据金条上的钢印来猜测(或粗略估计)金条的重量,这是 初始估计,是算法的第一个估计值。
卡尔曼滤波需要一个初始估计作为初始值,这个值可以非常粗略。
下图描述了本例中所使用的算法。
现在,可以开始具体测量和估计的过程了。
金条重量的初始估计是1000g,这个估计仅在滤波器初始化时使用一次,后续迭代不再需要这个值。
金条的重量不会改变,系统模型是静态的,下一个时刻的预测就等于此时的初始化估计值。
用秤称重:
计算增益。本例中 ,故:
用状态更新方程计算当前的估计值:
系统模型是静态的,金条的重量不应该改变,下一时刻的预测应该等于此时的估计:
在一个采样周期过后,上一时刻的预测值成为了这一时刻的先验估计。
做第二次称重:
计算增益:
计算估计值:
至此先告一段落。增益随着每次测量而减小,故后面的测量对估计值的贡献总小于前面的测量。我们已经很接近真实的金条重量了(1000g)。如果做更多次的称重,我们会和真值更加接近。
下表汇总并比较了上面的测量值、估计值以及真值。
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | |
---|---|---|---|---|---|---|---|---|---|---|
996 | 994 | 1021 | 1000 | 1002 | 1010 | 983 | 971 | 993 | 1023 | |
996 | 995 | 1003.67 | 1002.75 | 1002.6 | 1003.83 | 1000.86 | 997.125 | 996.67 | 999.3 | |
996 | 995 | 1003.67 | 1002.75 | 1002.6 | 1003.83 | 1000.86 | 997.125 | 996.67 | 999.3 |
下图中列出了测量值、估计值以及真值。
这个估计算法对测量值有平滑的效果,并且能够收敛到真值。
本例中,我们设计了一个针对静态系统的简单估计算法。我们还推导出了五个卡尔曼滤波方程之一的状态更新方程。下一章中我们会重新审视这个状态更新方程。
是时候考虑一下状态随时间变化的动态系统了。本例中,我们尝试用 滤波器 对一个直线匀速飞行中的飞行器进行跟踪。
假设一个只有一个维度的世界中,有这样一个飞行器在往远离雷达的方向飞行(或者靠近雷达)。因为是一维空间,飞行器到雷达的角度是恒定的,其高度也是恒定的。
表示 时刻飞行器的距离。飞行器速度可以近似用距离差分法得到 - 计算距离随时间的变化率。
因此,速度是距离的导数:
雷达向目标的方向以固定频率发射跟踪波束,两次跟踪测量之间的时间间隔为 .
则匀速运动的动力学模型可以由下面的运动方程给出:
根据这些方程,下一个采样周期时的飞行器距离等于当前飞行器距离加上目标速度乘以采样间隔时间。由于我们假设飞行器的速度不变,下一时刻的速度等于当前时刻的速度。
上述方程称为 状态外插方程 (也叫 转移方程 或 预测方程)。
在上个示例中我们已经用过状态外插方程了,只不过上个例子中这个方程是个恒等式,即下一时刻的状态等于当前时刻的状态。
状态外插方程依赖系统动态模型,因此不同的示例中这个方程也不同。
这个方程有一个以矩阵形式给出的更加一般的形式,后续会讲到。
上述方程的形式是本例特有的。
现在我们来把状态更新方程改一改。
假设雷达的跟踪间隔 ( ) 为5秒,假设 时刻飞行器的距离为30,000m,其速度为40m/s.
使用上述状态外插方程,我们能够预测 时刻的目标位置为:
预测目标 时刻的速度为:
然而 时刻雷达测量的目标距离 ( ) 为30,110m而非30,200m。预测和实际测量的距离之间相差了90m. 这个差有可能是两个原因导致的:
哪个原因是正确的呢?
我们把速度的状态更新方程写下来:
系数 的值和雷达的测量精度等级有关。假设雷达的 精度是20m,那么90m的误差大概率是飞行器速度改变了,我们应该把 的值调高一些。如果 设为0.9,那么此时估计的速度就应该是:
而另一方面,假如雷达的 精度是150m,那90m的误差大概率是雷达测得不准,我们应该把 的值降低一些。如果 的值降为0.1,那么估计的速度就应该是:
如果是飞行器真实速度从40m/s降到了22m/s,可以看到在10个测量周期之后(把上面的公式以 = 0.1 带入10次),飞行器速度的估计也逐渐降到了22m/s. 而如果是因为雷达测量不准,则后续测量的位置将会大致均匀散布在真实位置前后,整体上计算出来的平均速度会保持在40m/s左右不变。
飞行器位置的状态更新方程与上一个例子里的方程类似:
和上例不同的是,上例里 系数每周期都在重新计算 ( ),而本例中 则是恒定的。
系数的大小和雷达精度有关。对高精度雷达,应该选用高的 ,以给测量值分配更高的权重。如果 ,则估计的飞行器距离会等于测量值。
如果 ,则测量值完全起不到任何作用:
于是我们推导出了雷达跟踪问题的状态更新方程。这又叫 跟踪更新方程 或 跟踪滤波方程。
下图描述了本例所使用的估计算法。
与上一个示例不同,增益( 和 )的值在本例里是给定的。在卡尔曼滤波里, 和 会被卡尔曼增益代替,并且每个采样周期会重新计算,后面会讲到。
现在来看一个数值示例。
考虑一个在一维世界里正在向雷达靠近(或远离)的飞行器。
滤波器的参数为:
测量周期是5秒。
时刻的初始条件给定为:
初始值需要外插至第一个测量周期:
第一个周期 ( ),初始值就是先验估计:
雷达进行一次测距:
用状态更新方程计算当前的状态估计:
用状态外插方程预测下一周期的状态:
一个采样周期过后,状态预测变为先验估计:
雷达进行一次测距:
用状态更新方程计算当前的状态估计:
用状态外插方程预测下一周期的状态:
下表汇总了测量值和估计值。
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | |
---|---|---|---|---|---|---|---|---|---|---|
30171 | 30353 | 30756 | 30799 | 31018 | 31278 | 31276 | 31379 | 31748 | 32175 | |
30194.2 | 30383.64 | 30612.73 | 30818.93 | 31025.7 | 31242.3 | 31418.8 | 31566.3 | 31739.4 | 31964.1 | |
39.42 | 38.65 | 42.2 | 41.7 | 41.55 | 42.44 | 38.9 | 34.2 | 34.4 | 39.67 | |
30391.3 | 30576.9 | 30823.9 | 31027.6 | 31233.4 | 31454.5 | 31613.15 | 31737.24 | 31911.4 | 32162.45 | |
39.42 | 38.65 | 42.2 | 41.7 | 41.55 | 42.44 | 38.9 | 34.2 | 34.4 | 39.67 |
下图中列出了测量值、估计值以及真值。
我们的估计算法对测量值有平滑效果,并且能收敛到真值。
下图描述了 、 时的真值、测量值和估计值。
滤波器的平滑效果降低了很多。当前估计值非常接近测量值,预测的误差也相对较高。
那么我们应该一直选取较低的 和 吗?
答案是否定的。 和 的值应该依测量精度而定。如果测量设备精度很高,例如激光雷达,较高的 和 会比较好,会更信赖测量值,对于本例则滤波器对飞行器速度的变化响应更快;如果测量设备精度很低,应该用较低的 和 ,会更信赖预测值,对于本例则滤波器对测量不确定性(误差)的平滑效果会更好,但滤波器对飞行器速度的变化响应就会慢得多。
我们推导了 滤波器的状态更新方程,并且还学到了状态外插方程。我们用 滤波器设计了一个一维动态系统估计算法,并用它数值求解了一个匀速运动目标的状态估计问题。
本例中,我们用 来跟踪匀加速运动的飞行器。
上个示例中,我们跟踪了一个匀速40m/s飞行的飞行器,下图给出了目标距离和速度随时间的变化。
可以看到,距离随时间的图像是一条直线。
考虑一架战斗机。战斗机先以50m/s匀速飞行20秒,再以8m/s2匀加速35秒。
下图描述了目标距离、速度和加速度与时间的关系。
如图所示,飞机速度前20秒恒定,随后线性增加。距离则前20秒线性增加,随后以二次曲线增加。
我们现在用上一例的 滤波器来跟踪这架飞行器。
假设一维世界中,飞行器径向靠近(或远离)雷达。
滤波器参数为:
跟踪周期是5秒。
时刻的初始条件给定为:
初始值需要外插至第一个测量周期:
所有滤波器的迭代过程归纳在下面的表里:
当前状态估计 ( , ) | 状态预测 ( , ) | ||
---|---|---|---|
1 |
|
|
|
2 |
|
|
|
3 |
|
|
|
4 |
|
|
|
5 |
|
|
|
6 |
|
|
|
7 |
|
|
|
8 |
|
|
|
9 |
|
|
|
10 |
|
|
下图中列出了飞行器距离和速度在前75秒的测量值、估计值以及真值。
可以看到在真值和估计值之间有一个稳态误差。这个稳态误差又叫 滞后误差,也叫:
滞后误差在加速阶段开始出现。在加速阶段结束后,滤波器会追上这个误差并收敛到真值。然而,如此大的滞后误差可能直接导致目标跟丢,这是一些应用场景里是无法接受的,例如导弹制导或防空。
我们分析了目标加速带来的滞后误差。
本例中,我们用 滤波器来跟踪一架匀加速运动的飞行器。
滤波器 (又叫 g-h-k 滤波器) 能够处理加速中的目标。新的状态外插方程为:
下图中列出了飞行器距离、速度和加速度在前50秒的测量值、估计值以及真值。
可见, 滤波器配合包含加速度的动态模型能够跟踪匀加速运动的目标并消除滞后误差。
但是如果目标正在进行机动怎么办?目标可能突然改变飞行方向,此时动态模型可能要包含jerk项(加速度的变化率),这种情况下,参数恒定的 滤波器仍然会产生估计误差,并且有可能丢失目标。
卡尔曼滤波可以处理动态模型中的不确定性,这是下一个话题,小结后即将展开讨论。
有许多种 滤波器,这些滤波器基本上都遵循同样的原理:
主要区别在这些滤波器对权重系数()的选择上。有些滤波器使用恒定权重,有些每次迭代会重新计算权重。
对 、 和 参数的选择对估计算法的性能至关重要。
那么应该怎样选择这些参数呢?
滤波器在这里只是作为卡尔曼滤波的切入点,所以我不计划展开讨论参数选择的策略。有兴趣的读者可以在许多文献或书籍中找到相关的信息,例如下面列出的材料:
Dirk Tenne, Tarunraj Singh. “Optimal Design of Filters”. State University of New York at Buffalo.
另一个重要的问题是滤波器的初始化,例如提供第一次迭代的起始值。
下面列出了一些常见的 滤波器(译注:有些滤波器未找到通用的中文译名,故保留原英文名):
关于这些滤波器也许后面会挑一些做类似的教程,但本教程是针对卡尔曼滤波的,后续示例也均围绕卡尔曼滤波展开。