معمل TurtleBot3 رقم 07 - الملاحة الذاتية باستخدام Nav2
5 دقائق قراءة
يقدّم هذا المعمل الملاحة الذاتية (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: إرسال أهداف الملاحة
- انقر على زر "2D Goal Pose" في شريط أدوات RViz
- انقر واسحب على الخريطة في المكان الذي تريد أن يذهب إليه الروبوت
- راقب الروبوت وهو يخطط مسارًا ذاتيًا وينتقل إليه!
بديل: ضبط الوضعية الابتدائية عبر سطر الأوامر:
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 للملاحة
ضبط الوضعية الابتدائية
الروبوت لا يعرف موضعه على الخريطة في البداية. يجب أن تُخبره:
- انقر على زر "2D Pose Estimate"
- انقر على الخريطة في الموضع الذي يوجد فيه الروبوت
- اسحب لضبط الاتجاه (الجهة التي يواجهها الروبوت)
- راقب سحابة الجسيمات (particle cloud) (الأسهم الحمراء) وهي تتقارب
إرسال أهداف الملاحة
- انقر على زر "2D Goal Pose"
- انقر على وجهة الخريطة
- اسحب لضبط الاتجاه النهائي المطلوب
- راقب الروبوت وهو يخطط وينفّذ المسار
استكشاف الأخطاء وإصلاحها
تجمّد 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) │
└─────────────┘