kramann.info
© Guido Kramann

Login: Passwort:










kramann.info
© Guido Kramann

Login: Passwort:




Lenkregelung mit dem esp32AV

(EN google-translate)

(PL google-translate)


Vollziehen Sie die nachfolgenden Schritte mit Ihrem Fahrzeug nach.


  1. Übertragen und Anpassen des Access-Point-Zugangs von esp32_CameraWebServer10temperatur auf den esp32cam.
  2. Booten des esp32cam ohne Motortreiber.
  3. Eintragen Ihrer esp32cam-IP und Starten des Processing-Sketches CaptureJavaRT2022_012regler.
  4. Einstecken des Motortreibers
  5. Aufsetzen des Fahrzeugs auf den Parcours (kreisförmige rote Linie am Boden mit Isolierklebeband hergestellt)
  6. Starten des Fahrzeugs mit "1" auf der PC-Tastatur. DER FOKUS MUSS DABEI IM FENSTER DER ANWENDUNG SEIN (einmal in das Fenster mit dem Videobild klicken).
  7. Das Fahrzeug kann jederzeit mit "0" gestoppt werden und wieder mit "1" gestartet werden.
  8. Verlässt das Fahrzeug die rote Linie stoppt es normalerweise von alleine.
Processing-Programm: CaptureJavaRT2022_012regler.zip
esp-Programm: esp32_CameraWebServer10temperatur.zip
Linienverfolgung mit dem esp32AV, Video 1.
Linienverfolgung mit dem esp32AV, Video 2.
Linienverfolgung mit dem esp32AV, Video 3.
Lenkregelung mit dem esp32AV, Ansicht 1.

Bild 0-1: Lenkregelung mit dem esp32AV, Ansicht 1.

esp32Av, Laptop und Access-Point.

Bild 0-2: esp32Av, Laptop und Access-Point.

Scherpunktperechnung der Rotanteile im Kamerabild am Laptop ergibt die Regeldifferenz aus der dann das Stellsignal für die Motoren berechnet und an das Fahrzeug via UDP gesendet wird.

Bild 0-3: Scherpunktperechnung der Rotanteile im Kamerabild am Laptop ergibt die Regeldifferenz aus der dann das Stellsignal für die Motoren berechnet und an das Fahrzeug via UDP gesendet wird.

Gesamter kleiner Parcours.

Bild 0-4: Gesamter kleiner Parcours.

Weitere Schritte:

  1. Modularisierung der Programmteile
  2. Implementierung von Optimierungsverfahren des Reglers.
  3. Optimierung des Reglers.
  4. Fehlertolerante Umsetzung des Gesamtsystems.

1. Modularisierung der Programmteile

Noch ohne irgendeine Veränderung an der Funktionalität der Software vorzunehmen, stellt der nachfolgende Processing-Sketch eine modularisierte Variante von CaptureJavaRT2022_012regler dar.

CaptureJavaRT2022_012regler_MODULAR004_bereinigt.zip -- modularisierte Variante.

Verbesserte Version: CaptureJavaRT2022_012regler_MODULAR005_OPT.zip, s.u.


Die Modularisierung erfolgte nach Überlegungen dazu welche Hauptaufgaben in der Software verwirklicht werden. Dabei wurde deutlich, dass diese Aufgaben nicht nebeneinander existieren, sondern dass sie eine streng hierarchische Struktur bilden.

Die Aufgabe auf der höchsten Hierarchieebene besteht hier darin, aus dem Kamerabild die Stellsignale für die Motoren zu gewinnen, die das Fahrzeug dann entlang einer Linie fahren lassen. Dasjenige Modul auf der obersten Hierarchieebene ist somit der Regler. Eine Objekt der gleichnamigen Klasse benutzt dann alle anderen Untermodule.

Die hierarchische Struktur der entstandenen objektorientierten Klassen, kann nachfolgendem UML-Klassendiagramm entnommen werden, in dem zu sehen ist, welche Klasse Methoden von welcher anderen Klasse benutzt. Dieses A-nutzt-B-Schema wird durch eine Verbindung mit einem offenen Pfeil von Klasse A nach Klasse B visualisiert.

UML-KLassendiagramm zu CaptureJavaRT2022_012regler_MODULAR004_bereinigt.

Bild 0-5: UML-KLassendiagramm zu CaptureJavaRT2022_012regler_MODULAR004_bereinigt.

... da aber Daten zu einem großen Teil innerhalb der draw()-Methode der Hauptklasse von einem Objekt geholt und dann an eine andere weiter gereicht werden, stellt die obige Darstellung zwar die konkrete Programmstruktur korrekt dar, trifft aber nicht ganz genau die tatsächlichen logischen Zusammenhänge. Nachfolgendes Schaubild ist diesbezüglich treffender:

Datenflussdiagramm zum Gesamtsystem. Die Blöcke entsprechen in der Software einzelnen Java-Klassen.

Bild 0-6: Datenflussdiagramm zum Gesamtsystem. Die Blöcke entsprechen in der Software einzelnen Java-Klassen.

Übungsaufgabe 1

a) Schreiben Sie genau auf, welche Methoden aus anderen Klassen jede der zum Projekt CaptureJavaRT2022_012regler_MODULAR004_bereinigt gehörende Klasse benutzt.

b) Wie verändert sich dieses Bild, wenn Sie auch mit erfassen, wenn Daten erst innerhalb der draw-Methode aus einem Objekt geholt werden, aber dann an ein anderes weiter gereicht werden?

4. a) Fehlertolerante Umsetzung des Gesamtsystems

Übungsaufgabe 2
  1. Identifizieren Sie mögliche Laufzeitfehler (Error), die sich innerhalb der Objekte der einzelenen Klassen ergeben können.
  2. Starten Sie einen ersten Versuch, Konzepte zu entwerfen, die diese Laufzeitfehler in ihrer negativen Auswirkung auf das geforderte Verhalten (Linienverfolgung) abmindern könnten (Mitigation).
  3. Überlegen Sie, ob Sie die vorhandene modulare Struktur verändern möchten, um die Möglichkeit, Laufzeitfehlern innerhalb eines Moduls behandeln zu können noch weiter zu verbessern.

2. Implementierung von Optimierungsverfahren des Reglers und 3. Optimierung des Reglers

Übungsaufgabe 3

Der aktuelle sehr einfache P-Regler soll durch einen PID-Regler ersetzt werden, dessen Parameter dann zur Laufzeit (während der Linienverfolgung) sukkzessive automatisch verbessert werden sollen.

4. b) Fehlertolerante Umsetzung des Gesamtsystems

Diskutieren Sie zunächst in Ihrer Gruppe die folgenden Fragen, bevor ein solches Konzept konkretisiert wird:

  1. Wie sähe die nach obiger Beschreibung sich ergebende neue hierarchische Struktur des Gesamtsystems (jetzt mit Optimierer) nun aus?
  2. Welche neuen möglichen Laufzeitfehler können sich bei dem neuen erweiterten System nun ergeben?
  3. Welche Strategien fallen Ihnen ein, um diese neuen Fehlermöglichkeiten abzuschwächen?
Ausgangspunkt mit heraus gezogenen Parametern, noch ohne Optimierer: CaptureJavaRT2022_012regler_MODULAR005_OPT.zip
import ipcapture.*;
import hypermedia.net.*;

//Herausgezogene wichtige Parameter des Systems
boolean TAUSCHE_ANTRIEB_LINKS_RECHTS = false;
float VORTRIEB = 0.7;
float PROPORTIONALE_VERSTAERKUNG = 0.58;
float ASYMMETRIE = 1.01; // 1.0==voll symmetrisch, >1, LINKS STAERKER, <1 RECHTS STAERKER
...

Code 0-1: CaptureJavaRT2022_012regler_MODULAR005_OPT.zip -- Ausgangspunkt mit heraus gezogenen Parametern

Parameteroptimierung des P-Anteils des Reglers
Relativer Verlauf des Fehlers (Grüne Kurve) während der Optimierung.

Bild 0-7: Relativer Verlauf des Fehlers (Grüne Kurve) während der Optimierung.

CaptureJavaRT2022_012regler_MODULAR007_OPT.zip -- Optimierung des P-Anteils des Reglers.
Lenkregelung mit PID-Regler:
esp32AV -- Lenkregelung mit PID-Regler -- https://youtu.be/ZBiitrESjTo
CaptureJavaRT2022_012regler_MODULAR101_PID.zip
...
    private float regeldifferenz = 0.0;
    
    private float[] e_array = new float[10];  // e_summe = e_array[0] + e_array[1] + ....
    private int index=0;
    private float dt = 0.1f; //Anpassen an frameRate(10); in setup() !!
    private float e_alt = 0.0f;

...
              //Implementierung P-Regler, PI-Regler, PID-Regler
              float P = PROPORTIONALE_VERSTAERKUNG;
              float I = INTEGRALE_VERSTAERKUNG;
              float D = DIFFERENTIALE_VERSTAERKUNG;
              float e = regeldifferenz;
              float eD = (e - e_alt)/dt;
              float eI = 0.0f;
              
              for(int i=0;i<e_array.length;i++)
                 eI+=e_array[i];
              eI*=dt;
              float Freg = P*e + I*eI + D*eD;
              
              e_alt = e;
              e_array[index] = e;
              index++;
              index%=e_array.length;              
...

Code 0-2: Regelungstechnischer Teil des Sketches (Tab "Regler")