مسیر یادگیری ROS 2  ·  پیوست عملی

پیوست ب: توزیع‌های ROS 2 و انتخاب مسیر درست برای ARCHO

از Humble تا Rolling Ridley — یک تصمیم مهندسی که هر تیم رباتیک دیر یا زود با آن روبه‌رو می‌شود
مخاطب: کسی که یک ربات واقعی را در طول سال‌ها نگه‌داری می‌کند
پیش‌نیاز: فصل ۱ (معماری ROS 2) و فصل ۲ (محیط توسعه)
پروژه پیوسته: ربات ARCHO
زمان مطالعه: ۹۰ تا ۱۲۰ دقیقه

این پیوست یک داستان واقعی مهندسی است، نه فقط یک جدول از اسم‌های عجیب. تیمی را تصور کن که ARCHO را روی ROS 2 Humble ساخته، دو سال با آن کار کرده، حالا هم مدیر پروژه می‌پرسد «چرا آپدیت نمی‌کنیم؟» و هم یک عضو تیم مقاله‌ای می‌خواند که در آن از ROS 2 Lyrical Luth صحبت شده. این پیوست دقیقاً همان مسیر فکری‌ای را طی می‌کند که چنین تیمی باید طی کند: توزیع ROS 2 یعنی چه، چرا اصلاً وجود دارد، کدام‌ها زنده‌اند و کدام‌ها مرده، LTS چه فرقی با غیر LTS دارد، Rolling Ridley چیست، و در نهایت — با چه معیاری باید تصمیم گرفت.

⚠️ یک هشدار صادقانه قبل از شروع

نام‌گذاری توزیع‌های ROS 2 به ترتیب حروف الفبا پیش می‌رود (هر سال یک حرف جدید). در زمان نگارش این پیوست، توزیع‌های تثبیت‌شده و مستند در docs.ros.org عبارت‌اند از Humble، Iron، Jazzy، Kilted Kaiju و شاخهٔ همیشه‌درحال‌توسعهٔ Rolling Ridley. نام Lyrical Luth در این پیوست به‌عنوان «توزیع بعدی در این توالی حروف الفبا» به‌کار رفته تا روش فکر کردن را یاد بدهد — نه به این معنا که تاریخ انتشار، شماره نسخه یا جزئیات فنی دقیق آن را تضمین می‌کنیم. قبل از تصمیم واقعی روی ARCHO، همیشه صفحهٔ رسمی docs.ros.org/en/rolling/Releases.html را چک کن — این یک‌بار خواندن پنج دقیقه‌ای، از ساعت‌ها دیباگ یک نصب اشتباه جلوگیری می‌کند.

در این پیوست چه می‌خوانیم ب.۱توزیع ROS 2 دقیقاً یعنی چه؟ ب.۲خط زمانی توزیع‌های ROS 2 ب.۳LTS در برابر غیر LTS ب.۴Rolling Ridley — آزمایشگاه همیشه‌باز ب.۵Humble در برابر Jazzy، Kilted و Lyrical ب.۶معرفی ROS 2 Lyrical Luth ب.۷سازگاری با اوبونتو ب.۸نصب و راه‌اندازی محیط ب.۹تأیید نصب: Talker و Listener ب.۱۰فرمان‌های ضروری خط فرمان ROS 2 ب.۱۱Workspace، colcon و rosdep ب.۱۲DDS، QoS و دیباگ گراف ROS ب.۱۳rosbag2، TF2، RViz2، Gazebo، Nav2، ros2_control، MoveIt 2 ب.۱۴راهنمای مهاجرت به Lyrical ب.۱۵Jetson، Raspberry Pi و Docker ب.۱۶چارچوب تصمیم: کدام توزیع را انتخاب کنیم؟ ب.۱۷اشتباهات رایج مبتدیان ب.۱۸جدول تقلب فرمان‌ها ب.۱۹جمع‌بندی، چک‌لیست و واژه‌نامه

ب.۱توزیع ROS 2 دقیقاً یعنی چه؟

جلسهٔ تیم ARCHO این‌طور شروع شد: «ما الان روی Humble هستیم. Humble یعنی چه؟ آیا ROS 2 یک برنامه است که نسخه دارد، مثل مرورگر کروم؟» جواب دقیق نه. توزیع (Distro) در ROS 2 یعنی یک مجموعهٔ نسخه‌بندی‌شده و آزمایش‌شده از صدها پکیج که تضمین می‌کند همه با هم سازگارند — rclcpp، rclpy، rmw، rviz2، nav2، ros2_control و هزاران پکیج دیگر، همه در یک نسخهٔ مشخص «قفل» می‌شوند و زیر یک نام مثل humble یا jazzy منتشر می‌شوند.

flowchart TD A["ROS 2"] --> B["Humble"] A --> C["Iron"] A --> D["Jazzy"] A --> E["Kilted Kaiju"] A --> F["Lyrical Luth"] A --> G["Rolling Ridley"] style A fill:#2f7de8,stroke:#ffffff,color:#0b1220,font-weight:bold style G fill:#8b5cf6,stroke:#ffffff,color:#ffffff,font-weight:bold
💡 قیاس درست (و قیاس غلط)

قیاس مفید: توزیع‌های ROS 2 شبیه نسخه‌های اوبونتو هستند (۲۰.۰۴، ۲۲.۰۴، ۲۴.۰۴) — هرکدام یک لحظهٔ منجمد از هزاران پکیج سازگار با هم. قیاس غلط: ROS 2 خودش یک سیستم‌عامل نیست. ROS 2 روی یک سیستم‌عامل (معمولاً اوبونتو) نصب می‌شود؛ توزیع ROS همان نقشی را بازی می‌کند که «نسخهٔ اوبونتو» برای کرنل لینوکس بازی می‌کند — یک لایهٔ سازگاری، نه خودِ سیستم‌عامل.

چرا اصلاً این‌همه توزیع لازم است؟ چون بدون آن، این اتفاق‌ها می‌افتاد:

🛠️ نکتهٔ مهندسی

وقتی می‌گویی «ARCHO روی Humble است»، در واقع می‌گویی «تمام پکیج‌های ARCHO با همان نسخهٔ منجمدشده از rclcpp، nav2، ros2_control و بقیه، کامپایل و تست شده‌اند.» این جمله، مسئولیت تیم است — نه چیزی که خودکار تضمین شود.

ب.۲خط زمانی توزیع‌های ROS 2

قبل از اینکه دربارهٔ آینده تصمیم بگیریم، باید تاریخچه را ببینیم. جدول زیر ستون آخرش «توصیه‌شده برای امروز؟» است — و این ستون است که واقعاً روی تصمیم اثر می‌گذارد، نه اینکه توزیع «جدید» است یا نه.

توزیعسال انتشار (تقریبی)LTS؟وضعیتتوصیه برای پروژهٔ جدید
Ardent Apalone۲۰۱۷خیرپایان پشتیبانی (EOL)خیر — فقط تاریخی
Bouncy Bolson۲۰۱۸خیرEOLخیر
Crystal Clemmys۲۰۱۸خیرEOLخیر
Dashing Diademata۲۰۱۹بلهEOLخیر
Eloquent Elusor۲۰۱۹خیرEOLخیر
Foxy Fitzroy۲۰۲۰بلهEOLفقط سیستم قدیمی و مستندشده
Galactic Geochelone۲۰۲۱خیرEOLخیر
Humble Hawksbill۲۰۲۲بلهدر حال پشتیبانی (رو به پایان)فقط برای نگه‌داری سامانهٔ موجود روی اوبونتو ۲۲.۰۴
Iron Irwini۲۰۲۳خیرEOLخیر
Jazzy Jalisco۲۰۲۴بلهدر حال پشتیبانیگزینهٔ محکم برای تولید روی اوبونتو ۲۴.۰۴
Kilted Kaiju۲۰۲۵خیردر حال پشتیبانیبرای دسترسی زودهنگام به قابلیت‌های جدید
Lyrical Luthنامشخص — قبل از استفاده تأیید شودباید در docs.ros.org تأیید شودباید تأیید شودباید تأیید شود
Rolling Ridleyمداومندارد (مفهوم LTS برایش معنی ندارد)همیشه فعالفقط توسعه/تست، نه تولید
⚠️ توزیع‌های EOL را برای پروژهٔ جدید انتخاب نکن

EOL یعنی End of Life — دیگر هیچ وصلهٔ امنیتی یا رفع باگی منتشر نمی‌شود. تنها استثنا: وقتی یک وابستگی قدیمی و غیرقابل‌جایگزین (مثلاً درایور سخت‌افزاری خاص) تو را مجبور به ماندن روی نسخهٔ قدیمی می‌کند — که آن‌وقت باید آگاهانه و مستند این ریسک را بپذیری، نه از سر بی‌اطلاعی.

ب.۳LTS در برابر غیر LTS

وقتی مدیر پروژهٔ ARCHO پرسید «چرا Jazzy را انتخاب کردید نه Iron؟»، جواب تیم یک کلمه بود: LTS — یعنی Long Term Support، پشتیبانی بلندمدت.

Humble → LTS  (پشتیبانی بلندمدت)
Jazzy  → LTS  (پشتیبانی بلندمدت)
Lyrical → LTS بودنش را در docs.ros.org تأیید کن

در برابر:

Iron   → غیر LTS (چرخهٔ کوتاه)
Kilted → غیر LTS (چرخهٔ کوتاه)

چرا این تفاوت برای یک شرکت رباتیک اهمیت حیاتی دارد؟

🤖 چرا یک ربات تولیدی ممکن است عمداً روی نسخهٔ قدیمی‌تر بماند

فرض کن ARCHO الان در ۴۰ انبار مشتری نصب شده و روی Humble کار می‌کند. حتی اگر Jazzy یا Lyrical منتشر شود، آپدیت فوری یعنی: تست دوبارهٔ کل استک ناوبری، بررسی سازگاری تمام درایورهای سنسور، و ریسک خرابی در سیستمی که همین الان کار می‌کند. تصمیم درست معمولاً این است: نسخهٔ فعلی روی رباتِ درحال‌کار می‌ماند تا پایان چرخهٔ پشتیبانی‌اش، و توزیع جدید فقط روی نسل بعدی محصول یا در یک شاخهٔ آزمایشی تست می‌شود.

ب.۴Rolling Ridley — آزمایشگاه همیشه‌باز

یکی از اعضای تیم ARCHO یک روز پرسید: «چرا مستقیم روی Rolling کار نکنیم؟ همیشه جدیدترین چیزهاست!» این دقیقاً همان اشتباهی است که این بخش می‌خواهد جلویش را بگیرد.

Rolling Ridley یک توزیع عادی نیست؛ یک شاخهٔ همیشه‌درحال‌توسعه است. برخلاف Humble یا Jazzy که در یک لحظه منجمد می‌شوند، Rolling هر روز می‌تواند تغییر کند — دقیقاً همان جایی است که توسعه‌دهندگان اصلی ROS 2 و نگه‌دارندگان پکیج‌ها، قابلیت‌های نسل بعدی را آزمایش می‌کنند، قبل از اینکه در یک توزیع پایدار (مثل Lyrical) منجمد و رسمی شوند.

flowchart LR subgraph Stable["توزیع پایدار"] direction TB S1["چرخهٔ انتشار ثابت"] --> S2["API قابل پیش‌بینی"] end subgraph Roll["Rolling Ridley"] direction TB R1["توسعهٔ مداوم"] --> R2["قابلیت جدید + احتمال شکست تغییرات"] end style S2 fill:#0e9e6e,stroke:#ffffff,color:#0b1220,font-weight:bold style R2 fill:#8b5cf6,stroke:#ffffff,color:#ffffff,font-weight:bold
سناریوRolling مناسب است؟
نگه‌داری کدِ خودِ ROS 2 یا یک پکیج پرکاربرد (Nav2, ros2_control, ...)بله — دقیقاً برای همین ساخته شده
تست زودهنگام یک قابلیت که قرار است در توزیع بعدی بیایدبله، در یک شاخهٔ جدا از تولید
یادگیری ROS 2 برای اولین‌بارخیر — مستندات و آموزش‌ها معمولاً حول توزیع پایدار نوشته می‌شوند
رباتی که قرار است در محیط مشتری مستقر شودخیر — API می‌تواند بدون اطلاع قبلی بشکند
پروژهٔ دانشگاهی که باید بعد از یک سال هم قابل اجرا باشدخیر — Reproducibility تضمین نمی‌شود
⚠️ Rolling اولین انتخاب یک ربات تولیدی نیست

اگر ARCHO روی Rolling ساخته شود، ممکن است سه ماه بعد، همان دستور colcon build با خطایی متوقف شود که هیچ‌کس در تیم انتظارش را نداشت — چون یک پکیج بالادستی خودش را بازطراحی کرده. برای یادگیری این پیوست هم، همیشه از یک توزیع پایدار استفاده کن، نه Rolling.

ب.۵Humble در برابر Jazzy، Kilted و Lyrical

اینجا جایی است که تیم ARCHO باید از حرف کلی («جدیدتر بهتر است») به سؤال‌های مشخص برسد. جدول زیر چارچوب سؤالاتی است که باید برای هر ارتقا از خودت بپرسی — نه یک ادعای قطعی دربارهٔ Lyrical، چون جزئیات دقیقش را باید از مستندات رسمی همان لحظه گرفت.

حوزهسؤالی که باید از مستندات رسمی بپرسی
rclcpp / rclpyآیا امضای APIای که استفاده می‌کنم منسوخ (Deprecated) یا حذف شده؟
DDS / RMWپیاده‌سازی پیش‌فرض DDS همان است که روی آن تست کرده‌ام؟
QoS و Executorsآیا رفتار پیش‌فرض QoS یا زمان‌بندی Executor تغییر کرده؟
launchآیا فایل‌های Launch پایتونی من هنوز بدون تغییر اجرا می‌شوند؟
Nav2 / ros2_control / MoveIt 2آیا نسخهٔ این پکیج در توزیع جدید، پارامترها یا رابط‌هایش را عوض کرده؟
Gazeboکدام نسل Gazebo با این توزیع جفت (Pair) شده؟
Python / C++ Standardنسخهٔ پایتون و استاندارد ++C پایهٔ توزیع چیست؟
Ubuntuاین توزیع روی کدام نسخهٔ اوبونتو Tier 1 است؟
🛠️ نکتهٔ مهندسی

هیچ‌وقت جمله‌ای مثل «Lyrical سریع‌تر است» یا «Lyrical بهتر است» را بدون منبع رسمی نپذیر. تفاوت واقعی بین دو توزیع را فقط از یادداشت‌های انتشار رسمی (Release Notes) و صفحهٔ تغییرات هر پکیج می‌توان استخراج کرد — نه از حدس یا از اینکه شماره‌اش بزرگ‌تر است.

ب.۶معرفی ROS 2 Lyrical Luth

فرض کن تیم ARCHO تصمیم گرفته یک نسخهٔ آزمایشی از ربات را روی Lyrical Luth بسازد تا برای آیندهٔ محصول آماده باشد. قبل از هر کاری، این‌ها را باید از docs.ros.org استخراج کند — نه حدس بزند:

✅ قبل از اتکا به Lyrical این‌ها را از منبع رسمی تأیید کن
  • تاریخ دقیق انتشار و شمارهٔ نسخه
  • آیا LTS است یا غیر LTS، و طول دقیق دورهٔ پشتیبانی
  • پلتفرم‌ها و معماری‌های سخت‌افزاری پشتیبانی‌شده (x86_64 / arm64)
  • نسخهٔ دقیق اوبونتو که برایش Tier 1 است
  • رابطه‌اش با Rolling در لحظهٔ انجماد (Fork Point)
  • تغییرات شکننده (Breaking Changes) نسبت به Jazzy و Kilted
  • پکیج‌ها یا APIهای منسوخ‌شده یا حذف‌شده
📖 قانونی که همیشه رعایتش کن

یک قابلیت را فقط زمانی «ویژگی Lyrical» بنام که در یادداشت انتشار Lyrical صراحتاً به‌عنوان تغییر جدید ذکر شده باشد. اگر یک قابلیت از Jazzy یا Kilted به ارث رسیده، گفتن «این قابلیت Lyrical است» گمراه‌کننده است و دقیقاً همان نوع خطایی است که این پیوست می‌خواهد از آن دوری کند.

رابطهٔ Lyrical با Rolling هم مثل هر توزیع پایدار دیگر است: در یک لحظهٔ مشخص، Rolling «منجمد» می‌شود، آن عکس لحظه‌ای همان توزیع پایدار جدید می‌شود، و از آن به بعد Rolling دوباره به جلو حرکت می‌کند تا زمانی که نوبت به انجماد توزیع بعدی برسد.

ب.۷سازگاری با اوبونتو

الگوی کلی جفت‌شدن ROS 2 با اوبونتو، LTS به LTS است — اما همیشه باید تأیید شود، نه فرض:

اوبونتو
│
├── ۲۰.۰۴ → ROS 2 Foxy   (EOL)
├── ۲۲.۰۴ → ROS 2 Humble (LTS)
├── ۲۴.۰۴ → ROS 2 Jazzy  (LTS)
└── نسخهٔ بعدی اوبونتو → Lyrical (در docs.ros.org تأیید شود)
⚠️ به این نمودار اعتماد کورکورانه نکن

این فقط یک الگوی تاریخی است، نه سند رسمی. همیشه سطح پشتیبانی دقیق را بررسی کن:

  • Tier 1 — نصب باینری رسمی، تست‌شده در CI رسمی، مستندسازی کامل
  • Tier 2 — پشتیبانی محدودتر، ممکن است نیاز به Build از سورس داشته باشد
  • Tier 3 — از نظر فنی ممکن، اما بدون تضمین یا تست رسمی

چرا این تمایز اهمیت دارد؟ چون نسخهٔ اوبونتو، زنجیره‌ای از وابستگی‌ها را با خودش می‌آورد که مستقیم روی ROS 2 اثر می‌گذارد:

ب.۸نصب و راه‌اندازی محیط

مراحل زیر همان الگوی استاندارد نصب باینری ROS 2 است — قبل از اجرا، نام توزیع (lyrical) و اوبونتوی هدف را طبق مستندات رسمی جایگزین کن.

بررسی سیستم

lsb_release -a
uname -a

نصب دسکتاپ در برابر ros-base

sudo apt install ros-lyrical-desktop
# در برابر
sudo apt install ros-lyrical-ros-base
بستهشامل چه چیزی استمناسب چه محیطی
ros-lyrical-desktopابزارهای گرافیکی (RViz2، rqt) + کتابخانه‌های اصلیایستگاه کاری توسعه‌دهنده
ros-lyrical-ros-baseفقط کتابخانه‌های اصلی، بدون ابزار گرافیکیکامپیوتر روی خود ربات (headless)

Source کردن محیط

source /opt/ros/lyrical/setup.bash
echo "source /opt/ros/lyrical/setup.bash" >> ~/.bashrc
source ~/.bashrc
💡 چرا Source کردن لازم است

نصب باینری ROS 2 در /opt/ros/lyrical کنار گذاشته می‌شود، ولی سیستم به‌طور پیش‌فرض نمی‌داند این پکیج‌ها کجا هستند. اسکریپت setup.bash متغیرهای محیطی لازم برای پیدا کردن پکیج‌ها (Package Discovery) را تنظیم می‌کند. اگر Workspace خودت (Overlay) را هم بعداً بسازی، آن را بعد از این Underlay سیستمی Source می‌کنی.

printenv | grep ROS
# ROS_DISTRO
# ROS_VERSION
# ROS_DOMAIN_ID
# RMW_IMPLEMENTATION

ب.۹تأیید نصب: Talker و Listener

ترمینال اول:

ros2 run demo_nodes_cpp talker

ترمینال دوم:

ros2 run demo_nodes_py listener
flowchart LR A["Talker Node"] -- "/chatter" --> B["Listener Node"] style A fill:#2f7de8,stroke:#ffffff,color:#0b1220,font-weight:bold style B fill:#0e9e6e,stroke:#ffffff,color:#0b1220,font-weight:bold

اگر پیام‌ها در ترمینال دوم دیده شوند، یعنی زنجیرهٔ کامل کار می‌کند: نصب درست بوده، محیط Source شده، Discovery شبکه فعال است، و پیام‌رسانی Publisher/Subscriber بین دو فرایند مستقل برقرار است.

ب.۱۰فرمان‌های ضروری خط فرمان ROS 2

هر فرمان زیر را با همین قالب یاد بگیر: هدف، کاربرد عملی، و زمانی که یک مهندس واقعاً به آن نیاز پیدا می‌کند.

فرمانهدفوقتی به کارت می‌آید
ros2 doctorبررسی سلامت محیط و شبکهٔ ROSوقتی چیزی «بدون دلیل» کار نمی‌کند
ros2 node listلیست نودهای فعالبررسی اینکه نود مورد نظر واقعاً بالا آمده
ros2 node info <node>جزئیات یک نوددیدن Topic/Service/Action هر نود
ros2 topic listلیست تاپیک‌های قابل‌کشفدیباگ ارتباط بین نودها
ros2 topic echo <topic>نمایش زندهٔ پیام‌های یک تاپیکبررسی اینکه دیتای واقعی منتشر می‌شود
ros2 topic hz <topic>فرکانس انتشار پیامبررسی اینکه سنسور یا کنترلر با نرخ درست کار می‌کند
ros2 service callفراخوانی مستقیم یک سرویستست دستی بدون نوشتن کد کلاینت
ros2 action send_goalارسال هدف به یک Action Serverتست رفتار طولانی‌مدت مثل ناوبری یا داک شدن
ros2 param get/setخواندن/تنظیم پارامتر در زمان اجراتنظیم زندهٔ رفتار نود بدون Restart
ros2 pkg createساخت پکیج جدیدشروع یک ماژول جدید در Workspace

ب.۱۱Workspace، colcon و rosdep

ros2_ws/
├── src/       ← کد منبع پکیج‌ها
├── build/     ← فایل‌های میانی ساخت
├── install/   ← خروجی نصب‌شدهٔ قابل Source کردن
└── log/       ← لاگ ساخت
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws
colcon build
source install/setup.bash
فرمانکاربرد
colcon build --symlink-installلینک نمادین به‌جای کپی — برای توسعهٔ پایتون و Launch بسیار سریع‌تر است، چون نیازی به Build دوباره برای هر تغییر کوچک نیست
colcon build --packages-select <pkg>ساخت فقط یک پکیج مشخص
colcon testاجرای تست‌های پکیج‌ها

rosdep مسئلهٔ متفاوتی از colcon حل می‌کند: colcon کد را می‌سازد، اما rosdep وابستگی‌های سیستمی (کتابخانه‌های apt) لازم برای آن کد را نصب می‌کند.

sudo rosdep init
rosdep update
rosdep install --from-paths src --ignore-src -r -y
ابزارحل می‌کند
aptنصب بستهٔ سیستمی (سطح لینوکس)
pipنصب کتابخانهٔ پایتون
rosdepترجمهٔ «وابستگی ROS» به دستور apt/pip مناسب همان توزیع اوبونتو
colconساخت و نصب پکیج‌های داخل Workspace

ب.۱۲DDS، QoS و دیباگ گراف ROS

flowchart TD A["کد کاربر (ROS 2 API)"] --> B["rclcpp / rclpy"] B --> C["rcl"] C --> D["RMW"] D --> E["پیاده‌سازی DDS"] E --> F["شبکه"] style A fill:#2f7de8,stroke:#ffffff,color:#0b1220,font-weight:bold style F fill:#8b5cf6,stroke:#ffffff,color:#ffffff,font-weight:bold

برای دیدن پیاده‌سازی فعلی: echo $RMW_IMPLEMENTATION. هیچ‌وقت پیاده‌سازی DDS را بدون دلیل مهندسی مشخص (مثلاً نیاز به کارایی چندپخشی بهتر یا سازگاری با ابزار خاص) عوض نکن.

QoS (کیفیت سرویس) به این دلیل به ROS 2 اضافه شد که یک تنظیم واحد برای همهٔ تاپیک‌ها درست نیست — جریان دوربین با LiDAR فرق دارد، فرمان موتور با نقشه فرق دارد، و وضعیت اضطراری باید همیشه برسد حتی اگر مصرف‌کننده دیر وصل شده باشد.

روش سیستماتیک دیباگ: «موتورها حرکت نمی‌کنند»

۱. نود ناوبری زنده است؟          → ros2 node list
۲. تاپیک /cmd_vel وجود دارد؟      → ros2 topic list
۳. آیا /cmd_vel واقعاً پیام می‌دهد؟ → ros2 topic echo /cmd_vel
۴. فرکانس آن چقدر است؟            → ros2 topic hz /cmd_vel
۵. کنترلر مشترک آن است؟          → ros2 topic info /cmd_vel
۶. نوع پیام‌ها سازگار است؟
۷. پروفایل QoS طرفین سازگار است؟

ب.۱۳rosbag2، TF2، RViz2، Gazebo، Nav2، ros2_control، MoveIt 2

این بخش‌ها همان مفاهیمی هستند که در فصل‌های اصلی کتاب عمیق دیدی؛ اینجا فقط نقش‌شان را در بستر «کدام توزیع» مرور می‌کنیم.

ros2 bag record /scan /odom /cmd_vel
ros2 bag play <bag_file>
ros2 bag info <bag_file>

ضبط داده هیچ‌وقت لوکس نیست — وقتی رباتی در محل مشتری رفتار عجیبی نشان می‌دهد، تنها راه بازسازی دقیق لحظه، یک Bag واقعی است.

flowchart LR A["map"] --> B["odom"] --> C["base_link"] --> D["laser_link"] style A fill:#2f7de8,stroke:#ffffff,color:#0b1220,font-weight:bold
⚠️ جعبهٔ هشدار میراث

بسیاری از آموزش‌های آنلاین برای ROS 1، Foxy، Humble یا Gazebo Classic نوشته شده‌اند. قبل از کپی هر دستور دربارهٔ Gazebo یا gazebo_ros_pkgs، بررسی کن که آیا هنوز مسیر رسمی معرفی‌شدهٔ توزیع جدید همین است یا نه — نسل‌های جدید Gazebo و روش یکپارچه‌سازی‌شان با ROS 2 عوض شده‌اند.

برای Nav2، ros2_control و MoveIt 2، سؤال کلیدی همان است که در بخش ب.۵ گفتیم: هر تغییری را فقط وقتی «مخصوص Lyrical» بدان که در یادداشت انتشار همان پکیج، صراحتاً ذکر شده باشد.

ب.۱۴راهنمای مهاجرت به Lyrical

وقتی تیم ARCHO تصمیم گرفت واقعاً مهاجرت کند، این چهار دسته را از هم جدا نگه داشت — قاطی‌کردن‌شان باعث تصمیم‌های عجولانه می‌شود:

دستهمعنی
تغییر شکننده (Breaking Change)کد قدیمی بدون تغییر دیگر کار نمی‌کند
منسوخ‌شدگی (Deprecation)هنوز کار می‌کند اما هشدار می‌دهد؛ باید قبل از حذف واقعی جایگزین شود
تغییر رفتاری (Behavioral Change)API همان است اما نتیجه یا پیش‌فرض عوض شده
قابلیت جدید (New Capability)چیزی که قبلاً اصلاً وجود نداشت
✅ چک‌لیست مهاجرت ARCHO از Humble/Jazzy/Kilted به Lyrical
  • یادداشت انتشار Lyrical را کامل خوانده‌ام
  • لیست APIهای منسوخ یا حذف‌شده را با grep در کد ARCHO جست‌وجو کرده‌ام
  • فایل‌های Launch را روی محیط جدید تست کرده‌ام
  • پروفایل‌های QoS حیاتی (فرمان موتور، توقف اضطراری) را دوباره بررسی کرده‌ام
  • سازگاری Gazebo/Nav2/ros2_control را چک کرده‌ام
  • وابستگی‌های package.xml را به‌روزرسانی کرده‌ام
  • روی یک ربات آزمایشی تست کرده‌ام، نه مستقیم روی ناوگان تولیدی

ب.۱۵Jetson، Raspberry Pi و Docker

برای بردهای NVIDIA Jetson، سازگاری فقط به ROS 2 محدود نیست؛ باید JetPack، نسخهٔ پایهٔ اوبونتوی همان JetPack، CUDA، TensorRT و درایورهای NVIDIA هم هم‌راستا باشند. سه مسیر معمول:

نصب بومی (Native)     → فقط اگر نسخهٔ اوبونتوی JetPack دقیقاً Tier 1 توزیع هدف باشد
کانتینر (Docker)      → رایج‌ترین راه‌حل برای جدا نگه‌داشتن نسخهٔ ROS از پایهٔ سیستم Jetson
ساخت از سورس          → آخرین راه‌حل، وقتی هیچ باینری سازگار موجود نیست

برای Raspberry Pi، ترجیح با معماری ۶۴ بیتی (arm64) و اوبونتو سرور یا دسکتاپ رسمی است — نه توزیع‌های غیررسمی Raspberry Pi OS — چون پشتیبانی باینری رسمی ROS 2 حول همین معماری‌ها ساخته می‌شود.

💡 چرا تیم‌ها ROS را کانتینر می‌کنند

Docker باعث می‌شود دقیقاً همان نسخهٔ توزیع، همان وابستگی‌ها و همان تنظیمات، روی لپ‌تاپ توسعه‌دهنده و روی کامپیوتر ربات یکسان باشد. هزینه‌اش پیچیدگی اضافه در Discovery شبکهٔ DDS و دسترسی به سخت‌افزار (دوربین، GPU، پورت‌های سریال) است که باید صریحاً به کانتینر پاس داده شود.

ب.۱۶چارچوب تصمیم: کدام توزیع را انتخاب کنیم؟

flowchart TD A["پروژهٔ جدید"] --> B{"نیاز به پشتیبانی تولیدی بلندمدت؟"} B -- بله --> C["جدیدترین LTS سازگار با سخت‌افزار"] B -- خیر --> D{"نیاز به جدیدترین قابلیت‌ها؟"} D -- بله --> E["پایدارترین غیر LTS، یا Rolling فقط برای آزمایش"] D -- خیر --> C style C fill:#0e9e6e,stroke:#ffffff,color:#0b1220,font-weight:bold style E fill:#8b5cf6,stroke:#ffffff,color:#ffffff,font-weight:bold
سناریوراهبرد پیشنهادیدلیل
یادگیری ROS 2 از صفرجدیدترین LTS پشتیبانی‌شدهمستندات و آموزش‌ها بیشتر حول همین نوشته می‌شوند
ربات تولیدی جدیدLTS سازگار با کل استک سخت‌افزاریپایداری بلندمدت
ربات با اوبونتوی قدیمی موجودهمان توزیع فعلی تا پایان چرخهسازگاری با کل زنجیرهٔ نصب‌شده
پژوهش روی جدیدترین APIآخرین پایدار یا Rolling برای آزمایشدسترسی زودهنگام به قابلیت‌ها
نگه‌دارندهٔ یک پکیج عمومیRolling + چند توزیع پایدار همزمانسازگاری روبه‌جلو با آینده
ربات مبتنی بر Jetsonتوزیعی که با نسخهٔ اوبونتوی JetPack موجود Tier 1 استوابستگی CUDA/TensorRT/درایور
ربات مبتنی بر Raspberry PiLTS با تصویر رسمی arm64پشتیبانی باینری رسمی
ربات میراثی (Legacy) با درایور خاصماندن روی توزیع فعلی + مستندسازی ریسکوابستگی غیرقابل جایگزین
🛠️ اصل طلایی این پیوست

«جدیدترین ROS» به‌طور خودکار مساوی «بهترین ROS» نیست. توزیع درست، جدیدترین توزیعی است که با کل زنجیرهٔ سیستم — اوبونتو، کرنل، JetPack، CUDA، درایورهای دوربین و LiDAR، Gazebo، Nav2، ros2_control و چرخهٔ نگه‌داری تیم — سازگار باشد؛ نه صرفاً توزیعی که تازه‌ترین تاریخ انتشار را دارد.

ب.۱۷اشتباهات رایج مبتدیان

نشانهعلتراه‌حل
فرمان ros2 پیدا نمی‌شودمحیط Source نشدهsource /opt/ros/<distro>/setup.bash
پکیج ساخته‌شده در Workspace پیدا نمی‌شودOverlay بعد از build سورس نشدهsource install/setup.bash
خطای ناسازگاری عجیب پکیج‌هامخلوط‌کردن پکیج دو توزیع مختلفهرگز پکیج توزیع دیگر را روی توزیع فعلی نصب نکن
گره‌ها همدیگر را نمی‌بینندROS_DOMAIN_ID متفاوت یا مشکل شبکهیکسان‌سازی Domain ID و بررسی ros2 doctor
رفتار متناقض بین دو ماشینیکی روی Rolling، دیگری روی نسخهٔ پایدارهر دو را روی همان توزیع پایدار نگه دار
Topic دیده می‌شود ولی داده رد و بدل نمی‌شودناسازگاری پروفایل QoSros2 topic info -v برای دیدن QoS دو طرف
کد از یک آموزش قدیمی کار نمی‌کندآموزش برای ROS 1 یا توزیع خیلی قدیمی نوشته شدههمیشه تاریخ و توزیع منبع آموزشی را چک کن

ب.۱۸جدول تقلب فرمان‌ها

# محیط
source /opt/ros/lyrical/setup.bash
printenv | grep ROS

# نودها و تاپیک‌ها
ros2 node list
ros2 topic echo /cmd_vel
ros2 topic hz /scan

# سرویس و اکشن
ros2 service call /battery_status
ros2 action send_goal /dock_robot

# پارامتر
ros2 param list
ros2 param set <node> <param> <value>

# ساخت و وابستگی
colcon build --symlink-install
rosdep install --from-paths src --ignore-src -r -y

# دیباگ و ضبط
ros2 doctor
ros2 bag record /scan /odom /cmd_vel

ب.۱۹جمع‌بندی، چک‌لیست و واژه‌نامه

داستان تیم ARCHO این‌طور تمام شد: آن‌ها روی Humble ماندند برای ناوگان تولیدی موجود، یک شاخهٔ آزمایشی روی Jazzy برای محصول بعدی ساختند، و یک محیط جداگانه و صریحاً «آزمایشی» روی Lyrical راه انداختند تا وقتی واقعاً زمان مهاجرت رسید، غافلگیر نشوند. هیچ تصمیمی بر اساس اسم گرفته نشد — همه بر اساس سازگاری واقعی با سخت‌افزار، Nav2، ros2_control، Gazebo و چرخهٔ نگه‌داری تیم.

✅ چک‌لیست نهایی پیش از انتخاب یا ارتقای توزیع
  • تاریخ انتشار و وضعیت LTS را از docs.ros.org تأیید کرده‌ام
  • سازگاری اوبونتو (Tier 1) را بررسی کرده‌ام
  • یادداشت انتشار را برای تغییرات شکننده خوانده‌ام
  • سازگاری Nav2 / ros2_control / Gazebo / MoveIt 2 را چک کرده‌ام
  • سازگاری سخت‌افزار (Jetson / Raspberry Pi / درایورها) را بررسی کرده‌ام
  • می‌دانم این توزیع را در محیط آزمایشی تست می‌کنم، نه مستقیم روی تولید
  • Rolling را با یک توزیع پایدار اشتباه نگرفته‌ام

واژه‌نامه

Distro
مجموعهٔ نسخه‌بندی‌شده و سازگار از پکیج‌های ROS 2 که زیر یک نام منتشر می‌شود.
LTS
Long Term Support — توزیعی با چرخهٔ پشتیبانی طولانی‌تر، مناسب سامانه‌های تولیدی.
Rolling Ridley
شاخهٔ همیشه‌درحال‌توسعهٔ ROS 2؛ منبع اصلی برای انجماد توزیع‌های پایدار بعدی.
EOL
End of Life — پایان پشتیبانی رسمی؛ دیگر وصلهٔ امنیتی یا رفع باگ منتشر نمی‌شود.
RMW
ROS Middleware — لایهٔ واسط بین rcl و پیاده‌سازی DDS.
QoS
Quality of Service — تنظیمات قابلیت‌اطمینان، ماندگاری و تاریخچهٔ پیام‌ها روی هر تاپیک.
Tier 1 / 2 / 3
سطح رسمی پشتیبانی یک پلتفرم توسط پروژهٔ ROS 2؛ Tier 1 بالاترین سطح تست و تضمین است.
Underlay / Overlay
محیط پایهٔ سیستمی ROS در برابر Workspace شخصی که روی آن Source می‌شود.
Breaking Change
تغییری که باعث می‌شود کد قدیمی بدون اصلاح دیگر کار نکند.