【问题标题】:Kalman filter with different sampling rate不同采样率的卡尔曼滤波器
【发布时间】:2020-04-21 07:09:26
【问题描述】:

我似乎找不到关于这个特定问题的帖子,所以我自己发布了一个。

我正在从事一个大型导航项目,在该项目中我可以访问车辆的里程计和从 LiDAR 数据得出的位置估计。我可以将来自 LiDAR 估计的样本从 1 到 20 Hz 改变质量,并且里程计数据以 40Hz 传输。

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

预测

更新

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

【问题讨论】:

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

标签: sensors prediction kalman-filter sensor-fusion


【解决方案1】:

有两种方法:

首先,让我们假设“迭代”是卡尔曼滤波器预测 + 更新

  1. 变量 dt:如果您可以测量卡尔曼滤波器迭代之间的 delta 时间,那么您基本上可以在每次从任何传感器到达新测量值时运行新的迭代。
  2. 静态 dt:如果您的增量时间必须保持静态,则只能以固定速率运行迭代。因此,您必须存储在每次迭代运行之间到达的传感器测量值。

现在有一个普遍的问题,您是否可以将测量分解为不同的“子更新”,这意味着您运行一个预测,并且对于每个传入的传感器测量,您执行一个单独的更新步骤。从理论上讲,这将允许您仅对已提供新数据的传感器执行更新(适用于上述两种情况)。它看起来像这样:

  1. 预测()
  2. update() 与传感器 A
  3. 由于没有测量到达,因此跳过传感器 B 的 update()
  4. update() 带传感器 c
  5. 重复

从理论上讲,您不应该这样做,原因如下:

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

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

【讨论】:

    猜你喜欢
    • 2011-04-14
    • 1970-01-01
    • 2017-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    相关资源
    最近更新 更多