Creado paquetes de ROS

Este tutotial explica el uso de roscreate-pkg o catkin para crear nuevos paquetes, y rospack para listar las dependenciar. El paquete que se creará en este tutorial esta disponible aquí.

¿Qué hace que un paquete sea catkin?

PAra que un paquete sea considerado catkin debe cumplir una serie de requisitos:

  • El paquete tiene que contener un archico complatible package.xml. Este fichero package.xml proporciona meta informacion acerca del paquete.
  • El paquete debe contener un CMakeLists.txt que usará catkin..
  • No debe haber más de un paquete en cada carpeta. Esto significa que no hay paquete anidados ni varios paquetes que compartan el mismo directorio.

El paquete más simple tendría el siguiente aspecto:

my_package/
  CMakeLists.txt
  package.xml

Paquete en el espacio de trabajo de catkin

El método recomendado para trabajar con paquetes catkin packages es usar el espacio de trabajo de catkin, pero también se puede construir paquetes catkin de manera independiente. Un espacio de trabajo trivial tendría el siguiente aspecto:

workspace_folder/         -- CATKIN WORKSPACE
  src/                    -- SOURCE SPACE
    CMakeLists.txt        -- The 'toplevel' CMake file
    package_1/
      CMakeLists.txt
      package.xml
      ...
    package_n/
      CMakeLists.txt
      package.xml
      ...
  build/                  -- BUILD SPACE
    CATKIN_IGNORE         -- Keeps catkin from walking this directory
  devel/                  -- DEVELOPMENT SPACE (set by CATKIN_DEVEL_PREFIX)
    bin/
    etc/
    include/
    lib/
    share/
    .catkin
    env.bash
    setup.bash
    setup.sh
    ...
  install/                -- INSTALL SPACE (set by CMAKE_INSTALL_PREFIX)
    bin/
    etc/
    include/
    lib/
    share/
    .catkin
    env.bash
    setup.bash
    setup.sh
    ...

En la placa Erle, el espacio de trabajo catkinesta en /root/catkin_ws.

Si quieres crear otro espacio de trabajo catkin, sigue las siguientes instrucciones.

Creado un paquete catkin

Esta sección demuestra como usar el script catkin_create_pkg para crear un nuevo paquete catkin, y que hacer después de haber sido creado.

Primero cambia el espacio de trabajo al espacio de trabajo de catkin:

# You should have created this in the Creating a Workspace Tutorial
$ cd ~/catkin_ws/src

Ahora utiliza el script catkin_create_pkg para crear un nuevo paquete denominado 'erle_beginner_tutorials' que depende de std_msgs, roscpp, y rospy:

root@erlerobot:~/catkin_ws/src# catkin_create_pkg erle_beginner_tutorials std_msgs rospy roscpp
Created file erle_beginner_tutorials/package.xml
Created file erle_beginner_tutorials/CMakeLists.txt
Created folder erle_beginner_tutorials/include
Created folder erle_beginner_tutorials/src
Successfully created files in /root/catkin_ws/src/erle_beginner_tutorials. Please adjust the values in package.xml.

Esto crea una carpeta erle_beginner_tutorials que contiene un package.xml y un CMakeLists.txt, que se ha completado con al información que has entregado a catkin_create_pkg.

root@erlerobot:~/catkin_ws/src# tree erle_beginner_tutorials/
erle_beginner_tutorials/
├── CMakeLists.txt
├── include
├── package.xml
└── src

2 directories, 2 files

catkin_create_pkg requiere que des un <package_name> y opcionalmente un lista de dependencias de las cuales depende tu paquete:

# This is an example, do not try to run this
# catkin_create_pkg <package_name> [depend1] [depend2] [depend3]

catkin_create_pkg también tiene funcionalidades más avanzadas que se describen en catkin/commands/catkin_create_pkg.

Dependencia de paquetes

Dependencias de primer orden

Cuando utilizas catkin_create_pkg se proporcionan una serie de dependencias, estas dependencias se pueden revisar con la herramienta rospack.

root@erlerobot:~# rospack depends1 erle_beginner_tutorials
roscpp
rospy
std_msgs

Como puede ver, rospack lista las algunas dependencias que se han introducido como argumento cuando se ejecutó catkin_create_pkg. Estas dependencias del paquete se almacenan en el archivo package.xml:

root@erlerobot:~# roscd erle_beginner_tutorials/
root@erlerobot:~/catkin_ws/src/erle_beginner_tutorials# cat package.xml
<?xml version="1.0"?>
<package>
  <name>erle_beginner_tutorials</name>
  <version>0.0.0</version>
  <description>The erle_beginner_tutorials package</description>

  <!-- One maintainer tag required, multiple allowed, one person per tag -->
  <!-- Example:  -->
  <!-- <maintainer email="[email protected]">Jane Doe</maintainer> -->
  <maintainer email="[email protected]">root</maintainer>


  <!-- 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>


  <!-- Url tags are optional, but mutiple are allowed, one per tag -->
  <!-- Optional attribute type can be: website, bugtracker, or repository -->
  <!-- Example: -->
  <!-- <url type="website">http://ros.org/wiki/erle_beginner_tutorials</url> -->


  <!-- Author tags are optional, mutiple are allowed, one per tag -->
  <!-- Authors do not have to be maintianers, but could be -->
  <!-- Example: -->
  <!-- <author email="[email protected]">Jane Doe</author> -->


  <!-- 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>message_generation</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>message_runtime</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>
  <run_depend>roscpp</run_depend>
  <run_depend>rospy</run_depend>
  <run_depend>std_msgs</run_depend>


  <!-- The export tag contains other, unspecified, tags -->
  <export>
    <!-- You can specify that this package is a metapackage here: -->
    <!-- <metapackage/> -->

    <!-- Other tools can request additional information be placed here -->

  </export>
</package>

Dependencias indirectas

En muchos casos, una dependencia puede tener sus propias dependencias. Por ejemplo, rospy tiene otras dependencias:

root@erlerobot:~/catkin_ws/src/erle_beginner_tutorials# rospack depends1 rospy
genpy
rosgraph
rosgraph_msgs
roslib
std_msgs

Un paquete puede tener varias dependencias indirectas. Afortunadamente rospack puede determinar de forma recursiva todas las dependencias:

root@erlerobot:~/catkin_ws/src/erle_beginner_tutorials# rospack depends erle_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

Personalizando el paquete

En esta parte del tutorial verá cada archico generado por catkin_create_pkg y describirá, línea por línea, cada componente de esos archivos y cómo se puede personalizar el paquete.

Personalizando el archico package.xml

El archivo generado package.xml debería estar en tu nuevo paquete. Ahora vamos a ir a través de package.xml y revisando cada elemento.

Etiqueta description

Primero actulizado la etiqueta description:

  <description>The erle_beginner_tutorials package</description>

Cambia la descripción como quieras, pero por convención, la frase tiene que ser corta, cubriendo el objetivo del paquete. Si es difícil describir el paquete en un sola frase, entonces puede ser que necesite replantearse el paquete.

Etiqueta maintainer

Ahora viene la etiqueta maintainer

  <!-- One maintainer tag required, multiple allowed, one person per tag -->
  <maintainer email="[email protected]">vmayoral</maintainer>

Se trato de un etiqueta obligatoria e importante para package.xml porque permite a otros saber con quién contactar acerca de este paquete. Al menos un persona es necesaria, pero se pueden añadir más si quieres. El nombre del maintainer tiene que ir en el cuerpo del tag, pero también hay un atributo para el email que debe ser rellenado:

Etiqueta license

La siguiente etiqueta es license, que requiere:

  <!-- 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>BSD</license>

Debes escoger una licencia e indicarla aquí. Algunas licencias de código abierto comunes son BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, and LGPLv3. Puedes leer más acerca de esto en Open Source Initiative. Para este tutorial se usa la licencia BSD porque el resto de los componentes de ROS la utilizan:


Nosotros recomendamos compartir tu código bajo un licencia de la Open Source Initiative

La Open Source Initiative (OSI) es una organización sin ánimo de lucro con ámbito global para educar y abogar sobre los beneficios de código abierto y construir puentes entre los diferentes grupos de interés en la comunidad de código abierto.


Etiqueta dependencies

El siguiente conjunto de etiquetas describen las dependencias del paquete. Las dependencias se dividen en build_depend, buildtool_depend, run_depend, test_depend. Para más detalles sobre esta etiqueta revise la documentación Catkin Dependencies. Desde que pasamos std_msgs, roscpp, and rospy como argumentos a catkin_create_pkg, las dependencias tendrán el siguiente aspecto:

  <!-- 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>message_generation</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>message_runtime</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>
  <run_depend>roscpp</run_depend>
  <run_depend>rospy</run_depend>
  <run_depend>std_msgs</run_depend>

Final package.xml

Como puedes ver el aspecto final de package.xml, sin comentarios ni etiquetas vacias:

<?xml version="1.0"?>
<package>
  <name>erle_beginner_tutorials</name>
  <version>0.0.1</version>
  <description>The erle_beginner_tutorials package</description>

  <maintainer email="[email protected]">vmayoral</maintainer>

  <license>BSD</license>

  <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>

  <export>
  </export>
</package>

results matching ""

    No results matching ""