هيكل حزمة ROS
في ROS (نظام تشغيل الروبوت)، تُعد الحزمة (package) أصغر وحدة أساسية لتنظيم البرمجيات. فهي تحتوي على كل ما تحتاجه لتشغيل جزء معين من نظام الروبوت، بما في ذلك العُقد (nodes)، والمكتبات (libraries)، والسكربتات (scripts)، وملفات الإعداد (configuration files)، وملفات التشغيل (launch files). ومن الضروري فهم بنية نظام ملفات الحزمة لأنها تحدد كيفية تنظيم الكود والموارد الخاصة بك بما يسهّل دمجها ضمن منظومة ROS.
هيكل حزمة ROS
تحتوي حزمة ROS النموذجية عادةً على الملفات والمجلدات التالية:
my_ros_package/
├── CMakeLists.txt
├── package.xml
├── launch/
├── src/
├── include/
├── msg/
├── srv/
├── scripts/
└── config/شرح كل عنصر من عناصر الحزمة
1. CMakeLists.txt
- هذا هو ملف إعداد البناء (build configuration file) الخاص بأداة CMake، والتي تستخدمها ROS كنظام بناء (build system) لها.
- يحدد هذا الملف كيفية تجميع (compile) وربط (link) الكود الخاص بك، والاعتماديات (dependencies) الواجب تضمينها، وكيفية توليد الرسائل (messages) والخدمات (services) والإجراءات (actions) إن وُجدت.
مثال:
find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs)
catkin_package()
include_directories(${catkin_INCLUDE_DIRS})2. package.xml
- يصف هذا الملف البيانات الوصفية (metadata) الخاصة بالحزمة (الاسم، الإصدار، الاعتماديات، المؤلف، إلخ).
- يُعد هذا الملف مهمًا لإدارة الحزم وحل الاعتماديات (dependency resolution).
مثال:
<package format="2">
<name>my_ros_package</name>
<version>0.1.0</version>
<description>A simple ROS package</description>
<maintainer email="[email protected]">Your Name</maintainer>
<license>MIT</license>
<build_depend>roscpp</build_depend>
<exec_depend>rospy</exec_depend>
</package>3. launch/
- يحتوي هذا المجلد على ملفات التشغيل (launch files) المستخدمة لتشغيل عدة عُقد في آنٍ واحد، عادةً مع إعدادات مخصصة لها.
- تُكتب ملفات التشغيل بصيغة XML أو YAML، وتساعد في إدارة أنظمة الروبوتات الكبيرة.
مثال: launch/my_robot.launch
<launch>
<node pkg="my_ros_package" type="my_node" name="my_node_instance" output="screen"/>
</launch>4. src/
- يحتوي هذا المجلد على ملفات الكود المصدري (source code) الخاصة بالعُقد، والتي تُكتب عادةً بلغة C++ أو Python.
مثال: src/my_node.cpp
#include <ros/ros.h>
int main(int argc, char **argv) {
ros::init(argc, argv, "my_node");
ros::NodeHandle nh;
ROS_INFO("Node is running");
ros::spin();
return 0;
}5. include/
- يخزّن هذا المجلد ملفات الترويسة (header files) إذا كنت تكتب الكود بلغة C++.
- يساعد ذلك في تنظيم الكود الخاص بك، خصوصًا في المشاريع الكبيرة.
مثال: include/my_ros_package/my_node.hpp
6. msg/
- يحتوي هذا المجلد على تعريفات الرسائل (message definitions) التي تستخدمها عُقد ROS للتواصل عبر المواضيع (topics).
مثال: msg/MyMessage.msg
int32 data- بعد تعريف الرسالة، يمكنك استخدامها في الكود الخاص بك عبر:
#include <my_ros_package/MyMessage.h>
7. srv/
- يحتوي هذا المجلد على تعريفات الخدمات (service definitions) للتواصل ثنائي الاتجاه بين العُقد (طلب - استجابة).
مثال: srv/AddTwoInts.srv
int32 a
int32 b
---
int32 sum8. scripts/
- يحتوي هذا المجلد على سكربتات قابلة للتنفيذ (executable scripts)، تُكتب عادةً بلغة Python، لتنفيذ العُقد أو الأدوات.
مثال: scripts/my_script.py
#!/usr/bin/env python
import rospy
rospy.init_node('my_python_node')
rospy.loginfo("Python node is running")
rospy.spin()9. config/
- يخزّن هذا المجلد ملفات الإعداد (configuration files) (مثل ملفات YAML) المستخدمة لتمرير المعاملات (parameters) إلى العُقد.
مثال: config/params.yaml
param1: 10
param2: "Hello ROS"مثال عملي على إنشاء حزمة ROS
-
إنشاء حزمة: يمكنك إنشاء حزمة ROS باستخدام الأمر التالي:
catkin_create_pkg my_ros_package roscpp rospy std_msgs -
بناء الحزمة: بعد كتابة الكود الخاص بك، قم ببناء حزمتك باستخدام:
cd ~/catkin_ws catkin_make -
تشغيل عقدة: يمكنك تشغيل عقدة من حزمتك باستخدام:
rosrun my_ros_package my_node -
استخدام ملف تشغيل (launch file): لتشغيل عُقدك باستخدام ملف تشغيل:
roslaunch my_ros_package my_robot.launch
ملخص
- CMakeLists.txt: تعليمات بناء الحزمة.
- package.xml: البيانات الوصفية والاعتماديات.
- launch/: تشغيل عدة عُقد معًا.
- src/: الكود المصدري للعُقد (بلغة C++ أو Python).
- msg/: تعريف أنواع رسائل مخصصة.
- srv/: تعريف أنواع خدمات للتواصل ثنائي الاتجاه.
- scripts/: سكربتات أو أدوات بلغة Python.
- config/: ملفات إعداد تحتوي على معاملات.
تعمل حزمة ROS على تنظيم الكود الخاص بك بشكل مرتب، ما يجعل تطوير أجزاء نظام الروبوت الخاص بك ومشاركتها أمرًا سهلاً.
1. إعداد مساحة عمل ROS (ROS Workspace)
mmabas77@mmabas77-ROS:~/ros$ mkdir ros_ws
mmabas77@mmabas77-ROS:~/ros$ cd ros_ws/
mmabas77@mmabas77-ROS:~/ros/ros_ws$ mkdir src2. بناء مساحة العمل (Workspace)
mmabas77@mmabas77-ROS:~/ros/ros_ws$ catkin_make
mmabas77@mmabas77-ROS:~/ros/ros_ws$ ls3. الانتقال إلى مجلد المصدر (Source Directory)
mmabas77@mmabas77-ROS:~/ros/ros_ws$ cd src/
mmabas77@mmabas77-ROS:~/ros/ros_ws/src$ ls4. إنشاء حزمة ROS
mmabas77@mmabas77-ROS:~/ros/ros_ws/src$ catkin_create_pkg helloworld_pkg roscpp rospy std_msgs
mmabas77@mmabas77-ROS:~/ros/ros_ws/src$ cd helloworld_pkg/
mmabas77@mmabas77-ROS:~/ros/ros_ws/src/helloworld_pkg$ ls
5. إنشاء مجلد للسكربتات (Scripts Directory) - بلغة Python (اختياري)
mmabas77@mmabas77-ROS:~/ros/ros_ws/src/helloworld_pkg$ mkdir scripts6. إنشاء عقدة ناشر (publisher node)
7. إنشاء عقدة مشترك (subscriber node)
8. بناء الحزمة
mmabas77@mmabas77-ROS:~/ros/ros_ws$ catkin_makeتحميل بيئة مساحة العمل (source) - خطوة مهمة جدًا
mmabas77@mmabas77-ROS:~/ros/ros_ws$ source devel/setup.bash9. تشغيل عقدة الناشر (Publisher Node)
mmabas77@mmabas77-ROS:~/ros/ros_ws$ rosrun helloworld_pkg publisher_node10. تشغيل عقدة المشترك (Subscriber Node)
mmabas77@mmabas77-ROS:~/ros/ros_ws$ rosrun helloworld_pkg subscriber_node