Como usar um filtro Kalman?

12

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_matricese observation_matrices. Quais valores devo colocar lá? O que essas matrizes significam?

Finalmente, onde posso encontrar minha saída? Deveria ser filtered_state_meansou 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?

romano
fonte
As matrizes serão estimadas pelo filtro Kalman. Você provavelmente precisa fornecer apenas alguns valores iniciais para o algoritmo de otimização ou algo semelhante.
Richard Hardy
1
Você precisa começar especificando um modelo de espaço de estado, que relacione suas observações aos estados não observados e descreva como o estado evolui ao longo do tempo; isso fornecerá sua matriz de transição e observação, bem como a matriz de covariância do erro de estado ("ruído do processo") e a matriz de covariância do erro de observação (são F, H, Q e R na página da Wikipedia, A, C, Q & R no link fornecido). O Kalman FIlter é simplesmente um algoritmo para estimar o estado (não observável) e sua matriz de variância-covariância a cada vez que você especificar todas essas coisas.
Glen_b -Reinstala Monica
Essa função à qual você vincula parece implementar algo um pouco diferente do KF padrão, pois ele pode usar o EM para estimar algumas coisas que você normalmente especificaria.
Glen_b -Reinstala Monica

Respostas:

8

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.

Michael_RW
fonte
1

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.

Martin
fonte