اگر ربات مسیریابتان مثل مار روی خط میپیچد یا در پیچها از خط بیرون میزند، احتمالاً از کنترل «اگر چپ بود بپیچ راست» استفاده میکنید. تیمهایی که در لیگ مسیریاب و امدادگر خطی روی سکو میروند، تقریباً همگی از PID استفاده میکنند؛ الگوریتمی که اسمش ترسناک است ولی ایدهاش را یک نوجوان ۱۳ ساله در یک جلسه میفهمد.
مسئله: خطا چیست؟
فرض کنید ۵ سنسور خط دارید و میخواهید خط دقیقاً زیر سنسور وسط باشد. «خطا» یعنی فاصلهٔ خط از وسط: اگر خط زیر سنسور سمت چپ است، خطا مثلاً منفی ۲ و اگر زیر سنسور راست است، مثبت ۲. کنترل ساده میگوید: خطا منفی → بپیچ چپ، مثبت → بپیچ راست. مشکل این است که ربات همیشه «زیاد» میپیچد و بعد باید برگردد؛ نتیجه همان تلوتلو خوردن است.
P: به اندازهٔ خطا واکنش نشان بده
بخش تناسبی (Proportional) میگوید: هرچه خطا بزرگتر، فرمان قویتر؛ خطای کوچک، اصلاح کوچک. فرمول: correction = Kp × error. با همین یک خط، تلوتلو بهشدت کم میشود. اما اگر Kp را خیلی زیاد کنید، باز نوسان میکند و اگر کم باشد، در پیچهای تند جا میماند.
D: به سرعت تغییر خطا هم نگاه کن
بخش مشتقی (Derivative) میگوید: اگر خطا دارد سریع کم میشود، یعنی داریم به خط میرسیم، پس فرمان را نرم کن تا از آن طرف رد نشویم. فرمول: Kd × (error − previous_error). D مثل ترمزِ هوشمند است و نوسان را میگیرد. برای بیشتر رباتهای مسیریاب دانشآموزی، PD کافی است.
I: خطاهای کوچکِ ماندگار را جمع کن
بخش انتگرالی (Integral) خطاهای کوچکی را که مدت طولانی میمانند جمع میکند و کمکم اصلاحشان میکند؛ مثلاً وقتی یک موتور کمی ضعیفتر از دیگری است. در ربات خطرو معمولاً مقدار کوچکی دارد یا صفر است، چون اگر زیاد باشد، ربات «حافظهٔ» خطاهای قدیمی را نگه میدارد و دیر واکنش میدهد.
کد نمونه برای آردوینو (سادهشده)
float Kp = 25, Ki = 0, Kd = 120;
float error, lastError = 0, integral = 0;
int baseSpeed = 150;
void loop() {
error = readLinePosition(); // -2 .. +2 (از ۵ سنسور)
integral += error;
float derivative = error - lastError;
float correction = Kp*error + Ki*integral + Kd*derivative;
lastError = error;
int left = constrain(baseSpeed + correction, 0, 255);
int right = constrain(baseSpeed - correction, 0, 255);
setMotors(left, right);
}
تابع readLinePosition() باید از مقادیر کالیبرهشدهٔ سنسورها یک عدد پیوسته (موقعیت وزنی خط) بسازد؛ همین موضوع در مقالهٔ سنسورهای ربات مسابقاتی توضیح داده شده است.
تنظیم ضرایب: روش عملی تیمهای نوین ذهن
- Ki و Kd را صفر بگذارید. Kp را از کم زیاد کنید تا ربات خط را دنبال کند ولی کمی نوسان داشته باشد.
- Kd را اضافه کنید و زیاد کنید تا نوسان از بین برود. اگر ربات «لرزان» شد، Kd زیاد است.
- اگر در خطوط مستقیم کمی یکطرفه حرکت میکند، Ki بسیار کوچک اضافه کنید.
- سرعت پایه را بالا ببرید و دوباره Kp و Kd را ریز تنظیم کنید؛ ضرایب به سرعت وابستهاند.
- ضرایب نهایی را در کد با تاریخ و شرایط (باتری پر، زمین تمرین) یادداشت کنید.
اشتباهات رایج
- استفاده از
delay()طولانی در حلقه؛ PID به حلقهٔ سریع و منظم نیاز دارد. - خروجی سنسور دیجیتال (فقط ۰ و ۱) که خطای پیوسته نمیدهد.
- فراموش کردن محدودکردن انتگرال (Anti-windup) وقتی Ki غیرصفر است.
- کپیکردن ضرایب تیم دیگر؛ ضرایب به وزن، موتور و سنسور همان ربات وابستهاند.
بعد از PID چه؟
وقتی PID را فهمیدید، در سطح بعدی میتوانید از آن برای چرخش دقیق با ژیروسکوپ در لیگ ماز، کنترل ارتفاع پهپاد در لیگ فیرا ایر و حتی کنترل دمای خانهٔ هوشمند استفاده کنید؛ همان الگوریتم، در همهٔ لیگها. این مباحث در دورهٔ رباتیک پیشرفته نوین ذهن بهصورت عملی روی ربات واقعی تمرین میشود. مشاورهٔ رایگان نوین ذهن میتواند سطح مناسب فرزندتان را مشخص کند.
پرسشهای پرتکرار
از چه سنی میتوان PID را فهمید؟
ایدهٔ شهودی P و D از حدود ۱۲ تا ۱۳ سال قابل فهم است؛ پیادهسازی کامل معمولاً در ۱۳ تا ۱۵ سالگی.
آیا PID فقط برای ربات مسیریاب است؟
خیر؛ از کنترل دمای یخچال تا پهپاد و خودروی خودران، همهجا هست. مسیریاب فقط سادهترین جا برای یادگیری آن است.
بدون PID میشود در لیگ مسیریاب برنده شد؟
در ردههای ابتدایی با مسیر ساده، بله؛ اما در امدادگر خطی و مسیرهای پیچیده، PID تقریباً ضروری است.
فرزندتان را برای مسابقات رباتیک آماده کنید
تیمهای مسابقاتی نوین ذهن هر سال روی سکوی فیراکاپ، ربوکاپ و ایراناپن میایستند. جلسهٔ اول رایگان است؛ بیایید و از نزدیک ببینید.
رزرو جلسهٔ آزمایشی رایگان