[…] häufigsten gelesen hier im Blog, sind die Beiträge zum Kalman Filter (Teil 1 & Teil 2 & EKF). In den Kommentaren und Emails, die ich dazu bekomme, zeigt sich allerdings, dass da mit Kanonen […]
Von: Motorblog » Alpha-Beta-Filter – der kleine Bruder vom Kalman Filter
Von: christian
Hallo,
erstmal danke für die hilfreichen Erklärungen. Kurze Frage um erweiterten Modell (CTRV), ich benötige den Fall der Positionsschätzung im Tunnel, wenn keine bzw. nur noch unsichere GPS-Lokalisierungen möglich sind.
Dann würde ich die Position gerne weiter schätzen, zum Beispiel eben auf Basis des ESP Geschwindigkeitssignal und der Gierrate, die ebenfalls vom ESP kommt.
Ich habe dies mal versucht zu simulieren, indem ich einfach die ersten GPS Werte noch eingelesen habe aber dann im Weiteren den Filter mit latitude = 0 und longitude = 0 gefüttert habe.
Da kommen jedoch völlig unbrauchbare Positionsschätzwerte heraus. Wenn ich immer 0 eingebe, so passt die Schätzung ganz gut, allerdings natürlich nicht Positionstreu. Hier hatte ich versucht nur die erste GPS-Koordinate einzuspeisen und dann basierend auf dieser weiter ohne GPS (genullt) zu schätzen, was allerdings nicht funktioniert hatte. Hätten Sie hier eine Idee?
Vielen Dank und Gruß
Von: Paul Balzer
Hallo Christian,
wenn du die GPS Position einfach auf 0.0/0.0 setzt, dann sagst du dem Kalman Filter, dass es die Position bitte auf’s Meer verschieben soll (siehe: https://www.google.de/maps/@0.0,0.0,6z), denn Lat/Lon von 0.0/0.0 ist ja auch eine Position auf der Welt, nämlich da wo sich Nullmeridian und Äquator schneiden.
Wenn du dem Filter sagen willst, dass du keine GPS Position hast, dann musst du das im Correction Schritt in der Measurement Matrix JH machen. Siehe `if GPS[filterstep]:` auf https://github.com/balzer82/Kalman/blob/master/Extended-Kalman-Filter-CTRV.ipynb?create=1
Da unterscheidet sich die Mess-Matrix dahingehend, dass du wenn GPS vorhanden ist die Positionszustände aktualisierst, wenn keine GPS Position vorhanden ist, schreibst du eine 0 in die Mess-Matrix und der Zustand wird nicht aktualisiert vom Correction-Step. Natürlich integrierst du damit die Messfehler von Geschwindigkeits- und Gierratensensor auf. Je nachdem wie gut die sind, wirst du nach ein paar Sekunden/Minuten relevante Fehler in der Positionsschätzung haben.
Hilft dir das?
Von: Christian
Hallo Paul,
danke für deine Antwort. Das ist soweit klar!
Jetzt habe ich noch eine Frage, ich möchte die Rechenschrittweite verändern, d.h. dass die Messwerte der Sensoren (Gierrate, Geschwindigkeit) alle 100 ms kommen und die GPS-Position alle 1s einmal.
Ich habe mal die Messdaten adaptiert, sodass ich z.B. nur jeden 5 Messwert und jeden 50 GPS Wert verwende (um die 50Hz down zu samplen).
Nun bekomme ich jedoch „stufige“ Verläufe, die der EKF berechnet.
Würde das so noch funktionieren, ggf. durch Adaption der Process Noise Covariance Matrix Q? Wenn ja wie müsste die dann aussehen? Oder bräuchte ich hierbei ein anderes Modell?
Kann der EKF eigentlich „asynchron“ getriggert werden oder müssen die Daten von GPS und Sensoren „aligned“ werden (Interpolation der GPS-Werte?).
Danke und viele Grüße
Von: Paul Balzer
Hallo Christian,
das ist eigentlich die gleiche Frage. Du lässt das Filter mit dt=100ms laufen. Wenn ein GPS Signal alle 1s kommt, dann setzt du in der Messmatrix H den Wert für GPS auf 1, sonst lässt du ihn 0.
Das ist übrigens exakt der Fall, den ich dir verlinkt habe (https://github.com/balzer82/Kalman/blob/master/Extended-Kalman-Filter-CTRV.ipynb?create=1).
Da läuft das Filter mit 50Hz und GPS mit 1Hz.
Von: Paul Balzer
Was mir noch einfällt: Wenn du mit einem Sensor/Messung direkt einen Wert im Zustandsvektor (z.B. die Position) updatest, dann kann die natürlich ‚springen‘.
Umso kleiner der Wert in Q (Varianz des Prozessrauschens) im Vergleich zum entsprechenden Wert in R ist (Varianz des Messrauschens), umso weniger wird es sich durch die Messung beeinflussen lassen und springen. Allerdings ist dann dein Prozess auch träger, d.h. in Kurven o.ä. wird er nicht hinterher kommen.
Hier ein Tracking, wo du den Unterschied zwischen 50Hz und 1Hz siehst: http://mechlab-engineering.de/wordpress/wp-content/uploads/2014/03/Extended-Kalman-Filter-CTRV-Adaptive-Trajectory.png
Von: Christian
Danke für deine Ausführungen! Ich werde mal aufgrund der langsameren Sample-Rates des Prozesses das CTRA Dynamikmodell ausprobieren.
Finde hierzu allerdings nicht allzu viele Infos, hättest du hier ein paar Quellen für mich?
Von: RandyW.
Was muss ich tun wenn keine Messung vorhanden ist? Nehme ich dann nur das Kinematikmodell (also nur x=gA(x,u))? oder muss ich auch immer die Covariance Pt mitberechnen?
Von: RandyW.
Was muss ich tun wenn keine Messung vorhanden ist? Nehme ich dann nur das Kinematikmodell (also nur x=gA(x,u))? oder muss ich auch immer die Covariance Pt mitberechnen?
Von: Paul Balzer
Die Kovarianz-Matrix P muss in jedem Fall mit berechnet werden. Denn wenn du keine Messung hast, wird die im ‚Prediction‘ Step immer größer und größer (es kommt ja +Q dazu) und das zeigt dem Filter, dass es immer weniger sicher ist. Du hast ja keine Messungen.
Wenn du keine hast, kannst du den Correction Step einfach weg lassen (man sagt das Filter läuft ‚Open Loop‘) oder du setzt die Messfunktion `h` auf Nullvektor (0).
Von: Torben
Hallo Paul,
danke für die interessanten Ausführungen. Ich habe eine Frage zum Matlab Skript.
Im Corrector Schritt wird der neue geschätzte Zustandsvektor zu \(x_{est} = x1 + K \cdot (y – h(x1))\) berechnet.
Wenn ich das richtig nachvollzogen habe, so wird in einem deinem Skript die Messung \(y\) zum Zeitpunkt \(t0\) aufgenommen, aber die Differenz zur „virtuellen“ Messung \(h(x1)\) zum Zeitpunkt \(t1\) gebildet. Müsste \(y\) nicht zum Zeitpunkt \(t1\) gemessen werden, konkret statt \(h(s)\), \(h(f(s))\) nehmen ?
Eine andere Frage betrifft die Übergangsmatrix. Üblicherweise habe ich kontinuierliche Modelle in Zustandsnormalform \(x_{dot} = A \cdot x + B \cdot u\), wie kommt man denn von dieser in die diskrete Form der Übergangsmatrix \(x_{t+1} = Phi(t) \cdot x(t)\) ?
Von: PES4 | Andreas' Blog
[…] gesucht Das Kalman-Filter einfach erklärt [Teil 1] Das Kalman Filter einfach erklärt [Teil 2] Das Extended Kalman Filter einfach erklärt Kalman Filter For Dummies IMU Data Fusing: Complementary, Kalman, and Mahony Filter Combine […]
Von: Motorblog » Von der Theorie auf die Rennstrecke: Kalman-Filter für die Antriebsschlupfregelung
[…] eigenen Projektes mit dem Kalmanfilter beschäftigt und dabei viel von den Blogeinträgen KF 1/KF 2/EKF gelernt. Da ich auch aufgrund des Standortvorteils direkt mit Paul über die Gestaltung fachsimpeln […]
Von: htw-mechlab.de » Sensordatenfusion mit Extended Kalman Filter (EKF)
[…] wird dabei ein Constant Turn Rate and Velocity (CTRV) -Modell nach folgendem Vorbild verwendet: http://www.cbcity.de/das-extended-kalman-filter-einfach-erklaert. Die Messdaten stammen aus einer Messung mit dem laboreigenen BMW i3 und wurden im Robot Operating […]
Von: Anonymous
˚Ʒ˚ݥ֥ɤΥ륤 ȥͥ롢åե8` iphone8`ƷB餷Ƥޤ“iphonecasesjpbuycheap777″˚ݤiPhone8/plusЩ`ʤdiphone`,ͥiphone8`,륤ȥiPhoneX`,åiphone8plus`,ޥۥ`֥ɥԩ`Dͨ.
ͥiphone` http://www.cyclinghalloffame.com/
Von: Paul Balzer
Hallo Martin,
ich habe den Artikel noch mal etwas überarbeitet, weil ich die Matlab Lösung nicht so schön finde. Die ist in der Tat verwirrend, weil dort numerisch differenziert wird und auch mit den Funktionen hin & her gesprungen wird.
Schau dir mal das eingebettete Video an mit der Python Implementierung, dann wird es deutlicher hoffe ich!
Grüße
Von: Andreas
Hallo Herr Balzer,
eine schöne Einführung zum Thema haben Sie hier erstellt. Was ich mich bei diesem Part zum EKF Frage ist folgendes:
Die Drehwinkelgeschwindigkeit im letzten Diagramm sieht “extrem” stark verrauscht aus. Die Messpunkte liegen auf den richtigen Statezustand. Kann es sein, dass bei bei der Kovarianz für die Messung anstatt:
R=r^2 ein R=r^2*eye(2,2) gemeint war?
Schönen Gruß
Andreas
Von: Manajemen
Can you provide additional details on the advantages or considerations of using Python for implementing EKF compared to other programming languages, and are there specific libraries or tools that are commonly used in EKF implementations in Python?