有界卡尔曼滤波器

3

卡尔曼滤波器更新的估计值能否应用上下限约束?

在实际生活中,我有一个状态只能具有非负值。但是,当我应用卡尔曼滤波器时,该状态被更新为具有负值。我如何在卡尔曼滤波器中应用此限制约束?

请回复。

谢谢。

5个回答

6
在每个线性或非线性卡尔曼滤波器公式中,实际上可以非常轻松地实现这一点: 只需在每个时间步骤中执行 min(xmax, max(xmin, x_plus)),其中x_plus是更新步骤后的状态估计。虽然这听起来像是一种很糟糕的方法,会失去所有卡尔曼滤波器的好属性等等,但实际上它是有理论依据的。有关详细信息,请参见D. Simon(2010年),“带状态约束的卡尔曼滤波:线性和非线性算法调查”,IET。 西蒙讨论了一般线性不等式约束的情况,这更加复杂,但在简单的包围框案例中,“状态投影方法”可归结为上述操作。

那是一个很好的参考! - Flo Ryan

2
在UKF(无迹卡尔曼滤波器)中,通过简单地约束sigma点(这些是您生成的点,用于近似考虑误差的状态高斯分布)可以轻松完成此操作。
对于EKF,您可以找到关于如何将状态空间投影回约束边界的论文。其复杂性来自两个因素:
如果您有多变量约束(例如2D距离),则希望以有意义的方式移动相关变量。
当您更新一个状态变量时,希望通过协方差矩阵反映与之相关的其他状态变量的变化。例如,如果您的状态包括速度和位置,则测量可能会导致速度略微纠正,并且位置也略微纠正。如果您的约束在更新后限制速度,则希望对位置进行相关更改。

1

一些常见的将状态变量限制在EKF(抱歉,没有KF)中的方法如下:

如果x是状态,并将其扩展为有界状态x'

  1. 为了强制一个像 x > a 这样的约束,我们定义一个新的状态 x' = exp(x) + a。 这将永远不会小于a,因为当 x -> -inf 时,exp(x) -> 0。对于负约束也是如此,其中 x < -a => x' = - exp(x) - a

  2. 如果您想在一个状态上设置低/高限制,例如 a < x < b: 可以使用 Sigmoid 函数来实现,最流行的(根据我的经验)是 x' = tanh(x),它将 x 限制在 (-1, 1) 范围内。现在,将其推广到 a < x < b 很简单,我们需要将其缩放到适当的大小并偏移它,如 x' = tanh(x)*(b-a)/2 + (a+b)/2。因此,当 tanh(x) = -1 时,我们得到 a,当 tanh(x) = 1 时,我们得到 b,成功实现所需的约束。

通常这涵盖了大部分边界,其相应的导数是可接受的。希望能对您有所帮助!


1

一种方法是创建人工测量值。在这种情况下,如果估计值低于零,就要处理一个“测量”来将其拉回来。因此,如果估计值为-x,则使用测量噪声值为x^2的“x”的人工测量值。一个明显的缺点是畸变状态变量的协方差估计。

第二种方法是将状态向量和协方差矩阵转换到不存在约束条件的空间中。例如,滤波器可以在对数空间中运算。滤波器可以产生正值或负值,但是通过变换x' = e^x将其转换回常规空间时,所有值都是正数。这样就避免了生成负估计值,但是当然协方差矩阵现在是对数空间中的二阶统计描述,可能不是真实统计的准确表示。为了将滤波器转移到其他空间,必须转换所有的模型矩阵,包括转移矩阵、测量雅各比矩阵以及过程和测量噪声矩阵。


0
其他答案更加通用,更适合回答大多数问题。在解决这个问题时,我意识到,尽管我的状态受到限制,但动态和测量更新的方式使得状态实际上永远不会违反约束条件。这是一个特殊情况,但我的状态是一个静态状态,与其他状态没有相关性,因此可以被视为一个孤立的单状态系统。
  • 状态传播是恒等的
  • 测量始终在约束范围内
在我的情况下,这确保了结果状态始终在约束范围内(卡尔曼滤波可以被视为一种插值形式)。如果您还想限制协方差,那就是另外一回事了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接