[Documentation] [TitleIndex] [WordIndex

ما هي مكونات حزمة catkin؟

كي تعتبر حزمة ما حزمة catkin يجب أن تحقق المتطلبات التالية:

أبسط شكل للحزمة يبدو على الشكل التالي:

  • my_package/
      CMakeLists.txt
      package.xml

الحُزَم في فضاء عمل catkin

الطريقة المفضلة للتعامل مع حزم catkin هي استخدام فضاء عمل catkin، لكن يمكن بناء حزم catkin بشكل مستقل. فضاء العمل في أبسط أشكاله يبدو كما يلي:

  • workspace_folder/        -- WORKSPACE
      src/                   -- SOURCE SPACE
        CMakeLists.txt       -- 'Toplevel' CMake file, provided by catkin
        package_1/
          CMakeLists.txt     -- CMakeLists.txt file for package_1
          package.xml        -- Package manifest for package_1
        ...
        package_n/
          CMakeLists.txt     -- CMakeLists.txt file for package_n
          package.xml        -- Package manifest for package_n

قبل متابعة هذا الدرس، أنشأ مجلداً فارغاً (كما في الدرس السابق إنشاء فضل عمل catkin).

إنشاء حزمة catkin

تبين الفقرات التالية كيفية استخدام الملف catkin_create_pkg لإنشاء حزمة جديدة، وماذا يمكن أن تفعل بالحزمة بعد ذلك.

أولاً غير مسار موجه الأوامر إلى مجلد الرمازا المصدري (src) الذي أنشأته في الدرس السابق إنشاء فضاء عمل catkin

‎# You should have created this in the Creating a Workspace Tutorial

‎$ cd ~/catkin_ws/src

الآن استخدم التعليمة catkin_create_pkg لإنشاء حزمة اسمها 'beginner_tutorials' تعتمد على المكتبات std_msg، roscpp، rospy:

‎$ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp

تنشئ هذه التعليمة مجلداً beginner_tutorials يحتوي على ملفي التوصيف package.xml والبناء CMakeLists.txt. واللذان تم ملؤهما بمعلومات مناسبة لاسم الحزمة والمكتبات المعتمدة عليها، وتعليمات مناسبة للبناء، وأخرى عن صاحب الحزمة.

تتطلب التعلمية catkin_create_pkg اسم الحزمة package_name واختيارياً أسماء المكتبات التي تعتمد الحزمة عليها، أي لها القالب التالي (لا تحاول تنفيذه):

‎# This is an example, do not try to run this # catkin_create_pkg <package_name> [depend1] [depend2] [depend3]

تؤمن catkin_create_pkg وظائف متقدمة أكثر، موصفة في الرابط catkin/commands/catkin_create_pkg.

بناء فضاء عمل catkin، والتصريح عن ملف الإعداد

ابنِ الحزم في فضاء عمل catkin باستخدام التعليمة:

‎$ cd ~/catkin_ws

‎$ catkin_make

عندما تنتهي عملية البناء، نكون قد حصلنا على مجلد بناء build ومجلد تطوير devel داخل مجلد فضاء العمل (شبيه بمجلد التطوير في المسار /opt/ros/$ROSDISTRO_NAME).

لإضافة فضاء العمل إلى بيئة ROS يجب التصريح عن ملف الإعداد المنشأ تلقائياً في مجلد التطوير:

‎$ . ~/catkin_ws/devel/setup.bash

مُعتَمَدات الحزمة

=== معتمدات المرتبة الأولى ==

عند استخدام catkin_create_pkg، تُؤمَّن بشكل تلقائي عدة مكتبات. تعتبر هذه المكتبات كمعتمدات من المرتبة الأولى. يمكن عرضها باستخدام أدوات rospack.

‎$ rospack depends1 beginner_tutorials

كما ترى فإن القائمة المعروضة تحتوي العمتمدات نفسها التي ذكرناها عند إنشاء الحزمة باستخدام catkin_create_pkg. هذه المعتمدات مخزنة داخل ملف التوصيف package.xml:

‎$ roscd beginner_tutorials $ cat package.xml

المُعتمَدات غير المُباشَرة

في كثير من الأحيان يكون للمكتبة المعتمد عليها مكتبات أخرى تعتمد هي عليها. مثلاً rospy لها معتمداتها:

‎$ rospack depends1 rospy

كما يمكن للحزمة أن تمتلك معتمدات غير مباشرة. تسمح rospack وبشكل عودي recursively بتحديد المكتبات المعتمد عليها بشكلٍ متتالٍ nested.

‎$ rospack depends beginner_tutorials

cpp_common rostime roscpp_traits roscpp_serialization catkin genmsg genpy message_runtime gencpp geneus gennodejs genlisp message_generation rosbuild rosconsole std_msgs rosgraph_msgs xmlrpcpp roscpp rosgraph ros_environment rospack roslib rospy

تخصيص حزمتك

هذا الجزء من الدرس سينظر إلى الملفات المولدة باستخدام catkin_create_pkg وتوصيفها سطراً بسطر، وكل مكون من هذه الملفات وكيفية تخصيصه.

تخصيص ملف التوصيف package.xml

ملف التوصيف المولد package.xml يجب أن يكون في داخل مجلد الحزمة. لنبحث في داخل هذا الملف ومكوناته.

علامة التوصيف

أولاً حدث علامة التوصيف description tag:

   5   <description>The beginner_tutorials package</description>

غير التوصيف لأي شيء تريده، بجملة مختزلة، يفضل أن تكون قصيرة ومعبرة عن وظيفة الحزمة. في حال استحالة ذلك يمكن تقسيم الجملة إلى عدة جمل.

علامات المشرفين

ثم تأتي علامة المشرف maintainer tag:

   7   <!-- One maintainer tag required, multiple allowed, one person per tag --> 
   8   <!-- Example:  -->
   9   <!-- <maintainer email="jane.doe@example.com">Jane Doe</maintainer> -->
  10   <maintainer email="user@todo.todo">user</maintainer>

تعتبر هذه العلامة ضرورية ومهمة للحزمة package.xml لأنها تخبر المستخدمين الآخرين عن كيفية التواصل مع صاحب الحزمة. يجب إضافة مشرف واحد على الأقل، ويمكن إضافة أكثر من مشرف. اسم المشرف يكتب في عرض العلامة، أما بريده الإلكتروني فله علامة خاصة.

   7   <maintainer email="you@yourdomain.tld">Your Name</maintainer>

علامات الترخيص

تعتبر علامة الترخيص license مهمة

  12   <!-- One license tag required, multiple allowed, one license per tag -->
  13   <!-- Commonly used license strings: -->
  14   <!--   BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv3 -->
  15   <license>TODO</license>

يسمح الترخيص بمعرفة ماذا يمكن أن يفعل المطور الآخر بهذه الحزمة، مثلاً يمكن أن يستخدمها لأغراض تطويرية وليس تجارية ، أو كليهما أو غير ذلك. من أشهر التراخيص المستخدمة:

يمكنك قراءة تفاصيل هذه التراخيص في الرابط: Open Source Initiative. في هذه الدروس سنستخدم ترخيص BSD لأن مكونات ROS الأخرى تستخدمه.

   8   <license>BSD</license>

علامات المعتمدات

تقسم إلى عدة علامات: build_depend، buildtool_depend، exec_depend، test_depend. لمعرفة المزيد عنها انظر الرابط Catkin Dependencies. باعتبار أننا أضفنا المكتبات std_msgs، roscpp، rospy كقيم لتعليمة catkin_create_pkg، ستبدو علامات المعتمدات كما يلي::

  27   <!-- The *_depend tags are used to specify dependencies -->
  28   <!-- Dependencies can be catkin packages or system dependencies -->
  29   <!-- Examples: -->
  30   <!-- Use build_depend for packages you need at compile time: -->
  31   <!--   <build_depend>genmsg</build_depend> -->
  32   <!-- Use buildtool_depend for build tool packages: -->
  33   <!--   <buildtool_depend>catkin</buildtool_depend> -->
  34   <!-- Use exec_depend for packages you need at runtime: -->
  35   <!--   <exec_depend>python-yaml</exec_depend> -->
  36   <!-- Use test_depend for packages you need only for testing: -->
  37   <!--   <test_depend>gtest</test_depend> -->
  38   <buildtool_depend>catkin</buildtool_depend>
  39   <build_depend>roscpp</build_depend>
  40   <build_depend>rospy</build_depend>
  41   <build_depend>std_msgs</build_depend>

كل المعتمدات قد أضيفت إلى علامة البناء build_depend، وإلى علامة أداء البناء buildtool_depend الخاصة بأداة catkin. ولأننا نحتاج أن تكون كل مكتباتنا متوافرة لمحلتي البناء والتشغيل، فقد أضيفت ايضاً إلىعلامة التشغيل exec_depend:

  12   <buildtool_depend>catkin</buildtool_depend>
  13 
  14   <build_depend>roscpp</build_depend>
  15   <build_depend>rospy</build_depend>
  16   <build_depend>std_msgs</build_depend>
  17 
  18   <exec_depend>roscpp</exec_depend>
  19   <exec_depend>rospy</exec_depend>
  20   <exec_depend>std_msgs</exec_depend>

إنهاء package.xml

أخيراً يبدو ملف التوصيف package.xml بدون أي تعليقات كما يلي:

   1 <?xml version="1.0"?>
   2 <package format="2">
   3   <name>beginner_tutorials</name>
   4   <version>0.1.0</version>
   5   <description>The beginner_tutorials package</description>
   6 
   7   <maintainer email="you@yourdomain.tld">Your Name</maintainer>
   8   <license>BSD</license>
   9   <url type="website">http://wiki.ros.org/beginner_tutorials</url>
  10   <author email="you@yourdomain.tld">Jane Doe</author>
  11 
  12   <buildtool_depend>catkin</buildtool_depend>
  13 
  14   <build_depend>roscpp</build_depend>
  15   <build_depend>rospy</build_depend>
  16   <build_depend>std_msgs</build_depend>
  17 
  18   <exec_depend>roscpp</exec_depend>
  19   <exec_depend>rospy</exec_depend>
  20   <exec_depend>std_msgs</exec_depend>
  21 
  22 </package>

تخصيص ملف البناء CMakeLists.txt

بعد الانتهاء من تخصيص ملف التوصيف package.xml الذي يحوي معلومات وسيطة، يمكنك الانتقال إلى تخصيص ملف البناء. إن الملف CMakeLists.txt الذي أنشأ باستخدام التعليمة catkin_create_pkg سيناقش في دروس لاحقة.


2023-10-28 12:25