Note: This tutorial assumes that you have completed the previous tutorials: Installation et Configuration de Votre Environnement 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. |
Navigation dans le Système de fichier ROS
Description: Ce tutoriel introduit les concepts du système de fichiers ROS, et couvre l'usage des commandes de roscd, rosls,et rospackTutorial Level: BEGINNER
Next Tutorial: Creation d'un package ROS
Contents
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 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.
Contents
Aperçu rapide des concepts du système de fichiers
Package : Le package (ou "paquet")est l'unité de base du code ROS. Chaque package peut contenir des bibliothèques, des exécutables, des scripts ou d'autres objets.
Manifest (package.xml): Un manifeste est une description d'un package. Cela sert à définir les dépendances entre packages et à capturer des méta-informations sur le package comme la version, le gestionnaire, licence, etc ..
Stacks : Une stack (ou "pile") est une collection de packages qui forment ainsi une librairie.
Stack Manifest : Un manifest mais pour une stack
Dans un système de fichiers, il est très facile de reconnaître un package ou une stack:
- Un package est constitué d'un répertoire avec un fichier manifest.xml.
- Une stack est constitué d'un répertoire avec un fichier stack.xml.
Outils système de fichiers
Le code est réparti entre de nombreux packages ROS. La navigation à l'aide des outils en ligne de commande comme ls et cd peut être très fastidieux et c'est pourquoi ROS fournit des outils pour vous aider.
Utiliser rospack
rospack et rosstack vous permet d'obtenir des informations sur les packages et les stacks. Dans ce tutoriel, nous allons seulement parler de l'option find, qui renvoie le chemin du package. Utilisation:
# rospack find [package_name] # rosstack find [stack_name]
Exemple:
rospack find roscpp
Devrait vous renvoyer :
LE_CHEMIN_DE_VOTRE_INSTALLATION/share/roscpp
Si vous avez installé ROS Groovy avec apt sur Ubuntu Linux, vous verriez exactement ceci:
/opt/ros/groovy/share/roscpp
Utiliser roscd
roscd fait partie de la suite rosbash Il vous permet de changer de répertoire (cd) pour se placer directement dans le répertoire d'un package ou d'une stack.
Utilisation:
#roscd [locationname[/subdir]]
Exécuter cet exemple:
roscd roscpp
Pour vérifier que nous pointons maintenant sur le répertoire du package roscpp, nous allons afficher le répertoire dans lequel nous sommes en utilisant la commande Unix pwd :
pwd
Vous devriez avoir:
LE_CHEMIN_DE_VOTRE_INSTALLATION/share/roscpp
Vous pouvez voir que LE_CHEMIN_DE_VOTRE_INSTALLATION/share/roscpp est le même chemin que celui trouvé par rospack dans l'exemple précédent. Notez que ROS_PACKAGE_PATH tapez:
echo $ROS_PACKAGE_PATH
Votre ROS_PACKAGE_PATH doit contenir une liste de répertoires où vous avez des packages ROS, séparés par des caractères ':'. Un ROS_PACKAGE_PATH typique pourrait ressembler à ceci:
/opt/ros/hydro/base/install/share:/opt/ros/hydro/base/install/stacks
De même que pour d'autres variables d'environnement de type PATH, vous pouvez ajouter des répertoires supplémentaires à votre ROS_PACKAGE_PATH, chaque chemin séparés par deux points «:».
Les sous-répertoires
roscd peut également vous placer dans le sous-répertoire d'un package ou d'une stack. Essayez:
roscd roscpp/cmake pwd
Vous devriez voir:
LE_CHEMIN_DE_VOTRE_INSTALLATION/share/roscpp/cmake
Cas particuliers de roscd
Outre les packages et les stacks, il y a d'autres emplacements spécifiques accessibles via roscd.
roscd sans argument
roscd sans argument vous placera directement dans $ROS_WORKSPACE. Essayez ceci:
$ roscd $ pwd
Et vous devriez avoir:
/home/user/fuerte_workspace
Note: Pour les versions antérieures à Fuerte, roscd vous menait à $ROS_ROOT.
roscd log
roscd log vous emmènera dans le dossier où ROS stocke les fichiers log. Notez que si vous n'avez pas encore exécuté de programmes ROS, cela va donner un message d'erreur indiquant que le répertoire n'existe pas encore.
Si vous avez déjà exécuté un programme ROS avant, essayez:
roscd log
Utiliser rosls
rosls fait partie de la suite rosbash Il vous permet d'exécuter ls directement dans un package par son nom plutôt que par un chemin absolu. Utilisation:
# rosls [package_name[/subdir]]
Exemple:
rosls roscpp_tutorials
devrait vous retourner :
cmake package.xml srv
Tab Complétion
Il peut être fastidieux de taper le nom complet d'un package. Dans l'exemple précédent, roscpp_tutorials est un nom assez long. Heureusement, certains outils ROS permettent la complétion avec la touche TAB.
Commencez par taper:
# roscd roscpp_tut<<< maintenant appuyez sur la touche TAB >>>
Après avoir appuyé sur la touche TAB, la ligne de commande doit remplir le reste:
roscd roscpp_tutorials/
Cela fonctionne parce que roscpp_tutorials est actuellement le seul package ROS qui commence par roscpp_tut . Maintenant, essayez de taper:
# roscd tur<<< maintenant appuyez sur la touche TAB >>>
Après avoir appuyé sur la touche TAB, la ligne de commande doit se remplir autant que possible:
roscd turtle
Toutefois, dans ce cas, il y a plusieurs packages qui commencent par turtle. Essayez de taper TAB une seconde fois. Ceci devrait afficher tous les packages ROS qui commencent par turtle :
turtle_actionlib/ turtlesim/ turtle_tf/
Sur la ligne de commande, vous devriez toujours avoir:
roscd turtle
Maintenant, tapez un s après turtle , puis appuyez sur TAB :
# roscd turtles<<< maintenant appuyez sur la touche TAB >>>
Comme il n'y a qu'un seul package qui commence par 'turtles', vous devriez voir:
roscd turtlesim/
En résumé
Vous avez sûrement repéré la convention de nommage des outils ROS:
- rospack = ros + pack (age)
- roscd = ros + cd
- rosls = ros + ls
Ce schéma de nommage est valable pour la plupart des outils ROS.
Maintenant que vous savez vous déplacer dans ROS, nous allons voir comment créer un package .