
Recientemente celebramos el lanzamiento de ROS 2 Humble Hawksbill con una publicación que detalla cómo comenzar a desarrollar la nueva versión en contenedores. Además, describimos las nuevas funciones incluidas en esta nueva versión, especialmente sus funciones de seguridad mejoradas.
Esta semana abordaremos el siguiente paso lógico en el desarrollo de software: el empaquetado. De hecho, una vez que hayamos terminado de desarrollar nuestra súper genial aplicación ROS 2 Humble, todavía tenemos que ponerla en manos de nuestros usuarios.
En esta publicación, veremos cómo empaquetar una aplicación ROS 2 Humble como romper Hay un ejemplo como «hola mundo».
ROS 2 Humilde complemento que dijiste?
Snaps son paquetes de aplicaciones para escritorio, nube e IoT que son fáciles de instalar, seguros, multiplataforma y libres de dependencia.
Las instantáneas son una solución de implementación ideal para aplicaciones basadas en ROS porque son soluciones de empaquetamiento distribuidas cruzadas, autónomas y en espacio aislado. Sin mencionar que admiten ROS de forma nativa para simplificar su proceso de empaquetado.Puede obtener más información sobre todas las funciones que ofrecen en un sitio web dedicado. página de robots!
establecer instantánea
Primero, consigamos la herramienta que nos permite crear instantáneas: snapcraft.
sudo snap install --classic snapcraft
también instalaremos LXD snapcraft lo usa como backend para empaques limpios, restringidos y reutilizables,
sudo snap install lxd
sudo lxd init --minimal
Tenga en cuenta que hemos inicializado LXD con un montón de parámetros predeterminados.ir Documentación LXD Si prefiere especificar algunos de estos parámetros usted mismo.
Todos estamos listos para empacar nuestro primer ejemplo, así que hagámoslo.
Un ejemplo de hablante-oyente
Para este ejemplo, nos lo tomaremos con calma porque ni siquiera necesitamos escribir ningún código.En su lugar, empacaremos uno de Demostración de ROS 2 del repositorio de GitHubElegí una demostración de ‘demo_nodes_cpp‘paquete, más específicamente’hablador_escucha.launch.py‘Manifestación.
Como sugiere el nombre, esta demostración inicia un «hablador» que publica mensajes de cadena sobre un tema de ROS 2. Junto a los «oyentes» que leyeron dicho mensaje. Ambos imprimen mensajes enviados/recibidos a la consola para facilitar el seguimiento. Por supuesto, ambos se inician simultáneamente desde un único archivo de inicio.
Si bien este ejemplo puede parecer un poco simplista, es ideal para los principiantes. Veremos lo fácil que es empaquetar aplicaciones ROS 2 con snap.
archivo snapcraft.yaml
Snapcraft se basa en el archivo de configuración «snapcraft.yaml» para impulsar el proceso de empaquetado. Entonces, vamos a crear uno,
mkdir -p ~/ros2_ws/first_snap/
cd ~/ros2_ws/first_snap/
touch snapcraft.yaml
Luego llénalo de la siguiente manera,
name: ros2-talker-listener
version: '0.1'
summary: ROS 2 Humble talker/listener example
description: |
This example launches a ROS 2 Humble talker and listener.base: core22
confinement: strictapps:
ros2-talker-listener:
command: opt/ros/humble/bin/ros2 launch demo_nodes_cpp talker_listener.launch.py
plugs: [network, network-bind]
extensions: [ros2-humble]parts:
ros-demos:
plugin: colcon
source: https://github.com/ros2/demos.git
source-branch: humble
source-subdir: demo_nodes_cpp
stage-packages: [ros-humble-ros2launch]
Lo crea o no, eso es todo lo que necesitamos para crear una instantánea. Pero examinemos este archivo más de cerca.
romper todo
Podemos tener los 3 bloques diferentes mencionados anteriormente snapcraft.yaml
documento.
En la parte superior del archivo, hay algunos repetitivos comunes a la mayoría de las instantáneas.instantánea name
, version
Espera, no hay nada inusual aquí.Entonces vino base: core22
Esta es una instantánea básica que proporcionará el entorno de tiempo de ejecución para nuestra aplicación basada en Ubuntu 22.04.La última entrada en este bloque es confinement: strict
Esto indica que nuestra aplicación está severamente restringida. En otras palabras, no puede acceder a ningún recurso en el host.
segundo bloque, apps
, especifica la aplicación expuesta desde la instantánea.Aquí se incluye una aplicación con command
muy familiar.Además, nuestra aplicación enumera algunos interfaces
en el interior plugs
parte.Aviso interfaz Permita que nuestra aplicación restringida acceda a recursos específicos del host. En este caso, nuestro complemento tendrá acceso a las interfaces relacionadas con la red que permiten que fluyan los temas de ROS 2. Al final, extensions: [ros2-humble]
Algunos otros campos comunes a las instantáneas de ROS 2 Humble se completarán automáticamente. Si tiene curiosidad acerca de lo que hace una extensión, tenga en cuenta que puede «extenderla». Revela todos sus secretos emitiendo el siguiente comando,
SNAPCRAFT_ENABLE_EXPERIMENTAL_EXTENSIONS=1 snapcraft expand-extensions
Finalmente llegamos al tercer bloque: parts
. Este parts
Las etiquetas definen las diferentes partes que componen nuestra aplicación final.incluyen un source
Una entrada para el código fuente, como un archivo local, tarball o, en este caso, un repositorio de GitHub para una rama específica.Más importante aún, las «partes» pueden incluir build-packages
solo se requiere en el momento de la compilación, a diferencia de stage-packages
Requerido solo en tiempo de ejecución.Lo más importante es que cada sección consta de un plugin
Aquí usamos colcon
Complementos que utilizan las herramientas de compilación familiares de ROS 2. Entonces este complemento tiene sus propias opciones, que puede ver con el comando,
snapcraft help colcon
puedes averiguar sobre metadatos globalesEste parte y ellos metadatos propiosEste complemento colcón, expandiry más en documento.
Ahora, snapcraft.yaml
Los archivos están definidos, es hora de construir la instantánea.
Construyendo el complemento Humble de ROS 2
Para crear una instantánea, emita el comando snapcraft
en la terminal,
$ SNAPCRAFT_ENABLE_EXPERIMENTAL_EXTENSIONS=1 snapcraft
Starting Snapcraft
…
* metallic sound of software being forged *
…
Created snap package
captura, muéstrate,
$ ls
ros2-talker-listener_0.1_amd64.snap snapcraft.yaml
¡Por supuesto que está ahí!
¿Qué tal si lo instalamos ahora? Para hacer esto, escriba,
$ sudo snap install --dangerous ros2-talker-listener_0.1_amd64.snap
ros2-talker-listener 0.1 installed
uso de
--dangerous
marca porque estamos montando la instantánea desde el disco, en lugar de usar tienda.
bien, pero cierto morder ¿Trabajar?
$ ros2-talker-listener
[INFO] [launch]: All log files can be found below /home/ubuntu/snap/ros2-talker-listener/x6/ros/log/2022-05-24-15-24-50-823207-localhost-24895
[INFO] [launch]: Default logging verbosity is set to INFO
[INFO] [talker-1]: process started with pid [24944]
[INFO] [listener-2]: process started with pid [24946]
[talker-1] 2022-05-24 15:24:51.341 [RTPS_TRANSPORT_SHM Error] Failed to create segment ac1bbb6c86049e8a: Permission denied -> Function compute_per_allocation_extra_size
[listener-2] 2022-05-24 15:24:51.346 [RTPS_TRANSPORT_SHM Error] Failed to create segment e75bbd4ac39608ab: Permission denied -> Function compute_per_allocation_extra_size
[talker-1] 2022-05-24 15:24:51.348 [RTPS_MSG_OUT Error] Permission denied -> Function init
[listener-2] 2022-05-24 15:24:51.348 [RTPS_MSG_OUT Error] Permission denied -> Function init
[talker-1] [INFO] [1653420292.379305200] [talker]: Publishing: 'Hello World: 1'
[listener-2] [INFO] [1653420292.380423139] [listener]: I heard: [Hello World: 1]
[talker-1] [INFO] [1653420293.379072149] [talker]: Publishing: 'Hello World: 2'
[listener-2] [INFO] [1653420293.379286698] [listener]: I heard: [Hello World: 2]
[talker-1] [INFO] [1653420294.379120962] [talker]: Publishing: 'Hello World: 3'
[listener-2] [INFO] [1653420294.379682258] [listener]: I heard: [Hello World: 3]
...
¡Sí lo hace! que asombroso.
¡Aún mejor, puede instalar y ejecutar este complemento en otra computadora incluso sin ROS 2 instalado! ¡Diablos, puedes instalar y ejecutar este complemento en otra distribución de Linux de hace 4 años!
Tenga en cuenta que los mensajes de error de FastDDS de la biblioteca DDS subyacente no impedirán que la aplicación se ejecute. En otras palabras, podemos ignorarlo con seguridad por ahora. Si desea obtener más información sobre cómo funciona la memoria compartida con instantáneas, hemos cubierto el tema en detalle en una publicación de blog dedicada: «Cómo usar la memoria compartida de ROS 2 con instantáneas».
¿Que sigue?
Vimos en esta publicación cómo crear una instantánea para una aplicación ROS 2 Humble. Si bien esta demostración es bastante simple, empaquetar una pila de ROS más compleja no es tan complicado. Para obtener una prueba de esto, consulte la serie «Cómo configurar un TurtleBot3 en minutos usando instantáneas», donde detallo cómo tomar instantáneas de todo el Turtlebot3.
Además, vimos cómo empaquetar aplicaciones ROS 2 de manera eficiente y sencilla. ¿Cómo distribuir ahora?Mira cómo hacerlo en la tienda aquí.
Por último, no dude en hacer cualquier pregunta. foro de snapcrafto en ROS RespuestasMe encantaría escuchar sus comentarios.