我试着理解卡尔曼滤波器是如何工作的,因为多维变体在一开始就太混乱了,我开始用一维的例子。
我找到了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
本身和{{1}提供了两个不同的列表})。
是否需要两个列表,否则p [k]将被计算两次(在预测和更新步骤中)?
答案 0 :(得分:12)
所有这些解决方案都是一般方程的特例,我们必须看看每个方程的特殊之处。
让我们从1D案例的正确通用方程开始:
# prediction
x[k] = a * x[k - 1]
p[k] = a * p[k - 1] * a + q
# update
y = z - h * x[k]
kg = p * h / (h * p * h + r)
x[k] = x[k] + kg * y
p[k] = (1 - kg * h) * p[k]
x
- 州p
- 错误(协方差)a
- 州过渡q
- 转换错误z
- 测量h
- 状态到测量的转换y
- 基于预测我们预期衡量的数据与我们实际测量的数据之间的差异kg
- kalman gain r
- 测量错误模型的所有参数(a
,q
,r
,h
)原则上也可以有一个索引k
并更改为系统发展。但在简单的情况下,它们都可以被视为不变。
只有解决方案1实现了a
,这很好。 a
告诉您状态如何从一个步骤变为另一个步骤,如果您假设温度静止然后a == 1
,就像在解决方案2和3中一样。
解决方案1没有q
。 q
是我们可以估算过程错误的地方。同样,如果流程是关于系统静止(a == 1
),那么我们可以设置q = 0
。
您的解决方案都没有h
,这是观察转换(如何从测量到状态)。如果您正在估算温度,则根据温度测量结果h = 1
。
h
可能与1不同的一个示例是,如果您测量的是其他您想要评估的内容,例如使用湿度测量来估算温度。然后h
将是线性转换T(humidity) = h * humidity
。我强调线性,因为上面是线性卡尔曼滤波器方程,它们只适用于线性(在数学意义上)系统。
k
与k - 1
以及x_est
和x_est_kminus1
的问题纯粹是一个实施问题。在这方面,你所有的解决方案都是一样的。
您对解决方案1中k
和k - 1
的看法已经过时。只有预测阶段需要考虑当前和前一步骤(因为它是基于前一步骤的当前状态的预测),而不是更新步骤。更新步骤作用于预测。
从可读性的观点来看,解3最接近数学方程。原则上,预测步骤不会给我们x_est[k]
但更像是predicted_x_est[k]
。然后,更新步骤会在此predicted_x_est[k]
上运行,并向我们提供实际的x_est[k]
。
然而正如我所说,所有实现都是等效的,因为当它们被编程时,您可以看到在预测步骤之后,不再需要过去。因此,您可以安全地将一个变量用于p
和x
,而无需保留列表。
您写道:
因此,对于高卡尔曼增益kg *(z - x_est [k-1])的“大块” delta z - x_est [k-1]被添加到新估计中。不是这个 如果总是计算当前值,那么事情变得毫无意义了吗?
在这些情况下,卡尔曼增益只能在0到1之间。什么时候最大?当r
(测量误差)为0时,这意味着我们无限地信任我们的测量值。然后该等式简化为
x_est = x_est + z - x_est
这意味着我们放弃了我们的预测值(右侧的x_est
)并将我们的更新估算值设置为与我们的测量值相等。当我们无限地信任我们衡量的东西时,这是一件有效的事情。
我实施了解决方案2,但我的卡尔曼滤波器并没有真正起作用(它 高度适应测量,而不是真正考虑到 噪音就好了。)
调整卡尔曼滤波器非常棘手,需要深入了解系统以及q
和r
的正确估计。请记住,q
是过程中的错误(状态演变),r
是我们测量的错误。如果您的卡尔曼滤波器过于适应测量,则意味着:
q
太大了r
太小或两者的组合。您必须使用值来查找有效的值。