Eu tenho uma trajetória de um objeto em um espaço 2D (uma superfície). A trajetória é dada como uma sequência de (x,y)
coordenadas. Sei que minhas medições são barulhentas e às vezes tenho discrepâncias óbvias. Então, eu quero filtrar minhas observações.
Tanto quanto eu entendi o filtro Kalman, ele faz exatamente o que eu preciso. Então, eu tento usá-lo. Encontrei uma implementação em python aqui . E este é o exemplo que a documentação fornece:
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)
Eu tenho alguns problemas com a interpretação de entrada e saída. Eu acho que measurements
é exatamente isso que são minhas medidas (coordenadas). Embora eu esteja um pouco confuso porque as medidas no exemplo são números inteiros.
Eu também preciso fornecer alguns transition_matrices
e observation_matrices
. Quais valores devo colocar lá? O que essas matrizes significam?
Finalmente, onde posso encontrar minha saída? Deveria ser filtered_state_means
ou smoothed_state_means
. Essas matrizes têm formas corretas (2, n_observations)
. No entanto, os valores nessa matriz estão muito longe das coordenadas originais.
Então, como usar esse filtro Kalman?
fonte
Respostas:
Aqui está um exemplo de um filtro Kalman bidimensional que pode ser útil para você. Está em Python.
O vetor de estado é composto por quatro variáveis: posição na direção x0, posição na direção x1, velocidade na direção x0 e velocidade na direção x1. Veja a linha comentada "x: estado inicial 4-tupla de localização e velocidade: (x0, x1, x0_dot, x1_dot)".
A matriz de transição de estado (F), que facilita a previsão do próximo estado do sistema / objetos, combina os valores atuais de posição e velocidade para prever a posição (por exemplo, x0 + x0_dot e x1 + x1_dot) e os valores atuais de velocidade para velocidade (ou seja, x0_dot e x1_dot).
A matriz de medição (H) parece considerar apenas a posição nas posições x0 e x1.
A matriz de ruído de movimento (Q) é inicializada em uma matriz de identidade de 4 por 4, enquanto o ruído de medição é definido como 0,0001.
Espero que este exemplo permita que você obtenha seu código funcionando.
fonte
O filtro Kalman é um filtro preditivo baseado em modelo - pois uma implementação correta do filtro terá pouco ou nenhum atraso na saída quando alimentada com medições regulares na entrada. Acho sempre mais fácil implementar o filtro kalman diretamente, em vez de usar bibliotecas, porque o modelo nem sempre é estático.
A maneira como o filtro funciona é que ele prediz o valor atual com base no estado anterior usando a descrição matemática do processo e, em seguida, corrige essa estimativa com base na medição do sensor de corrente. Assim, também é capaz de estimar o estado oculto (que não é medido) e outros parâmetros que são usados no modelo, desde que suas relações com o estado medido sejam definidas no modelo.
Eu sugiro que você estude o filtro kalman com mais detalhes porque, sem entender o algoritmo, é muito fácil cometer erros ao tentar usar o filtro.
fonte