Kalman-Filterung der Spurerkennung: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
 
(11 dazwischenliegende Versionen von einem anderen Benutzer werden nicht angezeigt)
Zeile 1: Zeile 1:
'''Autoren:''' [[Benutzer:Jan Müller|Jan Müller]], [[Benutzer:Yannick Schmidt| Yannick Schmidt]]  
'''Autoren:''' [[Benutzer:Jan Müller|Jan Müller]], [[Benutzer:Yannick Schmidt| Yannick Schmidt]] <br>
 
'''Betreuer:''' [[Benutzer:Ulrich_Schneider| Prof. Schneider]]<br/>
'''Betreuer:''' [[Benutzer:Ulrich_Schneider| Prof. Schneider]]<br/>
<br>
<br>
Zeile 9: Zeile 10:
== Einleitung ==
== Einleitung ==
[[Datei:PolynomVorKalman.gif|150px|thumb|right|Abbildung 1: Polynom vor Kalman-Filter]]
[[Datei:PolynomVorKalman.gif|150px|thumb|right|Abbildung 1: Polynom vor Kalman-Filter]]
Der folgende Artikel beschreibt die Anwendung eines Kalman-Filters zur Filterung der Spurerkennung des Carolo-Cup-Fahrzeugs der HSHL. Hintergrund ist, dass der bisherige Algorithmus zur Spurerkennung keine Filterung beinhaltet und entsprechende Ausreißer, wie in Abbildung 1. zu sehen, zur Folge hat
Der folgende Artikel beschreibt die Anwendung eines Kalman-Filters zur Filterung der Spurerkennung des Carolo-Cup-Fahrzeugs der HSHL. Hintergrund ist, dass der bisherige Algorithmus zur Spurerkennung keine Filterung beinhaltet und entsprechende Ausreißer, wie in Abbildung 1. zu sehen, zur Folge hat. Ziel der Integrierung eines Kalman-Filters ist die Eliminierung des in Abb. 1 zu sehenden Zappelns.
 
== Inhalt ==
Die Gliederung des Inhalts hängt stark von Ihrem individuellen Projekt ab. Benutzen Sie einen leicht nachvollziehbaren roten Faden und gliedern Sie nach gesundem Menschenverstand!
 
 
 
=== Unterabschnitt ===
# Nutzen Sie Aufzählungen
#* mit verschiedenen Schachtelungen
#* und so weiter
# zweite Ebene
#* mit erneuter Unterebene
 
=== Bilder ===
Bauen Sie Bilder ein, am Besten mit darin gekennzeichneten Stellen, die Sie dann im Text erklären. Referenzieren Sie Bilder und Tabellen konsequent im Text. Zitieren Sie ggf. die Bildurheber.
[[Datei:RetroGameStation_HSHL_Messe.jpg|rechts|mini|Abb 1: Beispielbild mit Quelle  <ref>© Mirek Göbel - Eigenes Werk</ref>]]
 
==== Bilder in den Text einbetten ====
Wenn Sie Bilder anzeigen möchten, ohne dass der Artikel links oder rechts weiter läuft, können Sie den Textfluss mit dem Befehl <nowiki><br clear=all></nowiki> stoppen (vgl. Abb. 2).
 
[[Datei:Sps steuerung cpu313c.jpg|left|mini|300px|Abb 2: Beispiel <nowiki><br clear=all></nowiki>]]
<br clear=all>
 
Alternativ können Sie das Bild in einer "wikitable" anzeigen lassen. Dadurch wird das Bild auch auf Bildschirmen mit einer anderen Auflösung in der richtigen Darstellungsart angezeigt (vgl. Abb. 3).
{| class="wikitable"
| [[Datei:Sps steuerung cpu313c.jpg|left|mini|300px|Abb 3: Beispiel wikitable]]
|}
Hier geht es weiter mit dem Text.
 
=== Tabellen ===
Tabelle 1 zeigt ein schönes Beispiel. '''[''Achtung 19.09.2022: mw-datatable funktioniert in diesem neuen Wiki nicht mehr!'']'''
{| class="mw-datatable"
! style="font-weight: bold;" | Spalte 1
! style="font-weight: bold;" | Spalte 2
! style="font-weight: bold;" | Spalte 3
|+ style = "text-align: left"|Tabelle 1: Beispieltabelle
|-
| blabla
| sowieso
| sowieso
|-
| test
| sowieso
| test1
|}
 
{| class="wikitable sortable"
|+ Tabelle mit Sortierfunktion
|-
! Überschrift !! Überschrift !! Überschrift
|-
| Beispiel || Beispiel || Beispiel
|-
| Beispiel || Beispiel || Beispiel
|-
| Beispiel || Beispiel || Beispiel
|}
 
=== Formeln ===
Für Formeln nutzen Sie die <nowiki><math></nowiki>-Umgebung.
 
Dieser Quelltext
 
<code type="latex">
<nowiki><math></nowiki> y = \int\limits_0^2 {\sin \frac{x}{2}dx}<nowiki></math></nowiki>
</code>
 
wird dann so dargestellt
<math>
y = \int\limits_0^2 {\sin \frac{x}{2}dx}
</math>.
 
Eine Übersicht über die Befehle findet sich z. B. hier: [https://latex-kurs.de/fragen/Gleichungen_Basic.html Gleichungen in math].
 
 
=== Sonderzeichen ===
Sonderzeichen setzen Sie einfach über [Alt]+ANSI Code z.B. [Alt]+0177: ±
 
Übersicht der [https://www.chip.de/news/ANSI-Code-Tabelle-Sonderzeichen-schnell-finden_132459812.html ANSI-Code Sonderzeichen]
 
Alternativ kann der [https://www.vioma.de/de/wiki/tools/html-sonderzeichen/#HTML-Sonderzeichen:%20Dingbats%20Zahlen Unicode] eingegeben werden z.B. <nowiki>&#10102;</nowiki> für &#10102;.
 
=== Formatierung ===
Nutzen Sie zur Formatierung Beispiele, z. B. aus dem weltbekannten Wikipedia selbst (das ist die gleiche Syntax!) oder anderer Hilfeseiten wie z. B. <ref> [http://meta.wikimedia.org/wiki/Help:Editing/de Hilfeseite des Wikimedia-Projekts] </ref>.
 
=== Quelltext ===
Anleitung und Beispiele zum Einbinden von Quelltext finden Sie hier: [[Quelltext_einbinden]].
<!-- 27.02.2021 derzeit defekt
Bei lang= muss die richtige Sprache eingetragen werden (matlab, c,...).
 
<source line lang="matlab" style="font-size:small">
for i=1:10
%    try
%        image = CAMERA_DumpFrame(s);     
%    catch err
%        error('MATLAB:RWTHMindstormsNXT:Sensor:unknown', 'An unknown Error occured while fetching the image. Please check that the Camera is connected and try again');
%    end
    image = CAMERA_GetImage(com);
    handle = imshow(image);
    %pause(0.1)
    currTime(i) = toc(startTime);
    disp(['Aktuelle Zeit: ',num2str(currTime(i))])
    %imwrite(image,sprintf('NXTCamImage%03d.png',i));
    %imwrite(img,fullfile(workingDir,sprintf('HexBug%03d.png',n)));
    % ca. alle 4.8 Sekunden ein Bild
end;
</source>
-->
 
=== Zitieren ===
Fremdquellen sollten Sie auf jeden Fall zitieren. Internetquellen können Sie einfach verlinken. Literatur zitieren Sie bitte nach [[Zitieren_nach_DIN1505|DIN ISO 690:2013-10]].
 
=== Absätze ausblenden ===
<div class="mw-collapsible mw-collapsed">
Zusätzliche Informationen können Sie mit dieser Formatierung bei Bedarf ein- und ausklappen.
</div>
 
 
 
 
 


== Zusammenfassung ==
== Hintergund Kalman-Filter ==
Was ist das Ergbnis?
Die Anwendung des Kalman-Filters wurde im Verlauf der Lehrveranstaltung "Multisensorsysteme" erlernt. Der Kalman-Filter wird verwendet, um Parameter der verschiedensten Systeme zu schätzen. Er schätzt, basierend auf dem aktuellen und vergangenen Messwerten den Zustand des Systems und kann auf diese Weise Messungen eliminieren, die stark verrauscht sind. Der Filter setzt sich aus verschiedenen Parametern zusammen. Dazu gehört die Eingansgröße, Ausgangsgröße und das Systemmodell.
Das Ergebnis dieses Artikels ist eine Vorlage, mit der Nutzer des Wikis schnell und leicht eigene Artikel verwirklichen können. Diese Vorlage ist Bestandteil der Anleitungen aus [http://193.175.248.171/wiki/index.php/Kategorie:HowTo den How-To's].


== Auslegung des Kalman-Filters ==
Für eine optimale Filterung muss das Systemmodell passend ausgerichtet werden. Im folgenden wird die Bestimmung der wichtigsten Parameter (in Abbildung 2 zu sehen) aufgeschlüsselt.
[[Datei:ParametrierungKalmanFilter.png|400px|thumb|left|Abbildung 2: Parameter des Kalman-Filters]]
=== Systemmatrix A ===
Die Systemmatrix A wird als n*n Matrix angelegt. Wobei n aus der Länge des Messvektors ermittelt wird. Der Messvektor setzt sich im Falle der Spurerkennung aus insgesamt 7 Werten zusammen: 1-3. Die drei Werte des Polynoms (a, b, c), 4-5. x und y des ersten gefundenen Schnittpunktes, 6-7. x und y des letzten gefundenen Schnittpunkts. Auf diesen sieben Parametern basierend kann nun die Systemmatrix aufgestellt werden. Da es zwischen den Werten keine Abhängigkeiten gibt kann hier ganz einfach eine 7*7 Einheitsmatrix gebildet werden.
=== Systemrauschen Q ===
Das Systemrauschen Q wird über eine zuvor ermittelte Standardabweichung eingestellt welche mit einer 7*7 Einheitsmatrix multipliziert wird. Da unser aufgestelltes System nicht anfällig für Fehler ist haben wir uns hier für einen niedrigen Wert von 0.001 entschieden.
=== Messrauschen R ===
Ähnlich wie auch das Systemrauschen wird das Messrauschen basierend auf einer 7*7 Einheitsmatrix multipliziert mit einer zuvor bestimmten Standardabweichung bestimmt. Die Messungen weisen in der Regelung kein großes Rauschen auf, lediglich einzelne Frames beinhalten fehlerhafte Polynome. Aus diesem Grund haben wir uns hier für eine Standardabweichung von 0.01 entschieden.
=== Anfangs-Zustandsschätzung x ===
Hierbei handelt es sich um den ersten Messwert für den Kalman-Filter. Dieser muss das selbe Format haben wie der Messvektor. Der Einfachheit halber haben wir uns hier für einen 7*1 Nullvektor entschieden. Allerdings geben wir diesem Messwert im folgenden Messwert wenig Vertrauen, damit sich das Modell, basierend auf den folgenden Messwerten einpendeln kann </br></br>
=== Anfangs-Fehlerkovarianz ===
Mit diesem Wert wird das Vertrauen für die erste Zustandsschätzung in dem Kalman-Filter integriert, je niedriger der Wert, desto höher das Vertrauen. Mit 100 haben wir das Vertrauen sehr gering eingestellt. Damit dem zuvor angelegten Nullvektor nicht groß vertraut wird.


== Ausblick ==
== Integrierung in Spurerkennung ==
Was kann/muss noch verbessert werden?
Der Kalman-Filter wurde zuvor in der Matlab-Entwicklungsumgebung implementiert und ausgelegt. Anschließend wurde aus dem Matlab-Code c-Code, mithilfe des Matlab Coders generiert. Der generierte Code wurde anschließend in das Visual Studio Projekt integriert. Die Code-Generierung mit dem Matlab-Coder wird im folgenden Artikel genauer beschrieben: [https://wiki.hshl.de/wiki/index.php/Von_Matlab_zu_C_Code Von Matlab zu C code].
Die generierte Funktion "KalmanFilter" wird anschließend in der Funktion der Spurerkennung, nachdem die Koordinaten transformiert wurden aufgerufen. Der folgende Auszug aus dem Quellcode der Spurerkennung zeigt den Umgang mit dem Kalman-Filter:
[[Datei:KalmanFilterInC.png|1200px|center|thumb|Abbildung 3: Auszug aus Spurerkennung.cpp]]
Dabei wird im ersten Schritt der Messvektor z aus Polynom-Parametern und Koordinaten generiert. Anschließend der Zustandsvektor für das Ergebnis der Filterung angelegt. Mit den beiden Vektoren kann nun der Kalman-Filter aufgerufen werden. Abschließend werden die Spurparameter mit den neuen Werten überschrieben und bei Bedarf in einem neuen Fenster (im Fahrzeug Koordinatensystem) ausgegeben (vgl. Abbildung 3).


== Ergebnis ==
[[Datei:PolynomKalman.gif|250px|thumb|left|Abbildung 4: Polynom nach Kalman-Filter]]
Mit der Anwendung des Kalman-Filters konnten die Ausreißer erfolgreich eliminiert werden. Die Abbildung 4 zeigt, dass das Polynom nun viel ruhiger verläuft und fehlerhaft erkannte Punkte nicht mehr zu unnötigem Rauschen des Polynoms führen. Dies hat zur Folge, dass die Regler weniger mit falschen Werten, bzw. starken Schwankungen zu kämpfen haben und die Spur generell zuverlässiger erkannt werden kann.


== Lessons Learned ==
- Auslegung des Kalman-Filters </br>
- Anwendung des Matlab Coders inkl. Einbindung in Visual Studio </br>
<br><br><br><br><br><br><br><br><br><br>
== Literaturverzeichnis ==
== Literaturverzeichnis ==
<references />
<references />

Aktuelle Version vom 12. Januar 2023, 18:02 Uhr

Autoren: Jan Müller, Yannick Schmidt

Betreuer: Prof. Schneider

→ zurück zum Hauptartikel: OSE Softwareumgebung
→ zurück zum Hauptartikel: OSE - Objekt - und Spurerkennung
→ zurück zum Hauptartikel: Praktikum SDE

Einleitung

Abbildung 1: Polynom vor Kalman-Filter

Der folgende Artikel beschreibt die Anwendung eines Kalman-Filters zur Filterung der Spurerkennung des Carolo-Cup-Fahrzeugs der HSHL. Hintergrund ist, dass der bisherige Algorithmus zur Spurerkennung keine Filterung beinhaltet und entsprechende Ausreißer, wie in Abbildung 1. zu sehen, zur Folge hat. Ziel der Integrierung eines Kalman-Filters ist die Eliminierung des in Abb. 1 zu sehenden Zappelns.

Hintergund Kalman-Filter

Die Anwendung des Kalman-Filters wurde im Verlauf der Lehrveranstaltung "Multisensorsysteme" erlernt. Der Kalman-Filter wird verwendet, um Parameter der verschiedensten Systeme zu schätzen. Er schätzt, basierend auf dem aktuellen und vergangenen Messwerten den Zustand des Systems und kann auf diese Weise Messungen eliminieren, die stark verrauscht sind. Der Filter setzt sich aus verschiedenen Parametern zusammen. Dazu gehört die Eingansgröße, Ausgangsgröße und das Systemmodell.

Auslegung des Kalman-Filters

Für eine optimale Filterung muss das Systemmodell passend ausgerichtet werden. Im folgenden wird die Bestimmung der wichtigsten Parameter (in Abbildung 2 zu sehen) aufgeschlüsselt.

Abbildung 2: Parameter des Kalman-Filters

Systemmatrix A

Die Systemmatrix A wird als n*n Matrix angelegt. Wobei n aus der Länge des Messvektors ermittelt wird. Der Messvektor setzt sich im Falle der Spurerkennung aus insgesamt 7 Werten zusammen: 1-3. Die drei Werte des Polynoms (a, b, c), 4-5. x und y des ersten gefundenen Schnittpunktes, 6-7. x und y des letzten gefundenen Schnittpunkts. Auf diesen sieben Parametern basierend kann nun die Systemmatrix aufgestellt werden. Da es zwischen den Werten keine Abhängigkeiten gibt kann hier ganz einfach eine 7*7 Einheitsmatrix gebildet werden.

Systemrauschen Q

Das Systemrauschen Q wird über eine zuvor ermittelte Standardabweichung eingestellt welche mit einer 7*7 Einheitsmatrix multipliziert wird. Da unser aufgestelltes System nicht anfällig für Fehler ist haben wir uns hier für einen niedrigen Wert von 0.001 entschieden.

Messrauschen R

Ähnlich wie auch das Systemrauschen wird das Messrauschen basierend auf einer 7*7 Einheitsmatrix multipliziert mit einer zuvor bestimmten Standardabweichung bestimmt. Die Messungen weisen in der Regelung kein großes Rauschen auf, lediglich einzelne Frames beinhalten fehlerhafte Polynome. Aus diesem Grund haben wir uns hier für eine Standardabweichung von 0.01 entschieden.

Anfangs-Zustandsschätzung x

Hierbei handelt es sich um den ersten Messwert für den Kalman-Filter. Dieser muss das selbe Format haben wie der Messvektor. Der Einfachheit halber haben wir uns hier für einen 7*1 Nullvektor entschieden. Allerdings geben wir diesem Messwert im folgenden Messwert wenig Vertrauen, damit sich das Modell, basierend auf den folgenden Messwerten einpendeln kann

Anfangs-Fehlerkovarianz

Mit diesem Wert wird das Vertrauen für die erste Zustandsschätzung in dem Kalman-Filter integriert, je niedriger der Wert, desto höher das Vertrauen. Mit 100 haben wir das Vertrauen sehr gering eingestellt. Damit dem zuvor angelegten Nullvektor nicht groß vertraut wird.

Integrierung in Spurerkennung

Der Kalman-Filter wurde zuvor in der Matlab-Entwicklungsumgebung implementiert und ausgelegt. Anschließend wurde aus dem Matlab-Code c-Code, mithilfe des Matlab Coders generiert. Der generierte Code wurde anschließend in das Visual Studio Projekt integriert. Die Code-Generierung mit dem Matlab-Coder wird im folgenden Artikel genauer beschrieben: Von Matlab zu C code. Die generierte Funktion "KalmanFilter" wird anschließend in der Funktion der Spurerkennung, nachdem die Koordinaten transformiert wurden aufgerufen. Der folgende Auszug aus dem Quellcode der Spurerkennung zeigt den Umgang mit dem Kalman-Filter:

Abbildung 3: Auszug aus Spurerkennung.cpp

Dabei wird im ersten Schritt der Messvektor z aus Polynom-Parametern und Koordinaten generiert. Anschließend der Zustandsvektor für das Ergebnis der Filterung angelegt. Mit den beiden Vektoren kann nun der Kalman-Filter aufgerufen werden. Abschließend werden die Spurparameter mit den neuen Werten überschrieben und bei Bedarf in einem neuen Fenster (im Fahrzeug Koordinatensystem) ausgegeben (vgl. Abbildung 3).

Ergebnis

Abbildung 4: Polynom nach Kalman-Filter

Mit der Anwendung des Kalman-Filters konnten die Ausreißer erfolgreich eliminiert werden. Die Abbildung 4 zeigt, dass das Polynom nun viel ruhiger verläuft und fehlerhaft erkannte Punkte nicht mehr zu unnötigem Rauschen des Polynoms führen. Dies hat zur Folge, dass die Regler weniger mit falschen Werten, bzw. starken Schwankungen zu kämpfen haben und die Spur generell zuverlässiger erkannt werden kann.

Lessons Learned

- Auslegung des Kalman-Filters
- Anwendung des Matlab Coders inkl. Einbindung in Visual Studio











Literaturverzeichnis