টার্গেট ট্র্যাকিং: কখন একটি ঘোরানো ট্যারিটকে ত্বরান্বিত ও হ্রাস করতে হবে?


24

বলুন যে আমার কাছে একটি চলমান বিজ্ঞপ্তি রয়েছে যার দ্বারা targetসংজ্ঞা দেওয়া হয়েছে:

Vector2 position;
Vector2 velocity;
float radius;

এবং একটি ঘোরানো turret(কোনও ধরণের চলমান গাড়িতে আরোহণিত) হিসাবে সংজ্ঞায়িত:

Vector2 position;
Vector2 velocity;
float angle; // radians
float angularVelocity; // radians per second
const float maxAngularVelocity; // radians per second
const float maxAngularAcceleration; // radians per second per second

(বা lines রেখাগুলির পাশাপাশি কিছু Note নোট করুন যে উভয়ের অবস্থান এবং বেগ অন্য কোথাও নিয়ন্ত্রিত হয়েছে - ধরে নিন বেগ বেগ স্থির এবং গতির উপর ভিত্তি করে অবস্থান পরিবর্তন।)

আমি একটি নির্দিষ্ট ফ্রেমে নির্ধারণ করতে দুটি সম্পর্কিত এআই ফাংশন লেখার চেষ্টা করছি:

  • কোন কৌণিক ত্বরণ (এবং কোন দিকে) বুড়িটি লক্ষ্যকে নির্দেশ করে রাখার জন্য বুরুজের কোণে প্রয়োগ করতে হবে?

  • লক্ষ্যটি যদি বর্তমানে দৃষ্টিতে থাকে তবে এটি (এর ব্যাসার্ধের কোনও অংশ) কি xসেকেন্ডের জন্য দৃষ্টিতে রাখা যেতে পারে , যেখানে xএক সেকেন্ডের ভগ্নাংশ থাকবে? (পর্যায়ক্রমে: লক্ষ্যটি আসলে "লক করা" এবং দর্শনীয় স্থানগুলি জুড়ে কেবল উড়ন্ত নয় তা নিশ্চিত করার জন্য কী অন্য কৌশল আছে?)

এবং আমি কিছু সাহায্য ব্যবহার করতে পারি ...


1
আবর্তনীয় ত্বরণ এবং হ্রাসের জন্য আপনার বিভিন্ন মান থাকতে পারে - আসল বিশ্বে সম্ভবত একটির মোটর এবং অন্যটি ব্রেক।
e100

উত্তর:


19

প্রথমে আপনাকে বুড়িটির মুখোমুখি দিক এবং লক্ষ্যটির দিকের মধ্যে কোণের পার্থক্য নির্ধারণ করতে হবে।

Vector2 turretToTarget = target.position - turret.position;
float desiredAngle = atan2(turretToTarget.y, turretToTarget.x);
float angleDiff = desiredAngle - turret.angle;

// Normalize angle to [-PI,PI] range. This ensures that the turret
// turns the shortest way.
while (angleDiff < -PI) angleDiff += 2*PI;
while (angleDiff >= PI) angleDiff -= 2*PI;

আপনার এই পরিমাণগুলি একবার হয়ে গেলে আপনি বুড়ি কোণের জন্য দ্বিতীয় ডিগ্রি প্রকাশ করতে পারবেন set আপনি সর্বদা অবস্থান এবং বেগের সর্বশেষতম ডেটা ব্যবহার করেন তা নিশ্চিত করার জন্য আপনাকে প্রতিটি আপডেটে এটি গণনা করতে হবে।

// Compute angular acceleration.
const float C0 = // Must be determined.
const float C1 = // Must be determined.
float angularAcc = C0 * angleDiff - C1 * turret.angularVelocity;

এখানে, ত্বরণ এক্সপ্রেশন প্রথম শব্দ (শূন্য ডিগ্রি) বার্ধটি লক্ষ্য দিকে বাঁক শুরু করতে হবে। তবে এটি সময়মতো থামবে না বরং এটি পিছনে পিছনে দোল করা উচিত। এটি বন্ধ করতে আমাদের স্যাঁতস্যাঁতে দ্বিতীয় টার্ম (প্রথম ডিগ্রি) প্রয়োজন যা একটি উচ্চ ঘূর্ণন বেগকে একটি উচ্চ ত্বরণ দ্বারা বিরোধিতা করে।

এখন সিস্টেমটি ভাল আচরণের জন্য ইতিবাচক ধ্রুবকগুলি (অগত্যা প্রোগ্রামের ধ্রুবকগুলি নয়) স্থির এবং ভারসাম্যপূর্ণ হওয়া দরকার। C0সিস্টেমের গতির জন্য প্রধান নিয়ন্ত্রণ। এর জন্য একটি উচ্চ মানের C0একটি দ্রুত বাঁক গতি দেয় এবং একটি কম মান একটি কম বাঁক গতি দেয়। আসল মান অনেকগুলি বিষয়ের উপর নির্ভর করে তাই আপনার এখানে পরীক্ষা এবং ত্রুটি ব্যবহার করা উচিত। C1স্যাঁতসেঁতে প্রস্থকে নিয়ন্ত্রণ করে। Discriminant দ্বিঘাত সমীকরণের আমাদের বলে যে যদি C1*C1 - 4*C0 >= 0আমরা একটি অ-দোদুল ব্যবস্থা আছে।

// New definition.
const float C1 = 2*sqrt(C0); // Stabilizes the system.

C1সংখ্যাসূচক কারণে আপনার সম্ভবত এটির থেকে কিছুটা বড় বাছাই করা উচিত , তবে খুব বেশি বড় নয় কারণ এটি খুব বেশি স্যাঁতসেঁতে হতে পারে এবং পরিবর্তে প্রতিক্রিয়া জানাতে ধীর হতে পারে। আবার, আপনি টুইট করতে হবে।

এছাড়াও এটি লক্ষণীয় গুরুত্বপূর্ণ যে এই কোডটি কেবল কৌনিক ত্বরণকে গণনা করে। কোণ এবং কৌণিক বেগটি এটিকে অন্য কোথাও থেকে আপডেট করতে হবে, কোনও ধরণের ব্যবহার করে এবং সংহতকারী। প্রশ্ন থেকে আমি ধরে নিই যে এটি আবৃত হয়েছে।

অবশেষে পিছিয়ে পড়ার বিষয়ে কিছু বলার আছে, কারণ দ্রুত টার্গেট ট্র্যাক করার সময় বুড়িটি সম্ভবত সর্বদা পিছনে থাকবে। এটি মোকাবেলার একটি সহজ উপায় হ'ল লক্ষ্যটির অবস্থানের সাথে একটি রৈখিক পূর্বাভাস যুক্ত করা, অর্থাৎ সর্বদা লক্ষ্যটির সামনের দিকে কিছুটা এগিয়ে যান।

// Improvement of the first lines above.
const float predictionTime = 1; // One second prediction, you need to experiment.
Vector2 turretToTarget = target.position + predictionTime * target.velocity - turret.position;
/// ...

কিছু সময়ের জন্য লক্ষ্য ব্যাসার্ধের মধ্যে বুড়িটি রাখার ক্ষেত্রে, এই ধরণের সিস্টেমে সরাসরি চাপিয়ে দেওয়ার জন্য এটি একটি কঠিন প্রয়োজন হতে পারে। আপনি নিশ্চিত হতে পারেন যে এই নিয়ামকটি সর্বদা লক্ষ্য (বা বরং পূর্বাভাসিত অবস্থান) লক্ষ্য করে বজায় রাখার চেষ্টা করবে। ফলাফলের সক্রিয় আউট যদি সন্তোষজনক না হতে আপনি প্যারামিটার সংশোধন করতে হবে predictionTime, C0এবং C1(স্থিতিশীল সীমার মধ্যে)।


আমি এটি সঠিক কিনা না তা বলার যোগ্য নই, তবে এটি কিছু চালাক জিনিস বলে মনে হচ্ছে! আমি অতীতে এই ধরণের সমস্যাগুলি সমাধান করেছি এবং কখন ত্বরণ করব এবং কখন "ব্রেকগুলি প্রয়োগ করব" তা কার্যকর করার জন্য ত্বরণের প্রভাব সম্পর্কে পূর্বাভাস দিয়ে। তার মানে কি আমি এটি ভুল করে চলেছি?
আয়ান

X এবং y পরামিতিটি atan2 টির উপর নির্ভরশীল হওয়ার কারণে atan2 এই পদ্ধতিটিকে ভবিষ্যদ্বাণীমূলক সিস্টেমের সাথে খাপ খাইয়ে নিতে শক্ত করে তোলে।
Skizz

নীচের আমার উত্তরে আমি ঠিক এটিই ইঙ্গিত দিচ্ছিলাম। দুর্দান্ত বিবরণ এবং উপস্থাপনা!
drxzcl

@ আইইন: না এখানে কোন সঠিক এবং ভুল নেই। আমি অনুমান করি যে আপনার পদ্ধতির দুটি পৃথক পৃথক অবস্থা থাকবে: ত্বরণ / হ্রাসকরণ, এই পদ্ধতিটি নিয়ন্ত্রণ তত্ত্বের নিয়ামক দ্বারা অনুপ্রাণিত, ওভারশুট এবং দোলন হ্রাস করার সময় একটি দ্রুত প্রতিক্রিয়া তৈরি করার জন্য ত্বরণকে স্কেল করে।
স্টাফান ই

1
অন্যান্য মন্তব্যগুলির মতো এটি স্থির লক্ষ্যের জন্য কাজ করবে তবে চলমান লক্ষ্যগুলির জন্য এটি সম্ভবত অগ্রহণযোগ্য হবে। C0 এবং C1 পদগুলি হ'ল traditionalতিহ্যবাহী kস্যাঁতসেঁতে বসন্তের স্টাফ, যেখানে C0 বসন্তের শক্তিকে প্রতিনিধিত্ব করে (সাধারণত বলা হয় ) এবং সি 1 ড্যাম্পিং ফ্যাক্টর (সাধারণত 'বি' বা 'সি' নামে পরিচিত)। হ্যাঁ, আপনি স্যাঁতসেঁতে কেটে কৃপণ করে দোলনকে হ্রাস করতে পারেন তবে সমস্যাটি হ'ল লক্ষ্যটি কোথায় হবে তা অনুমান করার চেষ্টা করে না , তাই কাঙ্ক্ষিত লক্ষ্যটি পিছিয়ে পড়ার মতো পরিণতি রয়েছে।
ড্যাশ-টম-ব্যাং

3

আপনার এখানে যা আছে এটি একটি প্রাথমিক নিয়ন্ত্রণ সমস্যা । বুড়িটি সিস্টেম, ত্বরণটি নিয়ন্ত্রণ এবং সেন্সরটি অবস্থান / বেগকে পরিমাপ করে। এই সমস্যাগুলি মোকাবিলার অনেকগুলি উপায় রয়েছে, কারণ এটি ইঞ্জিনিয়ারিংয়ের ক্ষেত্রে খুব সুচিন্তিত একটি সমস্যা।

কীটি একটি স্থিতিশীল সিস্টেমের সাথে সমাপ্ত হয়, অর্থাত্ একটি সিস্টেম যা দোলা দেয় না। এটি সাধারণত স্যাঁতসেঁতে যোগ করার মাধ্যমে করা হয়। উইকিপিডিয়া পৃষ্ঠাটি আপনার শুরু করা উচিত।


2

প্রথমে, টারেট থেকে টারেক্ট থেকে ভেক্টর গণনা করুন। তারপরে এটি বার্জের বর্তমান ভেক্টরের সাথে তুলনা করুন। তারপরে কৌণিক ত্বরণ এবং একটি নির্দিষ্ট সময়ের মধ্যে ডানদিকে ডান দিকে মোড় ঘোরার জন্য প্রয়োজনীয় কৌণিক বেগ এবং কৌণিক গতিবেগ কাজ করতে উভয়ের মধ্যে পার্থক্যটি ব্যবহার করুন।

ঠিক আছে, এটা সহজ মনে হয়েছিল। যাইহোক, আপনি যখন টার্নেটটি ঘুরিয়েছেন তখন লক্ষ্যটি সরে যেতে চলেছে তাই আপনার লক্ষ্যটির অবস্থান সম্পর্কে অনুমান করার চেষ্টা করা উচিত। এটা করতে:-

Pd' = Pd + t.Vd
Ps' = Ps + t.Vs

যেখানে পি অবস্থান এবং ভি গতিবেগ এবং সাবস্ক্রিপ্টটি গন্তব্য (লক্ষ্য) এবং গুলি উত্স (ট্যারেট) এর জন্য, যা একটি দিকনির্দেশক ভেক্টর দেয়: -

Dsd' = Pd' - Ps' = Pd + t.Vd - (Ps + t.Vs) = Pd - Ps + (Vd - Vs).t

যেখানে ডি হ'ল একটি দিকের ভেক্টর এবং ডিএসডি 'টি টি সময়ে প্রয়োজনীয় দিক। এখন, বর্তমান অবস্থান এবং সর্বাধিক বেগ এবং প্রদত্ত সময়ের জন্য গতিবেগের উপর ভিত্তি করে বেড়িটির দিকনির্দেশটি কার্যকর করুন টি: -

Ds' = t.Ds.Rs -> this is a vector rotation

ডিএস এবং ডিএস 'উত্সের দিকনির্দেশ এবং রুপটি আবর্তিত বেগ। এই সমস্ত কিছুর সাথে আপনি কখন ডিএসডি '== ডিএস' এবং এর জন্য প্রয়োজনীয় রোটেশনাল বেগটি খুঁজে পেতে চান। ভুলে যাবেন না যে সমস্ত পি, ডি এবং ভি এর x এবং y উপাদান রয়েছে।

আমি এখানে অ্যাকাউন্টে ত্বরণ নিইনি - যা জটিলতায় আরও অনেক কিছু যুক্ত করে। একবার আপনি টাকা এবং টি পেয়ে গেলে সম্ভবত একই ফলাফলটি পেতে একটি প্যারাবোলিক Rs (অর্থাত্ ত্বরণ এবং হ্রাস) পেতে পারেন।


এটি ইন্টারসেপেশন গণনার জন্য ভাল উত্তরের মতো দেখায়, তবে দুর্ভাগ্যক্রমে এমন লোকদের মধ্যে একটি বড় ব্যবধান রয়েছে যারা এই জাতীয় গণিতের স্বরলিপিটি পড়তে এবং এটিকে প্রোগ্রাম কোডে পরিণত করতে পারে এবং বেশিরভাগ লোক গেমগুলি তৈরি করে যারা ইতিমধ্যে উত্তরটি জানে না। প্রশ্নটি. অন্য কথায়, আমি মনে করি গেম ডেভস যারা এই গণিতের স্বরলিপিটি পড়তে পারে, সম্ভবত ফায়ারিং সলিউশনটি কীভাবে প্রোগ্রাম করা যায় তা ইতিমধ্যে নির্ধারণ করতে পারে। আপনি যদি আপনার শর্তাদি বোঝাতে চান তবে এটি আপনার সূত্রগুলি বুঝতে সহায়তা করবে।
দ্রোঞ্জ

2

আপনি সম্ভবত এখানে যা খুঁজছেন তা হ'ল একটি পিআইডি কন্ট্রোলার , যা এই প্রশ্নের উত্তরে গৃহীত উত্তরের মতো

আমি প্রথমে "আমার নিজের ঘূর্ণায়মান" এই প্রশ্নের উত্তর দিয়েছিলাম তবে এই উত্তরটি উল্লেখযোগ্যভাবে আরও সম্পূর্ণ এবং মার্জিত।


0

করণীয় এবং ট্র্যাক করা অবজেক্টের মধ্যবর্তী কোণটি গণনা করা প্রথম কাজ।
পরবর্তী জিনিসটি বর্তমান টরেন্টের গতি ব্যবহার করে এবং সর্বাধিক ত্বরণটি পিছনের দিকে (টরেন্টটি থামানো) প্রয়োগ করা টরেন্টটি ট্র্যাক করা অবজেক্টের আগে বা পরে থামবে কি না তা পরীক্ষা করা উচিত।
যদি উত্তরটি হয় যে টরেন্টটি ট্র্যাক করা অবজেক্টের আগে বন্ধ হয়ে যায়, সর্বাধিক ত্বরণ এগিয়ে নেওয়া (গতি বাড়ানো) প্রয়োগ করুন।
যদি উত্তরটি হয় যে ট্র্যাক করা অবজেক্টের পরে টরেন্টটি থামবে, সর্বাধিক ত্বরণ পিছনে (টরেন্টটি থামানো) প্রয়োগ করুন।
এইভাবে টরেন্টটি দ্রুত পৌঁছে যাবে এবং ডান পয়েন্টে থামবে (বা তার পরে কোনও ভগ্নাংশ)।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.