繁体   English   中英

卡尔曼滤波器(一维):几种方法?

[英]Kalman filter (one-dimensional): several approaches?

我试图了解卡尔曼滤波器的工作原理,并且因为多维变体对于一开始来说太混乱了,所以我从一维示例开始。

我找到了 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]可以更改为xp


解决方案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_estx_est本身和x_est_kminus1 )和pp本身和p_kminus1 )。

是否需要两个列表,否则 p[k] 将被计算两次(在预测和更新步骤中)?

所有这些解都是一般方程的特例,我们必须看看每个方程有什么特别之处。

适当的方程

让我们从一维情况的适当一般方程开始:

# 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 - 卡尔曼增益
  • r - 测量误差

模型的所有参数( aqrh )原则上也可以有一个索引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 我强调线性,因为以上是线性卡尔曼滤波器方程,它们仅适用于线性(在数学意义上)系统。

当前和上一步问题

kk - 1以及具有x_estx_est_kminus1的问题纯粹是实现问题。 在这方面,您的所有解决方案都是相同的。

您对解决方案 1 中的kk - 1想法是错误的。 只有预测阶段需要考虑当前和上一步(因为它是基于上一步对当前状态的预测),而不是更新步骤。 更新步骤作用于预测。

从可读性的角度来看,解决方案 3 最接近数学方程。 原则上,预测步骤还没有给我们x_est[k] ,但更像是x_est[k] predicted_x_est[k] 然后在这个更新步骤运行predicted_x_est[k]和赋予我们的实际x_est[k]

然而正如我所说,所有的实现都是等价的,因为当它们被编程时,你可以看到在预测步骤之后,过去不再需要了。 因此,您可以安全地为px使用一个变量,而无需保留列表。

关于卡尔曼增益

你写了:

因此,对于高卡尔曼增益 kg * (z - x_est[k-1]),将增量 z - x_est[k-1] 的“大块”添加到新估计中。 如果总是计算当前值,这整件事不是变得毫无意义吗?

在这些情况下,卡尔曼增益只能在 0 和 1 之间。什么时候最大? r (测量误差)为 0 时,这意味着我们无限信任我们的测量结果。 然后等式简化为

x_est = x_est + z - x_est

这意味着我们丢弃我们的预测值(右侧的x_est )并将我们更新的估计值设置为等于我们的测量值。 当我们无限信任我们测量的东西时,这是一件有效的事情。

适应测量

我实施了解决方案 2,但我的卡尔曼滤波器并没有真正起作用(它高度适应测量,并没有真正考虑其上的噪声)。

调整卡尔曼滤波器很棘手,需要对系统有深入的了解以及对qr正确估计。 请记住, q是过程(状态演化)的误差, r是我们测量的误差。 如果您的卡尔曼滤波器过度适应测量,则意味着:

  • q太大
  • r太小

或两者的结合。 您将不得不玩弄这些值以找到有效的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM