অ-সর্বজনীন গতি পরিকল্পনার দুর্দান্ত পৃথিবীতে আপনাকে স্বাগতম । আমি ল্যাটিস গ্রিড পাথ প্ল্যানার ব্যবহার করে এটি করার পরামর্শ দিচ্ছি । অন্যান্য বিকল্পের মধ্যে কিনোডাইনামিক আরআরটি এবং ট্র্যাজেক্টোরি অপ্টিমাইজেশন অন্তর্ভুক্ত রয়েছে । নন-হোলোনমিক সিস্টেমে গাড়ি, নৌকা, আনসাইকেল বা সত্যিই এমন কিছু অন্তর্ভুক্ত থাকে যেখানে যানবাহন তার পছন্দমতো পথে ভ্রমণ করতে পারে না। এই সিস্টেমগুলির জন্য পরিকল্পনা হোলোনমিক সিস্টেমগুলির চেয়ে অনেক বেশি শক্ত এবং academic 2000 অবধি একাডেমিক গবেষণার প্রান্তে ছিল। আজকাল প্রচুর অ্যালগরিদম রয়েছে যা থেকে শালীনতার সাথে কাজ করে।
এখানে কিভাবে এটা কাজ করে.
রাষ্ট্র
আপনার গাড়ির কনফিগারেশন q আসলে একটি 3D স্টেট যা গাড়ির এক্স, ওয়াই অবস্থান এবং এর অরিয়েন্টেশন t যুক্ত করে । আপনার এ * অ্যালগোরিদমের নোডগুলি আসলে 3 ডি ভেক্টর।
class Node
{
// The position and orientation of the car.
float x, y, theta;
}
ক্রিয়াকলাপ
তাই প্রান্ত সম্পর্কে কি?
এটি কিছুটা শক্ত, কারণ আপনার গাড়িটি চাকাটি ঘুরিয়ে দেওয়ার জন্য সীমাহীন অসংখ্য উপায় বেছে নিতে পারে । সুতরাং, গাড়িটি একটি বিচ্ছিন্ন সেট, এ এ গ্রহণ করতে পারে এমন ক্রিয়া সংখ্যা সীমাবদ্ধ করে আমরা এটি জালিয়াতির গ্রিড পরিকল্পনাকারীর কাছে অ্যাক্সেসযোগ্য করে তুলতে পারি । সরলতার স্বার্থে ধরে নিতে পারি যে গাড়িটি গতি দেয় না বরং তাত্ক্ষণিকভাবে তার বেগ পরিবর্তন করতে পারে can আমাদের ক্ষেত্রে এ নিম্নরূপ হতে পারে:
class Action
{
// The direction of the steering wheel.
float wheelDirection;
// The speed to go at in m/s.
float speed;
// The time that it takes to complete an action in seconds.
float dt;
}
এখন, আমরা ক্রিয়াকলাপগুলির একটি পৃথক সেট তৈরি করতে পারি যা গাড়ি যে কোনও সময় নিতে পারে। উদাহরণস্বরূপ, সম্পূর্ণ শক্তিকে 0.5 সেকেন্ডের জন্য টিপতে গিয়ে একটি শক্ত ডান এইরকম দেখতে পাবেন:
Action turnRight;
turnRight.speed = 1;
turnRight.wheelDirection = 1;
turnRight.dt = 0.5;
গাড়িটি বিপরীতে স্থাপন করা এবং ব্যাক আপ নেওয়া এই রকম হবে:
Action reverse;
reverse.speed = -1;
reverse.wheelDirection = 0;
reverse.dt = 0.5;
এবং আপনার ক্রিয়াকলাপগুলির তালিকাটি এর মতো দেখাবে:
List<Action> actions = { turnRight, turnLeft, goStraight, reverse ...}
নোডে নেওয়া কোনও পদক্ষেপ কীভাবে একটি নতুন নোডের ফলাফল দেয় তা নির্ধারণ করার একটি উপায়ও আপনার প্রয়োজন। একে সিস্টেমের ফরোয়ার্ড ডায়নামিক্স বলা হয় ।
// These forward dynamics are for a dubin's car that can change its
// course instantaneously.
Node forwardIntegrate(Node start, Action action)
{
// the speed of the car in theta, x and y.
float thetaDot = action.wheelDirection * TURNING_RADIUS;
// the discrete timestep in seconds that we integrate at.
float timestep = 0.001;
float x = start.x;
float y = start.y;
float theta = start.theta;
// Discrete Euler integration over the length of the action.
for (float t = 0; t < action.dt; t += timestep)
{
theta += timestep * thetaDot;
float xDot = action.speed * cos(theta);
float yDot = action.speed * sin(theta);
x += timestep * xDot;
y += timestep * yDot;
}
return Node(x, y, theta);
}
পৃথক গ্রিড ঘর
এখন, জাফরি গ্রিড গঠন করা, সব আমরা করতে প্রয়োজন হয় হ্যাশ বিযুক্ত গ্রিড কোষে গাড়ির যুক্তরাষ্ট্র। এটি এগুলিকে পৃথক নোডগুলিতে পরিণত করে যা A * অনুসরণ করতে পারে। এটি অত্যন্ত গুরুত্বপূর্ণ কারণ অন্যথায় এ * এর সাথে তুলনা করার জন্য দুটি গাড়ি রাজ্য আসলে একই কিনা তা জানার কোনও উপায় থাকবে না। গ্রিড কক্ষের মানগুলিতে পূর্ণসংখ্যক হ্যাশ করে, এটি তুচ্ছ হয়ে যায়।
GridCell hashNode(Node node)
{
GridCell cell;
cell.x = round(node.x / X_RESOLUTION);
cell.y = round(node.y / Y_RESOLUTION);
cell.theta = round(node.theta / THETA_RESOLUTION);
return cell;
}
এখন, আমরা একটি এ * পরিকল্পনা করতে পারি যেখানে গ্রিডসেলগুলি নোড, ক্রিয়াগুলি নোডগুলির মধ্যে প্রান্ত এবং গ্রিডসেলের ক্ষেত্রে স্টার্ট এবং লক্ষ্য প্রকাশ করা হয়। দুটি গ্রিডসেলের মধ্যে হিউরিস্টিক হ'ল x এবং y এর সাথে দূরত্বে কোণার দূরত্ব।
পথ অনুসরণ করা
গ্রিডসেলস এবং তাদের মধ্যে ক্রিয়াগুলির ক্ষেত্রে এখন আমাদের একটি পাথ রয়েছে, আমরা গাড়ীর জন্য একটি পথ অনুসরণকারী লিখতে পারি। গ্রিড কোষগুলি বিচ্ছিন্ন হওয়ায় গাড়িটি অভ্যন্তরীণ কোষগুলিতে ঝাঁপিয়ে পড়ত। সুতরাং আমরা পথ ধরে গাড়ির গতি মসৃণ করতে হবে। যদি আপনার গেমটি পদার্থবিজ্ঞানের ইঞ্জিন ব্যবহার করে থাকে তবে স্টিয়ারিং কন্ট্রোলার লিখে এটি সম্পন্ন করা যায় যা গাড়ীটিকে যতটা সম্ভব পথের কাছে রাখার চেষ্টা করে। অন্যথায়, আপনি বেজিয়ার কার্ভগুলি ব্যবহার করে বা পথের নিকটতম কয়েকটি পয়েন্টের গড় দিয়ে পথটি অ্যানিমেট করতে পারেন।