如何使用卡尔曼滤波器?

机器算法验证 Python 卡尔曼滤波器 平滑
2022-03-24 07:27:48

我有一个物体在二维空间(表面)中的轨迹。(x,y)轨迹以坐标序列的形式给出。我知道我的测量结果很嘈杂,有时我有明显的异常值。所以,我想过滤我的观察结果。

据我了解卡尔曼滤波器,它正是我所需要的。所以,我尝试使用它。我在这里找到了一个 python 实现这是文档提供的示例:

from pykalman import KalmanFilter
import numpy as np
kf = KalmanFilter(transition_matrices = [[1, 1], [0, 1]], observation_matrices = [[0.1, 0.5], [-0.3, 0.0]])
measurements = np.asarray([[1,0], [0,0], [0,1]])  # 3 observations
kf = kf.em(measurements, n_iter=5)
(filtered_state_means, filtered_state_covariances) = kf.filter(measurements)
(smoothed_state_means, smoothed_state_covariances) = kf.smooth(measurements)

我在解释输入和输出时遇到了一些麻烦。我想这measurements正是我的测量值(坐标)。虽然我有点困惑,因为示例中的测量值是整数。

我还需要提供一些transition_matricesobservation_matrices. 我应该把什么值放在那里?这些矩阵是什么意思?

最后,我在哪里可以找到我的输出?应该是filtered_state_means还是smoothed_state_means这些阵列具有正确的形状(2, n_observations)但是,这些数组中的值离原始坐标太远了。

那么,如何使用这个卡尔曼滤波器呢?

2个回答

这是一个可能对您有用的二维卡尔曼滤波器示例。它在 Python 中。

状态向量由四个变量组成:x0 方向的位置、x1 方向的位置、x0 方向的速度和x1 方向的速度。请参阅注释行“x:位置和速度的初始状态 4 元组:(x0, x1, x0_dot, x1_dot)”。

状态转换矩阵 (F) 有助于预测系统/对象的下一个状态,它结合位置和速度的当前状态值来预测位置(即 x0 + x0_dot 和 x1 + x1_dot)和速度的当前状态值速度(即 x0_dot 和 x1_dot)。

测量矩阵 (H) 似乎只考虑 x0 和 x1 位置中的位置。

运动噪声矩阵 (Q) 初始化为 4×4 单位矩阵,而测量噪声设置为 0.0001。

希望这个例子能让你的代码正常工作。

卡尔曼滤波器是一种基于模型的预测滤波器——当在输入端输入常规测量值时,滤波器的正确实现在输出端几乎没有或没有时间延迟。我发现直接实现卡尔曼滤波器总是比使用库更直接,因为模型并不总是静态的。

滤波器的工作方式是它使用过程的数学描述基于先前状态预测当前值,然后根据当前传感器测量值校正该估计。因此,它还能够估计隐藏状态(未测量)和模型中使用的其他参数,只要它们与测量状态的关系在模型中定义即可。

我建议您更详细地研究卡尔曼滤波器,因为如果不了解算法,在尝试使用该滤波器时很容易出错。