Kalman Filter C Implementierung GPS

Gast #5111959
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.
Gast
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.
Gast
@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.
Gast
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.
Gast
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.
Gast
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.