Ön tekerlek istikametinden ve süratinden bisiklet istikametini hesaplayın


10

Direksiyon eklemeye çalıştığım basit bir yukarıdan aşağıya bisiklet oyunum var. Bisikletin yönünü ve hızını belirlemek için ön tekerleğin başlığını nasıl kullandığımı bilmek istiyorum.

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;
}

Bisiklet hızını ön ve arka tekerleğe uygulamaya çalıştım ve bisiklet pozisyonunu belirlemek için orada konumların farkını kullanmaya çalıştım, ancak ileri sürükleme kafa karıştırıcı hale getiriyor.

Madshogo yorumuna göre düzenleme

resim açıklamasını buraya girin


Şu anda telefonumdayım, bu yüzden kısa bir cevap vereceğim: tekerlekler, bisikletin geçtiği hayali bir daireye teğet, bu nedenle bisikleti çeviriyor. Dairenin merkezi, her tekerleğe dik olan çizgilerin kesişme noktasındadır. Tekerleklerin her ikisi de düzse (bisiklet dönmüyorsa), bu çizgiler sonsuz yoldan kesişir (paraleldir), sonsuz bir yarıçap dairesine, yani A çizgisine yol açar. Sonunda, bu, bisikletin izlemesi gereken yörüngeyi (daire) veya eğriliğini, hangisi ihtiyaçlarınıza uygun olursa olsun verir.
jrsala

Cevabınız için teşekkürler madshogo. Eklediğim şemaya bakabilir ve bana bunun doğru olup olmadığını söyleyebilir misiniz? Kırmızı çizgi bisiklet başlığı. Şerefe
user346443

Oh bekleyin, ön tekerlek çiziminizdeki daireye teğet değil. Kafamda her iki tekerlek teğetti. Bu birkaç şeyi değiştirir.
jrsala

Bisiklet fiziği için Wikipedia sayfasını gördünüz mü ? Eğikliği dikkate alan dönüş yarıçapı için yararlı formüller vardır.
sam hocevar

Yanıtlar:


3

Tamam, sonuçlara geri döndüm!

animasyonlu bisiklet

İki yaklaşım denedim:

  • Tekerlek merkezlerinin hareketini düzenleyen bir diferansiyel denklem elde etmek için katı mekaniği kullanmak: sistem "bisiklet" in girişleri arka tekerlekteki tork ve ön tekerleğin açısıdır ve çıktılar merkezlerin kinematiğidir tekerlekler. Ama vazgeçtim, zordu!

  • Arka tekerlek, ön tekerleği ön tekerlek düz değilken ileri doğru "ittiğinde" geometrik bir bakış açısıyla ne olacağını tahmin etmeye çalışmak. Bu yöntem doğrudan gerçek bir diferansiyel denklem alabileceğiniz sonsuz küçük artışların bir denklemini (aşağıya bakınız) verir. ODE'yi elde etmek için bu ilk denklemi manipüle etmeyi denemedim ama tahminim, katı mekaniklerini kullanarak aynı ODE'yi elde etmiş olacağım. Sadece doğru geliyor.

İşaretler ve hipotezler:

Biz ex ve ey temel vektörleri ile düzlemdeyiz .

A arka tekerleğin merkezidir. B , ön tekerleğin merkezidir. Bisiklet L' nin uzunluğu A ve B arasındaki mesafedir . Arasındaki açı ey ve vektör AB olduğu φ . AB ve ön tekerlek arasındaki açı θ'dır .

Sezgisel gerekçe:

Belirli bir anda t , A (t) ' nin AB ile doğrusal hız V (t)' ye sahip olduğunu varsayarız . Bu nedenle, sonsuz bir zaman aralığı dt için ,

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

Ayrıca, t zamanında , ön tekerleğin sürüklenmediğini, yani B hızının ön tekerleğin yönü ile doğrusal olduğunu, yani AB ile bir açı forms oluşturduğunu varsayıyoruz . Diyoruz bir açı oluşturan birim vektör İçeride ISTV melerin RWMAIWi'nin ile AB , ön tekerlek ile aynı yönde, yani birim vektör.

Bu nedenle, t + dt'de ,

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

belirli bir gerçek, pozitif λ için, bisiklet L' nin uzunluğu korunacak şekilde:

mesafe (A (t + dt), B (t + dt)) = L

Hesaplamalar:

Bu son denklem şu anlama gelir:

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

ancak B (t) tanım gereği A (t) + L.Uφ'dur , böylece λ denklemi sağlamalıdır

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

Çözelti, tabii ki, bağımsızdır cp sorun aynı olduğu zaman pozitif doğru kiralama noktaları y . Bu nedenle, R'ye açısına sahip dönme matrisini çağırırsak , λ ,

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

Birkaç hesaplamadan sonra, v'yi V normu olarak adlandırırsak ,

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

İşte yukarıdaki animasyonu almak için kullanılan pseudocode var (kullanmak yerine , kullandığım u U (θ + φ) = daha basit olduğu için):

// 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);
}

Çok fazla tekrarlarsanız ve / veya direksiyon açısını arttırırsanız, yörünge tutarlı bir daire olduğuna inanıyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.