AlphaBot: Geregelte Fahrt mit Linienverfolger: Unterschied zwischen den Versionen
(49 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
[[Kategorie:Arduino]] | [[Kategorie:Arduino]] | ||
[[Kategorie:AlphaBot]] | [[Kategorie:AlphaBot]] | ||
[[Datei: | [[Datei:AlphaBot 550px.gif|thumb|rigth|350px|Abb. 1: Geregelte Fahrt mit Linienverfolger]] | ||
[[Datei:Tracker-sensor.jpg|thumb|rigth|350px|Abb. 2: AlphaBot Linienverfolger]] | |||
'''Autor:''' [[Benutzer:Ulrich_Schneider| Prof. Dr.-Ing. Schneider]]<br> | '''Autor:''' [[Benutzer:Ulrich_Schneider| Prof. Dr.-Ing. Schneider]]<br> | ||
'''Modul:''' Praxismodul I<br> | '''Modul:''' Praxismodul I<br> | ||
Zeile 7: | Zeile 9: | ||
== Inhalt == | == Inhalt == | ||
* | * Inbetriebnahme des Linienverfolgungssensors | ||
* Kalibrierung des Linienverfolgungssensors | |||
* 2-Punkt-Regler | |||
* PD-Regler | |||
* x-y-Plot der Roboterpose | |||
== Lernziele== | == Lernziele== | ||
Nach Durchführung dieser Lektion können Sie | Nach Durchführung dieser Lektion können Sie | ||
* | * geregelt einer Linie folgen. | ||
* den Kurswinkel aus differenzieller Odometrie bestimmen und darstellen. | |||
* die Funktion eines PID-Reglers erläutern. | |||
* einen PD-Regler systematisch auslegen. | |||
* die Auslegung systematisch dokumentieren | |||
== Vorbereitung/Hausaufgabe == | |||
Bereiten Sie diese Aufgabe für den Praktikumstermin vor. | |||
* Planen Sie jede Aufgabe als PAP. | |||
* Nehmen Sie den Linienverfolger anhand der Beispiel <code>E28_IR_Line_Tracking_Sensor_Messung</code> und <code>E28b_IR_Line_Tracking_Sensor</code> in Betrieb. | |||
* Nutzen Sie das Tutorial [[AlphaBot_Linienverfolgungsssensor]] zur Einarbeitung. | |||
* Kalibrieren Sie den Sensor. | |||
* Zeigen Sie die Messwerte im Seriellen Monitor an. | |||
* Kapseln Sie die Kalibrierung in der Funktion <code>void KalibriereLinienVerfolger()</code>. | |||
* Beantworten Sie die Lernzielkontrollfragen. | |||
* Ohne umfangreiche Vorbereitung werden Sie nicht zum Praktikum zugelassen. | |||
'''Arbeitsergebnis:''' <code>void KalibriereLinienVerfolger()</code> | |||
{| role="presentation" class="wikitable mw-collapsible mw-collapsed" | |||
| <strong>Tipp 1 </strong> | |||
|- | |||
| | |||
<syntaxhighlight lang="c" style="background-color: #EFF1C1; font-size:larger"> | |||
void KalibriereLinienVerfolger() { | |||
Serial.println("Kalibrierung startet für 10s..."); | |||
for (int i = 0; i < 400; i++) // Die Kalibrierung kann 10s dauern. | |||
{ | |||
trs.calibrate(); // Die Sensoren werden 10x gelesen | |||
} | |||
Serial.println("Kalibrierung beendet"); | |||
/* Ausgabe der Minimalwerte während der Kalibrierung */ | |||
for (int i = 0; i < NUM_SENSORS; i++) | |||
{ | |||
Serial.print(trs.calibratedMin[i]); | |||
Serial.print(' '); | |||
} | |||
Serial.println(); | |||
/* Ausgabe der Maximalwerte während der Kalibrierung */ | |||
for (int i = 0; i < NUM_SENSORS; i++) | |||
{ | |||
Serial.print(trs.calibratedMax[i]); | |||
Serial.print(' '); | |||
} | |||
Serial.println(); | |||
delay(1000); // 1 Sekunde Pause | |||
} | |||
</syntaxhighlight> | |||
|- | |||
|} | |||
== Lernzielkontrollfragen == | |||
Lernzielkontrollfragen: | |||
* Wie funktioniert der Linienverfolgungssensors technisch? | |||
* Arbeitet der Sensor passiv? | |||
* Welche Bauteile kommen in Sender und Empfänger zum Einsatz? | |||
* Welche Wellenlänge hat das ausgesendete Licht? Ist dieses sichtbar? | |||
* Wieso und wie wird der Sensor kalibriert? | |||
* Erläutern Sie wie und wieso ein gewichteter Mittelwert gebildet wird. | |||
* Welchen Messbereich hat das Sensorsystem? | |||
* Welcher Wert dient als Sollwert? | |||
== Versuchsdurchführung == | == Versuchsdurchführung == | ||
=== Aufgabe 5. | === Aufgabe 8.1: 2-Punkt-Regler === | ||
Programmieren Sie einen [https://de.wikipedia.org/wiki/Zweipunktregler 2-Punkt-Regler], damit der AlphaBot der schwarzen Linien folgt. Der 2-Punkt-Regler fährt beispielsweise nach rechts, wenn er hell sieht und nach links, wenn er Schwarz sieht. So "hangelt" er sich zappelig an der Linie entlang. | |||
'''Arbeitsergebnissse:''' <code> ZweiPunktRegler.pap, ZweiPunktRegler.ino </code> | |||
{| role="presentation" class="wikitable mw-collapsible mw-collapsed" | |||
| <strong>Tipp 1 </strong> | |||
|- | |||
| [[Datei:Loop 2PunktRegler.png|left|450px|Abb. 3: Ablaufplan im Loop]]<br> Abb. 3: PAP des 2-Punkt-Reglers im void loop() | |||
|- | |||
|} | |||
=== Aufgabe 8.2: PD-Regler === | |||
[[Datei:Regelkreis PD.png|thumb|rigth|550px|Abb. 4: Regelkreis für den Linienverfolgungs-Algorithmus]] | |||
Programmieren Sie einen PD-Regler gemäß Abb. 4, damit der AlphaBot der schwarzen Linien folgt. Planen Sie zuvor das Programm als PAP. | |||
<math> u(t) = K_P \cdot e(t) + K_D \cdot \frac{d}{dt}e(t) </math> | |||
# Wählen Sie den Sollwert als Konstante. | |||
# In welchem Bereich bewegt sich der Istwert? | |||
# Setzen Sie die Motorsteuerung mit dem Befehl <code>MotorRun(L,R)</code> um, wobei gilt <math>L,R \in [-250; 250]</math>. | |||
# Experimentieren Sie, welche Parameter <code>Kp, Kd</code> die besten Ergebnisse liefern. | |||
# Dokumentieren Sie Ihre Ergebnisse systematisch tabellarisch. | |||
'''Arbeitsergebnisse:''' <code>PDRegler.pap, PDRegler.ino, PD_Parametervariation.xslx</code> | |||
{| role="presentation" class="wikitable mw-collapsible mw-collapsed" | |||
| <strong>Tipp 1 </strong> | |||
|- | |||
| Nützliche Links: | |||
* [https://www.youtube.com/watch?v=MSoLigzhbeM info8uniwue: Einführung PID Regler] | |||
* [https://www.youtube.com/watch?v=quqxyny5kBU Loviscach, J.: P- und PI-Regler; Einstellung nach Ziegler-Nichols] | |||
* [https://www.youtube.com/watch?v=l26IGS2RlM0 Studyfix: Regelkreis] | |||
* [[AlphaBot_Linienverfolgungsssensor |AlphaBot - Linienverfolgungssensor]] | |||
|- | |||
|} | |||
{| role="presentation" class="wikitable mw-collapsible mw-collapsed" | |||
| <strong>Tipp 2 </strong> | |||
|- | |||
| [[Datei:Loop PD Regler.png|left|450px|Abb. 6: Ablaufplan im Loop]]<br> Abb. 6: PAP des PID-Reglers im void loop() | |||
|- | |||
|} | |||
{| role="presentation" class="wikitable mw-collapsible mw-collapsed" | |||
| <strong>Tipp 3 </strong> | |||
|- | |||
| Studieren Sie das Beispiel [[https://svn.hshl.de/svn/Informatikpraktikum_1/trunk/AlphaBot/ArduinoLibOrdner/AlphaBot/examples/E08b_Infrared_Line_Tracking_PD E08b_Infrared_Line_Tracking_PD]]. | |||
|- | |||
| Achten Sie darauf, dass Sie in einer Gleichung dieselben Dateitypen verrechnen. Möchten Sie beispielsweise eine Fließkommazahl berechnen müssen Sie alle Variable mit <code>float()</code> umwandeln. | |||
|- | |||
| Lassen Sie einen Motor (R) mit konstanter Leistung (z. B. 80) fahren und verändern sie relativ dazu den anderen Motor (z. B. <math>L= 80 \pm 20</math>). | |||
|- | |||
| Legen Sie den Regler für eine sanfte Geradenfahrt aus.<br> | |||
# Legen Sie mit <code>Kd = 0</code> zuerst <code>Kp</code> aus. | |||
# Gehen Sie wissenschaftlich vor. Schreiben Sie alle Beobachtungen in eine Tabelle. Sind Sie zufrieden, ändern Sie den <code>Kp</code>-Wert nicht mehr (z. B. <code>Kp = -0.01</code>). | |||
# Variieren Sie nun <code>Kd</code>, um die Schwingung des P-Reglers zu dämpfen. Bei mir ist <code>Kd = 0.5* Kp</code>. | |||
# Manche Gruppen haben mit einem reinen P-Regler bereits zufriedenstellende Ergebnisse erziehlt. | |||
|- | |||
|} | |||
=== Aufgabe 8.3: Geradeausfahrt mit Linienverfolger === | |||
Nun wollen wir gleichzeitig den Ultraschall und Linienverfolger nutzen. | |||
# Bereiten Sie sich vor, indem Sie die Funktion des Linienverfolgungssensors in der gängigen Fachliteratur (z. B. [[AlphaBot_Linienverfolgungsssensor |AlphaBot - Linienverfolgungssensor]]) recherchieren und erläutern können. | |||
# Nutzen Sie schwarzes Klebeband auf einem hellen Untergrund (z. B. weißes Blatt Papier), um eine gerade Fahrstrecke von 2 m zu markieren. | |||
# Drehen Sie den Ultraschall-Sensor auf 180° (Blick auf die Wand). | |||
# Messen Sie während der Fahrt die gefahrene Strecke (x) mit der Odometrie. | |||
# Messen Sie während der Fahrt den Abstand zur Wand (y) mit dem Ultraschall Sensor. | |||
# Folgen Sie der schwarzen Linie möglichst geradlinig. | |||
# Experimentieren Sie, welche Parameter <code>Kp, Kd</code> die besten Ergebnisse liefern. | |||
# Dokumentieren Sie Ihre Ergebnisse systematisch tabellarisch. | |||
# Zeichnen Sie die Roboterpose (x,y,ψ) in MATLAB<sup>®</sup>. | |||
'''Arbeitsergebnisse:''' <code>PDReglerUltraschall.pap, PDReglerUltraschall.ino, zeigeRoboterpose.m</code> | |||
=== Aufgabe 8.4: Nachhaltige Doku === | |||
Sichern Sie alle Ergebnisse mit beschreibendem Text (<code>message</code>) in SVN. | |||
* Halten Sie die Regeln für den [[Software_Versionsverwaltung_mit_SVN|Umgang mit SVN]] ein. | |||
* Halten Sie die [[Medium:Programmierrichtlinie.pdf|Programmierrichtlinie für C]] und die [[Medium:Programmierrichtlinien_für_Matlab.pdf|Programmierrichtlinien für MATLAB<sup>®</sup>]] ein. | |||
* Versehen Sie jedes Programm mit einem Header ([[Header Beispiel für MATLAB]], [[Header Beispiel für C]]). | |||
* Kommentiere Sie den Quelltext umfangreich. | |||
'''Arbeitsergebnis''' in SVN: <code>SVN Log</code> | |||
== Tutorials == | == Tutorials == | ||
*[[AlphaBot_Linienverfolgungsssensor]] | |||
* [https://www.youtube.com/watch?v=MSoLigzhbeM info8uniwue: Einführung PID Regler] | |||
* [https://www.youtube.com/watch?v=quqxyny5kBU Loviscach, J.: P- und PI-Regler; Einstellung nach Ziegler-Nichols] | |||
* [https://www.youtube.com/watch?v=l26IGS2RlM0 Studyfix: Regelkreis] | |||
== Demos == | == Demos == | ||
*<code>E28_IR_Line_Tracking_Sensor_Messung</code> | |||
*<code>E28b_IR_Line_Tracking_Sensor</code> | |||
*<code>E08_Infrared_Line_Tracking</code> | |||
*<code>E08b_Infrared_Line_Tracking_PD</code> | |||
== Literatur == | == Literatur == | ||
---- | ---- | ||
→ Termine [[Einführungsveranstaltung_Informatikpraktikum_2_im_SoSe_2023|1]] [[AlphaBot:_Messdatenverarbeitung_mit_MATLAB|2]] [[AlphaBot:_MATLAB_als_serieller_Monitor|3]] [[AlphaBot: Servo ansteuern|4]] [[ | → Termine [[Einführungsveranstaltung_Informatikpraktikum_2_im_SoSe_2023|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 SoSe23|11]]<br> | ||
→ zurück zum Hauptartikel: [[AlphaBot_SoSe23|Informatik Praktikum 2]] | → zurück zum Hauptartikel: [[AlphaBot_SoSe23|Informatik Praktikum 2]] |
Aktuelle Version vom 25. Mai 2023, 13:11 Uhr
Autor: Prof. Dr.-Ing. Schneider
Modul: Praxismodul I
Lehrveranstaltung: Mechatronik, Informatik Praktikum 2, 2. Semester
Inhalt
- Inbetriebnahme des Linienverfolgungssensors
- Kalibrierung des Linienverfolgungssensors
- 2-Punkt-Regler
- PD-Regler
- x-y-Plot der Roboterpose
Lernziele
Nach Durchführung dieser Lektion können Sie
- geregelt einer Linie folgen.
- den Kurswinkel aus differenzieller Odometrie bestimmen und darstellen.
- die Funktion eines PID-Reglers erläutern.
- einen PD-Regler systematisch auslegen.
- die Auslegung systematisch dokumentieren
Vorbereitung/Hausaufgabe
Bereiten Sie diese Aufgabe für den Praktikumstermin vor.
- Planen Sie jede Aufgabe als PAP.
- Nehmen Sie den Linienverfolger anhand der Beispiel
E28_IR_Line_Tracking_Sensor_Messung
undE28b_IR_Line_Tracking_Sensor
in Betrieb. - Nutzen Sie das Tutorial AlphaBot_Linienverfolgungsssensor zur Einarbeitung.
- Kalibrieren Sie den Sensor.
- Zeigen Sie die Messwerte im Seriellen Monitor an.
- Kapseln Sie die Kalibrierung in der Funktion
void KalibriereLinienVerfolger()
. - Beantworten Sie die Lernzielkontrollfragen.
- Ohne umfangreiche Vorbereitung werden Sie nicht zum Praktikum zugelassen.
Arbeitsergebnis: void KalibriereLinienVerfolger()
Tipp 1 |
void KalibriereLinienVerfolger() {
Serial.println("Kalibrierung startet für 10s...");
for (int i = 0; i < 400; i++) // Die Kalibrierung kann 10s dauern.
{
trs.calibrate(); // Die Sensoren werden 10x gelesen
}
Serial.println("Kalibrierung beendet");
/* Ausgabe der Minimalwerte während der Kalibrierung */
for (int i = 0; i < NUM_SENSORS; i++)
{
Serial.print(trs.calibratedMin[i]);
Serial.print(' ');
}
Serial.println();
/* Ausgabe der Maximalwerte während der Kalibrierung */
for (int i = 0; i < NUM_SENSORS; i++)
{
Serial.print(trs.calibratedMax[i]);
Serial.print(' ');
}
Serial.println();
delay(1000); // 1 Sekunde Pause
}
|
Lernzielkontrollfragen
Lernzielkontrollfragen:
- Wie funktioniert der Linienverfolgungssensors technisch?
- Arbeitet der Sensor passiv?
- Welche Bauteile kommen in Sender und Empfänger zum Einsatz?
- Welche Wellenlänge hat das ausgesendete Licht? Ist dieses sichtbar?
- Wieso und wie wird der Sensor kalibriert?
- Erläutern Sie wie und wieso ein gewichteter Mittelwert gebildet wird.
- Welchen Messbereich hat das Sensorsystem?
- Welcher Wert dient als Sollwert?
Versuchsdurchführung
Aufgabe 8.1: 2-Punkt-Regler
Programmieren Sie einen 2-Punkt-Regler, damit der AlphaBot der schwarzen Linien folgt. Der 2-Punkt-Regler fährt beispielsweise nach rechts, wenn er hell sieht und nach links, wenn er Schwarz sieht. So "hangelt" er sich zappelig an der Linie entlang.
Arbeitsergebnissse: ZweiPunktRegler.pap, ZweiPunktRegler.ino
Tipp 1 |
Abb. 3: PAP des 2-Punkt-Reglers im void loop() |
Aufgabe 8.2: PD-Regler
Programmieren Sie einen PD-Regler gemäß Abb. 4, damit der AlphaBot der schwarzen Linien folgt. Planen Sie zuvor das Programm als PAP.
- Wählen Sie den Sollwert als Konstante.
- In welchem Bereich bewegt sich der Istwert?
- Setzen Sie die Motorsteuerung mit dem Befehl
MotorRun(L,R)
um, wobei gilt . - Experimentieren Sie, welche Parameter
Kp, Kd
die besten Ergebnisse liefern. - Dokumentieren Sie Ihre Ergebnisse systematisch tabellarisch.
Arbeitsergebnisse: PDRegler.pap, PDRegler.ino, PD_Parametervariation.xslx
Tipp 1 |
Nützliche Links: |
Tipp 2 |
Abb. 6: PAP des PID-Reglers im void loop() |
Tipp 3 |
Studieren Sie das Beispiel [E08b_Infrared_Line_Tracking_PD]. |
Achten Sie darauf, dass Sie in einer Gleichung dieselben Dateitypen verrechnen. Möchten Sie beispielsweise eine Fließkommazahl berechnen müssen Sie alle Variable mit float() umwandeln.
|
Lassen Sie einen Motor (R) mit konstanter Leistung (z. B. 80) fahren und verändern sie relativ dazu den anderen Motor (z. B. ). |
Legen Sie den Regler für eine sanfte Geradenfahrt aus.
|
Aufgabe 8.3: Geradeausfahrt mit Linienverfolger
Nun wollen wir gleichzeitig den Ultraschall und Linienverfolger nutzen.
- Bereiten Sie sich vor, indem Sie die Funktion des Linienverfolgungssensors in der gängigen Fachliteratur (z. B. AlphaBot - Linienverfolgungssensor) recherchieren und erläutern können.
- Nutzen Sie schwarzes Klebeband auf einem hellen Untergrund (z. B. weißes Blatt Papier), um eine gerade Fahrstrecke von 2 m zu markieren.
- Drehen Sie den Ultraschall-Sensor auf 180° (Blick auf die Wand).
- Messen Sie während der Fahrt die gefahrene Strecke (x) mit der Odometrie.
- Messen Sie während der Fahrt den Abstand zur Wand (y) mit dem Ultraschall Sensor.
- Folgen Sie der schwarzen Linie möglichst geradlinig.
- Experimentieren Sie, welche Parameter
Kp, Kd
die besten Ergebnisse liefern. - Dokumentieren Sie Ihre Ergebnisse systematisch tabellarisch.
- Zeichnen Sie die Roboterpose (x,y,ψ) in MATLAB®.
Arbeitsergebnisse: PDReglerUltraschall.pap, PDReglerUltraschall.ino, zeigeRoboterpose.m
Aufgabe 8.4: Nachhaltige Doku
Sichern Sie alle Ergebnisse mit beschreibendem Text (message
) in SVN.
- Halten Sie die Regeln für den Umgang mit SVN ein.
- Halten Sie die Programmierrichtlinie für C und die Programmierrichtlinien für MATLAB® ein.
- Versehen Sie jedes Programm mit einem Header (Header Beispiel für MATLAB, Header Beispiel für C).
- Kommentiere Sie den Quelltext umfangreich.
Arbeitsergebnis in SVN: SVN Log
Tutorials
- AlphaBot_Linienverfolgungsssensor
- info8uniwue: Einführung PID Regler
- Loviscach, J.: P- und PI-Regler; Einstellung nach Ziegler-Nichols
- Studyfix: Regelkreis
Demos
E28_IR_Line_Tracking_Sensor_Messung
E28b_IR_Line_Tracking_Sensor
E08_Infrared_Line_Tracking
E08b_Infrared_Line_Tracking_PD
Literatur
→ Termine 1 2 3 4 5 6 7 8 9 10 11
→ zurück zum Hauptartikel: Informatik Praktikum 2