زمان‌بندی هوشمندانه برای گراف‌های ROS2 روی یه پردازنده: وقتی همه چیز زیر دستته!

Fall Back

اگه با ربات‌ها و برنامه‌های پیچیده سر و کار داشتی، احتمالاً اسم ROS2 به گوشت خورده؛ همون پلتفرم محبوب برای ساختن نرم‌افزارهای رباتیک. حالا یه مشکلی که خیلی‌ها باهاش مواجه می‌شن، اینه که بخوان زمان‌بندی یا همون «Scheduling» رو دقیق‌تر و پیشرفته‌تر روی برنامه‌هاشون اجرا کنن. اینجا دقیقاً دارم در مورد این مقاله جدید حرف می‌زنم که اومده یه راهکار جالب برای این موضوع پیشنهاد داده.

اول یه توضیح بدم که اصلاً زمان‌بندی (Scheduling) چیه: یعنی چی؟ یعنی اینکه کارها و تسک‌هایی که توی سیستم رباتیکی اجرا می‌شن، بر اساس یه نظم خاص و بر اساس اولویت‌ها بتونن به‌موقع اجرا بشن و هیچ چیزی از قلم نیفته. بخصوص با ROS2 که پر از ارتباطات بین ماژول‌های مختلفه، اوضاع زمانی پیچیده‌تر هم میشه!

تا حالا بیشتر تحقیقات فقط سر زنجیره‌ای بودن کارها تمرکز کرده بودن؛ یعنی یه کار، پشت سر هم و ساده میاد و اجرا میشه. ولی دنیای واقعی این قدر ساده نیست و بیشتر شبیه یه جنگل از درخته تا یه زنجیره! یعنی کلی کار به شکل گراف پیچیده و شبکه‌وار (که بهش Directed Acyclic Graph یا به اختصار DAG میگن: یعنی مجموعه‌ای از گره‌ها و پیکان‌هایی که هیچ چرخه‌ای توشون وجود نداره) با هم ارتباط دارن. حالا بیشتر زمان‌بندی‌های قبلی مخصوص این زنجیره‌های ساده بودن و وقتی پای گراف‌های عجیب غریب وسط بود، سیستم‌ها کم می‌آوردن یا نتیجه دقیق نمی‌دادن.

تو این مقاله، نویسنده‌ها یه راه حل جدید پیشنهاد دادن که از Events Executor استفاده می‌کنه. Events Executor یه جور مدیریت‌کننده‌ی جدید تو ROS2 هست که می‌تونه بین وظایف مختلف، براساس رویدادها زمان‌بندی انجام بده. اونا اومدن با یه مدل مخصوص به اسم “Fixed Job Level Priority Scheduler” (یا به زبان خودمونی: زمان‌بندی‌کننده با اولویت ثابت برای هر کار)، سیستم رو طوری درست کردن که حتی گراف‌های پیچیده هم راحت زمان‌بندی بشن، اون هم فقط روی یه پرازنده (Uniprocessor). این یعنی حتی اگه کلی تسک وابسته و پیچیده داشتی، بازم می‌تونی مطمئن باشی همه چیز درست و به موقع انجام میشه.

نکته جالب‌تر اینه که اونا تونستن نشون بدن برنامه‌های ROS2 رو میشه مثل یه جنگل، یا همون Forest، از درخت‌ها مدل‌سازی کرد؛ یعنی به جای اینکه فقط مثل زنجیره نگاه کنیم، میشه همه روابط و وابستگی‌ها رو به این مدل گرافی تبدیل کرد. این مسئله باعث میشه بشه کلی ایده‌ی پیشرفته‌تر و ابزارهای قدیمی کار با گراف رو هم اینجا پیاده کرد و دیگه تو محدودیت‌های قدیمی نگیریم.

یه بخش جذاب درباره پیام‌رسانی هم هست: برای اینکه این سیستم درست کار کنه، باید یه صف پیام خاص (Event Queue) درست کرد و حتی ارسال پیام‌ها هم باید یه ویژگی خاص داشته باشن به اسم LIFO (Last In, First Out)؛ یعنی آخرین پیام، اول پردازش میشه.
این چیزی نیست که الان تو ROS2 به صورت پیش‌فرض وجود داشته باشه و یه مدل پیام‌رسانی سفارشی می‌خواد که نویسنده‌ها ساختن یا پیشنهاد دادن.

جالب اینجاست که با همین ایده‌ها و این پیاده‌سازی، تونستن نشون بدن نتایج عملکرد این سیستم درست مثل زمان‌بندی‌های پیشرفته و رایج تو دنیاست (مثلاً زمان‌بندی DAG با اولویت ثابت)، با این تفاوت که دیگه نیازی به اطلاعات دقیق پیش‌زمینه‌ای درباره ترتیب اجرای تسک‌ها نداری! معمولاً باید بدونی هر کار از کی شروع میشه و کِی باید تموم شه، اما اینجا بدون نیاز به اون اطلاعات هم سیستم درست کار می‌کنه.

در کل دارن یه قدم دیگه برمی‌دارن تا شکاف بین نظریه‌های قدیمی “Real-Time Systems” (سیستم‌های سخت‌افزاری که باید دقیق و به موقع جواب بدن) و آنالیز ROS2 حسابی کوچیک‌تر شه. یعنی راحت‌تر می‌تونی مطمئن شی رباتت به موقع کارها رو انجام می‌ده، حتی وقتی همه چیز پیچیده و درهم شد!

خلاصه‌ش؟ این مقاله یه پل خیلی خوب زده بین تئوری‌های زمان‌بندی سیستم‌های بلادرنگ و دنیای جدید و کاربردی ROS2. اگه دنبال اجرای پروژه‌های رباتیک پیچیده روی یه سخت‌افزار ساده هستی، ایده‌های توش می‌تونه برات نجات‌بخش باشه!

منبع: +