Guía de Docker y ROS
En esta guía sencilla, explicaré cómo crear, usar y trabajar eficientemente con ROS + Docker.
El público principal de este artículo son los estudiantes del programa de Máster en Robótica e Inteligencia Artificial de la Universidad de León, pero también puede ser útil para cualquiera que busque trabajar con ROS/ROS 2 y Docker.
El objetivo es aprovechar las ventajas de Docker para crear diferentes imágenes de ROS para entornos aislados, así no tendrás diferentes versiones de ROS instaladas en tu sistema y muchos comandos que memorizar para cambiar de una versión a otra. Algo así como el Conda de ROS.
En resumen:
- Instalar Docker
- Crear imágenes Docker con ROS + VNC
- Configurar el servidor VSCode para cada imagen
Instalar Docker
La forma más fácil es instalar Docker Desktop. Estas instrucciones son para máquinas basadas en Ubuntu.
Ve a https://docs.docker.com/desktop/install/ubuntu/ y sigue las instrucciones:
Desinstala docker-desktop si lo tenías:
sudo apt remove docker-desktop
Elimina cualquier archivo relacionado:
rm -r $HOME/.docker/desktop
sudo rm /usr/local/bin/com.docker.cli
sudo apt purge docker-desktop
Añade el repositorio de software de Docker (puede cambiar con el tiempo):
# Añade la clave GPG oficial de Docker:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# Añade el repositorio a las fuentes de Apt:
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
Descarga el último paquete .deb
(el enlace varía según la fecha, así que búscalo)
E instálalo haciendo doble clic en el .deb
. Si el doble clic no funciona y el programa eddy
no se abre, puedes instalarlo así:
sudo apt install <archivo.deb>
Se asume que al instalar esto, también se instala el docker de terminal, lo cual es genial. Ahora algunas configuraciones recomendadas. Para evitar que te pidan sudo
cada vez que ingreses un comando docker
:
sudo usermod -aG docker $USER
Para verificar que todo funciona bien:
docker run hello-world
Para iniciar docker-desktop, búscalo entre las aplicaciones instaladas.
Para actualizarlo, descarga el último paquete debian nuevamente e instálalo de la misma manera.
Docker desktop es solo una interfaz para gestionar los contenedores docker que tienes en el sistema pero con botones y demás, en lugar de hacer todo por consola. Es más cómodo que por consola aunque en este tutorial lo uso más a menudo.
Iniciar Imágenes de ROS
Para iniciar las imágenes de ROS, usaremos las imágenes de https://hub.docker.com/r/tiryoh/ros-desktop-vnc
Estas imágenes inician un contenedor Ubuntu, con una interfaz de usuario que podemos ver desde el navegador, con toda la molestia de instalar ROS ya resuelta. Una delicia.
El desarrollador que hace estas imágenes (tiryoh) tiene diferentes versiones disponibles, por lo que cambiar entre versiones no debería ser más difícil que abrir otra máquina con un comando.
Para iniciar la virtualización de ROS1:
docker run -d -p 6080:80 -e RESOLUTION=1600x900 --shm-size=512m --name ros_noetic_vnc tiryoh/ros-desktop-vnc:noetic
Para iniciar la virtualización de ROS2:
docker run -d -p 6080:80 -e RESOLUTION=1600x900 --shm-size=512m --name ros_humble_vnc tiryoh/ros2-desktop-vnc:humble
Aspectos importantes de este comando:
-
-p 6080:80
esto mapea el puerto interno de la máquina (80) al puerto donde veremos la conexión VNC (6080, nos conectamos al escritorio virtual en https://localhost:6080). Si tenemos varias máquinas ejecutándose al mismo tiempo, nos dará un error si tenemos el mismo puerto en segundo lugar, y tendremos que cambiarlo y recordar qué puerto es. De todas formas, si usamos docker desktop, dentro de la sección containers ya nos mostrará qué puerto tiene cada contenedor, e incluso si hacemos clic abre el navegador. -
-e RESOLUTION=1600x900
esta resolución está bien para ver el escritorio virtual en una pantalla de navegador. Si por alguna razón tienes una pantalla 4k y se ve muy pequeño con esta resolución, puedes cambiarla aquí. -
--name ros_noetic_vnc
aquí es donde nombras el contenedor. Creo que tener uno por asignatura está bien, así que podría serros_noetic_vnc_middleware
-
tiryoh/ros-desktop-vnc:noetic
es el nombre de la imagen, como un repo de GitHub. El primero es el autor, el segundo es la imagen, y el tercero es como la rama. Aquí es donde cambiamos la versión de ROS.
Para ROS1:
tiryoh/ros-desktop-vnc:noetic
-> ROS noetic (recomendado)tiryoh/ros-desktop-vnc:melodic
-> ROS melodic (el anterior)tiryoh/ros-desktop-vnc:kinetic
-> ROS kinetic (antiguo)
Para ROS2:
tiryoh/ros2-desktop-vnc:foxy
-> ROS2 foxytiryoh/ros2-desktop-vnc:galactic
-> ROS2 galactictiryoh/ros2-desktop-vnc:humble
-> ROS2 humble
Una vez que hayamos seleccionado la versión que queremos, ejecutamos el comando, esperamos a que todo se descargue y monte la imagen, y abrimos el puerto que asignamos en el navegador (https://localhost:6080), o vamos a docker-desktop y hacemos clic en el puerto del contenedor.
Deberíamos ver una interfaz de usuario simple, no la que estamos acostumbrados a ver en Ubuntu, sino otra más simple para que no consuma demasiados recursos. Podemos abrir consolas, carpetas, etc. Si ingresamos los comandos de ROS, veremos que están instalados por defecto, etc.
Ahora tenemos nuestro sistema virtual de ROS funcionando. Ahora solo necesitamos encontrar una manera de escribir código y subir archivos sin morir en el intento. Para eso, usaremos un servidor VSCode que se conectará a nuestro contenedor virtual.
NOTA: esto es para la primera vez que inicias uno de estos contenedores. El resto de las veces, puedes abrir docker-desktop e ir a la sección containers, y presionar el símbolo de reproducción para iniciar el contenedor.
Configurar el Servidor VSCode
Abre VSCode en el sistema host, e instala una extensión llamada dev-containers
, es oficial de Microsoft.
Esta extensión es magia negra, nos permite conectarnos a un contenedor virtual, editar código, subir archivos y usar todas las extensiones y cosas de nuestro sistema host (copilot, etc.)
Una vez instalado, para conectarse al contenedor que hemos abierto, presiona CTRL + SHIFT + P. Eso abre el buscador de acciones. Escribe “attach to running container”, y presiona enter. Aparecerá una lista de los contenedores iniciados que tenemos ahora mismo. Selecciona al que queremos conectarnos, y se abre otra ventana de VSCode con el contenido del contenedor. Ahora, en el explorador de archivos, hay un botón “Abrir Carpeta”, presiónalo y selecciona la ruta donde estarán los archivos que queremos desarrollar. Por ejemplo: /home/ubuntu/ros_ws
.
Ahora podemos editar los archivos que queramos desde la comodidad de VSCode y se actualizan en tiempo real dentro del contenedor. También podemos mover archivos sin tener que hacer comandos ssh
, e incluso la terminal de VSCode es una terminal dentro del contenedor.
Si queremos cambiar la carpeta una vez seleccionada, haz clic derecho donde están los archivos, pero no en un archivo específico, y selecciona ‘remove folder from workspace’. La ventana se cierra y se abre otra con el botón ‘Abrir Carpeta’ para seleccionar la carpeta donde queremos trabajar.
Para detener los contenedores, etc.
Para detener el servidor VSCode, simplemente cierra el VSCode. Si no tienes habilitado el autoguardado, ten cuidado de no dejar nada sin guardar. La extensión hace toda la magia de gestionar la conexión, etc.
Ahora solo cierra el contenedor. Para eso, abre docker-desktop y presiona el botón de detener, el cuadrado. De nuevo, mejor no dejar nada ejecutándose y demás. El estado se guarda, incluso las ventanas que tenías abiertas, así que la próxima vez que lo inicies deberías encontrar todo como estaba cuando lo cerraste, aunque por si acaso, mejor no dejar nada ejecutándose entre apagar y encender el contenedor.