Skip to content
Snippets Groups Projects
Commit 9b86a6dc authored by David Ihlenfeld's avatar David Ihlenfeld
Browse files

Fix Fehler Haltepunkt und Anpassung 'velocity'

parent 8ca30006
No related branches found
No related tags found
No related merge requests found
...@@ -397,110 +397,4 @@ void drive_curve(float curve_angle, int dir) { ...@@ -397,110 +397,4 @@ void drive_curve(float curve_angle, int dir) {
Motor.stop(); 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 #endif
...@@ -120,4 +120,5 @@ void setup() { ...@@ -120,4 +120,5 @@ void setup() {
void loop() { 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
} }
...@@ -74,8 +74,8 @@ uint8_t red, green, blue; ...@@ -74,8 +74,8 @@ uint8_t red, green, blue;
* Antriebsmotor * * Antriebsmotor *
* ************* */ * ************* */
bits_MotorDriverTB6612FNG Motor; bits_MotorDriverTB6612FNG Motor;
uint8_t velocity = 100; uint8_t velocity = 75;
uint8_t velocity_backward = 80; uint8_t velocity_backward = 60;
Encoder encoder(18, 19); //A,B: Pins, an die der Encoder angeschlossen ist 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) const float wheelDiameter = 0.0255; //empirisch ermittelt damit passend für Übersetzung (entspricht nicht Durchmesser des Rades)
......
...@@ -6,5 +6,118 @@ void platzhalter(){ ...@@ -6,5 +6,118 @@ void platzhalter(){
// Dies ist nur ein Platzhalter. // Dies ist nur ein Platzhalter.
} }
/* ************* *
Main-Funktion
* ************* */
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 #endif
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment