Hallo!
Ich arbeite zur Zeit an einem kleinen Hobby-Projekt, bei dem ich ein GPS
Sensor nutze. Die Daten, welche ich daraus erhalte sind allerdings nicht
allzu gut und vor allem sind da sehr viele Ausreißer bei.
Ich habe nun nach einer Ladung Recherche erfahren, dass ein Kalman
Filter da Wunder wirkt. Allerdings hab ich überhaupt keine Ahnung davon
und selbst nach einiger Recherche tappe ich noch immer im Dunkeln.
Hat da eventuell jemand ne Idee, wie ich dieses Filter einsetze, oder
gar ein paar Code Schnipsel?
Grüße,
Woda
Eine wirklich sehr einfache und anschauliche Erklärung des Kalman
Filters finde ich diese hier:
http://www.cbcity.de/das-kalman-filter-einfach-erklaert-teil-1
Hat man mal die Funktionsweise verstanden, ist das Filter wirklich
genial. Wenn auch im Einsatz nicht ganz unkompliziert, da die diversen
Filterkonstanten erst bestimmt werden müssen.
Für den Einsatz auf einem uC sollte aber eine Floating Point Einheit
vorhanden sein. Andernfalls tut man sich recht schwer damit.
So ein Kalmanfilter ist eigentlich gedacht für verschiedene Sensoren aus
zu werten nach ein Ergebnis. Wenn sie nur eine GPS haben, brauchen sie
Kalman nicht. Wenn zusatzlich noch ein IMU (inertial measurement unit)
forhanden ist, oder odometrie macht das mehr Sinn. Das Problem bei GPS
ist das die genauigkeit abhangt von fiele externe factoren, ein Filter
kan helfen, aber macht das GPS-update auch langsamer.
@Sebastian
Ich hab mir die Seite angeschaut und die war auch wirklich sehr
hilfreich!
Allerdings habe ich zwar jetzt ein Grundverständniss dafür, aber
immernoch keinen Schimmer, wie man das implementieren könnte. Hast du
sowas schonmal implementiert und Erfahrung damit?
@RP6
Hast du eine Idee, wie man auch ohne Kalman Filter die Werte aufbessern
kann und auch nachfolgende Werte vorhersagen kann? Dachte mir, dass da
das Kalman Filter die einfachste Lösung sei.
Ein Kalmann-Filter fusioniert verschiedene Sensorwerte. Du hast nur
einen Sensor mit Ausreißern, also willst du eigentlich die Ausreißer
rausfiltern.
Vielleicht reicht ein einfacher Medianfilter: Du merkst dir immer die
letzten drei (fünf, sieben, nein, elf) Werte, sortierst sie und nimmst
den mittleren.
RP6conrad schrieb:> So ein Kalmanfilter ist eigentlich gedacht für verschiedene Sensoren aus> zu werten nach ein Ergebnis. Wenn sie nur eine GPS haben, brauchen sie> Kalman nicht.
Nein Nein Nein! Das ist einfach falsch. Sorry. Das Kalmanfilter wird
recht häufig mit Sensorfusion verwendet - das ist aber nicht der Sinn
des Kalmanfilters. Das Prinzip des Kalmanfilters hat nichts damit zu
tun, dass mehrere Sensorwerte fusioniert werden. Siehe auch
http://www.cbcity.de/das-kalman-filter-einfach-erklaert-teil-1http://www.cbcity.de/das-kalman-filter-einfach-erklaert-teil-2http://www.cbcity.de/das-extended-kalman-filter-einfach-erklaertSebastian K. schrieb:> Für den Einsatz auf einem uC sollte aber eine Floating Point Einheit> vorhanden sein. Andernfalls tut man sich recht schwer damit.
Oder man rechnet eben mit Ganzzahlen ... das geht auch auf einem 8-Bit
Mikrocontroller mit 4 MHz völlig ohne Probleme. Natürlich macht es die
FPU schöner, einfacher und schneller. Aber eine FPU ist für mich keine
Vorraussetzung für ein Kalmanfilter.
Woda schrieb:> @RP6> Hast du eine Idee, wie man auch ohne Kalman Filter die Werte aufbessern> kann und auch nachfolgende Werte vorhersagen kann? Dachte mir, dass da> das Kalman Filter die einfachste Lösung sei.
Viel einfacher als das Kalman Filter ist das Alpha Beta Filter. Das ist
so eine Art "Kalmanfilter für Arme". Aber vor allem ist es viel
einfacher zu verstehen. Google mal danach.
Woda schrieb:> erfahren, dass ein Kalman> Filter da Wunder wirkt.
Prinzipiell musst du natürlich aber sehen, dass auch ein noch so gutes
Filter keine Informationen herausholen kann die nicht messbar sind. Wie
der Name bereits besagt reduziert ein Filter den Informationsgehalt.
Dieses wegnehmen von Informationen macht es aber u.U. erst möglich die
gemessenen Daten sinnvoll zu nutzen. Die Sensorfusion mit einer IMU ist
mit Sicherheit ein gängiges Verfahren um sich zusätzlich Informationen
dazuzuholen. Ich verweise da gerne auf Open Source Drohnen - die haben
nämlich genau deine Problematik auch. Sie brauchen eigentlich eine sehr
genaue Position, haben aber nur GPS, eine schlechte IMU aus
MEMS-Sensoren und wollen daraus eine Flugregelung bauen die möglichst
auf wenige cm genau die Position halten soll. Da viele Projekte dort
Open Source sind bin ich mir sicher, dass sich da was findet für dich
...
Ansonsten erzähl doch mehr von deinem Projekt. Dann bekommst du
vielleicht noch einige andere Ideen.
Die ganzen Informationen habe ich soweit mal durchgeschaut, allerdings
fehlt mir noch immer der genaue Durchblick, wie ich genau die Matrizen
fülle.
Es geht bei meinem Projekt im Prinzip auch nur darum, dass ich das GPS
in einem Auto verwende und dadurch die Messdaten recht ungenau werden.
Daher möchte ich die Daten etwas filtern.
Die Idee mit dem Alpha Beta Filter ist auch super, aber ich möchte es
erstmal mit dem Kalman Filter durchziehen :-)
Hat jemand ein Beispiel, mit ähnlicher Grundidee, dass ich mir den
Aufbau der Matrizen abgucken kann? :-)
Woda schrieb:> Die ganzen Informationen habe ich soweit mal durchgeschaut, allerdings> fehlt mir noch immer der genaue Durchblick, wie ich genau die Matrizen> fülle.
Du brauchst erstmal ein mathematisches Modell.
Allgemein ein nichtlineares Modell sieht wie folgt aus
x' = f(x,u),
y = h(x).
x ist die Systemzustände, u der Systemeingang.
x' = Ax + Bu wenn dein System linear ist.
y = Cx.
Konkret zu deinem System: x = [Position, Geschwindigkeit,
Beschleunigung], u = 0.
Was du messen kannst ist die Position, die Geschwindigkeit und
Beschleunigung müssen geschätzt werden.
ISBN 9783486705720
Integrierte Navigationssysteme: Sensordatenfusion, GPS und Inertiale
Navigation
Da wird auch auf die Anwendung von Kalman-Filtern eingegangen.
Schonmal vielen Dank allerseits!
Der Aufbau der einzelnen Matrizen etc. hat super geklappt.
Jetzt habe ich aber noch das Problem, dass man mit GPS-Koordinaten ja
nicht direkt rechnen kann (oder?).
Ich habe die Koordinaten im Dezimalminuten Format, kann mir jemand
sagen, wie ich am elegantesten diese Werte im Filter, welcher auf
metrische Werte ausgelegt ist, nutze?
Ich habe den Ansatz, dass ich die Werte einfach in ein anderes
Koordinatensystem stecke, mit dem ersten Wert als (0,0) Ausgangswert und
jeweils die Entfernung der Werte aufaddiere.
Grüße,
Woda