Sensors 不同采样率的卡尔曼滤波

Sensors 不同采样率的卡尔曼滤波,sensors,prediction,kalman-filter,sensor-fusion,Sensors,Prediction,Kalman Filter,Sensor Fusion,我似乎找不到关于这个具体问题的线索,所以我自己发了一条 我正在从事一个大型的导航项目,在那里我可以使用Veghille的里程计和从激光雷达数据得出的位置估计。我可以将激光雷达估计的样本从1-20 Hz变化到不同的质量,里程计数据以40 Hz传输 我已经实现了一个标准的卡尔曼滤波器,遵循以下等式(来自维基百科): 预测 更新 我现在的问题是,当来自不同信息源的采样率不同时,如何(最佳地)使用卡尔曼滤波器?有两种方法: 首先,假设“迭代”是一个卡尔曼滤波预测+更新 变量dt:如果可以测量卡尔曼

我似乎找不到关于这个具体问题的线索,所以我自己发了一条

我正在从事一个大型的导航项目,在那里我可以使用Veghille的里程计和从激光雷达数据得出的位置估计。我可以将激光雷达估计的样本从1-20 Hz变化到不同的质量,里程计数据以40 Hz传输

我已经实现了一个标准的卡尔曼滤波器,遵循以下等式(来自维基百科):

预测

更新


我现在的问题是,当来自不同信息源的采样率不同时,如何(最佳地)使用卡尔曼滤波器?

有两种方法:

首先,假设“迭代”是一个卡尔曼滤波预测+更新

  • 变量dt:如果可以测量卡尔曼滤波迭代之间的增量时间,则基本上可以在每次来自任何传感器的新测量到达时运行新的迭代
  • 静态dt:如果增量时间必须保持静态,则只能以固定速率运行迭代。因此,您必须存储在每次迭代运行之间到达的传感器测量值
  • 现在有一个普遍的问题,你是否可以将测量分解为不同的“子更新”,这意味着你运行一个预测,对于每个传感器测量,你执行一个单独的更新步骤。这将允许您仅对提供了新数据(适用于上述两种情况)的传感器执行更新。它看起来像这样:

  • 预测
  • 使用传感器A更新()
  • 跳过传感器B的更新(),因为没有到达测量值
  • 使用传感器c更新()
  • 重复
  • 从理论上讲,你不应该这样做,原因如下:

  • 如果在每次更新之前不进行预测,那么系统的真实动态可能会超过过滤器的速度。update()方法将实际测量值与根据预测状态专门计算的预测测量值进行比较。如果predict()和update()之间经过足够的时间,update()将基本上比较新的测量值和旧的预测值。如果您的过滤器的运行速度远远快于系统状态在现实世界中的变化速度,那么您就没事了。但是,如果与实际系统中的状态变化相比,您的过滤器运行相对较慢,那么您将在过滤器对状态的估计中遇到滞后/不准确的情况
  • 对每个测量值执行单独的更新将导致大量不必要的冗余数学矩阵运算(如果F较大,则可能会非常昂贵)。假设F和H具有非对角分量(因此状态/观测值是相互关联的),然后对所有最近的测量值进行一次预测和一次更新,以最小化昂贵的矩阵计算。如果F是纯对角的,或者F的段是纯对角的,那么就有一些状态或状态组彼此完全独立。为了节省矩阵计算,您应该将它们划分为不同的卡尔曼滤波器

  • 其他人建议,为了避免上述问题2,您可以将H矩阵(以及相关的y、z、S、K)拆分为每个传感器的单独较小矩阵。因此,传感器A有自己的H、y、z、s、K矩阵,传感器B有自己的矩阵集,等等。如果在F或H中有非对角元素,这不是最优的。非对角元素意味着一个状态依赖于另一个状态,因此它们将显示协方差。K最终基于预测的状态协方差以及预测的观测协方差进行计算(请记住,如果您具有状态协方差,它通常通过H将协方差注入预测的观测值,更不用说H本身可能会创建额外的协方差)。如果开始将系统范围内的H,S矩阵分割为每个传感器的单独H,S矩阵,则最终会切断模型相关状态/观测之间的关系。这会导致次优K,因为某些协方差被删除。

    不需要使用卡尔曼滤波器的固定时间步长,因此您可以改变预测中使用的时间步长,以获得下一次测量的时间,然后执行更新。矩阵F和Q确实会随着时间步长的变化而变化,因此它们需要在运行中重新计算。@KeithBrodie谢谢你的回答,但你确定吗?因为我看到一些文章提到,当采样间隔不同时,要么降低一个采样率,要么插值另一个采样率。我想你指的是这样一种情况,即你只观察测量值的一个子集。在这种情况下,您需要使用顺序卡尔曼滤波器,以便仅使用测量向量的一部分进行更新。