भौतिकी मॉडल के साथ एक जहाज के लिए एआई नियंत्रण


19

मैं ऐसे विचारों की तलाश कर रहा हूं कि 2 डी स्पेस में निम्नलिखित को कैसे लागू किया जाए। दुर्भाग्यवश मुझे अभी तक एआई / पथ खोजने / स्वायत्त नियंत्रण के बारे में ज्यादा जानकारी नहीं है।

मान लें कि यह जहाज स्वतंत्र रूप से आगे बढ़ सकता है लेकिन इसमें द्रव्यमान और गति है। इसके अलावा, बाहरी बल इसे प्रभावित कर सकते हैं (विस्फोट आदि)। खिलाड़ी किसी भी समय जहाज के लिए एक लक्ष्य निर्धारित कर सकता है और इसे उस स्थान पर पहुंचना चाहिए और रुकना चाहिए।

भौतिकी के बिना यह सरल होगा, बस दिशा और जाने के लिए इंगित करें। लेकिन मौजूदा गति से कैसे निपटें और फिर मौके पर रोकें? मैं सीधे जहाज के प्लेसमेंट को संशोधित नहीं करना चाहता।

संपादित करें: बस स्पष्ट करने के लिए, जहाज का भौतिकी संबंधी गणित ही समस्या नहीं है।


मुझे उम्मीद है कि जल्द ही इसी तरह के मुद्दे का सामना किया जाएगा; मैं इसका उत्तर देखने के लिए उत्सुक हूं।
बिल

जवाबों:


15

स्टीयरिंग व्यवहार पर एक नज़र है । विशेष रूप से तलाश और आगमन आपकी आवश्यकताओं के लिए दिलचस्प हो सकता है। ये व्यवहार तब भी काम करेंगे जब विस्फोट जैसे कुछ अन्य प्रभाव जहाजों की स्थिति को अस्थायी रूप से बदल देते हैं।


+1। एक 2 डी अंतरिक्ष खेल के लिए, मैं आपके ढांचे के रूप में स्टीयरिंग व्यवहार का उपयोग करने की सिफारिश करूंगा, और उस ढांचे के भीतर एक घटक के रूप में मेरे उत्तरों में से एक का उपयोग करूंगा।
दस

जब मैं प्रश्न पढ़ता हूं तो वही सोचने का सुझाव देने जा रहा था। मैंने स्टीयरिंग बिहेवियर का उपयोग किया है, यह आसान है और कुछ अच्छे एआई / मोशन के लिए अनुमति देता है।
१६

5

यह बिल्कुल सही पाने के लिए एक आसान समस्या नहीं है। आपके पास दो विकल्प हैं, हालांकि प्रत्येक समाधान की बारीकियां अलग-अलग हैं:

एक गणितीय उपाय। यदि आपकी भौतिकी प्रणाली काफी सरल है, तो आप अपनी गति के लिए बंद फॉर्म बना सकते हैं और गणना कर सकते हैं कि आपको एक बिंदु पर रुकने के लिए ब्रेकिंग बल को लागू करना शुरू करना होगा। यदि आपकी ब्रेकिंग फोर्स एक स्थिर है और आपके पास कोई वायु प्रतिरोधक क्षमता नहीं है, तो इसे द्विघात में विघटित करना चाहिए।

एक अपरिपक्व समाधान। आप एक हाथ से चलने वाले पीआईडी ​​नियंत्रक का उपयोग कर सकते हैं या वास्तव में अपने भौतिकी प्रणाली में अपने जहाज के लिए ब्रेकिंग दूरी रिकॉर्ड कर सकते हैं: एक परीक्षण में, अधिकतम गति से जहाज को एक स्टॉप तक ब्रेक करें, यात्रा की गई दूरी की रिकॉर्डिंग करें और हर छोटे टाइमस्टेप को गति दें। डेटा डायरेक्टरी में परिणामी दूरी / गति ग्राफ को स्टोर करें।

रन टाइम में, अपनी वर्तमान गति और लक्ष्य गति को पुनः प्राप्त करें और दूरी को प्राप्त करने के लिए प्लग इन करें। अपने लक्ष्य बिंदु से इस दूरी पर आपको पूर्ण ब्रेक की आवश्यकता है।

इस दृष्टिकोण का लाभ यह है कि आप इसका उपयोग किसी भी गति को वास्तव में ब्रेक करने के लिए कर सकते हैं। नुकसान यह है कि यदि आपके ब्रेक को रैंप पर या बंद करना पड़ता है, तो आप कभी भी वक्र पर नहीं होंगे।


1

जैसा कि पहले कहा गया था कि यह स्थिति स्टीयरिंग व्यवहार के लिए एकदम सही है, लेकिन मैं इसे थोड़ा विस्तार देना चाहूंगा। आगमन परिदृश्य इस परिदृश्य के लिए एकदम सही होगा। आप बाधाओं को भी ध्यान में रखना चाह सकते हैं। आप यहां भी बाधा निवारण व्यवहार का उपयोग कर सकते हैं।

दुर्भाग्य से, http://www.red3d.com/cwr/steer/ व्यवहार के लिए स्रोत कोड प्रदान नहीं करता है। हालांकि, उदाहरण के लिए प्रोग्रामिंग गेम AI करता है और विखंडू को समझने में आसान व्यवहार बताता है। यदि आपको वह पुस्तक नहीं मिल रही है तो आप हमेशा यहाँ स्रोत कोड प्राप्त कर सकते हैं: http://www.wordware.com/files/ai/

इसके अलावा, यदि आप पाथफाइंडिंग को शामिल करने के लिए अपने आंदोलन का विस्तार करना चाहते हैं, तो आपके पास एक पाथफाइंडर वर्ग हो सकता है जो पथ की गणना करता है (शायद 2 डी वैक्टर के संग्रह के रूप में) और मिश्रण में इसे जोड़ने के लिए पथ अनुसरण स्टीयरिंग व्यवहार का उपयोग करें।

मैंने जिस सोर्स कोड से लिंक किया है वह इन स्टीयरिंग बिहेवियर को एक साथ मिलाने के तीन अलग-अलग तरीके प्रदान करता है।

उम्मीद है की वो मदद करदे।


Red3d.com लिंक सीधे स्रोत प्रदान नहीं करता है , लेकिन OpenSteer ( opensteer.sourceforge.net ) पर उस पृष्ठ पर एक लिंक सही है जो स्टीयरिंग व्यवहार का एक खुला स्रोत कार्यान्वयन है।
बुमज़ैक

आह पता नहीं था, धन्यवाद। हालाँकि, मैंने OpenSteer के स्रोत को देखा और बकलैंड की पुस्तक में पाए गए आपके फेस कोड में अधिक स्पष्ट रूप से देखना आसान पाया। खासतौर पर जब शुरू हो रहा हो।
रे डे

1

किसी स्थिति की ओर बढ़ना बहुत मुश्किल नहीं है, लेकिन मैं व्यक्तिगत रूप से कुछ समय के लिए संघर्ष करता रहा, ताकि किसी स्थिति की ओर कदम बढ़ा सकूँ और एक विशिष्ट गति से पहुँच सकूँ या गति की कमी के साथ एक पथ का अनुसरण कर सकूँ।

मैंने एक हर्मीट वक्र का उपयोग करके समस्या को हल किया । अपने जहाज की स्थिति और वेगों को p0 और m0 सेट करें, अपने लक्ष्य की स्थिति और गति के लिए p1 और m1। यह मानता है कि आप लक्ष्य के बाद जहाज को एक सेकंड का पालन करना चाहते हैं। पी (0) के दूसरे व्युत्पन्न की गणना करें, जो आपको अपने जहाज पर लागू करने के लिए त्वरण देगा।

यहाँ दूसरी व्युत्पन्न के लिए कोड है (F # में, मुझे आशा है कि आप इसे अपनी पसंद की भाषा में अनुकूलित कर सकते हैं। sq () वर्ग की गणना करता है, एकल उद्धरण उद्धरण के रूप में व्याख्या नहीं किए जाते हैं, लेकिन वर्ण के रूप में, वे पहचानकर्ता का हिस्सा हैं):

    let h'' t =
        let h00'' t = 12.0 * t - 6.0
        let h10'' t = 6.0 * t - 4.0
        let h01'' t = -12.0 * t + 6.0
        let h11'' t = 6.0 * t - 2.0

        let t = (t - t0) / diff_t

        (sq (1.0 / diff_t)) *
        ((h00'' t * p0) +
         (h10'' t * diff_t * v0) +
         (h01'' t * p1) +
         (h11'' t * diff_t * v1))

ध्यान दें कि यदि आपका जहाज बाहरी ताकतों (जैसे ग्रहों से गुरुत्वाकर्षण) के अधीन है, तो आपको त्वरण से जोर की गणना करते समय इसके लिए ध्यान देना होगा।



-3

मुझे लगता है कि आपके जहाज में पैरामीटर होने चाहिए: स्थिति और वेग।

वेग सभी बलों (जैसे गुरुत्वाकर्षण, विस्फोट, उपयोगकर्ता इनपुट आदि) के प्रत्येक फ्रेम योग में है और किसी प्रकार का नम भी हो सकता है।

स्थिति की गणना अंतिम स्थिति और वेग * time_step से की जाती है।

हालांकि, इसके साथ लक्ष्य पर रोक को लागू करना मुश्किल हो सकता है।


3
-1 ऐसा लगता है कि पेटेरिटी हिएवित्रा को पता है कि बुनियादी भौतिकी प्रणाली का उपयोग कैसे किया जाता है। तो इस सवाल पर आपका जवाब है कि किसी लक्ष्य पर रुकना बहुत मुश्किल है?
अटैकिंगहोबो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.