Apuntes de Robot Operating System (ROS)

Advertencia
Este artículo se actualizó por última vez el 2023-03-29, es posible que el contenido no esté actualizado.

¿Qué es ROS?

Robot Operating System (ROS) es un framework para programar robots, nos da facilidades para programar tareas de diferentes tipos como navegación (usando el stack de navegación de ROS), manipulación (usando moveit), percepción (usando por ejemplo PCLPoint Cloud Library)

Conceptos básicos de ROS

Nodos

Son los procesos básicos en ROS, cada nodo representa un proceso independiente dentro del ROS stack. Los nodos pueden comunicarse entre si de tres maneras:

  • ROS topics (publisher/subscriber) posibilitan a un nodo a publicar mensajes para que los lean otros nodos que se suscriban al topic

  • ROS services (request/response) posibilita que un nodo cliente lance peticiones (request) a otro nodo servidor solicitando un servicio. Una vez que se completa la tarea el nodo servidor responde (response) enviando el resultado de la petición.

  • ROS actions (action/feedback/result) Con este método un nodo cliente puede enviar una petición de acción a otro nodo servidor. Mientras el servidor está ejecutando la acción envía información continuamente al cliente del progreso de la acción. Una vez completada la tarea, el servidor envia el resultado al cliente, este sería el producto final de la acción. Las “acciones” se parecen a los servicios, la diferencia es la realimentación continua que el servidor da al cliente mientras ejecuta la acción.

___Parameter Server _

En este servidor podemos almacenar parámetros globales que todos los nodos pueden consultar.

ROS1 y ROS2

ROS Noetic es la última versión de ROS 1, y está destinada a ser la última versión de ROS 1. ROS Noetic utiliza ya Python 3 y está basada en Ubuntu 20.04. Hay un montón de literatura, tutoriales y ejemplos basados en ROS1 pero creo que lo mejor es centrarse directamente en ROS2.

ROS2 es la nueva versión de ROS. La motivación principal de ROS2 es ser un sistema operativo orientado a ser usado en el mundo real y no un sistema operativo de investigación y desarrollo como era ROS1, sus objetivos declarados son:

Seguridad

Tiene que ser seguro y usar la encriptación adecuada siempre que sea necesario.

Sistemas Embebidos

ROS2 tiene que poder ejecutarse en sistemas embebidos.

Diversidad de red

Es necesario que pueda conectarse y comunicarse usando todo tipo de redes desde LAN a redes satelitales, para adecuarse a cualquier entorno en el que se usen robots.

Computación en Tiempo Real

Tiene que ser capaz de llevar a cabo RTCReal Time Computing de forma fiable, dado que esta es crucial para la robótica.

Orientado al producto

Tiene que cumplir con los estándares industriales para usarlo en productos comerciales

ROS2 implica cambiar muchas cosas:

  • Usa DDS como protocolo de red para todas las comunicaciones.
    • Prescinde del ROS Master que actuaba como coordinador de nodos en ROS1. Usa funcionalidades del protocolo DDSData Distribution Service para que los nodos se descubran.
    • Es más robusto frente a problemas de comunicación que ROS1, también gracias a la funcionalidad de DDS
  • ROS2 es multiplataforma, corre de forma nativa en Linux, Windows y MacOS
  • Los nodos de ROS2 pueden correr en un mismo proceso y su ciclo de vida es gestionable
  • Las bibliotecas de ROS2 comparten una implementación común (escrita en C)
  • Incluye un bridge (ROS1 bridge) para facilitar la comunicación con, y migración de, antiguos sistemas.

Tutoriales de ROS2

El tutorial oficial

  1. Empezar con las instrucciones de instalación
  2. Seguir con los tutoriales

Probando ROS2 con Docker

Probar ROS1 con Docker

Referencias

Gracias a Docker podemos usar ROS fácilmente en cualquier linux (aunque no sea Ubuntu)

Lanzar un completo ROS Noetic en Docker es tan simple como:

1
2
3
4
docker pull osrf/ros:noetic-desktop-full

# Si queremos una sesión interactiva:
docker run -it osrf/ros:noetic-desktop-full bash

Imágenes Docker de ROS disponibles:

noetic-ros-core

Esta imagen nos permite usar paquetes básicos de ROS: podremos publicar y suscribirnos a nodos ROS, invocar servicios ROS y lazar ficheros ROS.

noetic-ros-base

Basada en la anterior. Añade algunos paquetes esenciales como: actionlib, dynamic reconfigure, nodelets y pluginlib.

noetic-robot

Basada en noetic-ros-base añade los metapaquetes roboty viz, así como la mayor parte de los paquetes utilizados en los tutoriales oficiales. Esta sería la imagen mínima para hacer los tutoriales. También sería la imagen ideal para instalar en un robot.

noetic-perception

Esta imagen incluye PCLPoint Cloud Library, la biblioteca perception_pcl y bibliotecas relacionadas con el procesamiento de imágenes como:

  • image_common
  • image_pipeline
  • image_transport_plugins
  • laser_pipeline00
noetic-desktop

Es similar a la anterior (noetic-robot) pero no está basada en ella.

noetic-desktop-full

Basada en la anterior pero además añade paquetes de percepción y simulación, tales como Gazebo y PCL.

Experimento

1
2
# Si queremos una sesión interactiva:
docker run -it osrf/ros:noetic-desktop-full bash

Dentro del contenedor actualizamos

1
2
3
4
apt update
apt upgrade
apt install python3-rosdep python3-rosinstall python3-rosinstall-generator python3-wstool build-essential
apt install python3-rosdep

Un dockerfile:

1
2
3
4
5
FROM: osrf/ros:noetic-desktop-full


RUN: apt-get update && apt-get upgrade -y
RUN: apt-get install python3-rosdep python3-rosinstall python3-rosinstall-generator python3-wstool build-essential python3-rosdep
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'


# Lanzar Xephyr en el DISPLAY :1
Xephyr -ac -screen 800x600 -br -reset -terminate 2> /dev/null :1 &

docker run -it --name correMundos pabloImage roscore



world_files=`docker exec -it correMundos 'ls' '-1' '/opt/ros/noetic/share/stage/worlds/' |grep '\.world' `

if [ ${#world_files[@]} -eq 0 ]; then
  echo "No se encontraron archivos con la extensión .world en este directorio."
else
  echo "Archivos .world encontrados:"
  for i in "${!world_files[@]}"; do
    echo "$((i+1)): ${world_files[i]}"
  done

  read -p "Ingrese el número del archivo que desea ejecutar: " selection
  case $selection in
    [1-${#world_files[@]}])
      selected_file=${world_files[$((selection-1))]}
      echo "Ejecutando archivo $selected_file..."
      docker exec -it correMundos "rosrun stage_ros stageros /opt/ros/noetic/share/stage/worlds/$selected_file"
      ;;
    *)
      echo "Selección inválida. Saliendo del programa."
      ;;
  esac
fi
0%