上限和下限约束可以应用于卡尔曼滤波器更新的估计吗?
我有一种在实际生活中只能具有非负值的状态。当我应用卡尔曼滤波器时,此状态会更新为负值。如何在卡尔曼滤波器中应用此限制约束?
请回复
谢谢
这实际上可以在每个线性或非线性卡尔曼滤波器公式中非常简单地实现:只需在每个时间步骤中执行
min(xmax, max(xmin, x_plus))
,其中x_plus
是更新步骤后的状态估计。虽然这听起来像是一个非常糟糕的黑客行为,失去了卡尔曼滤波器的所有良好属性等,但实际上它在理论上是很好地证明的。有关详细信息,请参阅 D. Simon (2010),“具有状态约束的卡尔曼滤波:线性和非线性算法的调查”,IET。 Simon 讨论了更复杂的一般线性不等式约束的情况,但在简单边界框的情况下,“状态投影方法”简化为上述操作。
在 UKF(无迹卡尔曼滤波器)中,只需约束 sigma 点(这些点是您生成的近似状态高斯分布并考虑误差的点)即可轻松实现此目的。
对于 EKF,您可以找到有关如何将状态空间投影回约束边界的论文。复杂性来自两个因素:
一种机制是创建人工测量。在这种情况下,如果估计值低于零,则处理“测量”以将其拉入。因此,如果估计值是 -x,则使用测量噪声值 x^2 处理“x”的人工测量。一个明显的缺点是状态变量的协方差估计的失真。
第二种方法是将状态向量和协方差矩阵变换到不存在约束的空间。例如,滤波器可以在对数空间中运行。滤波器可以产生正值或负值,但当通过变换 x' = e^x 转换回正常空间时,所有值都是正值。这排除了生成负估计,但当然协方差矩阵现在是对数空间中二阶统计量的描述,这可能不是真实统计量的准确表示。要移动到滤波器的另一个空间,必须变换所有模型矩阵、转移矩阵、测量雅可比行列式以及处理和测量噪声矩阵。
在 EKF(抱歉,没有 KF)中绑定状态变量的一些常见方法如下:
如果
x
是状态,我们将其增强到有界状态 x'
。
为了强制实现诸如
x > a
之类的界限,我们定义了一个新状态 x' = exp(x) + a
。
这永远不会小于 exp(x) -> 0
和 x -> -inf
。这也适用于负约束,其中 x < -a
=> x' = - exp(x) - a
如果您想对诸如
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
,成功实现了所需的边界。这通常涵盖了大部分界限,并且它们各自的导数是可以接受的。希望有帮助!
其他答案更通用,更适合回答大多数问题。在解决这个问题时,我的一个认识是,即使我的状态之一受到限制,动态和测量更新也使得该状态实际上永远不会违反约束。这是一个有点特殊的情况,但我的状态是一个静态状态,与其他状态没有相关性,因此可以被视为一个孤立的单状态系统。
在我的例子中,这确保了结果状态保持在约束范围内(卡尔曼可以被认为是插值的一种形式)。如果您还想限制协方差,那就是另一回事了。