AlphaBot: Autonomes Einparken: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
 
(12 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 25: Zeile 25:


== Vorbereitung/Hausaufgabe ==
== Vorbereitung/Hausaufgabe ==
In diesem Praktikumstermin soll Ihr AlphaBot autonom einparken. Erstellen Sie als Vorbereitung ein [https://de.wikipedia.org/wiki/Endlicher_Automat Zustandsdiagramm] für die Funktion <code>Parken()</code> mit [https://www.yworks.com/products/yed yEd].
In diesem Praktikumstermin soll Ihr AlphaBot autonom einparken. Erstellen Sie als Vorbereitung ein [https://de.wikipedia.org/wiki/Endlicher_Automat Zustandsdiagramm] für die Funktion <code>Parken()</code> mit [https://www.yworks.com/products/yed yEd]. Falls in der Informatik Zustandsautomaten nicht behandelt worden, schauen Sie sich bitte als Vorbereitung die Tutorial an.
 
Planen Sie eine Zustandsmaschine, die zwischen den Zuständen
Planen Sie eine Zustandsmaschine, die zwischen den Zuständen
* Zustand 1: Parklücke suchen,
* Zustand 1: Parklücke suchen,
Zeile 41: Zeile 42:


{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
| <strong>Musterlösung Hausaufgabe&thinsp;</strong>
| <strong>Ansatz für die Lösung Hausaufgabe&thinsp;</strong>
|-
|-
| [[Datei:Zustandsdiagramm AEP Inf2P.jpg|500px]]
| [[Datei:Zustandsdiagramm AEP Inf2P.jpg|500px]]
|}
|}
== Tutorial ==
* [[Zustandsdiagramm| HSHL-Wiki: Zustandsdiagramm]]
<syntaxhighlight lang="c" style="background-color: #EFF1C1; font-size:small">
// Pin-Definitionen
const int ledPin = 13;
const int buttonPin = 2;
// Zustände definieren
enum State {
  LED_OFF,
  LED_ON,
  LED_BLINK
};
State currentState = LED_OFF;
// für Tasterentprellung
bool lastButtonState = LOW;
unsigned long lastDebounceTime = 0;
const unsigned long debounceDelay = 50;
void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT);
  Serial.begin(9600);
}
void loop() {
  handleButton();
  runStateMachine();
}
void handleButton() {
  bool reading = digitalRead(buttonPin);
  if (reading != lastButtonState) {
    lastDebounceTime = millis();
  }
  if ((millis() - lastDebounceTime) > debounceDelay) {
    if (reading == HIGH && lastButtonState == LOW) {
      // Zustand wechseln bei Tastendruck
      switchState();
    }
  }
  lastButtonState = reading;
}
void switchState() {
  if (currentState == LED_OFF) {
    currentState = LED_ON;
  }
  else if (currentState == LED_ON) {
    currentState = LED_BLINK;
  }
  else {
    currentState = LED_OFF;
  }
  Serial.print("Neuer Zustand: ");
  Serial.println(currentState);
}
void runStateMachine() {
  switch (currentState) {
    case LED_OFF:
      digitalWrite(ledPin, LOW);
      break;
    case LED_ON:
      digitalWrite(ledPin, HIGH);
      break;
    case LED_BLINK:
      digitalWrite(ledPin, millis() % 500 < 250);
      break;
  }
}
</syntaxhighlight>


= Versuchsdurchführung =
= Versuchsdurchführung =
Zeile 65: Zeile 147:
* Realisieren Sie die Zustandsmaschine mit der Mehrfachverzweigung <code>switch..case</code>.
* Realisieren Sie die Zustandsmaschine mit der Mehrfachverzweigung <code>switch..case</code>.
* Ermitteln Sie die Roboterpose aus den unterschiedlichen Radumdrehungen (Differenzielle Odometrie).
* Ermitteln Sie die Roboterpose aus den unterschiedlichen Radumdrehungen (Differenzielle Odometrie).
* Nutzen Sie den Ultraschallsensor um mittig in der Parklücke zu stehen.
* Senden Sie den Lagewinkel der Roboterpose und Zustand via Bluetooth an MATLAB und visualisieren Sie diese Werte über der Zeit.
* Nutzen Sie den Ultraschallsensor, um mittig in der Parklücke zu stehen.


'''Arbeitsergebnisse:''' <code>AutonomesParken.ino</code>
'''Arbeitsergebnisse:''' <code>AutonomesParken.ino</code>


== Aufgabe 10.2: Nachhaltige Doku ==
== Aufgabe 11.2: Nachhaltige Doku ==
* Sichern Sie alle Ergebnisse mit beschreibendem Text (<code>message</code>) in SVN.
* 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 Regeln für den [[Software_Versionsverwaltung_mit_SVN|Umgang mit SVN]] ein.
Zeile 77: Zeile 160:


'''Arbeitsergebnis''' in SVN: <code>SVN Log</code>
'''Arbeitsergebnis''' in SVN: <code>SVN Log</code>
= Tutorials =
 
* [https://de.wikipedia.org/wiki/Endlicher_Automat Wikipedia: Zustandsdiagramm]
 
* [https://de.mathworks.com/discovery/state-diagram.html Zustandsdiagramme mit MATLAB<sup>®</sup>]
 
== [[Datei:Lektionen.jpg|60px]] Ausblick zur nächsten Lektion ==
== [[Datei:Lektionen.jpg|60px]] Ausblick zur nächsten Lektion ==
In der nächsten Lektion findet die Abschlussprüfung statt.
In der nächsten Lektion findet die Abschlussprüfung statt.

Aktuelle Version vom 2. Juli 2026, 16:12 Uhr

Abb. 1: Schritte eines Einparkvorgangs
Autor: Prof. Dr.-Ing. Schneider
Modul: Praxismodul II
Lehrveranstaltung: Mechatronik, Informatik Praktikum 2, 2. Semester
Lektion: 11

Inhalt

Lernziele

Nach Durchführung dieser Lektion können Sie

  • mit yED eine Zustandsmaschine planen.
  • eine Zustandsmaschine programmieren.
  • funktional programmieren und Funktionen zu einem großen Projekt zusammenfügen.
  • Quelltext debuggen und optimieren.
  • Messdaten speichern und via MATLAB® auswerten und visualisieren.
  • autonom einen AlphaBot einparken.

Vorbereitung/Hausaufgabe

In diesem Praktikumstermin soll Ihr AlphaBot autonom einparken. Erstellen Sie als Vorbereitung ein Zustandsdiagramm für die Funktion Parken() mit yEd. Falls in der Informatik Zustandsautomaten nicht behandelt worden, schauen Sie sich bitte als Vorbereitung die Tutorial an.

Planen Sie eine Zustandsmaschine, die zwischen den Zuständen

  • Zustand 1: Parklücke suchen,
  • Zustand 2: Rechtseinschlag (rückwärts),
  • Zustand 3: Linkseinschlag (rückwärts) und
  • Zustand 4: Geradeaus (Korrekturzug)

unterscheiden kann. Welche Transitionen führen zu den Zustandsübergängen?

Legen Sie das Programm als Funktionsrümpfe an.

Arbeitsergebnis: ZustandsdiagrammAutonomesParken.graphml

Arbeitsergebnisse: AutonomesParken.pap, AutonomesParken.ino


Tutorial

// Pin-Definitionen
const int ledPin = 13;
const int buttonPin = 2;

// Zustände definieren
enum State {
  LED_OFF,
  LED_ON,
  LED_BLINK
};

State currentState = LED_OFF;

// für Tasterentprellung
bool lastButtonState = LOW;
unsigned long lastDebounceTime = 0;
const unsigned long debounceDelay = 50;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT);
  Serial.begin(9600);
}

void loop() {
  handleButton();
  runStateMachine();
}

void handleButton() {
  bool reading = digitalRead(buttonPin);

  if (reading != lastButtonState) {
    lastDebounceTime = millis();
  }

  if ((millis() - lastDebounceTime) > debounceDelay) {
    if (reading == HIGH && lastButtonState == LOW) {
      // Zustand wechseln bei Tastendruck
      switchState();
    }
  }

  lastButtonState = reading;
}

void switchState() {
  if (currentState == LED_OFF) {
    currentState = LED_ON;
  } 
  else if (currentState == LED_ON) {
    currentState = LED_BLINK;
  } 
  else {
    currentState = LED_OFF;
  }

  Serial.print("Neuer Zustand: ");
  Serial.println(currentState);
}

void runStateMachine() {
  switch (currentState) {

    case LED_OFF:
      digitalWrite(ledPin, LOW);
      break;

    case LED_ON:
      digitalWrite(ledPin, HIGH);
      break;

    case LED_BLINK:
      digitalWrite(ledPin, millis() % 500 < 250);
      break;
  }
}

Versuchsdurchführung

In diesem Termin lassen wir den AlphaBot autonom einparken.

Aufgabe 11.1: Parken

Schreiben Sie das Programm AutonomesParken.ino. Folgende Funktionsanforderungen sollten erfüllt werden:

  1. Erstellen Sie eine Zustandsmaschine, die zwischen den folgenden 4 Zuständen unterscheiden kann.
    1. Zustand: Parklücke suchen,
    2. Zustand: Rechtseinschlag,
    3. Zustand: Linkseinschlag und
    4. Zustand: Geradeaus (Korrekturzug)
  2. Fahren Sie konstant ohne Unterbrechung zügig rückwärts.
  3. Verwenden Sie Ihr Programm sucheParkluecke.ino im Zustand 1.
  4. Programmieren Sie Zustand 2: Rechtseinschlag. Schlagen Sie voll rechts ein und fahren Sie rückwärts bis das Fahrzeug 40° zur Lücke steht.
  5. Programmieren Sie Zustand 3: Linkseinschlag. Schlagen Sie voll links ein, bis das Fahrzeug gerade (0 °) in der Lücke steht.
  6. Programmieren Sie Zustand 4: Geradeaus. Fahren Sie gerade vorwärts, bis Sie mittig in der Parklücke stehen.
  7. Schalten Sie alle Motoren aus.

Anforderungen:

  • Realisieren Sie die Zustandsmaschine mit der Mehrfachverzweigung switch..case.
  • Ermitteln Sie die Roboterpose aus den unterschiedlichen Radumdrehungen (Differenzielle Odometrie).
  • Senden Sie den Lagewinkel der Roboterpose und Zustand via Bluetooth an MATLAB und visualisieren Sie diese Werte über der Zeit.
  • Nutzen Sie den Ultraschallsensor, um mittig in der Parklücke zu stehen.

Arbeitsergebnisse: AutonomesParken.ino

Aufgabe 11.2: Nachhaltige Doku

Arbeitsergebnis in SVN: SVN Log


Ausblick zur nächsten Lektion

In der nächsten Lektion findet die Abschlussprüfung statt.



→ Termine 1 2 3 4 5 6 7 8 9 10 11 12
→ zurück zum Hauptartikel: Informatik Praktikum 2
→ Haben Sie Fragen? Informatik Praktikum FAQ