Forum: Mikrocontroller und Digitale Elektronik Kalman Filter C Implementierung GPS


von Woda (Gast)


Lesenswert?

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

von Sebastian K. (sek)


Lesenswert?

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.

von RP6conrad (Gast)


Lesenswert?

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.

von Woda (Gast)


Lesenswert?

@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.

von S. R. (svenska)


Lesenswert?

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.

von Peter (Gast)


Lesenswert?

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-1 
http://www.cbcity.de/das-kalman-filter-einfach-erklaert-teil-2 
http://www.cbcity.de/das-extended-kalman-filter-einfach-erklaert

Sebastian 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.

von clonephone82 (Gast)


Lesenswert?

Vielleicht auch interessant. Code funktioniert auch habe ich vor ein 
paar Jahren mal mit einen paar Analog Device Sensoren ausprobiert.

sg

von clonephone82 (Gast)


Lesenswert?


von Woda (Gast)


Lesenswert?

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? :-)

von Stm M. (stmfresser)


Lesenswert?

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.

: Bearbeitet durch User
von Christoph db1uq K. (christoph_kessler)


Lesenswert?

ISBN 9783486705720
Integrierte Navigationssysteme: Sensordatenfusion, GPS und Inertiale 
Navigation
Da wird auch auf die Anwendung von Kalman-Filtern eingegangen.

von Thomas K. (rlyeh_drifter) Benutzerseite


Lesenswert?

Hallo,

ich hab mal nach einer Implementierung für den STM32 gesucht und hab da 
Folgendes gefunden:

https://github.com/simondlevy/TinyEKF


Eine weitere, wirklich nette, graphische Erklärung zum Kalman-Filter 
findet man hier:

http://www.bzarg.com/p/how-a-kalman-filter-works-in-pictures/

viel Spaß!

von Woda (Gast)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.