Semana 4. Docker y ROS Bridge
Las semanas 3 y 4 consistieron en diseñar una imagen Docker para poder ejecutar sobre el robot real Turtlebot2 un contenedor con ROS 2 Foxy y los drivers kobuki instalados, junto con la capacidad de lanzar el nodo operador Keyop para controlar manualmente el robot.
Para ello creé un fichero Dockerfile donde especifique las instrucciones para el proceso de contrucción de la imagen.
La sintaxis que empleé es sencilla:
- Con FROM seleccionamos una imagen base.
- Con ARG creamos variables existentes unicamente en el proceso de construcción.
- Con RUN ejecutamos instrucciones durante el proceso de construcción(en este caso, instrucciones Unix con intérprete sh) desde el WORKDIR (por defecto, “/”).
- Con CMD indicamos el comando inicial por defecto que se ejecutará siempre que lanzemos el contenedor (usando docker run). Solo puede haber uno.
Hay más sintaxis (COPY, ENV, WORKDIR, etc.), pero es sencillo de usar. Contar con conocimientos en Unix proporcinan una ventaja muy grande a la hora de desarrollar imágenes Docker.
Para lanzar el contenedor, recomiendo ejecutar el script run_docker. Si la imagen no esta instalada en la máquina local, se ejecutará automáticamente el comando docker pull.
En el lanzamiento del contenedor usé el sistema de ventanas X de Unix, para lanzar un terminal xterm externo y tomar el control del nodo keyop.
xhost +
docker run -it --rm --device /dev/ttyUSB0 -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix carlosalpha1/kobuki_keyop:ros-foxy
xhost -
Otro de los objetivos fue investigar sobre Ros Bridge ya que no hay en ROS2 Foxy soporte o por lo menos no logro encontrar para las camaras RGBD que usa el robot Turtlebot 2. De modo que la idea, es hacer un puente entre ROS1 y ROS2 para que los datos de los topics de la cámara publicado a través de ROS Noetic se puedan visualizar (subscribir) usando ROS 2. Un Puente de Ros lo que hace es transformar los datos para establecer la comunicación entre ROS1 y ROS2.
Para usar el puente tuve que bajarme el siguiente repositorio y realizar los pasos de compilación que indican además de probar sus ejemplos. El repositorio lo guardé en un nuevo Workspace únicamente para el puente, de esta forma evitaría conflictos.
Luego para probar el Turtlebot2 y leer de la cámara con ROS 2, hice lo siguiente:
- Previamente tenía ROS Noetic instalado y un workspace con modelos de robots entre ellos Turtlebot2 descargados de los repositorios de TheConstructCore
- ROS 2 Foxy instalado y un workspace con mis repositorios de ROS2.
- Es recomendable descomentar las lineas referentes a ROS y ROS2 de nuestro fichero ~/.bashrc para evitar conflictos.
En la shell 1 lanzamos ros noetic:
$> . /opt/ros/noetic/setup.bash
$> roscore
En la shell 2 lanzamos el puente compilado en ROS1 y ROS2, (importante consultar instrucciones de instalación):
$> . bridge_ws/install/setup.bash
$> export ROS_MASTER_URI=http://localhost:11311
$> ros2 run ros1_bridge dynamic_bridge
En la shell 3 lanzamos turtlebot 2 en ROS Noetic:
$> . robots_ws/devel/setup.bash
$> roslaunch turtlebot_gazebo main.launch
En la shell 4 lanzamos Ros Foxy y probamos a visualizar la camara con rviz2
$> . /opt/ros/foxy/setup.bash
$> ros2 run rviz2 rviz2
El ejemplo descrito lo podeis ver en el siguiente video: