معمل TurtleBot3 رقم 06 - SLAM (تحديد الموقع ورسم الخريطة في آنٍ واحد)
يقدّم هذا المعمل للطلاب مفاهيم SLAM باستخدام محاكاة TurtleBot3 مع حزمة SLAM Toolbox. سيتعلّم الطلاب كيف يمكن للروبوتات بناء خرائط لبيئات مجهولة وتتبّع موقعها الخاص داخل تلك الخرائط في آنٍ واحد.
أهداف التعلّم
بإتمام هذا المعمل، سيتمكن الطلاب من:
- فهم أساسيات خوارزميات SLAM
- تجربة رسم الخرائط اللحظي (real-time) باستخدام بيانات الماسح الليزري
- تعلّم تحويلات إطارات الإحداثيات (coordinate frame transformations) في الروبوتات
- التدرّب على تحكم teleop لاستكشاف الروبوت
- تصور بيانات رسم الخريطة في RViz
المتطلبات الأساسية
- إتمام المعمل 05 (أساسيات محاكاة TurtleBot3)
- فهم topics وnodes وإطارات الإحداثيات في ROS 2
- تثبيت حزمة SLAM Toolbox (
sudo apt install ros-jazzy-slam-toolbox)
ما يتضمّنه هذا المعمل
المكوّنات الأساسية
- محاكاة Gazebo: روبوت TurtleBot3 Waffle Pi في عالَم TurtleBot3 World
- SLAM Toolbox: رسم خرائط لحظي باستخدام SLAM المتزامن (sync SLAM) لضمان الموثوقية
- تصور RViz: عرض تفاعلي للخريطة وتتبّع الروبوت
- دورة حياة مبسّطة (Simplified Lifecycle): تشغيل مباشر لـnode الـSLAM بدون إدارة معقدة لدورة الحياة (lifecycle)
الملفات الأساسية
launch/lab06.launch.py: ملف Launch الرئيسي مع دمج SLAMconfig/slam_config.yaml: إعدادات SLAM Toolbox المُحسَّنةconfig/turtlebot3_lab06_slam.rviz: إعداد RViz مخصص لتصور SLAMturtlebot3_lab06/map_saver.py: أداة تعليمية لحفظ الخرائط
بداية سريعة
1. ضبط بيئة العمل
export TURTLEBOT3_MODEL=waffle_pi2. تشغيل المعمل
cd /path/to/your/ros_ws
source install/setup.bash
ros2 launch turtlebot3_lab06 lab06.launch.py3. التحكم في الروبوت
في طرفية جديدة:
source install/setup.bash
export TURTLEBOT3_MODEL=waffle_pi
ros2 run turtlebot3_teleop teleop_keyboard4. تفعيل SLAM (مطلوب!)
مهم: يحتاج SLAM Toolbox إلى تفعيل يدوي بعد التشغيل:
في طرفية جديدة:
source install/setup.bash
ros2 node list
ros2 node info /slam_toolbox
ros2 lifecycle get /slam_toolbox
# Configure SLAM Toolbox
ros2 lifecycle set /slam_toolbox configure
# Activate SLAM Toolbox
ros2 lifecycle set /slam_toolbox activateتحقق من حالة SLAM:
# Verify SLAM is active
ros2 lifecycle get /slam_toolbox
# Should show: active [3]
# Verify map is being published
ros2 topic echo /map --once5. استكشِف وارسم الخريطة
استخدم عناصر التحكم بلوحة المفاتيح لقيادة الروبوت في المكان:
- w: للأمام
- s: للخلف
- a: انعطاف لليسار
- d: انعطاف لليمين
- x: توقف
- q/z: زيادة/تقليل السرعة الخطية
- e/c: زيادة/تقليل السرعة الزاوية
ما الذي يجب أن تراه
في Gazebo
- روبوت TurtleBot3 في العالَم المُحاكى
- الروبوت يستجيب لأوامر الـteleop
- تصور الماسح الليزري (خطوط حمراء)
في RViz
- عرض الخريطة: خريطة تُبنى لحظيًا (رمادي=غير معروف، أبيض=مساحة حرة، أسود=عوائق)
- نموذج الروبوت: تمثيل ثلاثي الأبعاد لـTurtleBot3
- الماسح الليزري: نقاط حمراء/ملونة تُظهر قراءات الحساس الحالية
- مسار الروبوت: خط أخضر يُظهر مسار حركة الروبوت
- إطارات TF: العلاقات بين إطارات الإحداثيات (map → odom → base_link)
مفاهيم SLAM الموضَّحة
1. رسم الخرائط اللحظي (Real-Time Mapping)
- تُحدَّث الخريطة كل 0.1 ثانية أثناء تحرك الروبوت
- تُحوَّل بيانات الماسح الليزري إلى شبكة إشغال (occupancy grid)
- تُملأ المناطق المجهولة تدريجيًا أثناء الاستكشاف
2. تحديد الموقع (Localization)
- يُتتبَّع موضع الروبوت داخل الخريطة المتنامية
- تُدمَج الـodometry مع مطابقة المسح (scan matching) لتحسين الدقة
- اكتشاف إغلاق الحلقة (loop closure) عند إعادة زيارة مناطق سابقة
3. إطارات الإحداثيات
- map: إطار الإحداثيات العام للخريطة
- odom: إطار الـodometry (يبدأ من الموضع الابتدائي للروبوت)
- base_link: إطار الإحداثيات المحلي للروبوت
4. دمج الحساسات
- ماسح LIDAR ثنائي الأبعاد يوفّر قياسات المسافة
- بيانات IMU لتتبّع الاتجاه
- مُشفِّرات العجلات (wheel encoders) لتقدير الـodometry
تفاصيل تقنية
خوارزمية SLAM
- تستخدم SLAM Toolbox مع تحسين Ceres Solver
- تُنفِّذ SLAM القائم على الرسم البياني (graph-based SLAM) مع تحسين رسم بياني للوضعيات (pose graph optimization)
- مُهيَّأة للاستخدام التعليمي بنهج SLAM المتزامن (sync SLAM) الموثوق
مقارنة بين SLAM المتزامن (Sync) وغير المتزامن (Async)
يستخدم هذا المعمل SLAM Toolbox المتزامن (Sync) لموثوقية تعليمية. إليك المقارنة:
Sync SLAM Toolbox (sync_slam_toolbox_node)
✅ المزايا:
- حتمي (Deterministic): نفس المدخلات تُنتج دائمًا نفس المخرجات
- أسهل في التصحيح (Debugging): معالجة متسلسلة، سلوك متوقَّع
- مناسب تعليميًا: أبسط للفهم واستكشاف الأخطاء
- مستقر: أقل عرضة للمشاكل المتعلّقة بالتوقيت
- آمن في الوقت الفعلي: يضمن المعالجة ضمن قيود زمنية
⚠️ العيوب:
- معالجة أبطأ: لا يستطيع الاستفادة من أنوية معالج متعددة لرسم الخريطة
- زمن انتظار أعلى (Latency): ينتظر اكتمال كل خطوة قبل الانتقال للتالية
- أقل كفاءة: قد يتجاوز مسحات (scans) إذا استغرقت المعالجة وقتًا طويلًا
Async SLAM Toolbox (async_slam_toolbox_node)
✅ المزايا:
- أداء أعلى: يستطيع الاستفادة من أنوية معالج متعددة
- زمن انتظار أقل: يعالج المسحات في خيوط (threads) متوازية
- أكثر كفاءة: استغلال أفضل للموارد
- قابل للتوسّع: يتعامل بشكل أفضل مع بيانات حساسات عالية التردد
⚠️ العيوب:
- غير حتمي: قد تُنتج نفس المدخلات مخرجات مختلفة قليلًا
- تصحيح أخطاء معقّد: المعالجة متعددة الخيوط أصعب في استكشاف الأخطاء
- حساس للتوقيت: يتطلب إدارة دقيقة لدورة الحياة (lifecycle)
- يستهلك موارد أكثر: يستخدم معالجًا وذاكرة أكثر
متى تستخدم كل نوع؟
| استخدم Sync SLAM عندما: | استخدم Async SLAM عندما: |
|---|---|
| التعلّم والتعليم | أنظمة روبوتات إنتاجية (Production) |
| تصحيح مشاكل SLAM | بيانات حساسات عالية التردد (>10 هرتز) |
| موارد حوسبة محدودة | أنظمة متعددة الأنوية متاحة |
| نتائج حتمية مطلوبة | أقصى أداء مطلوب |
| منصات روبوتات بسيطة | أنظمة ذاتية معقدة |
متطلب إدارة دورة الحياة (Lifecycle Management)
كلٌّ من SLAM المتزامن وغير المتزامن يتطلب إدارة دورة حياة:
# Required for BOTH sync and async SLAM
ros2 lifecycle set /slam_toolbox configure
ros2 lifecycle set /slam_toolbox activateلماذا إدارة دورة الحياة؟
- nodes الخاصة بـSLAM Toolbox هي lifecycle nodes (nodes مُدارة)
- تبدأ في حالة "غير مُهيَّأة (unconfigured)" لأسباب أمنية
- التفعيل اليدوي يضمن تسلسل تشغيل مُتحكَّم فيه
- يمنع بدء SLAM قبل أن تكون جميع الحساسات جاهزة
المعاملات (Parameters) الأساسية
- الدقة (Resolution): 0.05 متر لكل بكسل (شبكة 5 سم) لرسم خرائط دقيق
- معدل التحديث: 50 هرتز للتحويلات، 2 هرتز لتحديثات الخريطة لتشغيل سلس
- مدى المسح: حتى 12 مترًا (مدى LDS الخاص بـTurtleBot3 Waffle Pi)
- إغلاق الحلقة (Loop Closure): مُفعَّل لاتساق الخريطة
- نوع SLAM: Sync SLAM Toolbox لموثوقية تعليمية
إعدادات RViz
- الإطار الثابت (Fixed Frame):
odom(يمنع أخطاء "Fixed Frame does not exist") - topic الخريطة:
/map(يُنشره SLAM Toolbox) - topic المسح:
/scan(بيانات الماسح الليزري) - topic المسار:
/path(مسار حركة الروبوت)
أنشطة تعليمية
أنشطة للمبتدئين
- استكشاف أساسي: قُد الروبوت وراقب تطوّر الخريطة
- فهم الإطارات: راقب علاقات TF في RViz
- تحليل الحساسات: راقب بيانات المسح الليزري في بيئات مختلفة
أنشطة متوسطة
- رسم خرائط منهجي: خطّط أنماط استكشاف فعّالة
- إغلاق الحلقة: عُد إلى موضع البداية وراقب تصحيح الخريطة
- ضبط المعاملات: عدّل
slam_config.yamlوراقب التأثيرات
أنشطة متقدمة
- تحليل الخريطة: احفظ الخرائط وحلّل مقاييس الجودة
- مقارنة الخوارزميات: قارن بمناهج SLAM مختلفة
- بيئات مخصصة: اختبر في عوالم Gazebo مختلفة
استكشاف الأخطاء وإصلاحها
"لم يتم استلام خريطة" في RViz
- المشكلة الأكثر شيوعًا: SLAM Toolbox غير مُفعَّل
- الحل: فعّل SLAM يدويًا:
ros2 lifecycle set /slam_toolbox configure ros2 lifecycle set /slam_toolbox activate - تحقق من حالة SLAM:
ros2 lifecycle get /slam_toolboxيجب أن يُظهرactive [3] - تحقق من topic الخريطة:
ros2 topic echo /map --onceيجب أن يُظهر بيانات الخريطة
node الـSLAM لا يبدأ التشغيل
- تحقق من وجود الـnode:
ros2 node list | grep slam_toolbox - تحقق من حالة دورة الحياة:
ros2 lifecycle get /slam_toolbox - الحالات المتوقَّعة: unconfigured [1] → inactive [2] → active [3]
- إذا بقي عالقًا في unconfigured: نفّذ أوامر configure وactivate أعلاه
الروبوت لا يستجيب لـteleop
- تحقق من نموذج TurtleBot3:
echo $TURTLEBOT3_MODELيجب أن يُظهر "waffle_pi" - تأكد من استيراد (source) الـteleop:
source install/setup.bashفي طرفية الـteleop - تحقق من topic الخاص بـcmd_vel:
ros2 topic list | grep cmd_vel
الخريطة لا تُحدَّث
- حرّك الروبوت - يحتاج SLAM إلى حركة لبناء الخرائط
- تحقق من topic الخاص بـ
/scan:ros2 topic echo /scan --once - تأكد من عمل الماسح الليزري في Gazebo (خطوط الليزر الحمراء مرئية)
أخطاء إطارات RViz
- الإطار الثابت (Fixed Frame) في RViz مضبوط على
odom(وليسmap) لمنع أخطاء بدء التشغيل - شجرة TF:
ros2 run tf2_tools view_framesلتصحيح مشاكل الإطارات - تأكد من ضبط نموذج TurtleBot3 بشكل صحيح لنشر الإطارات بشكل سليم
أخطاء ملف Launch
- تم إصلاحه: أُزيلت إدارة دورة الحياة المعقّدة التي كانت تُسبّب فشلًا
- تم إصلاحه: أُضيف ضبط تلقائي لمتغيّر البيئة TURTLEBOT3_MODEL
- إذا لم تُوجَد الحزمة، تأكد من بناء مساحة العمل:
colcon build --packages-select turtlebot3_lab06
أفكار للتوسّع
للطلاب
- قارن جودة رسم الخريطة في بيئات مختلفة
- نفّذ خوارزميات استكشاف ذاتي (autonomous exploration)
- ادرس تأثير سرعة الروبوت على جودة الخريطة
- أنشئ عوالم مخصصة لتحديات رسم الخرائط
للمدرّسين
- أضِف حزمة الملاحة (Nav2) للملاحة الذاتية
- ادمج روبوتات متعددة لـSLAM متعدد الروبوتات
- أضِف رسم خرائط دلالي (semantic mapping) باستخدام بيانات الكاميرا
- نفّذ دمج الخرائط (map merging) من جلسات استكشاف مختلفة
بنية الملفات
turtlebot3_lab06/
├── README.md # This file
├── QUICKSTART.md # Quick reference
├── package.xml # Package dependencies
├── setup.py # Package setup
├── launch/
│ └── lab06.launch.py # Main SLAM launch file
├── config/
│ ├── slam_config.yaml # SLAM Toolbox configuration
│ └── turtlebot3_lab06_slam.rviz # RViz setup file
└── turtlebot3_lab06/
├── __init__.py
└── map_saver.py # Educational map saving utilityالخطوات التالية
بعد إتمام هذا المعمل، يجب أن يكون الطلاب مستعدين لِـ:
- الملاحة: استخدام الخرائط لتخطيط المسار الذاتي
- SLAM متقدم: رسم خرائط ثلاثي الأبعاد، SLAM دلالي، أو سيناريوهات متعددة الروبوتات
- النشر على روبوت حقيقي: تطبيق مفاهيم SLAM على روبوتات فعلية
- مشاريع بحثية: استكشاف أحدث خوارزميات SLAM
الدعم والمصادر
- توثيق SLAM Toolbox
- دليل TurtleBot3
- حزمة الملاحة في ROS 2
- منتدى نقاش المقرر للأسئلة والتعاون
تذكّر: SLAM قدرة أساسية في الروبوتات تُمكّن الأنظمة الذاتية من فهم بيئتها والتنقل فيها. يوفّر هذا المعمل تجربة عملية بالمفاهيم الأساسية التي تُشغّل كل شيء بدءًا من مكانس التنظيف الآلية وصولًا إلى المركبات ذاتية القيادة.