Erfahrung mit dem Kalman-Filter am Beispiel von NMEA-Daten

Der Zweck des Artikels besteht nicht darin, die Prinzipien des Kalman-Filters zu erlÀutern, sondern ihn anhand realer (Roh-) Daten als Beispiel zu demonstrieren. Wer möchte, kann den Quellcode Àndern und mit dem Algorithmus experimentieren. Ich hoffe, dass meine Arbeit denjenigen hilft, die vor einer Àhnlichen Aufgabe stehen.


Die verwendeten Daten stammen von einem GPS-EmpfÀnger im NMEA-0183-Format, insbesondere von den GGA- und VTG-Nachrichten.


Aufgrund des Rauschens des GPS ist eine Filterung erforderlich. Die Ursachen fĂŒr Störungen in GPS-Daten sind unterschiedlich. Die wichtigsten:


  • AtmosphĂ€re.
  • Hindernisse fĂŒr das Signal.
  • GPS-Umlaufbahnposition. Beispielsweise beeintrĂ€chtigt die geringe Neigung der GPS-Bahnen (ungefĂ€hr 55 °) die Genauigkeit in den zirkumpolaren Regionen der Erde erheblich.

All dies fĂŒhrt insgesamt zu PositionssprĂŒngen, KursversĂ€tzen und anderen Problemen. Und bei der Arbeit musste ich zunĂ€chst genau die gefilterte Geschwindigkeit ermitteln.


Tatsache ist, dass die vom GerĂ€t gemessene und in der VTG-Nachricht ĂŒbertragene Geschwindigkeit unplausible Messwerte (SprĂŒnge usw.) ergab, die die Steuerungsaufgaben Ă€ußerst komplizierten.
Daher wurde beschlossen, ein Filtermodell in Octave zu erstellen. Nachdem Sie die Geschwindigkeit als Ableitung der durch die GGA-Nachricht dargestellten GPS-Daten erhalten haben, vergleichen Sie sie mit den ursprĂŒnglichen Geschwindigkeitsdaten aus der VTG-Nachricht.


Zum leichteren Vergleich mĂŒssen die Daten in einem Diagramm angezeigt werden.


Der Kalman-Filter filtert Daten und ihre Ableitungen hervorragend.


«».


— . ( ) : - - . , 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

FĂŒr meine Zwecke scheint der durchschnittliche Q-Wert (0,05) bei diesem NMEA-Kit jetzt am meisten zu bevorzugen. Eine genauere und möglicherweise dynamisch variable Auswahl von Koeffizienten wird wĂ€hrend des Debuggens bei Festmachertests implementiert.


AngehÀngte Dokumente.
habrGGA.m - das Hauptskript (Daten lesen, Filterfunktion aufrufen, Diagramme
zeichnen ) KalmanX.m - Kalman-Filter (Latitude)
KalmanY.m - Kalman-Filter (Longitude)


All Articles