AlphaBot: Messdatenverarbeitung mit MATLAB: Unterschied zwischen den Versionen
Keine Bearbeitungszusammenfassung |
Keine Bearbeitungszusammenfassung |
||
| (45 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | |||
| Zeile 1: | Zeile 1: | ||
[[Kategorie:Arduino]] | [[Kategorie:Arduino]] | ||
[[Datei: | [[Datei:TesteFilterVergleich.jpg|thumb|rigth|450px|Abb. 1: Vergleich rauschunterdrückender Filter]] | ||
'''Autor:''' [[Benutzer:Ulrich_Schneider| Prof. Dr.-Ing. Schneider]] | {|class="wikitable" | ||
'''Modul:''' Praxismodul | |- | ||
'''Lehrveranstaltung:''' Mechatronik, Informatik Praktikum 2, 2. Semester | | '''Autor:''' || [[Benutzer:Ulrich_Schneider| Prof. Dr.-Ing. Schneider]] | ||
|- | |||
| '''Modul:''' || Praxismodul II | |||
|- | |||
| '''Lehrveranstaltung:''' || Mechatronik, Informatik Praktikum 2, 2. Semester | |||
|} | |||
== Inhalt == | == Inhalt == | ||
* | * Einarbeitung in MATLAB<sup>®</sup> | ||
* Programmierung und Anwendung eines gleitenden Mittelwertfilters | * Programmierung und Anwendung eines gleitenden Mittelwertfilters | ||
* Programmierung und Anwendung eines rekursiven Tiefpassfilters | |||
* Auslegung von Filterparameter | |||
* Anwendung der Filter auf eine Ultraschallmessung | |||
* Vergleich der Filter anhand technischer Kriterien | |||
== Lernziele== | == Lernziele== | ||
Nach Durchführung dieser Lektion | Nach Durchführung dieser Lektion | ||
* können Sie | * können Sie reale Messwerte speichern und via MATLAB<sup>®</sup> zyklisch visualisieren. | ||
* | * haben Sie ein gleitendes Mittelwertfilter programmiert. | ||
* | * haben Sie ein rekursives rekursiven Tiefpassfilter programmiert. | ||
* | * können Sie die Filter parametrieren. | ||
* | * haben Sie die Filter zyklisch auf Ultraschallmesswerte angewendet und das Filterverhalten analysiert. | ||
* können Sie | * können Sie eine Funktion in MATLAB<sup>®</sup> programmieren und aufrufen. | ||
== Lernzielkontrolle == | == Lernzielkontrolle == | ||
# | # Wozu werden rekursive Filter benötigt? | ||
# | # Nennen Sie die Formel für ein gl. Mittelwertfilter. | ||
# Welche | # Welche Parameter hat ein gl. Mittelwertfilter? Was bedeuten die Parameter? | ||
# | # Nennen Sie die rekursive Formel für ein Tiefpassfilter. | ||
# | # Welche Parameter hat ein Tiefpassfilter? Was bedeuten die Parameter? | ||
# | # Vergleichen Sie die zwei rekursiven Filter. Nennen Sie Vor- und Nachteile. | ||
# Wurde der Quelltext durch Header und Kommentare aufgewertet? | # Wurde der Quelltext durch Header und Kommentare aufgewertet? | ||
# Wurde auf <code>magic numbers</code> verzichtet? | # Wurde auf <code>magic numbers</code> verzichtet? | ||
# Wurde die | # Wurde die Programmierrichtlinie eingehalten? | ||
== Vorbereitung == | == Vorbereitung == | ||
Führen Sie als Vorbereitung den [https://www.mathworks.com/learn/tutorials/matlab-onramp.html MATLAB<sup>®</sup> Onramp Kurs] durch. | |||
'''Arbeitsergebnis''' in SVN: MATLAB<sup>®</sup> Kurszertifikat | |||
== Versuchsdurchführung == | == Versuchsdurchführung == | ||
=== Aufgabe | === Aufgabe 1.1: Positionserfassung mit Ultraschall === | ||
# | # Lesen Sie die Messwerte des Ultraschall-Sensors auf ein statisches Ziele aus. Schreiben Sie hierzu ein Arduino-Programm <code>messeEntfernung.ino</code>. Messen Sie zyklisch die Zeit mit dem Befehl <code>millis()</code>. | ||
# Messen Sie 10 s auf ein statisches Ziel (z. B. einen Karton) in 30 cm Entfernung. | |||
# | # Nutzen Sie das Programm Putty, um die Daten der seriellen Schnittstelle in der ASCII-Datei <code>UltraschallMessung.txt</code> zu speichern. Eine Anleitung finden Sie unter der URL [[Einrichtung von PuTTY]]. | ||
# Nutzen Sie das | # Schreiben Sie einmalig als Header die Bezeichnung der Messwerte Zeit in ms und Strecke in cm in die Textdatei. | ||
''' | '''Nützliche Befehle''': <code>pinMode(), digitalWrite(), pulseIn(), delayMicroseconds(), millis()</code> | ||
'''Arbeitsergebnisse''' in SVN: <code> | '''Arbeitsergebnisse''' in SVN: <code>UltraschallMessung.txt, messeEntfernung.ino</code> | ||
=== Aufgabe 2 | <div class="mw-collapsible mw-collapsed"> | ||
# | '''Tipp:''' Nutzen Sie das Demoprogramm [https://svn.hshl.de/svn/Informatikpraktikum_1/trunk/Demos/Arduino/DemoUltraschallHCSR04 DemoUltraschallHCSR04] als Programmierstart. | ||
# | </div> | ||
# | ---- | ||
=== Aufgabe 1.2: Darstellung und Speicherung in MATLAB<sup>®</sup> === | |||
# Stellen Sie die Messdaten in einem Diagramm in cm über der Zeit dar. | # Kopieren Sie das Demo [https://svn.hshl.de/usvn/project/Informatikpraktikum_1/show/trunk/Arduino/ArduinoLibOrdner/AlphaBot/examples/E32_DebugTxt2MATLAB/E32_DebugTxt2MATLAB.ino|<code>DemoDebugTxt2MATLAB.ino</code>] in Ihr Arbeitsverzeichnis und passen Sie es an. | ||
# Laden und visualisieren Sie die Messdaten in <code>Ultraschallmessung.txt</code> mit MATLAB<sup>®</sup>. | |||
# Sichern Sie die Achsenbeschriftung im 2x1 Cell-Array <code>stTitel</code>. | |||
# Stellen Sie die Messdaten in einem Diagramm in cm über der Zeit in s dar. | |||
# Beschriften Sie die Graphen. | # Beschriften Sie die Graphen. | ||
# Speichern Sie die Messung in der Datei <code>UltraschallMessung.mat</code>. | |||
'''Nützliche Befehle''': <code>plot, xlabel, ylabel, save</code> | |||
'''Arbeitsergebnisse''' in SVN: <code>zeigeUltraschallMessung.m, UltraschallMessung.mat</code> | |||
<div class="mw-collapsible mw-collapsed"> | |||
Gegeben (vgl. Abb. 1): | |||
* <code>fZeit</code>: 1x100 Messwertarray der Zeit in s | |||
* <code>fMesswerte</code>: 1x100 Messwertarray der Ultraschallwerte in cm | |||
<code>save('UltraschallMessung.mat','fZeit',fMesswerte','stTitel')</code> | |||
</div> | |||
---- | |||
=== Aufgabe 1.3: Zyklische Messdatenverarbeitung in MATLAB<sup>®</sup> === | |||
# Schreiben Sie die Funktion <code>(fZeit, fEntfernung)=LeseUltraschall(k)</code> und speichern Sie diese in der Datei <code>LeseUltraschall.m</code>. | |||
# Laden Sie darin <code>UltraschallMessung.mat</code> einmalig nur bei ersten Durchlauf und speichern Sie <code>fZeit, fEntfernung</code> als persistente Variablen. | |||
# <code>(fZeit, fEntfernung)=LeseUltraschall(k)</code> gibt zwei Werte fZeit(k) und fEntfernung(k) zurück (z. B. [0 30] für 0 s und 30 m). | |||
# Schreiben Sie das Rahmenprogramm <code>zeigeZyklischUltraschallMessung.m</code>, welches <code>LeseUltraschall</code> zyklisch aufruft. | |||
# Stellen Sie im Rahmenprogramm die Messdaten in einem Diagramm in cm über der Zeit in s dar. | |||
# Beschriften Sie den Graphen entsprechend Abb. 1. | |||
'''Nützliche Befehle''': <code>plot, xlabel, ylabel, load, global, persistent, isempty, for, function</code> | |||
''' | '''Arbeitsergebnisse''' in SVN: <code>zeigeZyklischUltraschallMessung.m, LeseUltraschall.m</code> | ||
=== Aufgabe | <div class="mw-collapsible mw-collapsed"> | ||
[[Datei:PAP_Aufgabe_1_4.jpg|thumb|left|450px|Abb. 2: PAP für die zyklische Messdatenverarbeitung]] | |||
</div> | |||
---- | |||
=== Aufgabe 1.4: Gleitendes Mittelwertfilter === | |||
Ein gleitendes Mittlwertfilter bildet einen Mittelwert über k Messwerte mittels FIFO. | Ein gleitendes Mittlwertfilter bildet einen Mittelwert über k Messwerte mittels FIFO. | ||
# Schreiben Sie die Funktion <code>GleitendesMittelwertFilter | # Schreiben Sie die Funktion <code>GleitendesMittelwertFilter.m</code>, welches die Eingangswerte zyklisch filtert. Hier bei wird der Mittelwert über die letzten k Messwerte gebildet. | ||
# Testen Sie Ihre Funktion mit Ultraschallmesswerten mit statischen Zielen. | # Testen Sie Ihre Funktion mit Ultraschallmesswerten mit statischen Zielen mit Ihrem Framework <code>zeigeZyklischUltraschallMessung.m</code> und <code>UltraschallMessung.mat</code> Aus den Aufgaben 1.3 und 1.4. | ||
# Visualisieren Sie Messwerte und Filterergebnis | # Visualisieren Sie Messwerte und Filterergebnis in einem Plot mit Achsenbeschriftung und Legende. | ||
# Testen Sie Ihre Funktion mit Ultraschallmesswerten mit dynamischen Zielen. | # Testen Sie Ihre Funktion mit Ultraschallmesswerten mit dynamischen Zielen. | ||
# Wählen Sie k anhand der Messwerte und diskutieren Sie Ihre Wahl mit Prof. Schneider. | # Wählen Sie k anhand der Messwerte und diskutieren Sie Ihre Wahl mit Prof. Schneider. | ||
''' | '''Nützliche Befehle''': <code>plot, xlabel, ylabel, legend, persistent, isempty, isnan, function</code> | ||
''' | '''Arbeitsergebnisse''' in SVN: <code>GleitendesMittelwertFilter.m, testeGleitendesMittelwertFilter.m</code> | ||
* Nutzen Sie | |||
* Die Formel für das gleitende Mittelwertfilter lautet: <math>\bar{x}(k)=\frac{x(1)+x(2)+\ldots+x(k)}{k}</math> für k Messwerte | '''Hinweise:''' | ||
* Nutzen Sie ein Array als FIFO. | |||
* Die Formel für das gleitende Mittelwertfilter lautet: <math>\bar{x}_{GM}(k)=\frac{x(1)+x(2)+\ldots+x(k)}{k}</math> für k Messwerte | |||
Eine Einführung zu rekursiven Filtern finden Sie in folgendem Video.<br> | {| role="presentation" class="wikitable mw-collapsible mw-collapsed" | ||
| <strong>Einführung zu rekursiven Filtern </strong> | |||
|- | |||
| Eine Einführung zu rekursiven Filtern finden Sie in folgendem Video.<br> | |||
* Gleitendes Mittelwertfilter: 19 m 52 s | * Gleitendes Mittelwertfilter: 19 m 52 s | ||
* Tiefpassfilter: 29 m | * Tiefpassfilter: 29 m | ||
[[Datei:RekursiveFilter.mp4|start=0|800px|Eine Einführung zu rekursiven Filtern]] | |||
<!-- | |||
<iframe key="panopto" path="/Panopto/Pages/Viewer.aspx?id=fce4a806-dcbf-4e92-b10d-ac69013d7cb1&autoplay=false&offerviewer=true&showtitle=true&showbrand=true&captions=false&interactivity=all" height="405" width="720" style="border: 1px solid #464646;" allowfullscreen allow="autoplay"></iframe> | <iframe key="panopto" path="/Panopto/Pages/Viewer.aspx?id=fce4a806-dcbf-4e92-b10d-ac69013d7cb1&autoplay=false&offerviewer=true&showtitle=true&showbrand=true&captions=false&interactivity=all" height="405" width="720" style="border: 1px solid #464646;" allowfullscreen allow="autoplay"></iframe> | ||
--> | |||
|} | |||
{| role="presentation" class="wikitable mw-collapsible mw-collapsed" | |||
| <strong>Demo </strong> | |||
< | |- | ||
| | |||
=== Aufgabe | [https://svn.hshl.de/svn/Informatikpraktikum_1/trunk/Demos/Arduino/DemoGleitenderMittelwert SVN: DemoGleitenderMittelwert] <br> | ||
Eine ausführliche Beschreibung mit Musterlösung finden Sie in [1, S. 11 ff.]. | |||
|} | |||
---- | |||
=== Aufgabe 1.5: Rekursives Tiefpassfilter === | |||
Ein rekursives Filter kann Messwerte in Echtzeit während der Laufzeit filtern. Nutzen Sie ein Tiefpassfilter, um die Messwerte zu filtern. | Ein rekursives Filter kann Messwerte in Echtzeit während der Laufzeit filtern. Nutzen Sie ein Tiefpassfilter, um die Messwerte zu filtern. | ||
# Schreiben Sie die Funktion <code>TiefpassFilter | # Schreiben Sie die Funktion <code>TiefpassFilter.m</code>, welches die Eingangswerte zyklisch filtert. Hierbei wird der Tiefpass berechnet. | ||
# Testen Sie Ihre Funktion mit Ultraschallmesswerten mit statischen Zielen. | # Testen Sie Ihre Funktion mit Ultraschallmesswerten mit statischen Zielen mit Ihrem Framework <code>zeigeZyklischUltraschallMessung.m</code> und <code>UltraschallMessung.mat</code> Aus den Aufgaben 1.3 und 1.4. | ||
# Visualisieren Sie Messwerte und Filterergebnis | # Visualisieren Sie Messwerte und Filterergebnis in einem Plot mit Achsenbeschriftung und Legende. | ||
# Testen Sie Ihre Funktion mit Ultraschallmesswerten mit dynamischen Zielen. | # Testen Sie Ihre Funktion mit Ultraschallmesswerten mit dynamischen Zielen. | ||
# Wählen Sie <math>\alpha</math> anhand der Messwerte und diskutieren Sie Ihre Wahl mit Prof. Schneider. | # Wählen Sie <math>\alpha</math> anhand der Messwerte und diskutieren Sie Ihre Wahl mit Prof. Schneider. | ||
'''Arbeitsergebnisse''' in SVN: <code>testeTiefpassFilter. | '''Arbeitsergebnisse''' in SVN: <code>TiefpassFilter.m, testeTiefpassFilter.m</code> | ||
'''Hinweis:''' | '''Hinweis:''' | ||
* Die Formel für das Tiefpassfilter lautet: <math>\bar{x}(k)=\alpha \cdot \bar{x}(k-1)+ (1-\alpha)\cdot x(k)</math> für den aktuellen Messwert <math>x(k)</math>. | * Die Formel für das Tiefpassfilter lautet: <math>\bar{x}_{TP}(k)=\alpha \cdot \bar{x}(k-1)+ (1-\alpha)\cdot x(k)</math> für den aktuellen Messwert <math>x(k)</math>. | ||
* <math>\alpha</math> ist hierbei ein Filterparameter <math>0<\alpha<1</math>. | * <math>\alpha</math> ist hierbei ein Filterparameter <math>0<\alpha<1</math>. | ||
{| role="presentation" class="wikitable mw-collapsible mw-collapsed" | |||
| <strong>Demo </strong> | |||
|- | |||
| [https://svn.hshl.de/svn/Informatikpraktikum_1/trunk/Demos/Arduino/DemoTiefpassFilter/DemoTiefpassFilter.ino SVN: DemoTiefpassFilter.ino]<br> | |||
Eine ausführliche Beschreibung mit Musterlösung finden Sie in [1, S. 11 ff.19]. | |||
|} | |||
---- | |||
=== Aufgabe 1.6: Filtervergleich === | |||
# Vergleichen Sie die Ergebnisse des Tiefpasses mit denen des gleitenden Mittelwertfilters. | |||
# Zeigen Sie das ungefilterte und die gefilterten Signal in MATLAB<sup>®</sup> in einem Plot vergleichend an (vgl. Abb.1). | |||
# Beschriften Sie die Achsen und nutzen Sie eine Legende. | |||
''' | '''Lernzielkontrollfragen:''' | ||
# Wurde das Signalrauschen geglättet? | |||
# Ist das gefilterte Signal verzögert? | |||
# Welchen Einfluss haben die Filterparameter? | |||
# Wie verhalten sich die gefilterten Signal bei Ausreißern? | |||
'''Arbeitsergebnisse''' in SVN: <code>testeFilterVergleich.m</code> | |||
{| role="presentation" class="wikitable mw-collapsible mw-collapsed" | |||
| <strong>Musterlösung </strong> | |||
|- | |||
| | |||
|- | |- | ||
| Eine ausführliche Beschreibung mit Musterlösung finden Sie in [1, S. 27 ff.]. | |||
|} | |} | ||
== | == Tutorial zum Einstieg == | ||
* [ | * [[Software_Plagiat| Was ist ein Plagiat?]] | ||
* [[Einarbeitung_in_die_Versionsverwaltung_SVN|Einarbeitung in die Versionsverwaltung SVN]] | |||
* [[Software Planung| Software Planung mit PAP]] | |||
* [[Arduino|Einstieg in die Welt des Arduino]] | |||
* [[Einführung_in_MATLAB|Einführung in MATLAB<sup>®</sup>]] | |||
* [[MATLAB-Befehle|MATLAB<sup>®</sup> Befehlsübersicht]] | |||
* [[Einrichtung von PuTTY]] | |||
* [[Ultraschallsensor_HC-SR04| HSHL-Wiki: Ultraschallsensor HC-SR04]] | * [[Ultraschallsensor_HC-SR04| HSHL-Wiki: Ultraschallsensor HC-SR04]] | ||
* [https://funduino.de/nr-10-entfernung-messen Funduino: Entfernungen mit einem HC-SR04 Ultraschallsensor am Arduino messen] | * [https://funduino.de/nr-10-entfernung-messen Funduino: Entfernungen mit einem HC-SR04 Ultraschallsensor am Arduino messen] | ||
* [https://www.arduino.cc/reference/de/ Arduino Befehlsübersicht] | |||
* [[Medium:Programmierrichtlinie.pdf|Programmierrichtlinie für C]] | |||
* [[Medium:Programmierrichtlinien_für_Matlab.pdf|Programmierrichtlinien für MATLAB<sup>®</sup>]] | |||
== Demos == | == Demos == | ||
* [https://svn.hshl.de/svn/Informatikpraktikum_1/trunk/Arduino/ArduinoLibOrdner/ArduinoUnoR3/examples/DemoUltraschallHCSR04 SVN: <code>DemoUltraschallHCSR04</code>] | |||
* [https://svn.hshl.de/svn/Informatikpraktikum_1/trunk/Arduino/ArduinoLibOrdner/ArduinoUnoR3/examples/DemoDebugTxt2MATLAB/ SVN: <code>DemoDebugTxt2MATLAB</code>] | |||
* [https://svn.hshl.de/svn/Informatikpraktikum_1/trunk/Demos/Arduino/DemoUltraschallHCSR04 SVN: DemoUltraschallHCSR04] | |||
* [https://svn.hshl.de/svn/Informatikpraktikum_1/trunk/Demos/Arduino/DemoDebug2MATLAB SVN: DemoDebug2MATLAB] | |||
* [https://svn.hshl.de/svn/Informatikpraktikum_1/trunk/Demos/Arduino/DemoGleitenderMittelwert/DemoGleitenderMittelwert.ino SVN: DemoGleitenderMittelwert.ino] | * [https://svn.hshl.de/svn/Informatikpraktikum_1/trunk/Demos/Arduino/DemoGleitenderMittelwert/DemoGleitenderMittelwert.ino SVN: DemoGleitenderMittelwert.ino] | ||
* [https://svn.hshl.de/svn/Informatikpraktikum_1/trunk/Demos/Arduino/DemoTiefpassFilter/DemoTiefpassFilter.ino SVN: DemoTiefpassFilter.ino] | * [https://svn.hshl.de/svn/Informatikpraktikum_1/trunk/Demos/Arduino/DemoTiefpassFilter/DemoTiefpassFilter.ino SVN: DemoTiefpassFilter.ino] | ||
== Literatur == | == Literatur == | ||
# | # Kim, P.: Kalman-Filter für Einsteiger: mit MATLAB Beispielen. CreateSpace Independent Publishing: 2016. ISBN-13: 978-1502723789 | ||
# Schneider, U.: ''Programmierrichtlinie für für die Erstellung von Software in C.'' Lippstadt: 1. Auflage 2022. [[Medium:Programmierrichtlinie.pdf|PDF-Dokument (212 kb)]] | # Schneider, U.: ''Programmierrichtlinie für für die Erstellung von Software in C.'' Lippstadt: 1. Auflage 2022. [[Medium:Programmierrichtlinie.pdf|PDF-Dokument (212 kb)]] | ||
== FAQ == | |||
* Muss ich die Lösungen selbst programmieren? '''Ja, nur Eigenleistung wird bewertet.''' | |||
* Darf ich die Musterlösung 1:1 kopieren und als meine Leistung ausgeben? '''Nein, das ist ein [[Software_Plagiat|Plagiat]] und wird als Täuschungsversuch gewertet.''' | |||
---- | ---- | ||
→ zurück zum Hauptartikel: [[ | → Termine [[Einführungsveranstaltung_Informatikpraktikum_2_im_SoSe_2025|1]] [[AlphaBot:_Messdatenverarbeitung_mit_MATLAB|2]] [[AlphaBot:_MATLAB_als_serieller_Monitor|3]] [[AlphaBot: Servo ansteuern|4]] [[AlphaBot:_Motoren_und_Inkrementalgeber|5]] [[AlphaBot: Programmier-Challenge I SoSe23|6]] [[AlphaBot:_Gesteuerte_Fahrt|7]] [[AlphaBot: Geregelte Fahrt mit Linienverfolger|8]] [[AlphaBot: Parklücke suchen|9]] [[AlphaBot: Autonomes Einparken|10]] [[AlphaBot: Programmier-Challenge II SoSe25|11]]<br> | ||
→ zurück zum Hauptartikel: [[AlphaBot_SoSe25|Informatik Praktikum 2]] | |||
Aktuelle Version vom 26. März 2025, 13:37 Uhr

| Autor: | Prof. Dr.-Ing. Schneider |
| Modul: | Praxismodul II |
| Lehrveranstaltung: | Mechatronik, Informatik Praktikum 2, 2. Semester |
Inhalt
- Einarbeitung in MATLAB®
- Programmierung und Anwendung eines gleitenden Mittelwertfilters
- Programmierung und Anwendung eines rekursiven Tiefpassfilters
- Auslegung von Filterparameter
- Anwendung der Filter auf eine Ultraschallmessung
- Vergleich der Filter anhand technischer Kriterien
Lernziele
Nach Durchführung dieser Lektion
- können Sie reale Messwerte speichern und via MATLAB® zyklisch visualisieren.
- haben Sie ein gleitendes Mittelwertfilter programmiert.
- haben Sie ein rekursives rekursiven Tiefpassfilter programmiert.
- können Sie die Filter parametrieren.
- haben Sie die Filter zyklisch auf Ultraschallmesswerte angewendet und das Filterverhalten analysiert.
- können Sie eine Funktion in MATLAB® programmieren und aufrufen.
Lernzielkontrolle
- Wozu werden rekursive Filter benötigt?
- Nennen Sie die Formel für ein gl. Mittelwertfilter.
- Welche Parameter hat ein gl. Mittelwertfilter? Was bedeuten die Parameter?
- Nennen Sie die rekursive Formel für ein Tiefpassfilter.
- Welche Parameter hat ein Tiefpassfilter? Was bedeuten die Parameter?
- Vergleichen Sie die zwei rekursiven Filter. Nennen Sie Vor- und Nachteile.
- Wurde der Quelltext durch Header und Kommentare aufgewertet?
- Wurde auf
magic numbersverzichtet? - Wurde die Programmierrichtlinie eingehalten?
Vorbereitung
Führen Sie als Vorbereitung den MATLAB® Onramp Kurs durch.
Arbeitsergebnis in SVN: MATLAB® Kurszertifikat
Versuchsdurchführung
Aufgabe 1.1: Positionserfassung mit Ultraschall
- Lesen Sie die Messwerte des Ultraschall-Sensors auf ein statisches Ziele aus. Schreiben Sie hierzu ein Arduino-Programm
messeEntfernung.ino. Messen Sie zyklisch die Zeit mit dem Befehlmillis(). - Messen Sie 10 s auf ein statisches Ziel (z. B. einen Karton) in 30 cm Entfernung.
- Nutzen Sie das Programm Putty, um die Daten der seriellen Schnittstelle in der ASCII-Datei
UltraschallMessung.txtzu speichern. Eine Anleitung finden Sie unter der URL Einrichtung von PuTTY. - Schreiben Sie einmalig als Header die Bezeichnung der Messwerte Zeit in ms und Strecke in cm in die Textdatei.
Nützliche Befehle: pinMode(), digitalWrite(), pulseIn(), delayMicroseconds(), millis()
Arbeitsergebnisse in SVN: UltraschallMessung.txt, messeEntfernung.ino
Tipp: Nutzen Sie das Demoprogramm DemoUltraschallHCSR04 als Programmierstart.
Aufgabe 1.2: Darstellung und Speicherung in MATLAB®
- Kopieren Sie das Demo
DemoDebugTxt2MATLAB.inoin Ihr Arbeitsverzeichnis und passen Sie es an. - Laden und visualisieren Sie die Messdaten in
Ultraschallmessung.txtmit MATLAB®. - Sichern Sie die Achsenbeschriftung im 2x1 Cell-Array
stTitel. - Stellen Sie die Messdaten in einem Diagramm in cm über der Zeit in s dar.
- Beschriften Sie die Graphen.
- Speichern Sie die Messung in der Datei
UltraschallMessung.mat.
Nützliche Befehle: plot, xlabel, ylabel, save
Arbeitsergebnisse in SVN: zeigeUltraschallMessung.m, UltraschallMessung.mat
Gegeben (vgl. Abb. 1):
fZeit: 1x100 Messwertarray der Zeit in sfMesswerte: 1x100 Messwertarray der Ultraschallwerte in cm
save('UltraschallMessung.mat','fZeit',fMesswerte','stTitel')
Aufgabe 1.3: Zyklische Messdatenverarbeitung in MATLAB®
- Schreiben Sie die Funktion
(fZeit, fEntfernung)=LeseUltraschall(k)und speichern Sie diese in der DateiLeseUltraschall.m. - Laden Sie darin
UltraschallMessung.mateinmalig nur bei ersten Durchlauf und speichern SiefZeit, fEntfernungals persistente Variablen. (fZeit, fEntfernung)=LeseUltraschall(k)gibt zwei Werte fZeit(k) und fEntfernung(k) zurück (z. B. [0 30] für 0 s und 30 m).- Schreiben Sie das Rahmenprogramm
zeigeZyklischUltraschallMessung.m, welchesLeseUltraschallzyklisch aufruft. - Stellen Sie im Rahmenprogramm die Messdaten in einem Diagramm in cm über der Zeit in s dar.
- Beschriften Sie den Graphen entsprechend Abb. 1.
Nützliche Befehle: plot, xlabel, ylabel, load, global, persistent, isempty, for, function
Arbeitsergebnisse in SVN: zeigeZyklischUltraschallMessung.m, LeseUltraschall.m
Aufgabe 1.4: Gleitendes Mittelwertfilter
Ein gleitendes Mittlwertfilter bildet einen Mittelwert über k Messwerte mittels FIFO.
- Schreiben Sie die Funktion
GleitendesMittelwertFilter.m, welches die Eingangswerte zyklisch filtert. Hier bei wird der Mittelwert über die letzten k Messwerte gebildet. - Testen Sie Ihre Funktion mit Ultraschallmesswerten mit statischen Zielen mit Ihrem Framework
zeigeZyklischUltraschallMessung.mundUltraschallMessung.matAus den Aufgaben 1.3 und 1.4. - Visualisieren Sie Messwerte und Filterergebnis in einem Plot mit Achsenbeschriftung und Legende.
- Testen Sie Ihre Funktion mit Ultraschallmesswerten mit dynamischen Zielen.
- Wählen Sie k anhand der Messwerte und diskutieren Sie Ihre Wahl mit Prof. Schneider.
Nützliche Befehle: plot, xlabel, ylabel, legend, persistent, isempty, isnan, function
Arbeitsergebnisse in SVN: GleitendesMittelwertFilter.m, testeGleitendesMittelwertFilter.m
Hinweise:
- Nutzen Sie ein Array als FIFO.
- Die Formel für das gleitende Mittelwertfilter lautet: für k Messwerte
| Einführung zu rekursiven Filtern |
Eine Einführung zu rekursiven Filtern finden Sie in folgendem Video.
|
| Demo |
|
SVN: DemoGleitenderMittelwert |
Aufgabe 1.5: Rekursives Tiefpassfilter
Ein rekursives Filter kann Messwerte in Echtzeit während der Laufzeit filtern. Nutzen Sie ein Tiefpassfilter, um die Messwerte zu filtern.
- Schreiben Sie die Funktion
TiefpassFilter.m, welches die Eingangswerte zyklisch filtert. Hierbei wird der Tiefpass berechnet. - Testen Sie Ihre Funktion mit Ultraschallmesswerten mit statischen Zielen mit Ihrem Framework
zeigeZyklischUltraschallMessung.mundUltraschallMessung.matAus den Aufgaben 1.3 und 1.4. - Visualisieren Sie Messwerte und Filterergebnis in einem Plot mit Achsenbeschriftung und Legende.
- Testen Sie Ihre Funktion mit Ultraschallmesswerten mit dynamischen Zielen.
- Wählen Sie anhand der Messwerte und diskutieren Sie Ihre Wahl mit Prof. Schneider.
Arbeitsergebnisse in SVN: TiefpassFilter.m, testeTiefpassFilter.m
Hinweis:
- Die Formel für das Tiefpassfilter lautet: für den aktuellen Messwert .
- ist hierbei ein Filterparameter .
| Demo |
| SVN: DemoTiefpassFilter.ino Eine ausführliche Beschreibung mit Musterlösung finden Sie in [1, S. 11 ff.19]. |
Aufgabe 1.6: Filtervergleich
- Vergleichen Sie die Ergebnisse des Tiefpasses mit denen des gleitenden Mittelwertfilters.
- Zeigen Sie das ungefilterte und die gefilterten Signal in MATLAB® in einem Plot vergleichend an (vgl. Abb.1).
- Beschriften Sie die Achsen und nutzen Sie eine Legende.
Lernzielkontrollfragen:
- Wurde das Signalrauschen geglättet?
- Ist das gefilterte Signal verzögert?
- Welchen Einfluss haben die Filterparameter?
- Wie verhalten sich die gefilterten Signal bei Ausreißern?
Arbeitsergebnisse in SVN: testeFilterVergleich.m
| Musterlösung |
| Eine ausführliche Beschreibung mit Musterlösung finden Sie in [1, S. 27 ff.]. |
Tutorial zum Einstieg
- Was ist ein Plagiat?
- Einarbeitung in die Versionsverwaltung SVN
- Software Planung mit PAP
- Einstieg in die Welt des Arduino
- Einführung in MATLAB®
- MATLAB® Befehlsübersicht
- Einrichtung von PuTTY
- HSHL-Wiki: Ultraschallsensor HC-SR04
- Funduino: Entfernungen mit einem HC-SR04 Ultraschallsensor am Arduino messen
- Arduino Befehlsübersicht
- Programmierrichtlinie für C
- Programmierrichtlinien für MATLAB®
Demos
- SVN:
DemoUltraschallHCSR04 - SVN:
DemoDebugTxt2MATLAB - SVN: DemoUltraschallHCSR04
- SVN: DemoDebug2MATLAB
- SVN: DemoGleitenderMittelwert.ino
- SVN: DemoTiefpassFilter.ino
Literatur
- Kim, P.: Kalman-Filter für Einsteiger: mit MATLAB Beispielen. CreateSpace Independent Publishing: 2016. ISBN-13: 978-1502723789
- Schneider, U.: Programmierrichtlinie für für die Erstellung von Software in C. Lippstadt: 1. Auflage 2022. PDF-Dokument (212 kb)
FAQ
- Muss ich die Lösungen selbst programmieren? Ja, nur Eigenleistung wird bewertet.
- Darf ich die Musterlösung 1:1 kopieren und als meine Leistung ausgeben? Nein, das ist ein Plagiat und wird als Täuschungsversuch gewertet.
→ Termine 1 2 3 4 5 6 7 8 9 10 11
→ zurück zum Hauptartikel: Informatik Praktikum 2
