คำนวณส่วนหัวของจักรยานจากล้อหน้าและความเร็ว


10

ฉันมีเกมจักรยานบนล่างที่เรียบง่ายที่ฉันพยายามเพิ่มการควบคุม ฉันต้องการทราบวิธีการใช้ส่วนหัวของล้อหน้าเพื่อกำหนดหัวเรื่องและความเร็วของจักรยาน

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

ฉันพยายามใช้ความเร็วของจักรยานกับล้อหน้าและล้อหลังและใช้ตำแหน่งที่แตกต่างกันเพื่อกำหนดตำแหน่งของจักรยาน แต่การลากไปข้างหน้าทำให้เกิดความสับสน

แก้ไขตามความคิดเห็น madshogo

ป้อนคำอธิบายรูปภาพที่นี่


ฉันอยู่ในโทรศัพท์ของฉันในขณะนี้ดังนั้นฉันจะให้คำตอบสั้น ๆ : ล้อเป็นวงสัมผัสกับวงกลมที่สมมติขึ้นตามที่จักรยานไปดังนั้นการหมุนจักรยาน ศูนย์กลางของวงกลมอยู่ที่จุดตัดของเส้นตั้งฉากกับแต่ละล้อ หากล้อทั้งสองตรง (จักรยานไม่หมุน) จากนั้นเส้นเหล่านี้ข้ามทางไกลไม่สิ้นสุด (ขนานกัน) ทำให้เกิดรัศมีวงอนันต์คือ A เส้น ในที่สุดสิ่งนี้จะช่วยให้คุณมีวิถีที่จักรยานควรปฏิบัติตาม (วงกลม) หรือความโค้งของมันแล้วแต่ความต้องการของคุณ
jrsala

ขอบคุณสำหรับคำตอบ madshogo คุณช่วยดูแผนภาพที่ฉันเพิ่มและบอกฉันว่าถูกต้องหรือไม่ เส้นสีแดงคือส่วนหัวของจักรยาน ไชโย
user346443

โอ้รอล้อหน้าไม่ได้สัมผัสกับวงกลมในรูปวาดของคุณ ในหัวของฉันมีล้อทั้งสองสัมผัสกัน นั่นเป็นการเปลี่ยนแปลงบางสิ่ง
jrsala

คุณเคยเห็นหน้าวิกิพีเดียสำหรับฟิสิกส์ของจักรยานไหม? มันมีสูตรที่มีประโยชน์สำหรับรัศมีวงเลี้ยวที่คำนึงถึง
sam hocevar

คำตอบ:


3

ตกลงฉันกลับมาพร้อมผลลัพธ์!

จักรยานเคลื่อนไหว

ฉันลองสองวิธี:

  • การใช้กลไกของแข็งเพื่อให้ได้สมการเชิงอนุพันธ์ที่ควบคุมการเคลื่อนที่ของศูนย์กลางของล้อ: อินพุตของระบบ "จักรยาน" คือแรงบิดที่ล้อหลังและมุมของล้อหน้าและเอาต์พุตเป็นจลศาสตร์ของศูนย์ ของล้อ แต่ฉันยอมแพ้มันยาก!

  • พยายามคาดเดาสิ่งที่เกิดขึ้นจากมุมมองทางเรขาคณิตเมื่อล้อหลัง "ดัน" ล้อหน้าไปข้างหน้าโดยล้อหน้าไม่ตรง วิธีนี้ให้ผลโดยตรงกับการเพิ่มขึ้นเล็กน้อย (ดูด้านล่าง) ซึ่งคุณจะได้สมการเชิงอนุพันธ์ที่แท้จริง ฉันไม่ได้พยายามจัดการสมการแรกนี้เพื่อให้ได้ ODE แต่ฉันเดาว่าฉันจะได้ ODE ที่เหมือนกันมาก ๆ โดยใช้กลศาสตร์ของแข็ง มันรู้สึกถูกต้อง

สัญลักษณ์และสมมติฐาน:

เราอยู่ในเครื่องบินที่มีพื้นฐานเวกเตอร์อดีตและEY

Aคือศูนย์กลางของล้อหลัง Bคือศูนย์กลางของล้อหน้า ความยาวของจักรยานLคือระยะห่างระหว่างและB มุมระหว่างEYและเวกเตอร์ABคือφ มุมระหว่างABและล้อหน้าเป็นθ

เหตุผลที่ใช้งานง่าย:

เราคิดว่าในทันทีบางT , A (t)มีความเร็วV (t) colinear กับAB ดังนั้นสำหรับ timestep dtเล็ก ๆ น้อย ๆ

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

นอกจากนี้เรายังคิดว่าในเวลาT , ล้อหน้าไม่ลอยคือความเร็วของBเป็น colinear กับทิศทางของล้อหน้าคือรูปแบบมุมθกับAB เราเรียกว่าเวกเตอร์หน่วยสร้างมุมθกับABนั่นคือเวกเตอร์หน่วยที่มีทิศทางเดียวกับล้อหน้า

ดังนั้นที่T + dt ,

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

สำหรับจริงบางอย่างในเชิงบวกλดังกล่าวว่าความยาวของจักรยานLเป็นป่าสงวน:

ระยะทาง (A (t + dt), B (t + dt)) = L

การคำนวณ:

สมการสุดท้ายนี้แปลเป็น

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

แต่B (t)ตามคำนิยามคือA (t) + L.Uφดังนั้นλต้องเป็นไปตามสมการ

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

วิธีการแก้ปัญหาของหลักสูตรมีความเป็นอิสระจากφตั้งแต่ที่เป็นปัญหาเดียวกันเมื่อจุดจักรยานไปทางบวกY ดังนั้นถ้าเราเรียกRหมุนเมทริกซ์ด้วยมุม , λจะต้องเป็นวิธีการแก้ปัญหาในเชิงบวกของ

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

หลังจากการคำนวณเล็กน้อยถ้าเราเรียกvปกติของVคุณจะได้

λ = ลิตร (sqrt (1 - (บาป (θ) (1-v.dt / L)) ²). - cos (θ)) + v.dt.cos (θ)

นี่คือรหัสเทียมที่ฉันเคยใช้ในการสร้างภาพเคลื่อนไหวด้านบน (แทนที่จะใช้ฉันใช้u = U (θ + φ)เพราะมันง่ายกว่า):

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

ถ้าคุณทำซ้ำมากและ / หรือเพิ่มมุมบังคับเลี้ยววิถีคือวงกลมซึ่งสอดคล้องกันฉันเชื่อ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.