ExperiĂŞncia com o filtro Kalman no exemplo de dados NMEA

O objetivo do artigo não é explicar os princípios do filtro Kalman, mas demonstrá-lo usando dados reais (brutos) como exemplo. Quem quiser pode modificar o código fonte e experimentar o algoritmo, espero que meu trabalho ajude aqueles que enfrentam uma tarefa semelhante.


Os dados utilizados sĂŁo de um receptor GPS no formato NMEA-0183, em particular as mensagens GGA e VTG.


A filtragem é necessária devido ao ruído do GPS. As causas da interferência nos dados do GPS são diferentes. Os principais:


  • atmosfĂ©ricos.
  • obstáculos ao sinal.
  • Posição da Ăłrbita do GPS. Por exemplo, a baixa inclinação das Ăłrbitas do GPS (aproximadamente 55 °) prejudica seriamente a precisĂŁo nas regiões circumpolares da Terra.

No total, tudo isso leva a saltos de posição, desvios de curso e outros problemas. E no trabalho, antes de tudo, eu precisava obter exatamente a velocidade filtrada.


O fato Ă© que a velocidade medida pelo equipamento e transmitida na mensagem VTG produziu leituras implausĂ­veis (saltos, etc.), o que complicou extremamente as tarefas de controle.
Portanto, decidiu-se construir um modelo de filtro no Octave e, tendo recebido a velocidade como derivada dos dados de GPS representados pela mensagem GGA, compare-os com os dados de velocidade originais da mensagem VTG.


Para facilitar a comparação, os dados devem ser exibidos em um gráfico.


O filtro Kalman faz um Ăłtimo trabalho de filtragem de dados e seus derivados.


«».


— . ( ) : - - . , Predict, Update, Invariant :


https://habr.com/ru/post/140274/
https://habr.com/ru/post/166693/
https://ru.wikipedia.org/wiki/%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80_%D0%9A%D0%B0%D0%BB%D0%BC%D0%B0%D0%BD%D0%B0


Octave (open-source Matlab Linux). F . ( ):



, .
— (PAC ) C++.


— Octave .


++ , , Octave — .


GGA :


VTG :

«--» — , . Latitude Longitude.


.


, .

:
Fk — //, state-transition model.
Hk — /, observation model.
Qk — , covariance of the process noise;.
Rk — , covariance of the observation noise.
K — .
Xp — () .
Xk — .
X(k-1) — .
Pp — , .
P — .
P(k-1) — () .
z- () .


:
Xp = Fk X(k-1); .
Pp = Fk
P(k-1) * F'k + Q; .


:
K = Pp H' inv(H Pp H' + R); .
Xk = Xp + K(z — HXp); z.
P = Pp — KHPp; .


.


KalmanX KalmanY .


X Y , , Q, R, F reset ( Q R, ).


(habrGGA.m) , , .


Q, R . ( Q, R). , .


, :



( ) , Q. R = 0,2.


, :



— X Y (Latitude Longitude) , :




:



( VTG) , .


Q R, (habrGGA.m):


 if j==1   Q = [ 0.01 0;
                  0   0.01];
            Q1=Q;     
            R=0.2; R1=R;
  elseif j==2   Q = [ 0.05 0;
                      0   0.05]; 
                      Q2=Q;
            R=0.2; R1=R;
  elseif j==3    Q = [1 0;
                       0  1];
                       Q3=Q;
            R=0.2; R1=R;
  end

Para meus propósitos, o valor Q médio (0,05) agora parece ser o mais preferível neste kit NMEA. Uma seleção de coeficientes mais precisa e possivelmente variável dinamicamente será implementada durante a depuração nos ensaios de amarração.


Arquivos anexados.
habrGGA.m - o script principal (lendo dados, chamando a função de filtro, plotando gráficos)
KalmanX.m - Filtro de Kalman (Latitude)
KalmanY.m - Filtro de Kalman (Longitude)


All Articles