From 9b86a6dc3ddd0bbf0d356dc28521693c5e5bda26 Mon Sep 17 00:00:00 2001 From: "david.ihlenfeld" <david.ihlenfeld@smail.th-koeln.de> Date: Tue, 14 May 2024 22:27:23 +0200 Subject: [PATCH] Fix Fehler Haltepunkt und Anpassung 'velocity' --- Fahrzeug/bits3-bare-minimum/basic_functions.h | 106 ---------------- .../bits3-bare-minimum/bits3-bare-minimum.ino | 3 +- Fahrzeug/bits3-bare-minimum/config.h | 4 +- .../bits3-bare-minimum/custom_functions.h | 115 +++++++++++++++++- 4 files changed, 118 insertions(+), 110 deletions(-) diff --git a/Fahrzeug/bits3-bare-minimum/basic_functions.h b/Fahrzeug/bits3-bare-minimum/basic_functions.h index 19790ab..827ae1b 100644 --- a/Fahrzeug/bits3-bare-minimum/basic_functions.h +++ b/Fahrzeug/bits3-bare-minimum/basic_functions.h @@ -397,110 +397,4 @@ void drive_curve(float curve_angle, int dir) { Motor.stop(); } -/* ************* * - Main-Funktion - * ************* */ - -void drive_course() { //Main-Funktion zum Abfahren des Kurses und anschliessendem Einparken (anhand der State-table) - - //Start Abfahren des Fahrkurses - for (i = 0; i < ABSCHNITTE; i++) { - - //Abschnitts-Ausgabe - //Serial.print("Aktueller Abschnitt: "); - //Serial.println(state_table[i].part); - - float x_diff = state_table[i].x_kor - state_table[i - 1].x_kor; //Differenz aktuelle und vorherige x Koordinate - float y_diff = state_table[i].y_kor - state_table[i - 1].y_kor; //Differenz aktuelle und vorherige y Koordinate - int curve_dir; //Kurvenrichtung: ergibt sich durch Vergleich der Koordinaten-Differenz - float curve_angle; //Kurvenwinkel: ergibt sich aus Berechung mit Koordinaten-Differenz - float drive_dist; //zu fahrende gerade Strecke aus Differnez der Koordinaten (Betrag) - - //Berechnung curve_angle - if (abs(x_diff) > 0.00) { - curve_angle = 180 / PI * atan(x_diff / y_diff); - } - else if (abs(y_diff) > 0.00) { - curve_angle = 180 / PI * atan(y_diff / x_diff); - } - else { - curve_angle = 0.00; - } - - //Bestimmung Kurvenrichtung: Vergleich der letzten beiden / letzten drei Koordinatenpunkte zur Bestimmung der Fzg.Ausrichtung - if (state_table[i].x_kor > state_table[i - 1].x_kor) { - if (state_table[i].y_kor > state_table[i - 2].y_kor) { - curve_dir = 1; - } - else if (state_table[i].y_kor < state_table[i - 2].y_kor) { - curve_dir = 2; - } - else { - curve_dir = 0; - } - } - else if (state_table[i].x_kor < state_table[i - 1].x_kor) { - if (state_table[i].y_kor > state_table[i - 2].y_kor) { - curve_dir = 2; - } - else if (state_table[i].y_kor < state_table[i - 2].y_kor) { - curve_dir = 1; - } - else { - curve_dir = 0; - } - } - else if (state_table[i].y_kor > state_table[i - 1].y_kor) { - if (state_table[i].x_kor > state_table[i - 2].x_kor) { - curve_dir = 2; - } - else if (state_table[i].x_kor < state_table[i - 2].x_kor) { - curve_dir = 1; - } - else { - curve_dir = 0; - } - } - else if (state_table[i].y_kor < state_table[i - 1].y_kor) { - if (state_table[i].x_kor > state_table[i - 2].x_kor) { - curve_dir = 1; - } - else if (state_table[i].x_kor < state_table[i - 2].x_kor) { - curve_dir = 2; - } - else { - curve_dir = 0; - } - } - - //Berechung Strecke Gerade - if (abs(curve_angle) == 0.0) { - drive_dist = abs(x_diff) + abs(y_diff); //Berechung des Betrags der Koordinatendifferenz (eine immer 0) - } - else { - drive_dist = sqrt(sq(abs(x_diff)) + sq(abs(y_diff))); //Berechung der Hypotenuse eines Dreiecks (x- und y-Anteil der Koordinaten) - } - - //Fahre Kurve - drive_curve(abs(curve_angle), curve_dir); - - //Fahre Gerade: Uebergabe der berechneten Strecke mit Abzug eines Korrekturwertes (aufgrund des Kurvenradius vor und nach einer Gerade) - if (i == 0) { - drive_straight(drive_dist - (dist_korr)); //Im ersten Abschnitt nur einfache Korrektur (da zu Beginn keine Kurve) - } - else { - drive_straight(drive_dist - (dist_korr * 2)); //In allen weiteren Abschnitten eine zweifache Korrektur - } - - - //Prüfe ob Einparken laut Zustandsautomat: - - //Parkplatzerkennung anhand der gegebenen Parkplatzgeometrie - //automatisches Einparken mit Parkplatz-Seite und -Typ - - - } - end_of_programm(); //Programmende sobald alle Abschnitte durchfahren sind -} - #endif diff --git a/Fahrzeug/bits3-bare-minimum/bits3-bare-minimum.ino b/Fahrzeug/bits3-bare-minimum/bits3-bare-minimum.ino index 2d427de..c24fd31 100644 --- a/Fahrzeug/bits3-bare-minimum/bits3-bare-minimum.ino +++ b/Fahrzeug/bits3-bare-minimum/bits3-bare-minimum.ino @@ -119,5 +119,6 @@ void setup() { * ************* */ void loop() { - drive_course(); //Hier wird nur diese Funktion ausgeführt werden --> Erweitern Sie diese um ihren Funktionen! + drive_course(); //Hier wird nur diese Funktion ausgeführt werden --> Erweitern Sie diese um ihren Funktionen! + //Bearbeiten Sie die drive_course Funktion unter custom_functions und erweitern Sie diese an der gekennzeichneten Stelle um die Parkfunktionen } diff --git a/Fahrzeug/bits3-bare-minimum/config.h b/Fahrzeug/bits3-bare-minimum/config.h index 6b53ab0..a197edd 100644 --- a/Fahrzeug/bits3-bare-minimum/config.h +++ b/Fahrzeug/bits3-bare-minimum/config.h @@ -74,8 +74,8 @@ uint8_t red, green, blue; * Antriebsmotor * * ************* */ bits_MotorDriverTB6612FNG Motor; -uint8_t velocity = 100; -uint8_t velocity_backward = 80; +uint8_t velocity = 75; +uint8_t velocity_backward = 60; Encoder encoder(18, 19); //A,B: Pins, an die der Encoder angeschlossen ist const float wheelDiameter = 0.0255; //empirisch ermittelt damit passend für Übersetzung (entspricht nicht Durchmesser des Rades) diff --git a/Fahrzeug/bits3-bare-minimum/custom_functions.h b/Fahrzeug/bits3-bare-minimum/custom_functions.h index 3e121de..1897c63 100644 --- a/Fahrzeug/bits3-bare-minimum/custom_functions.h +++ b/Fahrzeug/bits3-bare-minimum/custom_functions.h @@ -6,5 +6,118 @@ void platzhalter(){ // Dies ist nur ein Platzhalter. } +/* ************* * + Main-Funktion + * ************* */ -#endif \ No newline at end of file +void drive_course() { //Main-Funktion zum Abfahren des Kurses (anhand der State-table) + + //Start Abfahren des Fahrkurses + for (i = 0; i < ABSCHNITTE; i++) { + + //Abschnitts-Ausgabe + //Serial.print("Aktueller Abschnitt: "); + //Serial.println(state_table[i].part); + + float x_diff = state_table[i].x_kor - state_table[i - 1].x_kor; //Differenz aktuelle und vorherige x Koordinate + float y_diff = state_table[i].y_kor - state_table[i - 1].y_kor; //Differenz aktuelle und vorherige y Koordinate + int curve_dir; //Kurvenrichtung: ergibt sich durch Vergleich der Koordinaten-Differenz + float curve_angle; //Kurvenwinkel: ergibt sich aus Berechung mit Koordinaten-Differenz + float drive_dist; //zu fahrende gerade Strecke aus Differnez der Koordinaten (Betrag) + + //Berechnung curve_angle + if (abs(x_diff) > 0.00) { + curve_angle = 180 / PI * atan(x_diff / y_diff); + } + else if (abs(y_diff) > 0.00) { + curve_angle = 180 / PI * atan(y_diff / x_diff); + } + else { + curve_angle = 0.00; + } + + //Bestimmung Kurvenrichtung: Vergleich der letzten beiden / letzten drei Koordinatenpunkte zur Bestimmung der Fzg.Ausrichtung + if (state_table[i].x_kor > state_table[i - 1].x_kor) { + if (state_table[i].y_kor > state_table[i - 2].y_kor) { + curve_dir = 1; + } + else if (state_table[i].y_kor < state_table[i - 2].y_kor) { + curve_dir = 2; + } + else { + curve_dir = 0; + } + } + else if (state_table[i].x_kor < state_table[i - 1].x_kor) { + if (state_table[i].y_kor > state_table[i - 2].y_kor) { + curve_dir = 2; + } + else if (state_table[i].y_kor < state_table[i - 2].y_kor) { + curve_dir = 1; + } + else { + curve_dir = 0; + } + } + else if (state_table[i].y_kor > state_table[i - 1].y_kor) { + if (state_table[i].x_kor > state_table[i - 2].x_kor) { + curve_dir = 2; + } + else if (state_table[i].x_kor < state_table[i - 2].x_kor) { + curve_dir = 1; + } + else { + curve_dir = 0; + } + } + else if (state_table[i].y_kor < state_table[i - 1].y_kor) { + if (state_table[i].x_kor > state_table[i - 2].x_kor) { + curve_dir = 1; + } + else if (state_table[i].x_kor < state_table[i - 2].x_kor) { + curve_dir = 2; + } + else { + curve_dir = 0; + } + } + + //Berechung Strecke Gerade + if (abs(curve_angle) == 0.0) { + drive_dist = abs(x_diff) + abs(y_diff); //Berechung des Betrags der Koordinatendifferenz (eine immer 0) + } + else { + drive_dist = sqrt(sq(abs(x_diff)) + sq(abs(y_diff))); //Berechung der Hypotenuse eines Dreiecks (x- und y-Anteil der Koordinaten) + } + + //Fahre Kurve + drive_curve(abs(curve_angle), curve_dir); + + //Fahre Gerade: Uebergabe der berechneten Strecke mit Abzug eines Korrekturwertes (aufgrund des Kurvenradius vor und nach einer Gerade) + if (i == 0) { + drive_straight(drive_dist - (dist_korr)); //Im ersten Abschnitt nur einfache Korrektur (da zu Beginn keine Kurve) + } + else { + drive_straight(drive_dist - (dist_korr * 2)); //In allen weiteren Abschnitten eine zweifache Korrektur + } + + + //Prüfe ob Einparken laut Zustandsautomat: + if (state_table[i].parking_side != 0 && state_table[i].parking_type != 0) { + + //Hier Parkfunktionen entwickeln + //Parkplatzerkennung anhand der gegebenen Parkplatzgeometrie + //automatisches Einparken mit Parkplatz-Seite und -Typ + + end_of_programm(); + + } + + } + + end_of_programm(); + +} + + +#endif -- GitLab