سبق 6.3: ملٹی نوڈ سسٹمز کو ڈیبگ کرنا
جب آپ متعدد نوڈز پر مشتمل ایک سسٹم لانچ کرتے ہیں، جو ٹاپکس اور سروسز کے ذریعے بات چیت کر رہے ہوتے ہیں، تو چیزیں بہت پوشیدہ طریقوں سے غلط ہو سکتی ہیں:
- ایک نوڈ خاموشی سے کریش ہو جاتا ہے
- نوڈز ایک دوسرے کو نہیں ڈھونڈ پاتے (نیٹ ورک کے مسائل)
- ڈیٹا فلو نہیں ہو رہا (ٹاپک میں عدم مطابقت)
- سسٹم سست ہے (لیٹنسی کی رکاوٹ)
- پیرامیٹرز صحیح طریقے سے نہیں پڑھے جا رہے
صحیح ڈیبگنگ ٹولز کے بغیر، آپ پرنٹ اسٹیٹمنٹس شامل کرنے اور اندازہ لگانے میں پھنس جائیں گے۔ ROS 2 طاقتور تشخیصی ٹولز فراہم کرتا ہے جو آپ کو یہ دیکھنے دیتے ہیں کہ سسٹم میں کیا ہو رہا ہے۔
ڈیبگنگ ورک فلو
موثر ڈیبگنگ کی کلید منظم تشخیص (systematic diagnosis) ہے:
1. سسٹم کی صحت چیک کریں (ros2doctor)
↓
2. فن تعمیر کا بصری جائزہ لیں (rqt_graph)
↓
3. تفصیلی لاگنگ فعال کریں (ros2 run ... --ros-args --log-level debug)
↓
4. ڈیٹا فلو کو ٹریس کریں (ros2 topic echo, ros2 service list)
↓
5. اجزاء کا تجربہ کریں (ہر نوڈ کو الگ کریں اور جانچیں)
↓
6. ٹھیک کریں اور توثیق کریں (تصدیق کریں کہ اصلاح کام کر گئی ہے)
آئیے ہر ٹول پر ایک نظر ڈالتے ہیں۔
1. سسٹم کی صحت کی جانچ: ros2doctor
ros2doctor آپ کا پہلا دفاعی ذریعہ ہے۔ یہ آپ کی ROS 2 انسٹالیشن اور چل رہے سسٹم پر خودکار چیک کرتا ہے۔
بنیادی استعمال
ros2 doctor
نمونہ آؤٹ پٹ:
ROS 2 Distribution: Humble
Platform: Linux
Architecture: x86_64
system check passed:
ROS 2 version: Humble
Python: 3.10.12
distro: humble
ROS 2 path: /opt/ros/humble
All checks passed!
تفصیلی تشخیصی رپورٹ
ros2 doctor --report
یہ ایک جامع رپورٹ تیار کرتا ہے جس میں شامل ہیں:
- ماحولیاتی متغیرات (Environment variables) (ROS_DISTRO, ROS_DOMAIN_ID)
- نیٹ ورک کنفیگریشن (localhost resolution)
- پیکیج کے راستے (کیا پیکیجز مل سکتے ہیں؟)
- مڈل ویئر کنفیگریشن (DDS سیٹنگز)
ان کا پتہ لگانے کے لیے مفید:
- ماحولیاتی سیٹ اپ کی کمی (کیا
source install/setup.bashکرنا بھول گئے؟) - نیٹ ورک کنفیگریشن کے مسائل
- پیکیج انسٹالیشن کے مسائل
جب نوڈز ایک دوسرے کو نہیں ڈھونڈ پاتے
اگر نوڈز بات چیت نہیں کر رہے ہیں، تو ros2doctor مسئلہ کی نشاندہی کرنے میں مدد کر سکتا ہے:
صورتحال: آپ دو نوڈز لانچ کرتے ہیں، لیکن وہ ایک دوسرے کے ٹاپکس نہیں دیکھ پاتے۔
# چیک کریں کہ دونوں نوڈز چل رہے ہیں یا نہیں
ros2 node list
# ٹاپکس چیک کریں
ros2 topic list
# ڈاکٹر چلائیں
ros2 doctor
# نیٹ ورک کے مسائل یا مڈل ویئر کی وارننگز دیکھیں
عام تشخیص:
WARNING: DDS network issues detected
- localhost resolution failed
- Try: ping 127.0.0.1
- Set ROS_LOCALHOST_ONLY=1 if using local-only communication
2. فن تعمیر کا بصری جائزہ: rqt_graph
rqt_graph نوڈ گراف دکھاتا ہے—تمام نوڈز اور ان کے کنکشنز۔ یہ سمجھنے کے لیے انمول ہے کہ کیا منسلک ہے اور ٹوٹی ہوئی روابط کو تلاش کرنے کے لیے۔
rqt_graph لانچ کریں
اپنے لانچ سسٹم کو چلانے کے ساتھ:
ros2 run rqt_graph rqt_graph
ایک ونڈو کھلتی ہے جو دکھاتی ہے:
- نوڈز مستطیل خانوں کے طور پر
- ٹاپکس دائروں کے طور پر
- کنکشنز تیروں کے طور پر (پبلشر → سبسکرائبر)
روبوٹ سسٹم کے لیے مثال گراف:
┌──────────────────┐
│ camera_sensor │ ──→ /image_raw ──→ ┌──────────────┐
└──────────────────┘ │ processor │
└──────────────┘
┌──────────────────┐ ↓
│ lidar_sensor │ ──→ /scan ───────────────→ │
└──────────────────┘
┌──────────────────┐
│ odometry │ ──→ /odom ────────────────→ │
└──────────────────┘
گراف کی تشریح
آپ کو کیا دیکھنا چاہیے؟
- تمام متوقع نوڈز موجود ہیں
- ڈیٹا فلو دکھانے والے تیر
- کوئی غیر منسلک جزو نہیں (جب تک کہ یہ جان بوجھ کر نہ ہو)
ریڈ فلیگز (خطرے کی علامات):
- غائب نوڈ: متوقع نوڈ گراف میں نہیں ہے → نوڈ کریش ہو گیا یا شروع ہونے میں ناکام رہا
- غائب ٹاپک: پبلشر سے کوئی تیر نہیں → ٹاپک کے نام میں عدم مطابقت یا پبلشر میں خرابی
- غیر منسلک نوڈ: بغیر کسی کنکشن کے نوڈ → دوسروں کے ذریعہ شائع نہیں ہو رہا یا سبسکرائب نہیں کیا گیا
ڈیبگنگ مثال: غائب ٹاپک
مسئلہ: آپ کا سبسکرائبر پبلشر سے ڈیٹا وصول نہیں کر رہا ہے۔
rqt_graph کے ساتھ تشخیص:
- rqt_graph کھولیں
- پبلشر نوڈ اور متوقع ٹاپک کو دیکھیں
- سبسکرائبر نوڈ کو دیکھیں
- چیک کریں کہ کیا تیر انہیں جوڑتا ہے
اگر کوئی تیر نہیں ہے:
- کیا وہ ایک ہی ٹاپک کا نام استعمال کر رہے ہیں؟
- کیا پبلشر واقعی شائع کر رہا ہے؟
- تمام فعال ٹاپکس دیکھنے کے لیے چلائیں:
ros2 topic list - ڈیٹا فلو دیکھنے کے لیے چلائیں:
ros2 topic echo /expected_topic
3. تفصیلی لاگنگ کو فعال کریں
ڈیفالٹ کے طور پر، ROS 2 نوڈز صرف INFO لیول کے پیغامات لاگ کرتے ہیں۔ ڈیبگنگ کے لیے، آپ کو DEBUG لاگز کی ضرورت ہوتی ہے جو عمل درآمد کی تفصیلات دکھاتے ہیں۔
لاگر لیولز
ROS 2 پانچ لاگنگ لیولز استعمال کرتا ہے (کم سے زیادہ تفصیل تک):
| لیول | کب استعمال کریں | مثال |
|---|---|---|
| ERROR | اہم ناکامیاں | "Motor command failed: timeout" |
| WARN | غیر معمولی لیکن قابلِ بازیافت | "Parameter value out of range, using default" |
| INFO | عام آپریشن کی معلومات | "Node started", "Message published" |
| DEBUG | تفصیلی عمل درآمد کا بہاؤ | "Entering function X", "Parameter value is 42.0" |
| TRACE | بہت تفصیلی اندرونی حالت | "Loop iteration 1000", "Buffer contents" |
چلتے وقت لاگ لیول سیٹ کرنا
جب کوئی نوڈ چل رہا ہو، تو اسے دوبارہ شروع کیے بغیر اس کی لاگنگ لیول تبدیل کریں:
# DEBUG لاگنگ کے ساتھ ایک نوڈ شروع کریں
ros2 run my_first_package minimal_publisher --ros-args --log-level debug
# یا چلتے ہوئے نوڈ کے لیے لاگنگ تبدیل کریں
ros2 param set /minimal_publisher rcl_logging_level DEBUG
اپنے کوڈ میں Debug آؤٹ پٹ شامل کرنا
اپنے نوڈ کوڈ میں، پیغامات خارج کرنے کے لیے لاگر استعمال کریں:
import rclpy
from rclpy.node import Node
class DebugNode(Node):
def __init__(self):
super().__init__('debug_node')
self.get_logger().error("Critical error - stopping")
self.get_logger().warn("Warning - proceeding with caution")
self.get_logger().info("Normal operation message")
self.get_logger().debug("Detailed debug info - only in debug mode")
self.get_logger().trace("Very detailed tracing info")
لاگنگ لیولز خاص طور پر کال بیکس میں مفید ہیں:
def timer_callback(self):
rate = self.get_parameter('publish_rate').value
self.get_logger().debug(f"Timer fired, rate={rate}") # صرف debug موڈ میں دکھایا جائے گا
msg = String()
msg.data = f'Message {self.counter}'
self.publisher_.publish(msg)
self.get_logger().info(f"Published: {msg.data}") # ہمیشہ دکھایا جائے گا
self.counter += 1
4. ڈیٹا فلو کو ٹریس کریں: ros2 کمانڈز
ایک بار جب آپ یہ شناخت کر لیتے ہیں کہ ایک نوڈ موجود ہے اور گراف صحیح نظر آتا ہے، تو اصل ڈیٹا فلو کو ٹریس کریں۔
ڈیٹا شائع ہو رہا ہے یا نہیں چیک کریں
# تمام فعال ٹاپکس کی فہرست بنائیں
ros2 topic list
# تفصیلی ٹاپک کی معلومات دیکھیں (پیغام کا قسم، پبلشرز، سبسکرائبرز)
ros2 topic list -t
# مثال آؤٹ پٹ:
/image_raw [sensor_msgs/Image]
/scan [sensor_msgs/LaserScan]
/odom [nav_msgs/Odometry]
حقیقی وقت میں ٹاپک ڈیٹا کو ایکو کریں
# جیسے ہی پیغامات شائع ہوں انہیں دیکھیں
ros2 topic echo /image_raw
# مثال آؤٹ پٹ: (مسلسل)
---
header:
stamp:
sec: 1700000001
nsec: 500000000
frame_id: camera
encoding: rgb8
width: 640
height: 480
data: [255, 128, 64, ...]
---
اگر کوئی آؤٹ پٹ نہیں ہے:
- ٹاپک موجود ہے لیکن کوئی پبلشر فعال نہیں ہے
- چیک کریں کہ پبلشر چل رہا ہے یا نہیں:
ros2 node list - چیک کریں کہ پبلشر واقعی اس ٹاپک پر شائع کر رہا ہے یا نہیں:
ros2 topic info /image_raw
سروسز کا تجربہ کریں
# دستیاب سروسز کی فہرست بنائیں
ros2 service list
# ایک سروس کو کال کریں
ros2 service call /spawn turtlesim/srv/Spawn "{x: 5, y: 5, theta: 0, name: 'turtle2'}"
# مثال آؤٹ پٹ:
result:
x: 5.0
y: 5.0
اگر سروس کال ناکام ہو جاتی ہے:
- کیا سروس سرور چل رہا ہے؟ چیک کریں:
ros2 service list - کیا سروس کا نام صحیح ہے؟
--verboseفلیگ کے ساتھ کال کرنے کی کوشش کریں:ros2 service call /spawn ... --verbose
5. ڈیبگنگ منظر نامہ: ٹوٹا ہوا سسٹم
آئیے ایک مکمل ڈیبگنگ مثال پر چلتے ہیں۔
مسئلہ
آپ ایک روبوٹ سسٹم لانچ کرتے ہیں جس میں شامل ہیں:
- 1 کیمرہ سینسر (
/imageپر شائع ہوتا ہے) - 1 پروسیسر (
/imageسے سبسکرائب کرتا ہے،/processedپر شائع کرتا ہے) - 1 ڈسپلے (
/processedسے سبسکرائب کرتا ہے)
سسٹم شروع ہوتا ہے، لیکن ڈسپلے تصاویر نہیں دکھا رہا ہے۔ کوئی خرابی پیغام نہیں۔ کیا غلط ہے؟
مرحلہ 1: چیک کریں کہ نوڈز چل رہے ہیں یا نہیں
ros2 node list
# آؤٹ پٹ:
/camera_sensor
/processor
/display
✓ تمام نوڈز موجود ہیں اور چل رہے ہیں۔
مرحلہ 2: گراف چیک کریں
ros2 run rqt_graph rqt_graph
بصری معائنہ سے پتہ چلتا ہے:
- کیمرہ
/imageپر شائع کرتا ہے - پروسیسر
/imageسے سبسکرائب کرتا ہے ✓ - پروسیسر
/processedپر شائع کرتا ہے - ڈسپلے
/processedسے سبسکرائب کرتا ہے ✓
گراف صحیح لگتا ہے!
مرحلہ 3: ڈیٹا فلو چیک کریں
# کیا کیمرہ واقعی شائع کر رہا ہے؟
ros2 topic echo /image
# آؤٹ پٹ: (کوئی پیغام نہیں)
مل گیا! کیمرہ نوڈ چل رہا ہے لیکن شائع نہیں کر رہا ہے۔ لاگنگ کے ساتھ کیمرہ نوڈ چیک کریں۔
مرحلہ 4: DEBUG لاگنگ کو فعال کریں
# کیمرہ نوڈ کو ماریں اور DEBUG لاگنگ کے ساتھ دوبارہ شروع کریں
ros2 run my_pkg camera_sensor --ros-args --log-level debug
# آؤٹ پٹ:
[DEBUG] [camera_sensor]: Camera initialized
[DEBUG] [camera_sensor]: Timer callback starting
[ERROR] [camera_sensor]: Failed to capture frame: device not found
مل گیا! کیمرہ ہارڈ ویئر نہیں ملا (شاید ہم اصل کیمرہ کے بغیر کلاؤڈ ماحول میں ہیں)۔ نوڈ چلتا ہے لیکن خاموشی سے ناکام ہو جاتا ہے۔
مرحلہ 5: ٹھیک کریں اور توثیق کریں
حل: ٹائر 1 ماحول کے لیے ایک موک (mock) کیمرہ استعمال کریں۔
def get_image():
# کلاؤڈ میں چلتے وقت موک امیج ڈیٹا
import os
if os.getenv('ROS_LOCALHOST_ONLY'):
# امیج ڈیٹا کی سمولیشن کریں
return [0] * (640 * 480)
else:
# حقیقی کیمرہ کیپچر
...
سسٹم کو دوبارہ شروع کریں:
ros2 run my_pkg camera_sensor --ros-args --log-level debug
# اب دکھاتا ہے:
[DEBUG] [camera_sensor]: Using mock camera (cloud environment)
[DEBUG] [camera_sensor]: Publishing frame...
[INFO] [camera_sensor]: Published image (640x480)
ڈیٹا فلو کی توثیق کریں:
ros2 topic echo /processed
# آؤٹ پٹ: (اب پروسیس شدہ تصاویر بہتی ہوئی دکھاتا ہے)
✓ ٹھیک ہو گیا!
ڈیبگنگ ورک فلو ڈایاگرام
سسٹم کام نہیں کر رہا؟
↓
ros2doctor چلائیں
↓
┌─────────────────────────┐
│ صحت کی جانچ کامیاب؟ │
└─────────────────────────┘
↙ نہیں ہاں ↘
↓ ↓
ماحول کے مسائل ٹھیک کریں rqt_graph کھولیں
↓ ↓
│ ┌──────────────────┐
│ │ گراف صحیح ہے؟ │
│ └──────────────────┘
│ ↙ نہیں ہاں ↘
│ ↓ ↓
│ نوڈ کے نام اور ٹاپکس چیک کریں DEBUG لاگنگ
│ & ٹاپکس فعال کریں
│ ↓ ↓
│ │ ٹاپکس ایکو کریں اور
│ │ ڈیٹا فلو چیک کریں
│ │ ↓
│ │ ┌──────────────────┐
│ │ │ ڈیٹا بہہ رہا ہے؟ │
│ │ └──────────────────┘
│ │ ↙ نہیں ہاں ↘
│ ↓ ← → ↓ ↓
│ انفرادی نوڈ کو سسٹم کام کر رہا ہے!
│ ڈیبگ کریں
│ ↓
└───────────────┘
گائیڈڈ پریکٹس: ڈیبگنگ مشق
ایک ٹوٹا ہوا سسٹم بنائیں
جان بوجھ کر کیڑے ڈال کر ایک لانچ سسٹم بنائیں:
from launch import LaunchDescription
from launch_ros.actions import Node
def generate_launch_description():
return LaunchDescription([
# ٹاپک 'data' پر پبلشر
Node(
package='my_first_package',
executable='minimal_publisher',
name='pub',
parameters=[{'publish_rate': 2.0}],
),
# سبسکرائبر 'data' کی توقع رکھتا ہے لیکن کیا اسے ملے گا؟
Node(
package='my_first_package',
executable='minimal_subscriber',
name='sub',
),
])
پوشیدہ خرابی: minimal_publisher /topic پر شائع کرتا ہے، minimal_subscriber /topic سے سبسکرائب کرتا ہے، لیکن minimal_subscriber کوڈ کو تبدیل کر کے /sensor_data کی توقع کی جا رہی ہے۔
اسے ڈیبگ کریں
- سسٹم لانچ کریں۔
ros2doctorچلائیں۔rqt_graphکھولیں — عدم تعلق کو نوٹ کریں۔ros2 topic echo /topic— ڈیٹا بہتا ہوا دیکھیں۔ros2 topic echo /sensor_data— کچھ بھی نہ دیکھیں۔- سبسکرائبر پر DEBUG لاگنگ فعال کریں۔
- ٹاپک میں عدم مطابقت کے بارے میں خرابی کا پیغام دیکھیں۔
- سبسکرائبر کو صحیح ٹاپک نام استعمال کرنے کے لیے اپ ڈیٹ کر کے ٹھیک کریں۔
آزادانہ پریکٹس
مشق 1: نوڈ لائف سائیکل ڈیبگنگ
دو نوڈز بنائیں:
- نوڈ A: ہر 1 سیکنڈ میں
/controlپر شائع کرتا ہے - نوڈ B:
/controlسے سبسکرائب کرتا ہے، ہر پیغام پر پرنٹ کرتا ہے
عمل درآمد کے بیچ میں نوڈ B کو مار دیں۔ rqt_graph کیا دکھاتا ہے؟ ros2 topic list کیا دکھاتا ہے؟
مشق 2: پیرامیٹر پروپیگیشن
ایک نوڈ بنائیں جو ایک پیرامیٹر کا اعلان کرتا ہے لیکن اسے کبھی استعمال نہیں کرتا۔ پیرامیٹر ویلیو کے ساتھ لانچ کریں۔ ros2 param get کے ساتھ تصدیق کریں کہ پیرامیٹر سیٹ ہو گیا ہے۔ پھر پیرامیٹر کو پڑھنے اور استعمال کرنے کے لیے کوڈ شامل کریں۔
مشق 3: سروس ڈیبگنگ
ایک سروس سرور اور کلائنٹ بنائیں۔ کلائنٹ کو غلط قسم کے دلائل کے ساتھ سروس کو کال کرنے پر مجبور کریں۔ عدم مطابقت کی شناخت کے لیے ڈیبگنگ ٹولز کا استعمال کریں۔
عام مسائل اور حل
| مسئلہ | تشخیص | حل |
|---|---|---|
| نوڈ شروع نہیں ہو رہا | ros2 node list متوقع سے کم نوڈز دکھاتا ہے | لاگز چیک کریں، تصدیق کریں کہ پیکیج صحیح طریقے سے بنا ہے، ایگزیکیوٹیبل نام چیک کریں |
| ڈیٹا فلو نہیں ہو رہا | rqt_graph نوڈز کے درمیان کوئی تیر نہیں دکھاتا | ٹاپک کے ناموں سے مماثلت کی تصدیق کریں (کیس-حساس!)، پیغام کی اقسام چیک کریں |
| سست/لیگی سسٹم | ros2 doctor --report مڈل ویئر کی وارننگ دکھاتا ہے | نیٹ ورک چیک کریں، اگر ایک ہی مشین پر ہیں تو ROS_LOCALHOST_ONLY=1 سیٹ کریں |
| سروس کال ٹائم آؤٹ | ros2 service list میں سروس موجود ہے لیکن کال ناکام ہو جاتی ہے | سرور پر DEBUG لاگنگ فعال کریں، درخواست کی شکل کی تصدیق کریں |
| پیرامیٹرز لاگو نہیں ہو رہے | پیرامیٹر ros2 param set کے ساتھ سیٹ کیا گیا ہے لیکن نوڈ اسے نظر انداز کرتا ہے | چیک کریں کہ نوڈ پیرامیٹر کو صحیح جگہ پر پڑھ رہا ہے (اعلان بمقابلہ حاصل کرنا) |
AI کے ساتھ کوشش کریں
سیٹ اپ: ڈیبگنگ چیلنج پر کام کرنے کے لیے اپنے AI اسسٹنٹ کا استعمال کریں۔
پرامپٹ سیٹ:
Prompt 1: "میرے پاس ایک ملٹی نوڈ سسٹم ہے جہاں نوڈ A سینسر ڈیٹا شائع کرتا ہے لیکن نوڈ B (سبسکرائبر) اسے وصول نہیں کر رہا ہے۔ دونوں نوڈز چل رہے ہیں۔ اس کو ڈیبگ کرنے کے لیے آپ کون سے منظم اقدامات اٹھائیں گے؟"
Prompt 2: "میری لانچ فائل 5 نوڈز شروع کرتی ہے، لیکن صرف 3 نوڈز rqt_graph میں ظاہر ہوتے ہیں۔ باقی 2 خاموشی سے کریش ہو رہے ہوں گے۔ میں کیسے پتہ لگاؤں گا کہ کون سے اور کیوں ناکام ہو رہے ہیں؟"
Prompt 3: "میرا سسٹم ڈیبگ لاگنگ آن ہونے پر ٹھیک کام کرتا ہے، لیکن جب میں لاگنگ بند کرتا ہوں تو یہ ٹوٹ جاتا ہے۔ اس کی کیا وجہ ہو سکتی ہے؟ میں اسے کیسے ٹھیک کروں گا؟"
متوقع نتائج:
- AI منظم ڈیبگنگ کے ذریعے چلتا ہے (ros2doctor → rqt_graph → لاگنگ → ایکو)
- AI نوڈ اسٹارٹ اپ لاگز اور stderr آؤٹ پٹ چیک کرنے کا مشورہ دیتا ہے
- AI ریس کنڈیشنز یا انیشلائزیشن آرڈر کے مسائل کی نشاندہی کرتا ہے
حفاظتی نوٹ: روبوٹ سسٹمز کو ڈیبگ کرتے وقت، اس بات کے لیے تیار رہیں کہ نوڈز غیر متوقع ترتیب میں شروع ہو سکتے ہیں۔ کسی بھی صورت میں جسمانی ہارڈ ویئر چلانے سے پہلے ہمیشہ ros2doctor اور rqt_graph سے سسٹم کی صحت کی تصدیق کریں۔ کبھی بھی یہ فرض نہ کریں کہ ڈیٹا بغیر تصدیق کے بہہ رہا ہے۔
اختیاری توسیع: ایک پیچیدہ ڈیبگنگ منظر نامہ بنائیں:
- مختلف پیغام کی اقسام کے ساتھ متعدد سینسر نوڈز
- ٹاپک کے ناموں کو دوبارہ نقشہ بنانے والا ایک درمیانی پروسیسر شامل کریں
- جان بوجھ کر ایک خرابی پیدا کریں (ٹاپک کے نام میں عدم مطابقت، پیرامیٹر کی قسم کی غلطی)
- خرابی کو تلاش کرنے اور ٹھیک کرنے کے لیے تمام ڈیبگنگ ٹولز کا استعمال کریں
- حوالہ گائیڈ کے طور پر اپنے ڈیبگنگ ورک فلو کو دستاویز کریں۔