У меня есть траектория объекта в 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_matrices
и observation_matrices
. Какие ценности я должен поставить там? Что означают эти матрицы?
Наконец, где я могу найти свой вывод? Должно ли это быть filtered_state_means
или smoothed_state_means
. Эти массивы имеют правильную форму (2, n_observations)
. Однако значения в этом массиве слишком далеки от исходных координат.
Итак, как использовать этот фильтр Калмана?
источник
Ответы:
Вот пример двумерного фильтра Калмана, который может быть вам полезен. Это в 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.
Надеюсь, этот пример позволит вам заставить ваш код работать.
источник
Фильтр Калмана является прогнозирующим фильтром на основе модели - так как правильная реализация фильтра будет иметь небольшую или нулевую задержку на выходе при подаче регулярных измерений на входе. Я считаю, что всегда проще внедрить фильтр Калмана напрямую, чем использовать библиотеки, потому что модель не всегда статична.
Способ работы фильтра заключается в том, что он прогнозирует текущее значение на основе предыдущего состояния, используя математическое описание процесса, а затем корректирует эту оценку на основе текущего измерения датчика. Таким образом, он также способен оценивать скрытое состояние (которое не измеряется) и другие параметры, которые используются в модели, если в модели определены их связи с измеренным состоянием.
Я бы посоветовал вам изучить фильтр Калмана более подробно, потому что без понимания алгоритма очень легко совершать ошибки при попытке использования фильтра.
источник