【发布时间】:2015-10-28 06:13:21
【问题描述】:
我试图了解卡尔曼滤波器的工作原理,因为多维变体在开始时太令人困惑,所以我从一维示例开始。
我找到了 3 个不同的来源来解释温度计的场景,但所有这些场景都实现了略微不同的方程式,我不明白这一点。
我实施了解决方案 2,但我的卡尔曼滤波器并没有真正起作用(它高度适应了测量,并未真正考虑其上的噪声)。
所以,在我浪费更多时间尝试解决方案 1 或 3(我直到现在才读到)之前:有人可以为一维卡尔曼滤波器提供一个清晰的解释和/或代码示例吗?
解决方案 1
// x_est: current estimate; p: current estimate error;
// a: constant of the system; kg: kalman gain
// z: current observation;
// Predict
x_est = a * x_est
p = a * p * a
// Update
kg = p / (p + r)
x_est = x_est + kg * (z - x_est)
p = (1 - kg) * p
作者(此处)仅解释说我们只更改当前值,因为不需要温度计来考虑最后一个值。
于是他简化了:
p[k] = (1 - kg) * p[k-1] 到 p = (1 - kg) * p
x_est[k] = x_est[k-1] + kg * (z - x_est[k-1]) 到 x_est = x_est + kg * (z - x_est)
...等等...
我不明白为什么这是可能的。我认为卡尔曼滤波器的主要部分之一是考虑当前观察 z 是否有用(通过卡尔曼增益)。因此,对于高卡尔曼增益kg * (z - x_est[k-1]),增量z - x_est[k-1] 的“大块”被添加到新估计中。如果总是计算当前值,这整件事不是变得毫无意义吗?
解决方案 2
# q: process variance / process noise
# r: error in measurement
x_est = x_est
p = p + q;
k = p / (p + r);
x_est = x_est + k * (z – x_est);
p = (1 – k) * p;
这几乎是一样的,但是作者甚至没有解释为什么 x[k-1] 和 p[k-1] 可以改变到 x 和 p。
解决方案 3
# Q: process variance / process noise
# R: error in measurement
# prediction
x_est_kminus1[k] = x_est[k - 1]
p_kminus1[k] = p[k - 1] + Q
# update
kg[k] = p_kminus1[k] / (p_kminus1[k] + R)
x_est[k] = x_est_kminus1[k] + kg[k] * (z[k] - x_est_kminus1[k])
p[k] = (1 - kg[k]) * p_kminus1[k]
在此解决方案中,作者为x_est(x_est 本身和x_est_kminus1)和p(p 本身和p_kminus1)提供了两个不同的列表。
是否需要两个列表,否则 p[k] 将被计算两次(在预测和更新步骤中)?
【问题讨论】:
标签: python algorithm filtering kalman-filter