Lenkregelung mit dem esp32AV
(EN google-translate)
(PL google-translate)
Vollziehen Sie die nachfolgenden Schritte mit Ihrem Fahrzeug nach.
|
esp-Programm: esp32_CameraWebServer10temperatur.zip
Linienverfolgung mit dem esp32AV, Video 1.
Linienverfolgung mit dem esp32AV, Video 2.
Linienverfolgung mit dem esp32AV, Video 3.
Bild 0-1: Lenkregelung mit dem esp32AV, Ansicht 1.
Bild 0-2: esp32Av, Laptop und Access-Point.
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.
Bild 0-4: Gesamter kleiner Parcours.
Weitere Schritte:
|
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.
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.
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:
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
|
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:
|
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
Bild 0-7: Relativer Verlauf des Fehlers (Grüne Kurve) während der Optimierung.
Lenkregelung mit PID-Regler:
esp32AV -- Lenkregelung mit PID-Regler -- https://youtu.be/ZBiitrESjToCaptureJavaRT2022_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")