我试图理解卡尔曼滤波器的工作原理。因为多维变量对初学者来说过于复杂,所以我从一个一维示例开始。
我找到了三个不同的来源解释了温度计的场景,但是所有这些情况都实现了略微不同的方程,我没有抓住重点。
我实现了解决方案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]
会在预测步骤和更新步骤中计算两次吗?
a
是否总是一个常数?如果我有一个传感器检测窗户是否打开...那么我会将a
重置为负值吗(因为房间现在正在冷却而不是加热)?你能给出一个关于h
的例子吗?它如何将当前估计状态转换为测量值?你忘记解释y
了。请添加一个对它的解释好吗?它是一种"未知剩余"吗?或者它是从哪里来的? - daniel451q
和r
吗?例如,当我知道温度计测量的噪声随着房间变得越来越热而增加时...或者我会根据先前的知识取一些平均误差,并且永远不会更新q
和r
吗? - daniel451q
和r
可能是平均误差,也可能取决于状态空间中的位置而进行修改;h
是线性变换。 - jepio