Berechnen Sie die Fahrradrichtung aus der Vorderradrichtung und der Geschwindigkeit

10

Ich habe ein einfaches Top-Down-Bike-Spiel, dem ich die Lenkung hinzufügen möchte. Ich würde gerne wissen, wie ich den Kurs des Vorderrads verwende, um den Kurs und die Geschwindigkeit des Fahrrads zu bestimmen.

void Update () 
{
    //Get input from user Vertical: 0 to 1, Horizontal -1 to 1
    float forwardInput = Input.GetAxis("Vertical");
    float sidewaysInput = Input.GetAxis("Horizontal") * m_steeringAmount;

    // Turn front wheel
    m_frontWheelTransform.localEulerAngles = new Vector3(0, sidewaysInput, 90);

    // get speed and drag
    float   speed           = m_velocity.magnitude;
    Vector3 forwardDrag     = -m_forwardDragConstant * m_velocity * speed;

    // calculate acceleration 
    float engineForce       = forwardInput * m_enginePower;
    Vector3 forwardTraction = transform.forward * engineForce;
    Vector3 forwrdForce     = forwardTraction + forwardDrag;
    Vector3 acceleration    = forwrdForce / m_mass;

    // update velocity and position
    m_velocity += acceleration * Time.deltaTime;
    transform.localPosition += m_velocity * Time.deltaTime;
}

Ich habe versucht, die Fahrradgeschwindigkeit auf das Vorder- und Hinterrad anzuwenden und die Differenz der dortigen Positionen zu verwenden, um die Fahrradrichtung zu bestimmen, aber der Vorwärtswiderstand macht es verwirrend.

Bearbeiten basierend auf Madshogo-Kommentar

Geben Sie hier die Bildbeschreibung ein

user346443
quelle
Ich bin gerade am Telefon, daher gebe ich nur eine kurze Antwort: Die Räder berühren einen fiktiven Kreis, entlang dem das Fahrrad fährt, sodass sich das Fahrrad dreht. Der Mittelpunkt des Kreises liegt am Schnittpunkt der Linien orthogonal zu jedem Rad. Wenn beide Räder gerade sind (das Fahrrad dreht sich nicht), kreuzen sich diese Linien unendlich weit (sie sind parallel), was zu einem Kreis mit unendlichem Radius führt, dh einer Linie. Auf diese Weise erhalten Sie die Flugbahn, der das Fahrrad folgen sollte (der Kreis), oder seine Krümmung, je nachdem, was Ihren Anforderungen entspricht.
jrsala
Danke für die Antwort madshogo. Könnten Sie sich das Diagramm ansehen, das ich hinzugefügt habe, und mir sagen, ob das richtig ist? Rote Linie ist die Fahrradrichtung. Cheers
user346443
Oh, warte, das Vorderrad berührt den Kreis in deiner Zeichnung nicht. In meinem Kopf waren beide Räder tangential. Das ändert ein paar Dinge.
jrsala
Hast du die Wikipedia-Seite für Fahrradphysik gesehen ? Es verfügt über nützliche Formeln für den Wenderadius, die die Neigung berücksichtigen.
Sam Hocevar

Antworten:

3

Ok, ich bin zurück mit Ergebnissen!

animiertes Fahrrad

Ich habe zwei Ansätze ausprobiert:

  • Unter Verwendung der Festkörpermechanik wird eine Differentialgleichung abgeleitet, die die Bewegung der Radmitten regelt: Die Eingaben des Systems "Fahrrad" sind das Drehmoment am Hinterrad und der Winkel des Vorderrads, und die Ausgänge sind die Kinematik der Zentren der Räder. Aber ich habe aufgegeben, es war schwer!

  • Der Versuch zu erraten, was unter geometrischen Gesichtspunkten passiert, wenn das Hinterrad das Vorderrad nach vorne "drückt", wobei das Vorderrad nicht gerade ist. Diese Methode liefert direkt eine Gleichung mit infinitesimalen Inkrementen (siehe unten), aus der Sie eine tatsächliche Differentialgleichung erhalten können. Ich habe nicht versucht, diese erste Gleichung zu manipulieren, um die ODE zu erhalten, aber ich vermute, dass ich dieselbe ODE mithilfe der Festkörpermechanik erhalten hätte. Es fühlt sich einfach richtig an.

Notationen und Hypothesen:

Wir sind in der Ebene mit Basisvektoren ex und ey .

A ist die Mitte des Hinterrads. B ist die Mitte des Vorderrads. Die Länge des Motorrads L ist der Abstand zwischen A und B . Der Winkel zwischen ey und dem Vektor AB beträgt φ . Der Winkel zwischen AB und dem Vorderrad beträgt θ .

Intuitive Begründung:

Wir gehen davon aus, dass zu einem bestimmten Zeitpunkt t , A (t) eine Geschwindigkeit V (t) kolinear mit AB . Daher ist für einen infinitesimalen Zeitschritt dt ,

A (t + dt) = A (t) + V (t) .dt .

Wir nehmen auch an, dass zum Zeitpunkt t das Vorderrad nicht driftet, dh die Geschwindigkeit von B ist kolinear zur Richtung des Vorderrads, dh es bildet mit AB einen Winkel θ . Wir nennen den Einheitsvektor, der mit AB einen Winkel θ bildet , dh den Einheitsvektor mit der gleichen Richtung wie das Vorderrad.

Daher wird bei t + dt ,

B (t + dt) = B (t) + λ.Uθ

für ein bestimmtes reales, positives λ, so dass die Länge des Fahrrads L erhalten bleibt:

Abstand (A (t + dt), B (t + dt)) = L.

Berechnungen:

Diese letzte Gleichung übersetzt in

Norm² (B (t) + λ.Uθ - A (t) - V (t) .dt) = L²

aber B (t) ist per Definition A (t) + L.Uφ , so dass λ die Gleichung erfüllen muss

norm² (L.Uφ + λ.Uθ - V (t) .dt) = L² .

Die Lösung ist natürlich unabhängig von φ, da das Problem dasselbe ist, wenn das Fahrrad auf positives y zeigt . Wenn wir also R die Rotationsmatrix mit dem Winkel -φ nennen , muss λ die positive Lösung von sein

norm² (L.ey; + λ.Uθ - RV (t) .dt) = L² .

Wenn wir nach einigen Berechnungen v die Norm von V nennen , erhalten Sie

λ = L. (sqrt (1 - (sin (θ). (1-v.dt / L)) ²) - cos (θ)) + v.dt.cos (θ) .

Hier ist der Pseudocode, mit dem ich die obige Animation erhalten habe (anstelle von Uθ verwende ich u = U (θ + φ), weil es einfacher war):

// I start at i=1 because i=0 contains the initial values
for (int i=1; i<=N; i++)
{
    // the array in which I stored the successive A points
    Aarray[i] = Aarray[i-1] + dt*V;
    float lambda = L*( sqrt(1 - (sin(theta)*(1-v*dt/L))**2) - cos(theta) )
                   + cos(theta)*v*dt;
    // the array in which I stored the successive B points
    Barray[i] = Barray[i-1] + lambda*u;
    // the AB vector normalized
    AiBiUnit = (Barray[i] - Aarray[i])/L;
    // Refreshing the velocity of A
    V = v*AiBiUnit;
    // Refreshing u.
    // u is indeed a unit vector separated from AiBiUnit by an angle theta,
    // so you get it by rotating the newly computed AiBiUnit by an angle
    // of +theta:
    u = AiBiUnit.rotate(theta);
}

Wenn Sie viel wiederholen und / oder den Lenkwinkel vergrößern, ist die Flugbahn ein Kreis, der meiner Meinung nach kohärent ist.

jrsala
quelle