از فصل ۲ تا اینجا، بارها با Topic، Service و Action کار کردیم بدون اینکه بپرسیم واقعاً پیامها چطور از یک Node به Node دیگر میرسند. جواب این سؤال، یکی از مهمترین تفاوتهای ROS 2 با نسل قبلیاش (ROS 1) است: ROS 2 روی یک Middleware استاندارد صنعتی بهنام DDS ساخته شده.
اگر یکی از هزار اسکن LiDAR گم شود، معمولاً فاجعهای رخ نمیدهد. اما اگر فرمان توقف اضطراری ARCHO گم شود، این میتواند خطرناک باشد. یک نقشه ممکن است دیر منتشر شود، اما هر Subscriber جدید باید بتواند آخرین نسخهاش را بگیرد — حتی اگر بعد از انتشار اولیه روشن شده باشد. به همین دلیل، یک رفتار ارتباطی ثابت برای همه پیامها اصلاً منطقی نیست.
QoS (Quality of Service) دقیقاً همین را تنظیم میکند: هر Topic میتواند رفتار ارتباطی خودش را داشته باشد.
| حالت | رفتار | مناسب برای |
|---|---|---|
| Reliable | پیام حتماً باید تحویل داده شود؛ اگر بسته گم شود، دوباره تلاش میشود | Parameter Event، تنظیمات، فرمانهای حساس غیر Real-time |
| Best Effort | اگر پیام رسید خوب، اگر نرسید پیام بعدی میآید | Camera Stream، LiDAR، داده سنسور سریع، شبکه WiFi ضعیف |
| حالت | رفتار |
|---|---|
| Volatile | Subscriber فقط پیامهایی را میگیرد که بعد از اتصالش منتشر شوند؛ پیامهای قبلی را نمیبیند |
| Transient Local | Publisher آخرین داده را نگه میدارد تا Subscriberهای جدید هم بتوانند آن را بگیرند — مثلاً برای Map |
| حالت | رفتار |
|---|---|
| Keep Last (depth=N) | فقط N پیام آخر نگه داشته میشود |
| Keep All | همه پیامها تا محدودیت منابع سیستم نگه داشته میشوند — میتواند حافظه زیادی مصرف کند |
| سیاست | معنی | مثال |
|---|---|---|
| Deadline | حداقل هر چند وقت یکبار باید پیام برسد | LiDAR باید هر ۱۰۰ میلیثانیه پیام بدهد؛ در غیر اینصورت Deadline Missed گزارش میشود — بسیار مفید برای Health Monitoring |
| Lifespan | پیام تا چه مدت معتبر است | فرمان سرعت مربوط به ۵ ثانیه قبل دیگر نباید اجرا شود |
| Liveliness | آیا Publisher هنوز زنده است | اگر Publisher فرمان موتور از بین برود، سیستم میتواند فرمان را خودکار صفر کند |
فرض کن LiDAR ARCHO با Best Effort منتشر میکند، اما یک Subscriber جدید فقط
Reliable قبول میکند. نتیجه: ارتباط اصلاً تشکیل نمیشود یا رفتار مورد انتظار رخ
نمیدهد — و نشانهاش این است که /scan در ros2 topic list دیده میشود،
اما هیچ دادهای دریافت نمیشود.
این دستور دقیقاً همانجایی است که ناسازگاری بین Publisher و Subscriber را پیدا میکنی.
export ROS_DOMAIN_ID=20
سیستمهایی با Domain ID متفاوت معمولاً یک ROS Graph مشترک نمیبینند. مثلاً یک آزمایشگاه میتواند Domain 10 و آزمایشگاه دیگر Domain 20 باشد تا ترافیک Discoveryشان با هم قاطی نشود.
Domain ID فقط Discovery را جدا میکند، نه ارتباط را رمزنگاری یا محافظت میکند. اتکا به Domain ID یا رمز عبور WiFi برای امنیت واقعی کافی نیست — این موضوعی است که در فصلهای بعدی درباره امنیت (اگر در ادامه مسیر پیش برویم) بیشتر بررسی میشود.
ROS Middleware — لایهای است که ROS 2 را به یک پیادهسازی واقعی DDS (مثل Cyclone DDS یا Fast DDS)
متصل میکند. همانطور که در نمودار بالا دیدیم، این لایه بین rcl و خود DDS قرار میگیرد
و به ROS 2 اجازه میدهد بدون تغییر کد، بین چند پیادهسازی DDS مختلف سوییچ کند.
QoS تعیین نمیکند پیام چه دادهای داشته باشد؛ تعیین میکند آن داده چقدر قابلاعتماد، ماندگار، تازه و بهموقع منتقل شود.
حالا که DDS و QoS را فهمیدی، وقت خوبی است که چهار نوع ارتباط اصلی ROS 2 (که در فصل ۲ و ۳ با آنها کار کردیم) را یکجا مرور کنیم:
| نوع | مناسب برای | مثال در ARCHO |
|---|---|---|
| Topic | جریان پیوسته داده؛ Publisher لازم نیست بداند چه کسی گوش میدهد | LiDAR Scan، IMU، Encoder، Battery Status، Camera Image |
| Service | درخواست و پاسخ سریع و کوتاه؛ برای کار طولانی مناسب نیست | Reset Odometry، Clear Fault، Enable Motor، Get Firmware Version |
| Action | کاری که زمان میبرد و به Goal/Feedback/Result و Cancel نیاز دارد | Navigate to Pose، Dock Robot، Follow Waypoints، Calibrate Wheels |
| Parameter | تنظیم رفتار یک Node؛ نامناسب برای داده سریع سنسور | max_velocity، wheel_radius، safety_distance، controller_frequency |
یک ربات صنعتی فقط نباید کار کند؛ باید بتواند به این سؤال جواب بدهد: «من سالم هستم یا نه؟»
| وضعیت | معنی |
|---|---|
| OK | همهچیز طبیعی است |
| WARN | مشکلی هست ولی هنوز خطرناک نیست |
| ERROR | خطای جدی رخ داده |
| STALE | دادهای که از این جزء دریافت میکنیم دیگر بهروز نیست |
مثال یک لحظه از وضعیت ARCHO:
LiDAR: OK
IMU: OK
Battery: WARN
Motor Driver: ERROR
Camera: STALE
Health Manager بر اساس همه این ورودیها تصمیم میگیرد: آیا مأموریت ادامه پیدا کند؟ آیا سرعت کم شود؟ آیا ARCHO کاملاً متوقف شود؟ آیا اپراتور مطلع شود؟
پیامی ساده که فقط میگوید «من هنوز زندهام». مثلاً MCU هر ۵۰ میلیثانیه یک Heartbeat میفرستد. اگر کامپیوتر اصلی برای ۳۰۰ میلیثانیه Heartbeat نبیند، نتیجه میگیرد MCU قطع شده — دقیقاً همان اصل Watchdog که در فصل ۱۶ و ۱۸ دیدیم.
now - last_scan_time > 0.5 second
↓
LiDAR Timeout
↓
Controller stop → Mission pause → Operator notification
| سطح | مثال |
|---|---|
| Info | Map loaded |
| Warning | Battery below 30% |
| Recoverable Error | LiDAR temporarily unavailable |
| Critical Error | Motor overcurrent، Emergency stop active |
مثلاً اگر دوربین ARCHO از کار بیفتد اما Navigation بتواند فقط با LiDAR ادامه دهد، سیستم به حالت DEGRADED میرود — نه متوقف، اما با قابلیت کاهشیافته. اگر Encoder از کار بیفتد، این یک خطای جدیتر است و سیستم به FAULT میرود.
نباید فرض کنیم «چون Nodeهای ROS 2 سالم هستند، پس ربات ایمن است». نرمافزار ممکن است Crash کند، شبکه قطع شود، یک Topic اشتباه منتشر شود، CPU هنگ کند، یا یک فرمان قدیمی بهاشتباه باقی بماند. به همین دلیل ایمنی واقعی نمیتواند فقط در یک لایه نرمافزاری باشد.
| نوع | رفتار |
|---|---|
| Normal Stop | Controller سرعت را بهآرامی به صفر میرساند |
| Protective Stop | بهدلیل مشاهده انسان یا مانع خطرناک، توقف سریع اما کنترلشده |
| Emergency Stop | قطع کاملاً سختافزاری انرژی محرکها — نباید فقط یک Topic نرمافزاری باشد |
اگر Layer 1 (اجتناب هوشمند از برخورد در Nav2) به هر دلیلی شکست بخورد، لایههای پایینتر همچنان باید بتوانند خطر را محدود کنند. این دقیقاً همان درسی است که در فصل ۱۸ درباره «یک لایه ایمنی کافی نیست» گرفتیم — اینجا آن اصل را به یک معماری کامل ششلایه تبدیل میکنیم.
ورودی Safety Supervisor: cmd_vel، مناطق ایمنی LiDAR، Bumper، E-stop، خطاهای موتور، کیفیت Localization و وضعیت باتری. خروجی: safe_cmd_vel، motor_enable، protective_stop.
| منطقه | سرعت مجاز |
|---|---|
| فضای باز انبار | ۰.۸ متر بر ثانیه |
| نزدیک انسان | ۰.۳ متر بر ثانیه |
| محدوده Docking | ۰.۱ متر بر ثانیه |
این محدودیتها میتوانند بر اساس نقشه، داده LiDAR زنده، موقعیت فعلی، نوع مأموریت و حضور انسان بهصورت پویا تغییر کنند.
وقتی Bumper فشرده میشود، ARCHO هرگز نباید بیدرنگ و بدون بررسی خودکار عقب برود — ممکن است مانع یا حتی یک انسان درست پشت آن ایستاده باشد.
ایمنی واقعی یعنی حتی وقتی نرمافزار سطح بالا اشتباه میکند، سختافزار و کنترل پاییندست اجازه ایجاد وضعیت خطرناک نمیدهند.
ARCHO حالا نهتنها کار میکند، بلکه میداند چطور با شرایط نامطلوب شبکه کنار بیاید (QoS)، چطور بگوید کجای بدنش سالم نیست (Diagnostics)، و چطور حتی وقتی چیزی در نرمافزار اشتباه میرود، در برابر آسیب به خودش یا انسانهای اطراف محافظت کند (معماری ایمنی چندلایه). اینها همان تفاوتهایی هستند که یک پروژه دانشجویی را از یک محصول صنعتی واقعی جدا میکنند.
پروژه ARCHO اکنون یک Health Manager با چهار سطح وضعیت، یک Safety Supervisor با شش لایه ایمنی مستقل، و QoS Profileهای درستتنظیمشده برای هر نوع داده (سنسور سریع در برابر فرمان حیاتی) دارد.
در فصل بیستم — فصل پایانی این مسیر — همه چیزهایی که در این ۱۹ فصل ساختیم را کنار هم میگذاریم و معماری کامل صنعتی نهایی ARCHO را میبینیم.