Creazione di un ROS Package
Description: Questo tutorial copre l'uso del roscreate-pkg oppure del catkin per creare un nuovo package, e rospack per elencare le dipendenze dei package.
Livello Tutorial: PRINCIPIANTE
Prossimo Tutorial: Compilare un ROS package
Contents
Da cosa è composto un catkin Package?
Un package, per essere considerato catkin package deve soddisfare alcuni requisiti:
Il package deve contenere un file catkin compliant package.xml
- Quel file package.xml fornisce meta informazioni sul package
Il package deve contenere un CMakeLists.txt che usa catkin. Catkin metapackages devono avere un file di testo standard CMakeLists.txt.
- Non ci può essere più di un package in ogni folder
- Questo significa che né i package annidati né package multipli condividono la stessa directory
Il package più semplice possibile potrebbe essere come questo:
my_package/ CMakeLists.txt package.xml
Packages in un catkin Workspace
Il metodo di lavoro consigliato con i package di catkin è usare un catkin workspace, ma puoi anche compilare i package di catkin in modo standalone (indipendente). Un banale workspace potrebbe essere come questo:
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
Prima di continuare con questo tutorial, crea un catkin workspace vuoto seguendo il tutorial Creare un Workspace per catkin.
Creare un catkin Package
Questo tutorial mostrerà come usare lo script catkin_create_pkg per creare un nuovo catkin package, e mostra anche cosa puoi fare con quello dopo che è stato creato.
Prima di tutto, passa alla source space directory (directory dello spazio di origine) del catkin workspace che hai creato seguendo il tutorial Creare un Workspace per catkin:
# Dovresti aver creato questo nel Tutorial Creare un Workspace $ cd ~/catkin_ws/src
Ora usa lo script catkin_create_pkg per creare un nuovo package chiamato 'beginner_tutorials' che dipende da std_msgs, roscpp, and rospy:
$ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
Questo creerà un folder beginner_tutorials che contiene un package.xml e un CMakeLists.txt, che sono stati parzialmente riempiti con l'informazione che hai dato in catkin_create_pkg.
catkin_create_pkg richiede che tu gli dia un package_name e opzionalmente un elenco di dipendenze su cui quel package dipende:
# Questo è un esempio, non provare ad eseguirlo # catkin_create_pkg <package_name> [depend1] [depend2] [depend3]
Anche catkin_create_pkg ha funzionalità più avanzate che sono descritte in catkin/commands/catkin_create_pkg.
Dipendenze del package
Dipendenze del primo ordine
Quando in precedenza si usava catkin_create_pkg, sono state fornite alcune dipendenze dei package. Queste dipendenze del primo ordine possono essere ora riviste con il tool rospack.
(Jan 9, 2013) C'é un bug riportato e già fixato in rospack in groovy, che richiede un po' di tempo finché il cambiamento si riflette sul tuo computer. Se vedi un problema simile come questo con il prossimo comando, puoi saltare al prossimo comando.
$ rospack depends1 beginner_tutorials
std_msgs rospy roscpp
Come puoi vedere, rospack elenca le stesse dipendenze che erano usate come argomenti quando si esegue catkin_create_pkg. Queste dipendenze per un package sono memorizzate nel file package.xml:
$ roscd beginner_tutorials $ cat package.xml
<package> ... <buildtool_depend>catkin</buildtool_depend> <build_depend>roscpp</build_depend> <build_depend>rospy</build_depend> <build_depend>std_msgs</build_depend> ... </package>
Dipendenze indirette
In molti casi, anche una dipendenza avrà delle proprie dipendenze. Per esempio, rospy ha altre dipendenze.
(Jan 9, 2013) C'é un bug riportato e già fixato in rospack in groovy, che richiede un po' di tempo finché il cambiamento si riflette sul tuo computer. Se vedi a similar issue like this con il prossimo comando, puoi saltare al prossimo comando.
$ rospack depends1 rospy
genpy rosgraph rosgraph_msgs roslib std_msgs
Un package può avere un paio di dipendenze indirette. Fortunatamente rospack può ricorsivamente determinare tutte le dipendenze annidate.
$ rospack depends beginner_tutorials cpp_common rostime roscpp_traits roscpp_serialization genmsg genpy message_runtime rosconsole std_msgs rosgraph_msgs xmlrpcpp roscpp rosgraph catkin rospack roslib rospy
Personalizzazione del tuo Package
Questa parte del tutorial mosterà ogni file generato da catkin_create_pkg e descriverà, linea per linea, ogni componente di questi file e come puoi personalizzarli per il tuo package.
Personalizzare il package.xml
Il package.xml generato dovrebbe essere nel tuo nuovo package. Ora portiamoci al package.xml e ritocchiamo alcuni elementi che necessitano la tua attenzione.
description tag
Prima di tutto, aggiorna il description tag (tag descrizione):
<description>The beginner_tutorials package</description>
Modifica la descrizione con qualcosa che ti piace, ma per convenzione, la prima frase deve essere corta dato che copre il campo del package. Se è difficile descrivere il package con una singola frase, allora potrebbe essere necessario spezzarla.
maintainer tags
In seguito abbiamo il maintainer tag (tag manutentore):
<!-- One maintainer tag required, multiple allowed, one person per tag --> <!-- Example: --> <!-- <maintainer email="jane.doe@example.com">Jane Doe</maintainer> --> <maintainer email="user@todo.todo">user</maintainer>
Questo è un tag necessario e importante per il package.xml perché permette ad altre persone di sapere chi contattare per avere informazioni sul package. E' richiesto almeno un maintainer (manutentore), ma se vuoi ne puoi avere molti. Il nome del maintainer va all'interno del body del tag, ma c'é anche un attributo email che deve essere riempito:
<maintainer email="you@yourdomain.tld">Your Name</maintainer>
license tags
Il prossimo è il license tag, anch'esso richiesto:
<!-- One license tag required, multiple allowed, one license per tag --> <!-- Commonly used license strings: --> <!-- BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv3 --> <license>TODO</license>
Devi scegliere una licenza e riempirla qui. Alcune comuni licenze open source sono BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, e LGPLv3. Puoi avere informazioni riguardo ciò su Open Source Initiative. Per questo tutorial noi useremo la BSD license perché il resto dei componenti del core ROS la usa già:
<license>BSD</license>
dependencies tags
Il prossimo set di tag descrive le dipendenze del tuo package. Le dipendenze sono divise in build_depend, buildtool_depend, run_depend, test_depend. Per una spiegazione più dettagliata di questi tag, vedi la documentazione su Catkin Dependencies. Dal momento che abbiamo passato std_msgs, roscpp, e rospy come argomenti al catkin_create_pkg, le dipendenze saranno come queste:
<!-- The *_depend tags are used to specify dependencies --> <!-- Dependencies can be catkin packages or system dependencies --> <!-- Examples: --> <!-- Use build_depend for packages you need at compile time: --> <!-- <build_depend>genmsg</build_depend> --> <!-- Use buildtool_depend for build tool packages: --> <!-- <buildtool_depend>catkin</buildtool_depend> --> <!-- Use run_depend for packages you need at runtime: --> <!-- <run_depend>python-yaml</run_depend> --> <!-- Use test_depend for packages you need only for testing: --> <!-- <test_depend>gtest</test_depend> --> <buildtool_depend>catkin</buildtool_depend> <build_depend>roscpp</build_depend> <build_depend>rospy</build_depend> <build_depend>std_msgs</build_depend>
Tutte le nostre dipendenze elencate sono state aggiunte come un build_depend per noi, oltre al buildtool_depend di default su catkin. In questo caso, vogliamo che tutte le nostre dipendenze specificate siano disponibili alla compilazione e al run time, quindi dobbiamo aggiungere un run_depend tag per ognuno di loro come di seguito:
<buildtool_depend>catkin</buildtool_depend> <build_depend>roscpp</build_depend> <build_depend>rospy</build_depend> <build_depend>std_msgs</build_depend> <run_depend>roscpp</run_depend> <run_depend>rospy</run_depend> <run_depend>std_msgs</run_depend>
Il package.xml finale
Come puoi vedere, il package.xml finale, senza commenti e tag inutilizzati, è molto più conciso:
<?xml version="1.0"?> <package> <name>beginner_tutorials</name> <version>0.1.0</version> <description>The beginner_tutorials package</description> <maintainer email="you@yourdomain.tld">Your Name</maintainer> <license>BSD</license> <url type="website">http://wiki.ros.org/beginner_tutorials</url> <author email="you@yourdomain.tld">Jane Doe</author> <buildtool_depend>catkin</buildtool_depend> <build_depend>roscpp</build_depend> <build_depend>rospy</build_depend> <build_depend>std_msgs</build_depend> <run_depend>roscpp</run_depend> <run_depend>rospy</run_depend> <run_depend>std_msgs</run_depend> </package>
Personalizzazione del CMakeLists.txt
Ora che package.xml, che contiene le meta informazioni, è stato adattato al tuo package, sei pronto a passare ai prossimi tutorial. Il file CMakeLists.txt creato con catkin_create_pkg sarà mostrato nei prossimi tutorial riguardo la compilazione del ROS code.
Ora che hai creato un nuovo ROS package, compiliamo il nostro ROS package.