„Charger - my next Project“ inspired by Dodge Charger 1968 + https://designer.microsoft.com/ - by Fürst Ruprecht

Ich überlege noch, ob ich die hinteren Räder mechanisch mit den vorderen verbinde damit beide Achsen lenken. Das würde den Einschlagwinkel der Räder reduzieren und einen Hinter- oder Vorderrad-Antrieb ermöglichen. Der Punkt ist nur, wie lange die Lösung dann im Realbetrieb hält. Außerdem weiß ich ja, daß ich den 4-Rad-Antrieb für die Steigungen brauche - solche Gedanken kann man aber auch kurzfristig verdrängen :)
Es scheint ja, dass Deine Werkstatt fürstlich ausgestattet ist und Du auch einige werkzeuge zur präzisen Metallverarbeitung hast.
Daher würde ich ggf. anbieten mit einem Getriebe-Motor die Lenkung zu realisieren bei dem die Vorder und Hinterachsschenkel lenkbar sind.
Ob es dafür schon große Servo-Motore gibt weiß ich nicht, aber elektronsich kann man ja schon einen alten Scheibenwischer-Motor so begrenzen, dass er nicht um 360 Grad dreht. Stabil muss es aber schon an einer Hanglage sein. Good luck beim creieren geeigneter Ideen
 
Hallo Forum,
da nach langer Zeit meine Software sich endlich wieder Richtung korrektem Verhalten entwickelt, stelle ich Euch hier mal den Arbeitstand ein. In erster Linie könnt Ihr mal sehen, wie das Ganze aussieht und zusammengestellt ist. Ich habe versucht, die Entwicklung etwas zu dokumentieren. Deshalb gibt es diverse .md Dateien die das Projekt erläutern sollen.
Viel Spaß beim Lesen.
Gruß Fürst Ruprecht
 

Attachments

Hallo Folk,
Heute direkt vom Feldtest:
Das Video ist nur eine kleine Impression. In der Halle waren es gemütliche 25 °C, draußen dagegen gefühlt deutlich über 30 °C – der Rover war entsprechend „rot glühend“ unterwegs.
Auf dem PC läuft der Mission Planner. Zu sehen ist die programmierte Route. Zusätzlich liest die Sprachausgabe einige Werte vor, die der Rover an den PC sendet. Die Datenpakete selbst kommen vollständig an, allerdings schafft die Sprachausgabe das Tempo verständlicherweise nicht ganz.
Trotzdem ist das sehr nützlich: So kann man den PC auch mal verlassen und direkt am Rover etwas prüfen oder untersuchen, ohne ständig auf den Bildschirm schauen zu müssen.
Interessant sind im Moment zwei Dinge:
1: Auf dem PC: Die Querabweichung von der Ideallinie = Track Error im Messages-Fenster
2. Die ständig arbeitenden Vorderräder des Rover
Zunächst bin ich recht glücklich das "anscheinend" ALLES funktioniert. Insbesondere die Navigation auf ausschließlich GPS-x/y-Punkten.
Dazu habe ich mal einen kleinen code-Auszug. Hier könnt ihr sehen, daß keine Winkel von einem Sensor benötigt werden.
Da mein Rover ja nicht auf der Stelle wendet, gibt es immer neue Koordinaten. Für Euch, Hinterachs-Angetriebene, geht das aber genauso gut. Ihr müßt für einen Wendevorgang einfach nur einen Punkt im 90-Grad Winkel "konstruieren" und dann den Regler rechnen lassen. Oder ihr verwendet einfach reale Wegpunkte. Bei RTK-Fix funktioniert das bei mir sehr gut.

void State::STC(int _next_target_idx){ Übergabe der Nummer n des anzusteuernden Wegpunktes X[n]
if(_next_target_idx < 1){
_next_target_idx = 1;
}
// Ideallinie für den Stanley-Controller festlegen.
// Normalfall: Linie vom vorherigen Wegpunkt X(n-1) zum aktuellen Zielwegpunkt X(n).
int from_idx = _next_target_idx - 1;
int to_idx = _next_target_idx;
// Sonderfall erster echter Missionswegpunkt:
// Home wird nicht als Anfangspunkt der Sollspur verwendet.
// Statt Home -> WP1 wird die Fahrspur WP1 -> WP2 als Ideallinie genutzt.

// Richtungsvektor der Ideallinie d = X(to_idx) - X(from_idx)
float d_x = waypointlistxy[to_idx].x - waypointlistxy[from_idx].x;
float d_y = waypointlistxy[to_idx].y - waypointlistxy[from_idx].y;

// Vektor v vom Startpunkt der Ideallinie zur aktuellen Rover-Position
float v_x = rover_x_m - waypointlistxy[from_idx].x;
float v_y = rover_y_m - waypointlistxy[from_idx].y;
// Skalarprodukt v·d für die Projektion der Rover-Position auf die Ideallinie
float dot_product_v_d = v_x * d_x + v_y * d_y;
// Skalarprodukt d·d entspricht der quadrierten Länge der Ideallinie
float dot_product_d_d = d_x * d_x + d_y * d_y;
// Schutz gegen identische oder nahezu identische Wegpunkte.
// In diesem Fall ist keine sinnvolle Ideallinie definiert.
if (dot_product_d_d < 0.0001) {
lenkeinschlag_rad = 0;
lenkeinschlag_deg = 0;
live.STC_angle_rad = lenkeinschlag_rad;
return;
}
// Positionsfaktor der senkrechten Projektion auf die Ideallinie.
// scale = 0 liegt bei from_idx, scale = 1 liegt bei to_idx.
float scale = dot_product_v_d / dot_product_d_d;
// Projektionspunkt der Rover-Position auf die Ideallinie,
// bezogen auf den Startpunkt der Ideallinie.
float proj_v_on_d_x = scale * d_x;
float proj_v_on_d_y = scale * d_y;
// Querfehlervektor r von der Ideallinie zur aktuellen Rover-Position.
// Betrag von r = seitlicher Abstand des Rovers zur Ideallinie.
float r_x = v_x - proj_v_on_d_x;
float r_y = v_y - proj_v_on_d_y;
// Abstand des Rovers zum aktuellen Zielwegpunkt.
// Dieser Abstand wird hier zur Abschwächung des Stanley-Anteils in Zielnähe verwendet.
float distanceToTarget = sqrt((waypointlistxy[_next_target_idx].x - rover_x_m) * (waypointlistxy[_next_target_idx].x - rover_x_m) + (waypointlistxy[_next_target_idx].y - rover_y_m) * (waypointlistxy[_next_target_idx].y - rover_y_m));
// Betrag des Querfehlers zur Ideallinie.
float r_magnitude = sqrt(r_x * r_x + r_y * r_y);//Querfehler (Cross-Track-Error) – also den Abstand des Rovers zur Ideallinie
// Wirksame Geschwindigkeit mit Mindestwert.
// Verhindert Division durch 0 und zu hohe Lenkausschläge bei sehr kleiner Geschwindigkeit.
float v_eff = max(fabs(rover_v_mps), 0.01);
// Wirksamer Zielabstand mit Mindestwert.
// Verhindert Division durch 0 direkt am Zielwegpunkt.
float d_eff = max(distanceToTarget, 0.1);
// Headingfreie Stanley-Variante:
// Der Lenkwinkel wird nur aus Querfehler, Zielabstand und Geschwindigkeit berechnet.
//float theta = atan2(r_magnitude * stanley_dist / d_eff, v_eff / stanley_spee);
//float theta = atan2(r_magnitude * stanley_dist, v_eff / stanley_spee);
// ich nutze im Moment nur die Querabweichung, dadurch fährt der Rover immer direkt zur Ideallinie
float theta = atan2(r_magnitude * stanley_dist, 1.0);
// 2D-Kreuzprodukt zur Bestimmung, auf welcher Seite der Ideallinie der Rover steht.
float cross_product_z = d_x * r_y - d_y * r_x;
// Positive z-Komponente: Rover steht links der Sollspur.
// Da Rechtslenkung negativ ist, wird theta in diesem Fall negativ gesetzt.
// Negative z-Komponente: Rover steht rechts der Sollspur, theta bleibt positiv.
if (cross_product_z > 0) {
// Rechts lenken
theta = -theta;
}
if (isnan(theta)) {
#ifdef CONTROLLER_DEBUGGING
Serial.println("theta ist NaN!");
#endif
theta = 0;
}
cross_track_error_cm = r_magnitude * 100.0;
RunningMedianCrossTrackErrorCm.add(cross_track_error_cm);
cross_track_error_cm = RunningMedianCrossTrackErrorCm.getAverage();
if(cross_product_z > 0){
cross_track_error_cm = -cross_track_error_cm;
}
// Ergebnis der headingfreien STC-Variante übernehmen.
// Es wird kein Magnetheading, kein IMU-Heading und kein heading_error verwendet.
lenkeinschlag_rad = theta;
// Lenkwinkel auf den mechanisch zulässigen Bereich begrenzen.
lenkeinschlag_rad = constrain(lenkeinschlag_rad, -maxSteer, maxSteer);
if (isnan(lenkeinschlag_rad)) {
#ifdef CONTROLLER_DEBUGGING
Serial.println("lenkeinschlag_rad ist NaN!");
#endif
lenkeinschlag_rad = 0;
}
if (rover_v_mps < 0) {
// Rückwärtsfahrt:
// Diese headingfreie STC-Variante wird rückwärts nicht angewendet.
// Variante A: beim Zurücksetzen geradeaus fahren.
lenkeinschlag_rad = 0.0;
// Variante B: optional entgegengesetzt lenken.
//lenkeinschlag_rad = -lenkeinschlag_rad;
}
// Lenkwinkel zusätzlich in Grad bereitstellen.
lenkeinschlag_deg = PIDeg(lenkeinschlag_rad);
#ifdef CONTROLLER_DEBUGGING
Serial.print(" StanleyWinkel : ");Serial.print(PIDeg(theta)); Serial.print(" Lenkung : ");Serial.println(lenkeinschlag_deg);
#endif
// STC-Ausgabewert für Anzeige, Debugging oder Reglerauswahl bereitstellen.
live.STC_angle_rad = lenkeinschlag_rad;
}

Allerdings sieht man die "geringe" Abtastrate vom GPS (5Hz). Dadurch gibt es kein geschmeidiges Lenken.
daher ist nun mein nächster Schritt für den schönen Fall des RTK-Fix den Kalman-Filter wieder in Betrieb zu setzen.
Ich werde berichten.
Meine Ritter - schönes Basteln, Testen und Schwitzen!

Euer immer gnädiger Fürst Ruprecht
 

Attachments

Charger_FR im Feldtest:
Etwas mehr als 200 Variablen zum Einstellen. Da dauert es schon etwas, bis alle so halbwegs richtig sind.
Den meisten Stress macht wieder der Magnetkompass.
View attachment IMG_0955.mov

Am besten gefallen mir meine beiden Schalter am Heck - rechts Elektronik, links Antrieb.
Antenne auf dem Dach ist Kommunikation zum PC. Unterm Dach GPS-RTK-Antenne und Esp32-Webserver-Antenne.
Mal sehen, ob das zuverlässig funktioniert.
Ich habe im Garten eine Ubiquiti-Monsterantenne installiert, das hat auch richtig was gebracht.
Schön wäre ein Video, bei dem zwei Rover versetzt hintereinander fahren 🤔💭💭💭💭
Es grüßt
Fürst Ruprecht
 
Gute Idee mit der Schnur. Vielleicht nehme ich eine dickere, dann fährt der Rover noch genauer.
Ja, schlägt sich schon ganz gut, der blaue. Ich habe im Nachhinein festgestellt, daß immer noch nicht alle Parameter richtig sind, geschweige denn Boptimal.
Der Blaue ( ChargerFR ) hat eine größere Übersetzung und die Motoren machen viel weniger Geräusche.
Vielleicht ganz interessant: Ich habe wiederholt versucht den Kompass zu kalibrieren - mit mäßigem Erfolg. Gestern habe ich die geplante Wegstrecke mit den GPS-Koordinaten und das Log-File der aufgezeichneten Testfahrt an Chatgpt gegeben und er hat die Offsets und Scales berechnet. Dadurch ist eine deutliche Verbesserung möglich gewesen. Jetzt hat der Kompass noch nichtlineare Abweichungen, mal sehen, was da noch geht. Man könnte natürlich eine Umrechnungstabelle anfertigen, nur ob es den Aufwand wert ist?
Mit der Genauigkeit bin ich noch nicht zufrieden. Hast Du mal bei Dir eine Schnur gespannt? Dein Mäher fährt im Vergleich viel schneller - oder täuscht das wegen der Größe, ich glaube eher nicht.
Im Übrigen bin ich von der Rechenleistung des Teensy4.1 total begeistert!!!
Gut - dann arbeite ich an dem Video mit den beiden Schnüren .... und dem Rückwärts-Navigieren.
Gruß Fürst Ruprecht
 
Hast Du mal bei Dir eine Schnur gespannt?
Nein, ich bin dazu noch nicht gekommen.
Mein BobyCar Mäher hat mich momentan voll in Beschlag genommen. Vor ca 4 Jahren hatte mein Akku vom E-Bike den Geist aufgegeben, die Steuerplatine hat geraucht, und da ich dort nicht experimentieren wollte musste ich mir einen neuen Bosch-Akku kaufen. So habe ich noch ganz viele 18650 Zellen. Jetzt habe ich mal 12 da heraus operiert und mit einen 24Volt Akku für die Brushless Motoren gebaut.

BobyCarII_Collage.jpg
Viellicht komme ich zur Schnur in der kommenden Woche. Muss jetzt aber bald auch anfangen noch was für meinen Urlaub im September vorzubreiten, Da will ich Korrekturdaten per Lora angehen. Das würde in der FeWo perfekt passen.
 
Das Design hast Du sehr schön gemacht, die Vorderräder farblich passend zu den hinteren - das gefällt mir sehr gut!
Akku habe ich auch gerade gebaut. Da die 18650 bei meinen Mähern nicht lange durchhalten habe ich TEURE Einzelzellen mit Z-Fahne in den Niederlanden bestellt und zu einem 7S3P-Pack zusammengebaut. Ich glaube, die 100€ haben sich gelohnt.
Jetzt bin ich gespannt, wie dein BobyCar fährt.
 
Back
Top