معمل TurtleBot3 رقم 07 - الملاحة الذاتية باستخدام Nav2
5 دقائق قراءة
شرائح الدرس
1 / 11
يقدّم هذا المعمل الملاحة الذاتية (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) │
└─────────────┘