फ्रंट व्हील हेडिंग और वेलोसिटी से बाइक हेडिंग की गणना करें


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

ओह रुको, सामने का पहिया आपकी ड्राइंग में सर्कल के लिए स्पर्शरेखा नहीं है। मेरे सिर में, दोनों पहिये स्पर्शशील थे। जो कुछ चीजों को बदल देता है।
जलसाल

क्या आपने बाइक भौतिकी के लिए विकिपीडिया पृष्ठ देखा है ? इसमें त्रिज्या के लिए उपयोगी सूत्र हैं जो झुकाव को ध्यान में रखते हैं।
sam hocevar

जवाबों:


3

ठीक है, मैं परिणामों के साथ वापस आ गया हूँ!

एनिमेटेड बाइक

मैंने दो दृष्टिकोण आजमाए:

  • पहियों के केंद्रों की गति को नियंत्रित करने वाले एक अंतर समीकरण को प्राप्त करने के लिए ठोस यांत्रिकी का उपयोग करना: सिस्टम "बाइक" के इनपुट रियर व्हील और फ्रंट व्हील के कोण पर टोक़ हैं, और आउटपुट केंद्रों के कीनेमेटीक्स हैं पहियों का। लेकिन मैंने हार मान ली, यह कठिन था!

  • यह अनुमान लगाने की कोशिश की जा रही है कि ज्यामितीय बिंदु से क्या होता है जब पीछे का पहिया सामने के पहिये को "धक्का" देता है और सामने का पहिया सीधा नहीं होता है। इस विधि से सीधे इन्फिनिटिमल इन्क्रीमेंट (नीचे देखें) का समीकरण मिलता है, जिससे आप वास्तविक अंतर समीकरण प्राप्त कर सकते हैं। मैंने ODE प्राप्त करने के लिए इस पहले समीकरण में हेरफेर करने की कोशिश नहीं की है, लेकिन मेरा अनुमान है कि मैंने ठोस मैकेनिक्स का उपयोग करते हुए उसी ODE को प्राप्त किया होगा। यह सिर्फ सही लगता है।

अंकन और परिकल्पना:

हम विमान में पूर्व वैक्टर एक्स और आंख के साथ हैं

A , रियर व्हील का केंद्र है। B सामने वाले पहिये का केंद्र है। बाइक L की लंबाई A और B के बीच की दूरी है । के बीच के कोण ey और वेक्टर एबी है φ । के बीच के कोण एबी और सामने पहिया है θ

सहज ज्ञान युक्त तर्क:

हम मानते हैं कि, एक निश्चित तात्कालिक टी पर , ए (टी) में एबी के साथ एक वेग वी (टी) कॉलिनियर है । इसलिए, एक अनंत टाइमस्टेप डीटी के लिए ,

एक (टी + डीटी) = एक (टी) + V (टी) .dt

हम यह भी है कि लगता है कि समय में, टी ,, सामने का पहिया बहाव नहीं करता है यानी की गति बी सामने पहिया की दिशा से colinear है, यानी एक कोण रूपों θ साथ एबी । हम फोन इकाई वेक्टर एक कोण बनाने θ साथ एबी , सामने पहिया के रूप में एक ही दिशा के साथ यानी इकाई वेक्टर।

इसलिए, t + dt पर ,

बी (टी + डीटी) = बी (टी) + λ.Ut

एक निश्चित वास्तविक, सकारात्मक λ जैसे कि बाइक L की लंबाई संरक्षित है:

दूरी (ए (टी + डीटी), बी (टी + डीटी)) = एल

गणना:

यह अंतिम समीकरण इसका अनुवाद करता है

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

लेकिन B (t) , परिभाषा के अनुसार, A (t) + L.U so है , ताकि λ समीकरण को संतुष्ट करना चाहिए

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

समाधान, ज़ाहिर है, से स्वतंत्र है φ के बाद से समस्या एक ही है जब सकारात्मक दिशा में बाइक अंक y । इसलिए, यदि हम आर -रोटेशन मैट्रिक्स को कोण- if के साथ कहते हैं , तो λ का सकारात्मक समाधान होना चाहिए

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

कुछ गणना के बाद, अगर हम कहते हैं वी के आदर्श वी , आपको मिल

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

यहाँ pseudocode मैं ऊपर दिए गए एनीमेशन का उपयोग करता था (U I का उपयोग करने के बजाय , मैं u = U ( because + was ) का उपयोग करता हूं क्योंकि यह सरल था):

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

यदि आप बहुत दोहराते हैं और / या स्टीयरिंग कोण बढ़ाते हैं, तो प्रक्षेपवक्र एक चक्र है, जो सुसंगत है, मेरा मानना ​​है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.