Note: This tutorial assumes that you have completed the previous tutorials: تثبيت بيئة ROS وإعدادها.
(!) Please ask about problems and questions regarding this tutorial on answers.ros.org. Don't forget to include in your question the link to this page, the versions of your OS & ROS, and also add appropriate tags.

التعرف على نظام ملفات ROS

Description: يقدم هذا الدرس مفاهيم نظام الملفات في ROS، ويتضمن استخدام أدوات موجه الأوامر roscd و rosls و rospack.

Tutorial Level: BEGINNER

Next Tutorial: Creating a ROS package

اختر "catkin" أو "rosbuild" من القائمة. نظام البناء القديم "rosbuild" لم يعد مدعوماً واستبدل بنظام بناء "catkin". للمستخدمين الجدد استخدم catkin. لمزيد من التفاصيل انظر الروابط التالية:

  1. catkin

  2. catkin/conceptual_overview

  3. catkin_or_rosbuild

  4. rosbuild

Prerequisites

For this tutorial we will inspect a package in ros-tutorials, please install it using

$ sudo apt-get install ros-<distro>-ros-tutorials

Replace '<distro>' (including the '<>') with the name of your ROS distribution (e.g. hydro, groovy, electric, fuerte etc.)

Quick Overview of Filesystem Concepts

  • Packages: Packages are the lowest level of ROS software organization. They can contain anything: libraries, tools, executables, etc.

  • Manifest: A manifest is a description of a package. Its most important role is to define dependencies between packages.

  • Stacks: Stacks are collections of packages that form a higher-level library.

  • Stack Manifest: These are just like normal manifests, but for stacks.

When you look at the filesystem, it's easy to tell packages and stacks apart:

  • A package is a directory with a manifest.xml file.
  • A stack is a directory with a stack.xml file.


filesystem_layout.png

Filesystem Tools

Code is spread across many ROS packages and stacks. Navigating with command-line tools such as ls and cd can be very tedious which is why ROS provides tools to help you.

Using rospack and rosstack

rospack and rosstack allow you to get information about packages and stacks. In this tutorial, we are only going to cover the find option, which returns the path to package or stack.

Usage:

$ rospack find [package_name]
$ rosstack find [stack_name]

Example:

$ rospack find roscpp

Would return:

  • YOUR_INSTALL_PATH/share/roscpp

If, for example, you have used the binary install of ROS Fuerte on Ubuntu linux, you would see exactly:

  • /opt/ros/fuerte/share/roscpp

Using roscd

roscd is part of the rosbash suite. It allows you to change directory (cd) directly to a package or a stack.

Usage:

$ roscd [locationname[/subdir]]

Run this example:

$ roscd roscpp

To verify that we have changed to the roscpp package directory. Now let's print the working directory using the Unix command pwd:

$ pwd

You should see:

  • YOUR_INSTALL_PATH/share/roscpp

You can see that YOUR_INSTALL_PATH/share/roscpp is the same path that rospack find gave in the previous example.

Note that roscd, like other ROS tools, will only find ROS packages that are below the directories listed in your $ROS_PACKAGE_PATH. To see what is in your $ROS_PACKAGE_PATH, type:

$ echo $ROS_PACKAGE_PATH

If you have not modified your $ROS_PACKAGE_PATH, you should see:

  • YOUR_INSTALL_PATH/share:YOUR_INSTALL_PATH/stacks

Similarly to other environment paths, you can add additional directories to your $ROS_PACKAGE_PATH, with each path separated by a colon ':'

Subdirectories

roscd can also move to a subdirectory of a package or stack.

Try:

$ roscd roscpp/cmake
$ pwd

You should see:

  • YOUR_INSTALL_PATH/share/roscpp/cmake

Special cases for roscd

There are a few special places you can tell roscd to go, that are not a package or stack.

roscd with no arguments

roscd without an argument will take you to $ROS_WORKSPACE. Try:

$ roscd
$ pwd

You should see:

  •  /home/user/fuerte_workspace

Note: Prior to Fuerte, roscd would take you to $ROS_ROOT.

roscd log

roscd log will take you to the folder where ROS stores log files. Note that if you have not run any ROS programs yet, this will yield an error saying that it does not yet exist.

If you have run some ROS program before, try:

$ roscd log

Using rosls

rosls is part of the rosbash suite. It allows you to ls directly in a package, stack, or common location by name rather than by package path.

Usage:

$ rosls [locationname[/subdir]]

Example:

$ rosls roscpp_tutorials

Would return:

  • bin  cmake  manifest.xml  srv

Tab Completion

It can get tedious to type out an entire package name. In the previous example, roscpp_tutorials is a fairly long name. Luckily, some ROS tools support TAB completion.

Start by typing:

$ roscd roscpp_tut<<< now push the TAB key >>>

After pushing the TAB key, the command line should fill out the rest.

  • $ roscd roscpp_tutorials/

This works because roscpp_tutorials is currently the only ROS package that starts with roscpp_tut.

Now try typing:

$ roscd tur<<< now push the TAB key >>>

After pushing the TAB key, the command line should fill out as much as possible:

  • $ roscd turtle

However, in this case there are multiple packages that begin with turtle. Try typing TAB another time. This should display all the ROS packages that begin with turtle

  •   turtle_actionlib/  turtlesim/         turtle_tf/

On the command line you should still have

  • $ roscd turtle

Now type a s after turtle and then push TAB

$ roscd turtles<<< now push the TAB key >>>

Since there is only one package that start with turtles, you should see:

  • $ roscd turtlesim/

Review

You may have noticed a pattern with the naming of the ROS tools:

  • rospack = ros + pack(age)
  • rosstack = ros + stack
  • roscd = ros + cd
  • rosls = ros + ls

This naming pattern holds for many of the ROS tools.

المتطلبات

في هذ الدرس سنتعامل مع حزم من (ros-tutorials)، لذا ثبت هذه الحزمة باستخدام التعليمة:

‎$ sudo apt-get install ros-<distro>-ros-tutorials

استبدل '<distro>' باسم نسخة ROS المطلوبة (noetic).

نظرة سريعة على مفاهيم نظام الملفات

  • الحزم: الحزمة هي وحدة تنظيم البرامج والرمازات المصدرية في ROS. كل حزمة تحتوي على المكتبات، والنسخ التنفيذية، والنصوص، وغير ذلك...

  • التوصيفات (package.xml): التوصيف (Manifest) هو توصيف للحزمة. يعرف المكتبات المعتمد عليها بين الحزم، ويحتفظ بالمعلومات الواسطة (Meta) عن الحزمة مثل رقم الإصدار والمشرف والرخصة وغير ذلك...

أدوات نظام الملفات

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

اسخدام rospack

تسمح rospack بالحصول على معلومات عن الحزم. في هذا الدرس، سنركز على خيار البحث find والذي يرجع مسار الحزمة.

الاستخدام:

‎$ rospack find [package_name]

مثال:

‎$ rospack find roscpp

النتيجة:

  • YOUR_INSTALL_PATH/share/roscpp

إذا ثُبَِت ROS Noetic باستخدام apt على نظام Ubuntu Linux فيجب الحصول على:

  • /opt/ros/noetic/share/roscpp

استخدام roscd

تعتبر roscd جزءاً من مجموعة rosbash. تسمح بتغيير المجلد (cd) مباشرة نحو الحزمة.

الاستخدام:

‎$ roscd <package-or-stack>[/subdir]

للانتقال إلى مجلد حزمة roscpp نفذ:

‎$ roscd roscpp

للتحقق، نطبع مجلد العمل الحالي باستخدام تعليمة Unix pwd:

‎$ pwd

ويجب الحصول على:

  • YOUR_INSTALL_PATH/share/roscpp

حيث YOUR_INSTALL_PATH/share/roscpp هو مسار rospack find نفسه في التعليمة السابقة.

لاحظ أن roscd مثل كل أدوات ROS ستجد فقط الحزم الموجودة في المجلدات المكتوبة في متحول البيئة ROS_PACKAGE_PATH. لرؤية محتوى المتحول ROS_PACKAGE_PATH أكتب:

‎$ echo $ROS_PACKAGE_PATH

يجب أن يحتوي المتحول ROS_PACKAGE_PATH قائمة بأسماء مجلدات الحزم يفصل في ما بينها فاصلة منقوطة. بعد التثبيت يجب أن يكون ROS_PACKAGE_PATH بالشكل:

  • /opt/ros/noetic/base/install/share

مثل كل متحولات البيئة يمكن إضافة مجلدات أخرى إليه بإذافة فاصلة منقوطة في نهايته ومسار المجلد.

المجلدات الفرعية

يمكن للتعليمة roscd أن تنقل مجلد العمل إلى مجلد فرعي داخل الحزمة.

جرب:

‎$ roscd roscpp/cmake

‎$ pwd

يجب أن تحصل على:

  • YOUR_INSTALL_PATH/share/roscpp/cmake

roscd log

تأخذك التعليمة roscd log إلى المجلد الذي يخزن فيه ROS ملفات التسجيل. ملاحظة: في حال لم تكن قد شغلت أي برنامج ROS حتى الآن فستحصل على خطأ، لأن هذا المجلد غير موجود بعد.

في حال كنت قد شغلت أحد برامج Ros من قبل جرب التعليمة:

‎$ roscd log

استخدام rosls

إن rosls جزء من مجموعة rosbash. تسمح ls بكتابة أسماء الملفات والمجلدات في الحزمة من دون الحاجة لكتابة المسار المطلق للحزمة. الاستخدام:

‎$ rosls <package-or-stack>[/subdir]

مثال:

‎$ rosls roscpp_tutorials

النتيجة:

  • cmake launch package.xml srv

التكميل التلقائي باستخدام زر Tab

في حال كانت كتابة اسم الحزمة بشكل كامل صعباً، فيمكن استخدام التكميل التلقائي باستخدام الزر TAB TAB completion، حيث نكتفي بكتابة الحروف الأولى ثم ضغط زر TAB، مثلاً في المثال السابق كانت roscpp_tutorials طويلة، لذا نكتب:

‎$ roscd roscpp_tut<<< now push the TAB key >>>‎

وبعد الضغط على زر TAB يتم التكميل بشكل تلقائي:

‎$ roscd roscpp_tutorials/‎

ينجح الإكمال عندما يكون هناك خيار واحد فقط للتكميل، أما عند وجود اكثر من خيار فلنجرب:

‎$ roscd tur<<< now push the TAB key >>>‎

نلاحظ بعد ضغط زر TAB أن التكميل التلقائي تم بحيث يكمل أكثر ما يمكن:

‎$ roscd turtle

أما الباقي، ففي هذه الحالة توجد عدة حزم تبدأ بالكلمة turtle لذلك نضغط الزر TAB مرة أخرى وهذا سيظهر كل الحزم التي تبدأ بالكلمة turtle:

  • turtle_actionlib/ turtlesim/ turtle_tf/

على موجه الأوامر حالياً لا تزال التعليمة هي:

‎$ roscd turtle

وبمجرد كتابة حرف يميز الحزمة التي نريد مثل s، نضغط TAB:

‎$ roscd turtles<<< now push the TAB key >>>‎

ولأنه بقيت حزمة واحدة تبدأ بالكلمة الجديدة turtles فإنه يتم الإكمال بشكل تلقائي لكامل اسم الحزمة:

‎$ roscd turtlesim/‎

إن أردت الحصول على قائمة بأسماء الحزم المثبتة حالياً، يمكن كذلك استخدام الإكمال التلقائي:

‎$ rosls <<< now push the TAB key twice >>>‎

مراجعة

من السهل رؤية الشبه بين أدوات ROS وتعليمات Linux المقابلة:

  • rospack = ros + pack(age)
  • roscd = ros + cd
  • rosls = ros + ls

يستخدم هذا الأسلوب في التشابه مع أدوات ROS الأخرى.

Now that you can get around in ROS, let's create a package.

Wiki: ar/ROS/Tutorials/NavigatingTheFilesystem (last edited 2022-09-01 17:20:19 by NadimArubai)