<> == Utilisation de roscreate == Pour créer un package, la commande `roscreate-pkg` permet de créer un nouveau [[Packages|package]] au format ROS. Tous les packages ROS sont constitués d'un certain nombre de fichiers, toujours sur le même modèle : [[Manifest|manifests]], [[CMakeLists|CMakeLists.txt]], mainpage.dox, et Makefiles. La commande roscreate-pkg simplifie les nombreuses étapes du processus laborieux de création à la main d'un package, et évite les erreurs courantes que l'on aurait eues en éditant à la main les fichiers de build et les manifestes correspondants. Pour créer un nouveau package dans le répertoire courant, on peut taper: {{{ # roscreate-pkg [package_name] }}} Mais on peut aussi préciser les dépendances de ce package par la commande: {{{ # roscreate-pkg [package_name] [depend1] [depend2] [depend3] }}} == Creation d'un nouveau package ROS == Maintenant nous allons nous rendre dans notre 'home' ou notre répertoire projet, pour créer un package {{{beginner_tutorials}}} que nous ferons dépendre de [[std_msgs]], [[roscpp]], and [[rospy]], qui sont des packages ROS courants. Pour se rendre dans le dossier ~/fuerte_workspace/sandbox on peut faire: {{{ $ cd ~/fuerte_workspace/sandbox }}} Mais, pour les versions ROS Fuerte ou ultérieures, vous pouvez plus simplement faire: {{{ $ roscd $ cd sandbox }}} A partir de là, créez votre package: {{{ $ roscreate-pkg beginner_tutorials std_msgs rospy roscpp }}} Vous obtiendrez une sortie ressemblant à ceci : {{{ Creating package directory ~/fuerte_workspace/sandbox/beginner_tutorials Creating include directory ~/fuerte_workspace/sandbox/beginner_tutorials/include/beginner_tutorials Creating cpp source directory ~/ros/ros_tutorials/beginner_tutorials/src Creating python source directory ~/fuerte_workspace/sandbox/beginner_tutorials/src/beginner_tutorials Creating package file ~/fuerte_workspace/sandbox/beginner_tutorials/Makefile Creating package file ~/fuerte_workspace/sandbox/beginner_tutorials/manifest.xml Creating package file ~/fuerte_workspace/sandbox/beginner_tutorials/CMakeLists.txt Creating package file ~/fuerte_workspace/sandbox/beginner_tutorials/mainpage.dox Please edit beginner_tutorials/manifest.xml and mainpage.dox to finish creating your package }}} Vous voudrez sûrement passer un moment à regarder plus attentivement le fichier `beginner_tutorials/manifest.xml`. Les fichiers [[Manifest|manifests]] jouent un rôle important pour ROS car ils définissent comment les packages sont construits, lancés et documentés. Vérifions que ROS trouve bien notre nouveau package. Il est souvent utile d'appeler ''rospack profile'' après toute modification au 'path' pour s'assurer que les nouveaux chemins des répertoires sont bien trouvés: {{{ $ rospack profile $ rospack find beginner_tutorials }}} {{{ YOUR_PACKAGE_PATH/beginner_tutorials }}} En cas d'erreur, cela implique que ROS ne parvient pas à trouver le nouveau package, ce qui provient probablement d'un problème avec la variable `ROS_PACKAGE_PATH`. Reportez-vous bien aux instructions d'installation de ROS, que celle-ci ait été faite depuis un repository SVN ou à partir d’exécutables binaires déjà compilés pour vous. Dans le cas où votre nouveau package de trouve à un emplacement situé en dehors des chemins déjà déclarés pour des packages existants, il faudra amender votre adapter d'environnement [[ROS/EnvironmentVariables#ROS_PACKAGE_PATH|ROS_PACKAGE_PATH]] pour y ajouter le nouveau chemin. Ensuite, essayez de sourcer à nouveau votre setup.sh dans votre dossier fuerte_workspace. Essayons d'aller dans le dossier du package. {{{ $ roscd beginner_tutorials $ pwd }}} {{{ YOUR_PACKAGE_PATH/beginner_tutorials }}} == Dépendances de premier ordre du package == Lorsque nous avons appelé {{{roscreate-pkg}}} précédemment, nous avons précisé quelques dépendances de packages. On peut refaire une passe sur ces dépendances '''de premier ordre''' avec l'outil {{{rospack}}} . {{{#!wiki blue/solid (9 Jan 2013) Il y a [[https://github.com/ros/rospack/issues/4|un bug]] reporté et déjà corrigé dans [[rospack]] en version `groovy`; cette correction peut prendre un certain temps à se propager dans les packages. Si vous observer [[http://answers.ros.org/question/51555/beginner-tutorials-segmentation-fault-with-rospack-depends1/?comment=51762#comment-51762|un problème similaire à celui-ci]] avec la commande suivante, vous pouvez sauter à la commande qui suit. }}} {{{ $ rospack depends1 beginner_tutorials }}} {{{ std_msgs rospy roscpp }}} Comme vous pouvez le constater, {{{rospack}}} rend éxactement la même liste de dépendances que celle que nous avions fournie avec {{{roscreate-pkg}}}. Ces dépendances sont enregistrées au niveau du fichiher '''manifest''' du package. Allez jeter un œil à ce fichier manifest. {{{ $ roscd beginner_tutorials $ cat manifest.xml }}} {{{ ... }}} == Dépendances indirectes du package == Dans la plupart des cas, chaque dépendance aura aussi d'autres dépendances. Par exemple, `rospy` a d'autres dépendances. {{{#!wiki blue/solid (9 Jan 2013) Il y a [[https://github.com/ros/rospack/issues/4|un bug]] reporté et déjà corrigé dans [[rospack]] en version `groovy`; cette correction peut prendre un certain temps à se propager dans les packages. Si vous observer [[http://answers.ros.org/question/51555/beginner-tutorials-segmentation-fault-with-rospack-depends1/?comment=51762#comment-51762|un problème similaire à celui-ci]] avec la commande suivante, vous pouvez sauter à la commande qui suit. }}} {{{ $ rospack depends1 rospy }}} {{{ roslib roslang }}} Un même package peut ainsi avoir un certain nmbre de dépendances indirectes. Par chance, {{{rospack}}} permet de déterminer de façon récursive toutes les dépendances filles. {{{ $ rospack depends beginner_tutorials }}} {{{ rospack roslib std_msgs rosgraph_msgs rosbuild roslang rospy cpp_common roscpp_traits rostime roscpp_serialization xmlrpcpp rosconsole roscpp }}} Note: en version Fuerte, la liste est bien plus courte: {{{ std_msgs roslang rospy roscpp }}} == Librairies des clients ROS == On peut se demander ce que sont ces dépendances {{{rospy}}} et {{{roscpp}}} dans l'exmple précédent. Ces librairies {{{rospy}}} et {{{roscpp}}}sont en fait les [[Client Libraries || librairies client ROS]]. Ces librairies client permettent aux différents langages de programmation à communiquer dans ROS. {{{rospy}}} est la librairie client pour Python. {{{roscpp}}} est la librairie client pour le C++. == En résumé == Revenos sur quelques commandes que nous avons utilisées ici: * roscreate-pkg = ros+create-pkg : crée tous les fichiers nécessaires pour créer un package ROS * rospack = ros+pack(age) : fournit les informations relatives à un package ROS * rosstack = ros+stack : fournit les informations relatives à une stack ROS