Logo

معمل TurtleBot3 رقم 07 - الملاحة الذاتية باستخدام Nav2

5 دقائق قراءة
شرائح الدرس
1 / 11

معمل TurtleBot3 رقم 07: الملاحة الذاتية باستخدام Nav2

من خريطة محفوظة إلى الوصول الذاتي للهدف

يقدّم هذا المعمل الملاحة الذاتية (autonomous navigation) باستخدام حزمة Nav2. بناءً على SLAM من المعمل 06، يتعلّم الطلاب استخدام خرائط جاهزة مُسبقًا لتحديد موقع الروبوت وتخطيط المسار.

أهداف التعلّم

  • فهم بنية حزمة الملاحة Nav2
  • التعرّف على AMCL (تحديد الموقع التكيفي بطريقة مونت كارلو - Adaptive Monte Carlo Localization)
  • تجربة تخطيط المسار الذاتي وتنفيذه
  • التدرّب على ضبط أهداف الملاحة باستخدام RViz

المتطلبات الأساسية

  • إتمام المعمل 06 (أساسيات SLAM)
  • تثبيت حزم Nav2:
    sudo apt install ros-jazzy-navigation2 ros-jazzy-nav2-bringup

بداية سريعة - حزمة المعمل 07

الخطوة 1: بناء الحزمة

cd ~/Desktop/ROS-2-Practical-Course-Roadmap-2025/ros_ws
colcon build --packages-select turtlebot3_lab07
source install/setup.bash

الخطوة 2: تشغيل الملاحة

export TURTLEBOT3_MODEL=waffle_pi
ros2 launch turtlebot3_lab07 lab07.launch.py

هذا يُشغّل Gazebo وNav2 وRViz بأمر واحد.

  • مثال بخريطة محفوظة في ~/maps:
cd ~/Desktop/ROS-2-Practical-Course-Roadmap-2025/ros_ws
source /opt/ros/jazzy/setup.bash
source install/setup.bash
export TURTLEBOT3_MODEL=waffle_pi
ros2 launch turtlebot3_lab07 lab07.launch.py map:=$HOME/maps/my_map.yaml

الخطوة 3: ضبط الوضعية الابتدائية (Initial Pose) (مطلوب)

مهم: يجب عليك ضبط الوضعية الابتدائية قبل أن يتمكن الروبوت من الملاحة.

  source /opt/ros/jazzy/setup.bash
  ros2 topic pub /initialpose geometry_msgs/msg/PoseWithCovarianceStamped "{header: {frame_id: 
  'map'}, pose: {pose: {position: {x: -2.0, y: -0.5, z: 0.0}, orientation: {w: 1.0}}}}" --once

الخطوة 4: إرسال أهداف الملاحة

  1. انقر على زر "2D Goal Pose" في شريط أدوات RViz
  2. انقر واسحب على الخريطة في المكان الذي تريد أن يذهب إليه الروبوت
  3. راقب الروبوت وهو يخطط مسارًا ذاتيًا وينتقل إليه!

بديل: ضبط الوضعية الابتدائية عبر سطر الأوامر:

ros2 topic pub /initialpose geometry_msgs/msg/PoseWithCovarianceStamped \
  "{header: {frame_id: 'map'}, pose: {pose: {position: {x: -2.0, y: -0.5, z: 0.0}, orientation: {w: 1.0}}}}" --once

اختياري: استخدام خريطتك الخاصة من المعمل 06

export TURTLEBOT3_MODEL=waffle_pi
ros2 launch turtlebot3_lab07 lab07.launch.py map:=$HOME/maps/my_map.yaml

بنية الحزمة

ros_ws/turtlebot3_lab07/
├── package.xml                 # Package dependencies
├── setup.py                    # Build configuration
├── resource/turtlebot3_lab07   # Package marker
├── launch/lab07.launch.py      # All-in-one launch file
└── turtlebot3_lab07/__init__.py

ملف الـLaunch يُشغّل:

  • محاكاة Gazebo (عالَم TurtleBot3 World)
  • حزمة Nav2 (AMCL، المخططات، أدوات التحكم، خرائط التكلفة - costmaps)
  • RViz مع تصور الملاحة

مكوّنات Nav2

المكوّنالوصف
AMCLيُقدّر وضعية الروبوت على خريطة معروفة
Map Serverيُحمّل ويُقدّم شبكة الإشغال (occupancy grid map)
Planner Serverيحسب المسارات العامة من نقطة البداية إلى الهدف
Controller Serverيُنفّذ المسار مع تجنّب العوائق محليًا
BT Navigatorتنسيق الملاحة القائم على شجرة السلوك (Behavior Tree)

الـTopics الأساسية

الـTopicالوصف
/mapالخريطة الثابتة من map server
/scanبيانات LIDAR لتحديد الموقع
/cmd_velأوامر السرعة إلى الروبوت
/goal_poseهدف الملاحة من RViz
/planالمسار العام المحسوب

استخدام RViz للملاحة

ضبط الوضعية الابتدائية

الروبوت لا يعرف موضعه على الخريطة في البداية. يجب أن تُخبره:

  1. انقر على زر "2D Pose Estimate"
  2. انقر على الخريطة في الموضع الذي يوجد فيه الروبوت
  3. اسحب لضبط الاتجاه (الجهة التي يواجهها الروبوت)
  4. راقب سحابة الجسيمات (particle cloud) (الأسهم الحمراء) وهي تتقارب

إرسال أهداف الملاحة

  1. انقر على زر "2D Goal Pose"
  2. انقر على وجهة الخريطة
  3. اسحب لضبط الاتجاه النهائي المطلوب
  4. راقب الروبوت وهو يخطط وينفّذ المسار

استكشاف الأخطاء وإصلاحها

تجمّد Gazebo/RViz أو ثباتهما

  • تأكد من استيراد (source) مساحة العمل: source install/setup.bash
  • انتظر 30 ثانية على الأقل لاكتمال التهيئة
  • تحقق مما إذا كانت ساعة المحاكاة تتقدّم: ros2 topic echo /clock --once
  • أنهِ أي عمليات متبقية: pkill -f "ros2|gazebo|rviz" وأعِد المحاولة

الروبوت لا يُحدِّد موقعه

  • تأكد من ضبط الوضعية الابتدائية بشكل صحيح (الخطوة 3)
  • الروبوت يظهر عند الإحداثيات (-2, -0.5) في عالَم TurtleBot3 World
  • قُد ببطء لمساعدة AMCL على التقارب

فشل الملاحة في التخطيط

  • تحقق من أن الهدف في مساحة حرة (المنطقة البيضاء على الخريطة)
  • جرّب هدفًا أقرب أولًا
  • تحقق من TF: ros2 run tf2_tools view_frames

أخطاء "Waiting for Transform"

  • انتظر وقتًا أطول للتهيئة (~30 ثانية)
  • تأكد من بدء تشغيل جميع الـnodes: ros2 node list

أوامر مفيدة

# Check Nav2 nodes are running
ros2 node list | grep -E "amcl|planner|controller|bt_navigator"
 
# Monitor navigation status
ros2 topic echo /navigate_to_pose/_action/status
 
# View TF tree
ros2 run tf2_tools view_frames
 
# Send navigation goal via command line
ros2 action send_goal /navigate_to_pose nav2_msgs/action/NavigateToPose \
  "{pose: {header: {frame_id: 'map'}, pose: {position: {x: 0.5, y: 0.5}, orientation: {w: 1.0}}}}"

بنية Nav2

                    ┌─────────────────┐
                    │   RViz Goal     │
                    │  (2D Goal Pose) │
                    └────────┬────────┘


                    ┌─────────────────┐
                    │  BT Navigator   │
                    └────────┬────────┘

              ┌──────────────┼──────────────┐
              ▼              ▼              ▼
     ┌────────────┐  ┌────────────┐  ┌────────────┐
     │  Planner   │  │ Controller │  │  Behavior  │
     │ (Global)   │  │  (Local)   │  │ (Recovery) │
     └─────┬──────┘  └─────┬──────┘  └────────────┘
           │               │
           ▼               ▼
     ┌────────────┐  ┌────────────┐
     │  Global    │  │   Local    │
     │  Costmap   │  │  Costmap   │
     └────────────┘  └────────────┘

            ┌──────┴──────┐
            │    AMCL     │
            │ (Localize)  │
            └─────────────┘

المصادر