如何使用卡尔曼滤波器?


12

我在2D空间(表面)中有一个物体的轨迹。轨迹以(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)。但是,这些数组中的值与原始坐标相距太远。

那么,如何使用该卡尔曼滤波器?


矩阵将通过卡尔曼滤波器进行估计。您可能只需要为优化算法等提供一些起始值。
理查德·哈迪

1
您需要先指定一个状态空间模型,该模型将您的观察结果与未观察到的状态联系起来,并描述状态随时间的变化。这将为您提供过渡和观测矩阵,以及状态误差的协方差矩阵(“过程噪声”)和观测误差的协方差矩阵(在维基百科页面A中为F,H,Q和R,您提供的链接上的C,Q和R)。卡尔曼滤波器只是一种算法,一旦指定了所有这些内容,就可以每次估计(不可观察的)状态及其方差-协方差矩阵。
Glen_b-恢复莫妮卡

您链接到的函数似乎实现了与标准KF有所不同的功能,因为它可以使用EM来估算您通常指定的某些内容。
Glen_b-恢复莫妮卡(Monica)

Answers:


8

这是一个二维卡尔曼滤波器的示例,可能对您有用。它在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。

希望这个例子可以使您的代码正常工作。


1

卡尔曼滤波器是基于模型的预测滤波器-因此,当在输入端进行常规测量时,滤波器的正确实现将在输出上具有很少或没有时间延迟。我发现直接实现kalman过滤器比使用库总是更直接,因为该模型并不总是静态的。

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.