فرض کن انبار بهقدری بزرگ شده که یک ARCHO کافی نیست و سهتا از آنها همزمان کار میکنند: robot_1، robot_2 و robot_3.
اگر هر سه ARCHO همزمان روی /scan، /odom و /cmd_vel منتشر و
مشترک شوند، کل سیستم دیگر نمیداند کدام پیام متعلق به کدام ربات است. Nav2 هرکدام سعی میکند فرمان
حرکت را برای همه سه ربات همزمان بفرستد — نتیجه فقط هرجومرج است.
راهحل ساده و رایج، پیشوند گذاشتن روی همه Topicهای هر ربات با نام خودش است — دقیقاً همان مفهوم Namespace که در فصل ۲ دیدیم، فقط اینبار در مقیاس یک ناوگان کامل:
/robot_1/scan
/robot_1/odom
/robot_1/cmd_vel
/robot_2/scan
/robot_2/odom
/robot_2/cmd_vel
حالا هر ARCHO فقط به Topicهای خودش گوش میدهد و فقط روی Topicهای خودش منتشر میکند. Nav2، SLAM Toolbox و ros2_control هرکدام داخل همان Namespace اجرا میشوند و اصلاً نمیدانند ARCHOهای دیگری هم وجود دارند.
Namespace بهتنهایی کافی نیست. یادت هست در فصل ۵ دیدیم TF Tree یک ساختار سراسری است — اگر هر سه
ARCHO فریمی بهنام base_link داشته باشند، TF نمیداند کدام base_link متعلق
به کدام ربات است. راهحل: هر ربات فریمهای خودش را با پیشوند خودش نامگذاری میکند.
robot_1/base_link
robot_1/laser_link
robot_1/odom
robot_2/base_link
robot_2/laser_link
robot_2/odom
فریم map معمولاً یکی برای همه رباتهای ناوگان است — چون همه در همان انبار حرکت
میکنند. اما هر ربات، Odometry، درایفت و خطای تجمعی خودش را دارد؛ پس هرکدام باید فریم
odom مستقل خودش را داشته باشد، دقیقاً مثل فصل ۵ و ۹ برای یک ربات تنها.
Namespace و TF Prefix فقط تضمین میکنند رباتها با هم قاطی نمیشوند. اما یک سؤال بزرگتر هنوز باز است: وقتی یک مأموریت جدید میآید (مثلاً «قفسه ۴۰ را خالی کن»)، کدام ARCHO باید آن را انجام دهد؟
Multi-Robot فقط اجرای چند نسخه موازی از Nav2 نیست؛ نیازمند یک لایه مدیریت ناوگان (Fleet Manager) برای تخصیص مأموریت و حل تعارض میان رباتهاست.
| حالت | سناریو | مثال |
|---|---|---|
| نقشه مشترک | یک ساختمان، چند ربات، همه روی یک map حرکت میکنند | چند ARCHO در یک طبقه از انبار |
| نقشه مستقل | رباتها در طبقات یا محیطهای کاملاً جدا کار میکنند | یک ARCHO در طبقه همکف، یکی در طبقه بالا |
حتی اگر هر ARCHO بهتنهایی از موانع ثابت دوری کند، ممکن است دو ربات دقیقاً در یک راهروی باریک روبهروی هم قرار بگیرند — چیزی که Local Costmap یک ربات بهتنهایی نمیتواند پیشبینی کند، چون هر ربات فقط محیط اطراف خودش را میبیند.
Robot A → ← Robot B
راهحلهای رایج در سطح Fleet (نه در سطح یک ربات تنها):
| راهحل | ایده |
|---|---|
| رزرو راهرو | قبل از ورود به یک راهروی باریک، ربات آن را برای خودش رزرو میکند |
| اولویت عبور | یک ربات (مثلاً با مأموریت مهمتر یا باتری کمتر) اولویت عبور دارد |
| Traffic Graph | نقشه انبار به یک گراف ترافیکی با جهت مجاز حرکت تبدیل میشود |
| Zone Lock | یک ناحیه کامل برای مدت کوتاهی قفل میشود تا فقط یک ربات در آن باشد |
| زمانبندی مأموریت | مأموریتهای نزدیک بههم زمانبندی میشوند تا همزمان به یک نقطه نرسند |
| نقطه انتظار | یک ربات در یک نقطه امن صبر میکند تا مسیر باز شود |
ناوگان ARCHO حالا میتواند بدون تداخل در ارتباطات کار کند (بهلطف Namespace و TF Prefix)، و مأموریتها بهصورت هوشمند بین رباتها تقسیم میشود (بهلطف Fleet Manager) — بدون اینکه دو ARCHO در یک راهروی باریک با هم برخورد کنند.
پروژه ARCHO اکنون بهعنوان یک ناوگان سهرباتی با Namespace و TF Prefix مستقل، و یک Fleet Manager ساده برای تخصیص مأموریت و رزرو راهرو، در انبار کار میکند.
در فصل پانزدهم یاد میگیریم چطور کل این سیستم را با Docker بستهبندی و با CI/CD بهصورت خودکار تست و تحویل کنیم — مسیری که یک پروژه ROS 2 را از «روی لپتاپ من کار میکند» به یک محصول قابل استقرار تبدیل میکند.