我有一个跟踪机器人状态的无味卡尔曼滤波器(UKF)。状态向量具有12个变量。每次执行预测步骤时,我的传递函数(自然)都会作用于整个状态。但是,我的传感器提供了机器人状态不同部分的测量值,因此我可以在一次测量中获得滚动,俯仰,偏航及其各自的速度,然后在另一次测量中获得线速度。

我的处理方法到目前为止,这只是简单地为协方差创建子矩阵,执行我的标准UKF更新方程,然后将结果值放回到完整的协方差矩阵中。但是,在进行一些更新之后,UKF对我大吼大叫,试图将不是正定的矩阵传递给Cholesky分解函数。显然,协方差正在失去其正定性质,我想这与我尝试更新整个协方差矩阵的子集有关。

作为一个实际日志文件的示例,以下矩阵(在UKF预测步骤之后)是正定的:

   1.1969            0            0            0            0            0      0.11567            0            0            0            0            0
        0       1.9682            0            0            0            0            0      0.98395            0            0            0            0
        0            0       1.9682            0            0            0            0            0      0.98395            0            0            0
        0            0            0       1.9682            0            0            0            0            0      0.98395            0            0
        0            0            0            0       1.9682            0            0            0            0            0      0.98395            0
        0            0            0            0            0       1.9682            0            0            0            0            0      0.98395
  0.11567            0            0            0            0            0      0.01468            0            0            0            0            0
        0      0.98395            0            0            0            0            0            1            0            0            0            0
        0            0      0.98395            0            0            0            0            0            1            0            0            0
        0            0            0      0.98395            0            0            0            0            0            1            0            0
        0            0            0            0      0.98395            0            0            0            0            0            1            0
        0            0            0            0            0      0.98395            0            0            0            0            0            1


但是,在对一个变量(在这种情况下为线性X速度)进行校正后,矩阵变为:

如您所见,两者之间的唯一区别是线性X速度方差位置中的值,这是我刚刚处理的测量值。这种差异足以“破坏”我的协方差矩阵。

我有两个问题:


更新过滤器的子集似乎不是处理事情的正确方法。还有更好的解决方案吗?
或者,我是否错过了将协方差矩阵保持为正定的步骤?

谢谢! />
看来我没有正确地将值放回原始协方差矩阵中。仅将值复制回来是不够的。我需要跟踪协方差矩阵的相关系数,并确保在更新方差值时,更新其行/列中的所有值以保持相关系数值。我必须做更多测试以验证这是我的问题,但是在Matlab中进行的一些初步分析表明确实是这样。如果我是正确的话,我会回答我自己的问题。不会飞。但是,我还有一个问题:

因为这是UKF,所以我实际上没有Jacobian矩阵。我想我知道如何在UKF更新方程式中工作,但即使在EKF中,我也要问一下,因为我也有其中之一-我的状态测量功能$ h $最终将身份矩阵,因为我直接测量状态变量。在这种情况下,我认为我的“ Jacobian”将是一个$ m \ times n $矩阵,并且在$(i,i)$位置有一个矩阵,其中$ i $是测量向量中测量值的索引?

#1 楼

首先,要注意一些事项,

首先,正如您提到的,您不能只拔出子矩阵并对其进行更新。但是,您可以在子矩阵上执行传播步骤。

这是因为互协方差术语(该信息在州的不同部分“传播”信息)。例如,这就是为什么对航向进行更准确的估算会导致位置估算更准确的原因。

但是,在进行编辑后,仅更新互相关(协方差)项也不会这样做,您需要更新整个矩阵(除非您确定某些元素是独立的,

这里您要进行以下操作:

为此,请像以前一样形成雅可比矩阵,但请注意,所有非对角元素中都应为零当没有状态的任何部分被测量时,矩阵求逆的魔力将把创新校正散布到状态的正确部分。对于$ m $测量值和$ m,雅可比矩阵的大小必须为$ n \乘m $。 n $个状态变量(或$ m \ times n $,取决于您对Jacobian的定义)。除非您确切地知道Jacobian元素等同于恒等,否则这些“协方差垃圾的更新部分”都不是。使用完整的Jacobian。

其他技巧(一旦理论上一切都正确)

但是,这仍然不能确保PD协方差矩阵。
我强烈建议您在解决所有其他错误之前不要进行以下操作。但是最后,对于运行时间很短的可现场部署的系统,我发现几乎总是需要执行以下操作:


在所有更新之后,让协方差$ P $为$ P \ gets \ frac {1} {2} P + \ frac {1} {2} P ^ {T} $,只是为了平整非对角项-为了对称
令$ P \得到P + \ epsilon I_ {n \ times n} $,其中$ \ epsilon $是一个小标量,可确保您不会下溢(并破坏矩阵的条件编号)