【问题标题】:Kalman filter (one-dimensional): several approaches?卡尔曼滤波器(一维):几种方法?
【发布时间】: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] 可以改变到 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] 将被计算两次(在预测和更新步骤中)?

【问题讨论】:

    标签: python algorithm filtering kalman-filter


    【解决方案1】:

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

    适当的方程式

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

    # 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 没有 qq 是我们可以估计过程错误的地方。同样,如果该过程是关于系统静止的(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],而是更像predicted_x_est[k]。然后更新步骤在这个predicted_x_est[k] 上运行,并为我们提供我们实际的x_est[k]

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

    关于卡尔曼增益

    你写道:

    所以对于高卡尔曼增益 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,但我的卡尔曼滤波器并没有真正工作(它 高度适应测量,并没有真正考虑 噪音)。

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

    • q 太大
    • r 太小了

    或两者的组合。您必须使用这些值才能找到有效的值。

    【讨论】:

    • 非常感谢!我只剩下几个问题,这些问题在阅读时浮现在我脑海中。 a 总是一个常数吗?如果我有一个传感器检测窗户是否打开了怎么办...我会将我的a 重置为负值(因为房间现在正在冷却而不是加热)?你能举一个h的例子吗?它如何将当前的估计状态转换为测量值?你忘了告诉y。你能添加一个解释吗?这是某种“未知的休息”吗?或者它来自哪里?
    • + 我们是否每次迭代都更新qr?例如。当我知道温度计测量的噪音越来越大时,房间变得越来越热......或者我会根据先验知识采取一些平均错误并且永远不会更新qr
    • @ascenator 我试图根据您的后续问题扩展答案 - 检查编辑以获取更改。 tldr 版本:所有这些都可以更改,但它使事情更难实现; qr 可能是平均错误,或者您可以根据您在状态空间中的位置修改它们; h 是线性变换。
    • 我还有一个问题:测量误差是绝对值吗?还是应该将其标准化为某个间隔?还是标准偏差的 sigma 的近似值会导致测量中的噪声?
    • @jepio,如果你能看看这个,我将不胜感激,谢谢。 stackoverflow.com/questions/44944512/…
    猜你喜欢
    • 2018-10-17
    • 2011-04-14
    • 1970-01-01
    • 2017-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多