Hitung pos sepeda dari pos roda depan dan kecepatan

10

Saya memiliki permainan sepeda top down sederhana yang saya coba tambahkan kemudi. Saya ingin tahu bagaimana saya menggunakan tajuk roda depan untuk menentukan tajuk dan kecepatan sepeda.

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

Saya sudah mencoba menerapkan kecepatan sepeda ke roda depan dan belakang dan menggunakan perbedaan posisi di sana untuk menentukan arah sepeda, tetapi seretan ke depan membuatnya membingungkan.

Edit berdasarkan komentar madshogo

masukkan deskripsi gambar di sini

pengguna346443
sumber
Saya sedang menggunakan ponsel saya saat ini sehingga saya hanya akan memberikan jawaban singkat: roda bersinggungan dengan lingkaran fiktif di mana sepeda berjalan, sehingga membuat sepeda berputar. Pusat lingkaran berada di persimpangan garis ortogonal ke setiap roda. Jika kedua roda lurus (sepeda tidak berputar) maka garis-garis ini melintasi jalur yang sangat jauh (paralel) menghasilkan lingkaran jari-jari tak terbatas, yaitu garis A. Akhirnya, ini memberi Anda lintasan yang harus diikuti oleh sepeda (lingkaran) atau kelengkungannya, mana saja yang sesuai dengan kebutuhan Anda.
jrsala
Terima kasih atas jawabannya madshogo. Bisakah Anda melihat diagram yang saya tambahkan dan beri tahu saya apakah itu benar. Garis merah adalah heading sepeda. Cheers
user346443
Oh, tunggu, roda depan tidak bersinggungan dengan lingkaran di gambar Anda. Di kepala saya, kedua roda bersinggungan. Itu mengubah beberapa hal.
jrsala
Pernahkah Anda melihat halaman Wikipedia untuk fisika sepeda ? Ini memiliki formula yang berguna untuk radius belokan yang memperhitungkan lean.
sam hocevar

Jawaban:

3

Ok, saya kembali dengan hasil!

sepeda animasi

Saya mencoba dua pendekatan:

  • Menggunakan mekanika padatan untuk mendapatkan persamaan diferensial yang mengatur pergerakan pusat roda: input dari sistem "sepeda" adalah torsi di roda belakang dan sudut roda depan, dan outputnya adalah kinematika dari pusat roda. Tapi saya menyerah, itu sulit!

  • Mencoba menebak apa yang terjadi dari sudut pandang geometris ketika roda belakang "mendorong" roda depan ke depan dengan roda depan tidak lurus. Metode ini secara langsung menghasilkan persamaan kenaikan sangat kecil (lihat di bawah) dari mana Anda bisa mendapatkan persamaan diferensial yang sebenarnya. Saya belum mencoba memanipulasi persamaan pertama ini untuk mendapatkan ODE tetapi dugaan saya adalah bahwa saya akan mendapatkan ODE yang sama menggunakan mekanika padatan. Rasanya benar.

Notasi dan hipotesis:

Kami berada di pesawat dengan basis vektor ex dan ey .

A adalah pusat dari roda belakang. B adalah pusat dari roda depan. Panjang sepeda L adalah jarak antara A dan B . Sudut antara ey dan vektor AB adalah φ . Sudut antara AB dan roda depan adalah θ .

Dasar pemikiran intuitif:

Kita mengira bahwa, pada t instan tertentu , A (t) memiliki kecepatan V (t) kolinear dengan AB . Oleh karena itu, untuk timestep dt sangat kecil ,

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

Kami juga menganggap bahwa, pada waktu t , roda depan tidak melayang, yaitu kecepatan B adalah kolinear dengan arah roda depan, yaitu membentuk sudut θ dengan AB . Kami memanggil vektor satuan yang membentuk sudut θ dengan AB , yaitu vektor satuan dengan arah yang sama dengan roda depan.

Oleh karena itu, pada t + dt ,

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

untuk λ nyata dan positif tertentu sedemikian sehingga panjang sepeda L dilestarikan:

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

Perhitungan:

Persamaan terakhir ini diterjemahkan menjadi

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

tetapi B (t) , menurut definisi, adalah A (t) + L.Uφ , sehingga λ harus memenuhi persamaan

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

Solusinya, tentu saja, tidak tergantung dari φ karena masalahnya sama ketika sepeda menunjuk ke arah positif y . Oleh karena itu, jika kita memanggil R matriks rotasi dengan sudut , λ harus menjadi solusi positif

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

Setelah beberapa perhitungan, jika kita memanggil v norma V , Anda dapatkan

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

Inilah pseudocode yang saya gunakan untuk mendapatkan animasi di atas (alih-alih menggunakan , saya menggunakan u = U (θ + φ) karena lebih sederhana):

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

Jika Anda mengulang banyak dan / atau meningkatkan sudut kemudi, lintasannya adalah sebuah lingkaran, yang koheren, saya percaya.

jrsala
sumber