如何处理卡尔曼滤波器中的异步数据
How to deal with asyncronous data in a kalman filter
我正在实施融合 3d 位置数据(由 2 种不同的计算机视觉算法提供)的卡尔曼滤波器。我正在用 9 维状态向量(位置、速度和加速度)对问题建模。然而,来自每个传感器的数据并不是同时到来的。由于我通过考虑先前数据的接收与当前数据点之间的时间步长来计算速度,因此两个连续的数据点可能完全不同,但仅相隔很小的时间步长,因此看起来位置已经改变迅速。
我想知道是否有人对解决此问题的最佳方法有洞察力或方向 - 卡尔曼滤波器本身会容忍这种行为吗?或者我应该将 window 时间内接收到的所有数据放入一个 bin 中,并减少对一批数据执行 update/predict 循环的频率?我看到的在对象跟踪中使用卡尔曼滤波器的资源只使用了一个相机(即同步数据),所以我很难找到与我的用例相关的信息。
非常感谢任何帮助!谢谢!
根据我从你的问题和我们在评论中的对话中了解到的所有信息,让我首先简要描述一下问题并提出解决方案。
快速回顾
您有一个带有两个独立传感器的系统,它们以不同的速率(30Hz 和 5Hz)进行测量(并且可能有一些时间抖动)。好消息是,每次这样的测量都完全足以进行卡尔曼滤波器的更新步骤。每个测量都有一个时间戳。
另一个重要的一点是,测量(可能)的精度很差,所以位置的变化看起来不太合理。
可能的解决方案
定义调用卡尔曼滤波器的最小时间间隔,这样 none 接收到的测量值必须等待太长时间才能处理。在我看来,100Hz 的频率可能是不错的第一选择。在这种情况下,您的 dt
将是 0.01s。
根据所选 dt
设计 F
和 Q
矩阵(它们都强烈依赖于此值)。
在每个没有测量的调用中执行预测步骤。一旦测量结果到来,请进行更新。所以你的调用序列看起来像:
调用顺序:
init()
predict()
predict()
predict()
predict()
update(sensor1)
predict()
update(sensor2)
update(sensor1)
predict()
predict()
update(sensor1)
predict()
and so on...
要处理精度问题,您可以使用参考信号(基本事实)。与参考相比,分析每个信号 (x, y, z)
的每个传感器读数的误差。卡尔曼滤波器只能很好地处理读数,其误差呈零均值正态分布。如果您看到一些系统偏移,也许您可以摆脱它。根据观察到的误差,您可以计算标准差(和方差),这样您就可以告诉您的过滤器测量结果有多好。这将是您的 R
矩阵。
如果您没有参照物,您可以站在同一个地方进行一些测量。所以你的参考位置将是恒定的,你可以看看读数的分散。
调整 Q
矩阵的元素并描述状态元素的可能动态。较小的位置 Q 元素会告诉过滤器不要将其更改得太快。因此,您的传感器的(可能的)不良性能将被部分消除(将低通滤波器视为直觉)。
希望对您有所帮助。如果我理解有误,请纠正我。
查看传感器读数图(如果可能的话还有参考轨迹)会很有帮助。
我正在实施融合 3d 位置数据(由 2 种不同的计算机视觉算法提供)的卡尔曼滤波器。我正在用 9 维状态向量(位置、速度和加速度)对问题建模。然而,来自每个传感器的数据并不是同时到来的。由于我通过考虑先前数据的接收与当前数据点之间的时间步长来计算速度,因此两个连续的数据点可能完全不同,但仅相隔很小的时间步长,因此看起来位置已经改变迅速。
我想知道是否有人对解决此问题的最佳方法有洞察力或方向 - 卡尔曼滤波器本身会容忍这种行为吗?或者我应该将 window 时间内接收到的所有数据放入一个 bin 中,并减少对一批数据执行 update/predict 循环的频率?我看到的在对象跟踪中使用卡尔曼滤波器的资源只使用了一个相机(即同步数据),所以我很难找到与我的用例相关的信息。
非常感谢任何帮助!谢谢!
根据我从你的问题和我们在评论中的对话中了解到的所有信息,让我首先简要描述一下问题并提出解决方案。
快速回顾
您有一个带有两个独立传感器的系统,它们以不同的速率(30Hz 和 5Hz)进行测量(并且可能有一些时间抖动)。好消息是,每次这样的测量都完全足以进行卡尔曼滤波器的更新步骤。每个测量都有一个时间戳。
另一个重要的一点是,测量(可能)的精度很差,所以位置的变化看起来不太合理。
可能的解决方案
定义调用卡尔曼滤波器的最小时间间隔,这样 none 接收到的测量值必须等待太长时间才能处理。在我看来,100Hz 的频率可能是不错的第一选择。在这种情况下,您的
dt
将是 0.01s。根据所选
dt
设计F
和Q
矩阵(它们都强烈依赖于此值)。在每个没有测量的调用中执行预测步骤。一旦测量结果到来,请进行更新。所以你的调用序列看起来像:
调用顺序:
init()
predict()
predict()
predict()
predict()
update(sensor1)
predict()
update(sensor2)
update(sensor1)
predict()
predict()
update(sensor1)
predict()
and so on...
要处理精度问题,您可以使用参考信号(基本事实)。与参考相比,分析每个信号
(x, y, z)
的每个传感器读数的误差。卡尔曼滤波器只能很好地处理读数,其误差呈零均值正态分布。如果您看到一些系统偏移,也许您可以摆脱它。根据观察到的误差,您可以计算标准差(和方差),这样您就可以告诉您的过滤器测量结果有多好。这将是您的R
矩阵。如果您没有参照物,您可以站在同一个地方进行一些测量。所以你的参考位置将是恒定的,你可以看看读数的分散。
调整
Q
矩阵的元素并描述状态元素的可能动态。较小的位置 Q 元素会告诉过滤器不要将其更改得太快。因此,您的传感器的(可能的)不良性能将被部分消除(将低通滤波器视为直觉)。
希望对您有所帮助。如果我理解有误,请纠正我。 查看传感器读数图(如果可能的话还有参考轨迹)会很有帮助。