ड्रोन का निशाना


9

एक "ड्रोन" और 2 डी विमान पर एक लक्ष्य बिंदु की कल्पना करें। आठ पैरामीटर हैं:

P = my position
Q = target position
V = my velocity
I = my moment of inertia
w = my angular velocity
s = my angular position
T = max thrust
U = max torque

(हम कहेंगे कि लक्ष्य स्थिर है)

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


3
यदि जोर केवल एक ही दिशा में जा सकता है , तो आप कभी भी दिशाओं में बदलाव नहीं करेंगे।
MichaelHouse

1
मुझे अधिक स्पष्ट रूप से निर्दिष्ट करना चाहिए - आप जोर नहीं पकड़ सकते हैं, अर्थात जोर केवल शिल्प के उन्मुखीकरण के सापेक्ष एक दिशा में जा सकता है। आप अभी भी शिल्प को घुमा सकते हैं और जोर की दिशा बदल सकते हैं।
गस

2
क्या यह प्रश्न नोड्यूवर से संबंधित है?
सेठ बत्तीन

1
तब मुझे लगता है कि मैं आपके लिए एक अच्छा समाधान पोस्ट कर सकता हूं (थोड़ी देर बाद आज रात)। :)
सेठ बत्तीन

1
इस प्रश्न के लिए एक अधिक वर्णनात्मक शीर्षक की आवश्यकता है, लेकिन मैं एक अच्छे के बारे में नहीं सोच सकता। परिचय सहायता?
एको

जवाबों:


5

आपके प्रश्न के संदर्भ में, http://nodewar.com/ पर , आपके समाधान के लिए कुछ विशिष्ट विचार हैं:

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

ये विधियाँ हैं जो मैंने एक वांछित त्वरण तक पहुँचने के लिए काम करने के लिए निर्धारित की हैं।

त्वरण, वेग नहीं

क्योंकि आपके पास पहले से ही एक दिया हुआ वेग है, और आपका लक्ष्य आगे बढ़ रहा है, आपको एक बिंदु की ओर जोर देने की आवश्यकता नहीं है। आपको अपने वेग को बदलने के लिए जोर की जरूरत है कि यह क्या होना चाहिए। इसका मतलब यह है कि आपके जहाज को यह इंगित करने की आवश्यकता नहीं है कि वह कहाँ जा रहा है, लेकिन उस दिशा में जिसमें उसे गति मिलनी चाहिए।

// My target velocity is for maintaining a circular orbit.  Yours may differ.
// Earlier, I calculated total gravity and the perpendicular direction.
// You may wish to subtract gravity from your total, rather than match it.
var targetVel = o.lib.vec.times(lateralDir, targetVelMag);

var targetAccel = lv.sum(
  o.lib.vec.diff(targetVel, o.me.vel), 
  o.lib.vec.times(gravity, 1 / o.me.mass)  
);

सही हेडिंग की ओर बढ़ते हुए

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

// convert acceleration to an angle
var polar = o.lib.vec.toPolar(targetAccel);
var traj = polar[1];

// constrain the angle to +/-2PI, because the ship's rotation is not limited 
// by default
var fixed_rot = o.lib.ang.rescale(o.me.rot);

// limit the correction to be +/-1PI
var traj_correction = traj - fixed_rot;
if (traj_correction > (Math.PI)){
  traj_correction = (2 * Math.PI) - traj_correction;
} else if (traj_correction < (-1 * Math.PI)){
  traj_correction = (2 * Math.PI) + traj_correction;
}

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

if (traj_correction > 0){
  torque = 1;
} else if (traj_correction < 0){
  torque = -1;
}

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

var max_a_accel = c.MAX_TORQUE / o.me.m_i;
var a_deccel_time = Math.abs(o.me.a_vel) / max_a_accel;
// the same math as linear acceleration, now in angles.
var stopping_angle = 0.5 * max_a_accel * a_deccel_time * a_deccel_time;


if (stopping_angle >= Math.abs(traj_correction)){
  // slowdown required.  Reverse torque
  torque *= -1;
}

अपनी आवश्यकताओं के अनुरूप ऊपर दिए गए कोड को ट्विक करने के बाद, आपका जहाज तेजी से और ठीक उसी तरह घूमना चाहिए, जिस लक्ष्य को आपने उसे दिया था।

तेज गति

तो, जोर कब लगाना है? फिर से, लक्ष्य और अन्य कारकों का तेजी से परिवर्तन एक सटीक समाधान को हल करने में बड़ी कठिनाई पैदा करता है। करने की कोशिश मत करो।

// if the heading is close to the final value, thrust.
if (Math.abs(traj_correction ) < 0.02) {  // about 1 degree
  if (true 
      // some logical test, in case you don't want to accelerate past
      // a maximum speed, or some such.  Not required for your stated purpose.
     ){
    thrust = 1;
  } 
}

उन मामलों के लिए जहां आपको आंशिक जोर की आवश्यकता होती है, आप फिर से इस तथ्य पर भरोसा कर सकते हैं कि आप प्रति सेकंड 0 और 1 जोर के बीच कई बार चुन सकते हैं। यह आपको वास्तविक मूल्य को अलग किए बिना एक प्रभावी आंशिक जोर देता है।

सौभाग्य!


महान, धन्यवाद, यह बहुत मदद करता है। मुझे लगता है कि इसे थोड़ा संशोधित करना पड़ेगा। आपकी प्रजाति का नाम क्या है?
गस

मैंने उन्हें सीढ़ी तक नहीं पहुंचाया। उनके पास हमला करने का कोई तरीका नहीं है। :)
सेठ बत्तीन

3

इस पूरे विषय के स्पष्ट नाम, "गति नियोजन" सहित कुछ अच्छे उत्तरों के साथ एक समान प्रश्न:
/programming/2560817/2d-trajectory-planning-of-a-spaceship-with-physics

एक प्रोग्रामर के रूप में, मुझे user470365 के सुझाव की व्यावहारिकता पसंद है। हालाँकि, मैं अधिक कठोर दृष्टिकोण पर एक कदम उठाऊंगा। यहां मेरा सुझाव शुरुआत में एक पूरी योजना की गणना करता है, लेकिन मुझे लगता है कि अगर पैरामीटर बदल रहे हैं तो आप जितनी बार चाहें उसका मूल्यांकन कर सकते हैं।

योजना

  1. एक निश्चित दिशा, के लिए बारी , और उस दिशा पकड़।
  2. एक निश्चित समय तक प्रतीक्षा करें, टी , फिर एक करें, लक्ष्य तक पहुंचने तक निरंतर जोर।

विवरण

मैं d और t खोजने के लिए पुनरावृत्त तरीके सुझाता हूं :

  1. कोई जोर नहीं मानते हुए, ड्रोन के भविष्य के प्रक्षेपवक्र के साथ एक लूप और एक छोटे टाइमस्टेप का उपयोग करके:

    • इस भविष्य के समय में ड्रोन की स्थिति और वेग के लिए, दिशा, डी खोजें , जैसे कि एक निरंतर जोर ड्रोन को लक्ष्य तक पहुंचाएगा। इसे 0 और 360 डिग्री के बीच बहुत सी दिशाओं का नमूना बनाकर करें और उस ड्रोन को खोजें जो कम से कम समय में ड्रोन को लक्ष्य के करीब लाएगा।
    • अगर हम अब और यह भविष्य समय के बीच पर्याप्त समय के लिए बारी करने के लिए है देखने के लिए । (मोड़ गैर-तुच्छ है। अंत में चर्चा देखें।)
    • यदि हमारे पास पर्याप्त समय है, तो हमारी खोज पूरी हो गई है, इसलिए इस लूप को तोड़ दें।
  2. हमने अब d और t पाया है

  3. जितनी जल्दी हो सके घ की ओर मुड़ें (फिर से, नीचे चर्चा देखें)।
  4. टी तक प्रतीक्षा करें , फिर निरंतर जोर शुरू करें।
  5. ड्रोन को अंततः लक्ष्य को मारना चाहिए।

टर्निंग

जब मैं कहता हूं "टर्न टू डी ", मेरा वास्तव में मतलब है, "टोरेंस का एक क्रम ऐसा करें कि हम जल्दी से जल्दी में घूमें जबकि कोणीय वेग को शून्य पर लाएं"। वर्तमान दिशा, वर्तमान कोणीय वेग और अधिकतम कोणीय त्वरण को शामिल करने के लिए संभवतः एक समीकरण है, लेकिन यह कोणों के रैपिंग व्यवहार से जटिल है।


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