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

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.

Wiki: it/ROS/Tutorials/CreatingPackage (last edited 2013-10-20 19:39:46 by Il_Voza)