Simulation: Mathematik

Für die Simulation Fahrbetrieb.

Inzwischen veraltete und obsolete Dokumentation, die nur noch verwirrt.

Im folgenden wird auf die zugrunde liegende Mathematik eingegangen. Dabei habe ich festgelegt, dass der Knick­punkt den Ursprung des fahrzeug­bezogenen Koordinaten­systems (x,y) darstellt und der hintere Fahrzeug­teil die Ausrichtung (α) bestimmt. Das Koordinaten­system ist ein Link­ssystem (wie bei allen Text- und grafischen Benutzer­oberflächen außer OS/2 Presen­tation Manager). Das hat den Vorteil, dass ich nicht zwischen Canvas-, Maus- und Fahrzeug­koordinaten umrechnen muss, und dass positive Winkel nach rechts gehen, was IMHO viel natürlicher ist.

Kurvenradius

Bei Fahrzeugen liegt der Kurven-Mittel­punkt „Momentan­pol“ rechnerisch in der Verlängerung der Achsen. Bei ungelenkt-mehrachsigen Fahrzeugen wie dem Muldenkipper gibt es bei den beiden (Hinter-)Achsen keinen Schnittpunkt, deshalb wird für das Maß b die Mitte zwischen den Achsen angenommen. Bei einem gewöhnlichen Fahrzeug (Auto) würde ich den mathematischen Kurvenradius auf die (Mitte der) Vorderachse legen. Bei einem knickgelenkten Fahrzeug gibt es jedoch 3 Kurvenradien. Der IMHO mathematisch wichtigste ist der am Knick rk. Im Bild ist der Lenkwinkel λ als lw eingezeichnet und die Herleitung von rb zu sehen:

rb = a + b cos λ
sin λ
Analog entwickelt sich ra durch Vertauschen der Längen a und b:
ra = a cos λ + b
sin λ
Etwas komplizierter erweist sich die Berechnung des Kurvenradius' am Knickpunkt rk. Durch Umformen und Gleichsetzen erhielt ich:
rk = a² + 2ab cos λ + b²
sin λ
Wie man sieht entsteht für den Lenkwinkel λ ≡ 0 ein unendlicher Radius. Negative λ generieren negative Radien, was paktisch erscheint. Hingegen die Unstetigkeit bei λ ≡ 0 ist lästig, weswegen besser mit dem Kehrwert des Radius' weitergerechnet wird!

Für kleine λ im Bogenmaß ist der gemeinsame Lenkradius r:

ra + b
λ
Für die Realisierung im Mikro­controller erscheint dies sinnvoll, da die tatsächlichen Kurvenr­adien vom errechneten Wert erheblich (nach oben) abweichen werden, da die breiten Reifen „geradeaus fahren wollen“. Nur bei den schmalen Reifen der ersten Auto­mobile ist der Kurven­radius hinreichend genau berechenbar.

Lenk-Ausbruch

„Gewöhnliche“ Fahrzeuge wie Fahrräder, Autos, Busse, Pferdekutschen und Handwagen verändern ihre Lage beim Lenken nicht. Dabei haben Pferdekutschen und Handwagen eine Drehschemel-Lenkung, Fahrräder, Motorräder und Dreiräder sind damit vergleichbar. Autos haben eine Einzelrad-Lenkung, wobei bei Bussen und einigen LKW mit mehrfacher Hinterachse auch eine Hinterachse mit gelenkt wird.

Knickgelenkte Fahrzeuge brechen beim Lenken aus. Zumindest wenn man den Fahrzeug-Ursprung auf den Knick legt. Legt man diesen auf die Verbindungsgerade zwischen Vorder- und Hinter­achse, gibt es trotzdem einen (geringfügigen) Ausbruch durch das Verkürzen der Fahrzeug-Gesamt­länge und das Rollen der Räder zum Knick hin.

Beim Einlenken vollziehen die Räder eine Schlepp­kurve. Voraussetzung dafür ist ein Längsdifferenzial, welches das gegenseitige Abrollen erlaubt. Ohne Differenzial werden die Räder auf einer Geraden aufeinander zu gezerrt; beim gleichzeitigen Fahren oder bei Getriebespiel wird sich eine Mischform einstellen. Für das Berechnen der Schlepp­kurve hatte ich lange nach einer hinreichend performanten Lösung gesucht, die auch für 8-Bit-Mikro­controller geeignet ist. Nun kann sie als gradweise Tabelle vorberechnet werden, nur unter Verwendung von Standard-Mathematik ohne weitere Interpolation, unter Annahme von gerader Radbewegung von einem Lenkwinkelgrad zum nächsten.

Das Bild zeigt einen (stark überhöhten) Iterations­schritt von einem Lenk­winkel zum nächsten. Dabei sind a, b und λ = lw die Achs-Teillängen und der Lenk­winkel. c ist die sich ergebende resul­tierende Achs­abstand, f ist der Propor­tio­na­li­täts­faktor der Rad-Längs­bewegungen, typischer­weise 1 für den Radlader und 2 für den Mulden­kipper: Es wird davon ausgegangen, dass die Vorder­achse die doppelte Längs­bewegung wie die Doppel-Hinter­achse vollzieht. Üm übrigen funktio­niert die Rechnung auch dann, wenn a ≡ 0 vorliegt, die Knick­lenkung zur Dreh­schemel-Lenkung „entartet“.

Als erstes wird der neue Achs­abstand c gemäß Kosinus­satz, aber für Außen­winkel, ermittelt. Davon wird stets nur das Quadrat benötigt:

c² = a² + b² + 2ab cos λ

Als nächstes muss die Längs­verkürzung d berechnet werden. Dazu wird der vorher­gehende Lenk­winkel ¹λ (mit 0 beginnend) und Achs­mitten­abstand ¹c (mit a+b beginnend) herangezogen:

2d = ¹c² – c²
a + fb + fa cos ¹λ + b cos ¹λ

Für diese Formel wurde der quadratische Term mal benutzt und mal verworfen, es kommt augenscheinlich (im Simulationsversuch unten) das gleiche heraus. Nun muss die veränderte Lage des Knickpunkts berechnet werden. Im Januar 2023 wurde dieser Algorithmus völlig neu aufgestellt, und es wird mit den Achs­mittel­punkten A und B gerechnet, die sich um d bzw. f×d auf den Knickpunkt zubewegen. Das erspart den Einsatz von Winkelfunktionen. Mittels einer Kreis­schnitt­berechnung (Point.moveToIntersect()) wird schließlich der neue Knickpunkt K ermittelt. Für die Tabelle genügen schließlich:

x = K.x
y = K.y
α = atan2(K.y-B.y, K.x-B.x)

Fahrspur

Ziel ist, dass alle 20 ms die Inkremente i der Antriebs­motor­umdrehung in eine aktualisierte Fahrzeugposition umgerechnet wird. Dazu gibt es einen Proportionalitäts­faktor k in m, der den Weg pro Inkrement festhält. Das Vorzeichen von i muss anhand der Servo­stellung ermittelt werden. Für Gerade­aus­fahrt (Lenk­winkel λ ≡ 0) gilt:

w = ki
x += w cos pos.α
y += w sin pos.α

Für Kurvenfahrten berechnet das JavaScript-Programm den Kreismittelpunkt an der Hinterachse (was es zur Visualisierung sowieso tut) und vollzieht eine Drehung an dieser Position. Der Kreismittelpunkt hat die Fahrzeugkoordinaten (mit dem Knick als Nullpunkt und dem Hinterteil auf der x-Achse) (-b,rb) mit rb wie oben. Der Verdrehwinkel µ (in rad) ist der Quotient aus Fahrstrecke und Kurvenradius. Es wird vernachlässigt, dass die Vorderräder eine andere Fahrstrecke abfahren.

Dazu wird das lokale Koordinatensystem am Drehpunkt zentriert, dann um µ verdreht und schließlich der Drehpunkt wiederhergestellt.

µ =w
rb
x +=b cos αrb sin α
y +=b sin α + rb cos α
α +=µ
x –=b cos αrb sin α
y –=b sin α + rb cos α

Rechenpunkt

Für das Mikrocontrollerprogramm erscheint die o.g. Rechnung mglw. zu aufwändig. Um mit einfachen Rechen­operationen auszukommen ist ein (lenkwinkel­abhängiger) Punkt des Fahr­zeugs erforderlich, bei dem die Längsachse des gerade­aus­gerichteten Fahr­zeugs das Lot zum Dreh­punkt schneidet. Ein solcher Punkt wäre in der Lenk­winkel-Tabelle abzu­speichern. Ich nenne diesen hiermit Rechen­punkt R.

Um vom lokalen Koordinatenursprung zum Knickpunkt im geradeausgerichteten Zustand zu kommen müssen die für den gegebenen Lenkwinkel abgespeicherten Koordinaten (x,y,α) rückwärts angewendet werden, also nicht einfach subtrahieren sondern Koordinatendrehung ausführen. In der Formel heißt dieser Punkt fortan Q.

Q.x = P.x cos P.α – P.y sin P.α
Q.y = P.x sin P.α + P.y cos P.α
Q.α = P.α

Die Koordinate des Drehpunktes ist im lokalen Koordinatensystem bekannt:

x = b
y = b cos λ + a
sin λ

Benötigt wird nun der Abstand (auf der Gerade­aus­richt­geraden) zwischen Q und R sowie der dazu senkrechte Abstand zwischen Drehpunkt (Momentanpol) und R, ein weiterer und kleinerer Kurvenradius. Die Animation zeigt nur die Konstruktionsgeraden; das Fahrzeug kann man sich allemal als „knickgelenktes Fahrrad, das niemals umfällt“ vorstellen.

Der Rechen­punkt R hat den Vorteil, für die nachfolgende Ausricht­prozedur ein geeigneter Ausgangs­punkt zu sein. Für a ≡ 0 (Dreh­schemel­lenkung) fällt dieser Punkt mit der Hinter­achse zusammen. Für ab besteht Symmetrie, und es sind Verein­fachungen möglich. Für den Allgemein­fall ist die Lage des Rechen­punktes von (a, b und) λ abhängig; dazu der sich ergebende Kurven­radius als Abstand zwischen Rechen- und Drehpunkt. Es ist fies, dass die Lage des Rechen­punktes von λ abhängt!! Daher wird für die folgende Ausrichtprozedur nur ein λ verwendet: Der maximale Lenkeinschlag.

Wie man an der nebenstehenden Simulation des Lenkvorgangs (nach rechts; das Fahrzeug steht mit der Front nach rechts) sieht, bewegt sich der Rechenpunkt R kaum und kann augenscheinlich im umgekehrten Verhältnis der Achsabstände a und b angenommen werden.

Diese neuen Erkenntnisse über den „Rechenpunkt“ lassen die JavaScript-Simulation falsch konstruiert erscheinen, und es erfolgt 2023 eine Umstellung vom Knick- zum Rechenpunkt. Für den Anwender auffallend ist dabei, dass beim Lenkvorgang der Ausrichtwinkel (in der Koordinatenanzeige) unverändert bleibt und das Auto nur noch in Längsrichtung „fährt“. Damit komme ich dem Ansatz von Felix Pfeiffer näher, der (unbewiesenermaßen) von einer (festen) Mitte zwischen den Mitten beider Achsmitten ausging.

Aus Sicht des Mikrocontrollers wird aus der Tabelle allenfalls C.x für die Längskorrektur benötigt sowie eine weitere Größe für die Verdrehung pro Radiant. (TODO!!) In diese fließt ein, dass der Kurvenradius der Räder größer ist als der Radius am Rechenpunkt. Besser: Werte aus experimentell aufgenommenen Kurvenradien.

Aus Sicht des Simulators wird weiterhin der Knickpunkt K und die Ausrichtung des Hinterteils α benötigt. Die Ausrichtung des Vorderteils ergibt sich schließlich daraus aus dem Lenkwinkel λ.

Der „Autopilot“ benötigt C.y (Kurvenradius am Rechenpunkt) und (vielleicht) C.x (Längskorrektur). Zur Kollisions­vermeidung werden zusätzlich noch sämtliche Fahrzeug­haupt­abmessungen benötigt.

Ausrichten

Ziel ist die Berechnung der Kurven­segmente, um das Fahrzeug von einer Startposition auf eine Ziellinie zu bringen. Im Normalfall genügen zwei Segmente mit jeweils maximalem Lenk­einschlag und damit bekanntem Kurven­radius. Am Ende muss das Fahrzeug geradeaus gelenkt auf der Ziellinie stehen. Diese Berechnung braucht nicht im 8-Bit-Mikro­controller erfolgen.

Zunächst wird die Position des Fahrzeugs (x,y,α) (in der Praxis aus den 3D-Markern ermittelt) in das Koordinatensystem der Ziellinie, ebenfalls (x,y,α) überführt. Der erste Lenkeinschlag (rechts oder links) bei |α| ≤ -90° richtet sich nach der Seite: Bei y < 0 rechts, sonst links. Bei |α| > -90°, also wenn das Fahrzeug tendenziell verkehrt herum steht, andersherum.

Ein weiteres wichtiges Indiz ist die Lage des Drehzentrums bei sofortigem Lenk­einschlag, und zwar der zur Zielachse nähere (von beiden). Für die folgenden Abschnitte kommen nur Kreisbögen mit festem Radius r sowie Geraden­abschnitte vor. Liegt das (erste) Dreh­zentrum mehr als r hinter dem Zielpunkt (also hinter der Y-Achse) wird vorwärts gefahren, sonst rückwärts. Ist der Abstand des Drehzentrums zur Ziellinie (X-Achse) größer als r erfolgt ein Abschnitt mit Gerade­aus­fahrt in Y-Richtung, und der zweite Kreis­bogen ist genau 90°: Ist |α| > -90°, dann mit gleicher Lenk­richtung, sonst mit wechselnder Lenkrichtung. Ansonsten (Normalfall) müssen 2 Kreisbögen tangential sowie stets mit wechselnder Lenkrichtung aneinandergesetzt werden, wobei der erste Bogen (|α| > -90°) auch länger als 180° werden kann (Fälle J und K).

Die verschiedenen Lösungen habe ich skizziert, wobei das Ziel das Erreichen der X-Achse mit Ausrichtung nach rechts ist, und das möglichst nahe am Ursprung.

  1. Fahrzeug nahe und rechts-parallel zur Zielachse, hinter dem Zielpunkt: Vorwärtsfahrt links-rechts
  2. Fahrzeug nahe und links-parallel zur Zielachse, hinter dem Zielpunkt: Vorwärtsfahrt rechts-links
  3. Fahrzeug nahe und links-parallel zur Zielachse, vor dem Zielpunkt: Rückwärtsfahrt rechts-links
  4. Fahrzeug nahe und rechts-parallel zur Zielachse, vor dem Zielpunkt: Rückwärtsfahrt links-rechts
  5. Fahrzeug fern und links-parallel zur Zielachse, vor dem Zielpunkt: Rückwärtsfahrt rechts-gerade-links
  6. Fahrzeug fern, links und schräg zur Zielachse, wegguckend, vor dem Zielpunkt: Rückwärtsfahrt wie E
  7. Fahrzeug fern, links und schräg zur Zielachse, hinguckend, vor dem Zielpunkt: Rückwärtsfahrt wie E
  8. Fahrzeug nahe, links und schräg zur Zielachse, wegguckend, vor dem Zielpunkt: Rückwärtsfahrt wie C
  9. Fahrzeug nahe, links und schräg zur Zielachse, hinguckend, vor dem Zielpunkt: Rückwärtsfahrt wie C
  10. Fahrzeug nahe Zielachse, α > 90°, vor dem Zielpunkt: Rückwärtsfahrt wie C
  11. Fahrzeug nahe Zielachse, verkehrtherum (α = 180°), weniger als r hinter Zielpunkt: Rückwärtsfahrt rechts-links
  12. Fahrzeug fern, verkehrtherum (α = 180°), vor Zielpunkt: Rückwärtsfahrt rechts-gerade-rechts
  13. Fahrzeug nahe Zielachse, α < -90°, Drehzentrum mehr als r hinter Zielpunkt und exakt r von Zielachse: Vorwärtsfahrt rechts

Eine Rampenberechnung teilt ein Bewegungs­segment in eine Beschleunigungs­phase, eine Phase unbe­schleunigter Bewegung (v konstant) und eine Abbrems­phase auf. Die mittlere Phase unbe­schleunigter Bewegung kann entfallen. Jede Phase wird in einen „Job“ übersetzt und dem Mikrocontroller übergeben. Mit dem „Tacho“ kann die Wegstrecke überprüft werden.

Das Erreichen des Zielpunktes ist eine simple Gerade­aus­fahrt vorwärts oder rückwärts. In der Realität ist durch nochmaligen Abgleich mit 3D-Markern die Lage zu prüfen und ggf. eine weitere Korrektur­bewegung zu starten. Auch die Simulation kann so verfahren, da die Bewegungs­segment-Abarbeitung (so wie's via request­AnimationFrame() implementiert ist) unexakt ist.

Die Implementierung erwies sich schließ­lich als deutlich geradliniger: