Mam trajektorię obiektu w przestrzeni 2D (powierzchni). Trajektoria jest podana jako ciąg (x,y)
współrzędnych. Wiem, że moje pomiary są hałaśliwe i czasami mam oczywiste wartości odstające. Chcę więc odfiltrować moje obserwacje.
O ile rozumiem filtr Kalmana, robi dokładnie to, czego potrzebuję. Więc próbuję go użyć. Znalazłem tutaj implementację Pythona . A oto przykład dokumentacji:
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)
Mam pewne problemy z interpretacją danych wejściowych i wyjściowych. Sądzę, że measurements
dokładnie takie są moje pomiary (współrzędne). Chociaż jestem trochę zdezorientowany, ponieważ pomiary w tym przykładzie są liczbami całkowitymi.
Muszę też podać trochę transition_matrices
i observation_matrices
. Jakie wartości powinienem tam umieścić? Co oznaczają te macierze?
Wreszcie, gdzie mogę znaleźć moje wyniki? Powinien to być filtered_state_means
lub smoothed_state_means
. Te tablice mają prawidłowe kształty (2, n_observations)
. Jednak wartości w tych tablicach są zbyt dalekie od pierwotnych współrzędnych.
Jak korzystać z tego filtra Kalmana?
źródło
Odpowiedzi:
Oto przykład dwuwymiarowego filtra Kalmana, który może ci się przydać. Jest w Pythonie.
Wektor stanu składa się z czterech zmiennych: pozycja w kierunku x0, pozycja w kierunku x1, prędkość w kierunku x0 i prędkość w kierunku x1. Zobacz skomentowany wiersz „x: stan początkowy 4-krotność lokalizacji i prędkości: (x0, x1, x0_dot, x1_dot)”.
Macierz przejścia stanu (F), która ułatwia przewidywanie następnego stanu systemu / obiektów, łączy wartości stanu obecnego położenia i prędkości w celu przewidywania położenia (tj. X0 + x0_dot i x1 + x1_dot) oraz wartości stanu obecnego prędkości dla prędkość (tj. x0_dot i x1_dot).
Matryca pomiarowa (H) wydaje się uwzględniać tylko pozycję w pozycjach x0 i x1.
Macierz szumów ruchu (Q) jest inicjalizowana do matrycy tożsamości 4 na 4, podczas gdy szum pomiaru jest ustawiony na 0,0001.
Mam nadzieję, że ten przykład pozwoli ci uruchomić kod.
źródło
Filtr Kalmana jest filtrem predykcyjnym opartym na modelu - ponieważ taka poprawna implementacja filtra będzie miała niewielkie opóźnienie na wyjściu lub jego brak, jeśli będzie zasilany regularnymi pomiarami na wejściu. Uważam, że zawsze łatwiej jest zaimplementować filtr kalmana bezpośrednio niż w przypadku korzystania z bibliotek, ponieważ model nie zawsze jest statyczny.
Filtr działa w ten sposób, że przewiduje bieżącą wartość w oparciu o poprzedni stan, wykorzystując matematyczny opis procesu, a następnie koryguje to oszacowanie na podstawie bieżącego pomiaru czujnika. Jest zatem w stanie oszacować stan ukryty (który nie jest mierzony) i inne parametry, które są używane w modelu, o ile ich relacje ze stanem mierzonym są zdefiniowane w modelu.
Sugerowałbym dokładniejsze przestudiowanie filtra Kalmana, ponieważ bez zrozumienia algorytmu bardzo łatwo jest popełnić błędy podczas próby użycia filtra.
źródło