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 . ( ):
![](https://habrastorage.org/webt/wm/ks/ck/wmkscke0g2v6yu0wj2dtble56pc.png)
, .
— (PAC ) C++.
— Octave .
++ , , Octave — .
GGA :![](https://habrastorage.org/webt/tu/cq/wt/tucqwt_yh8rfnlv4z_6iir_qmp4.png)
VTG :
![](https://habrastorage.org/webt/m8/j5/k1/m8j5k1cnk79y03qkg43216wubw8.png)
«--» — , . 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; .
.![](https://habrastorage.org/webt/qv/kw/s8/qvkws8fzp4ehk-a_5i_pqclbs5m.png)
KalmanX KalmanY .
X Y , , Q, R, F reset ( Q R, ).
(habrGGA.m) , , .
Q, R . ( Q, R). , .
, :
![](https://habrastorage.org/webt/ru/az/nv/ruaznv-mu7qwy0pwfmlisla2_me.png)
( ) , Q. R = 0,2.
, :
![](https://habrastorage.org/webt/za/8d/ck/za8dckvcpxahpkc64j-e2dwhmlw.png)
— X Y (Latitude Longitude) , :
![](https://habrastorage.org/webt/zm/r0/dy/zmr0dytsu9actdb11rexuymqau4.png)
![](https://habrastorage.org/webt/56/yb/3e/56yb3e-ixrofwck4qmz63i9xy4s.png)
:
![](https://habrastorage.org/webt/ar/zh/8o/arzh8o2aqj-bfx2zpjw4fnv2k3g.png)
( 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)