ROS (Robot Operating System)
¿Qué es ROS?
El Robot Operating System (ROS) es un middleware robótico, es decir, una colección de frameworks diseñada para el desarrollo de software en robótica. Originalmente desarrollado en 2007 bajo el nombre de Switchyard por el Laboratorio de Inteligencia Artificial de Stanford, ROS fue creado para apoyar el proyecto del Robot con Inteligencia Artificial de Stanford (STAIR2). Desde 2008, su desarrollo ha sido continuado principalmente por Willow Garage, un instituto de investigación robótica, con la colaboración de más de veinte instituciones en un modelo de desarrollo federado.
Aunque ROS no es un sistema operativo, proporciona servicios estándar similares a los de uno. Estos incluyen la abstracción del hardware, control de dispositivos de bajo nivel, implementación de funcionalidades comunes, intercambio de mensajes entre procesos y mantenimiento de paquetes. Su arquitectura está basada en grafos, donde el procesamiento ocurre en nodos que pueden recibir, enviar y multiplexar mensajes de sensores, control, estados, planificaciones y actuadores, entre otros. La biblioteca está orientada a sistemas UNIX (principalmente Ubuntu -Linux-), aunque también se está adaptando a otros sistemas operativos como Fedora, Mac OS X, Arch, Gentoo, OpenSUSE, Slackware, Debian y Microsoft Windows, los cuales son considerados ‘experimentales’ en la actualidad.
ROS se compone de dos partes fundamentales: la parte del sistema operativo, ros, y ros-pkg. Esta última incluye una suite de paquetes contribuidos por usuarios, organizados en conjuntos llamados pilas (stacks en inglés), que implementan diversas funcionalidades como localización y mapeo simultáneo, planificación, percepción y simulación, entre otros.
¿En qué consiste ROS?
El Robot Operating System (ROS) se puede definir como un metasistema operativo, ya que se instala sobre otro sistema operativo existente, usualmente un sistema UNIX como Ubuntu o Debian. ROS proporciona funcionalidades similares a las de un sistema operativo, pero en un entorno de cluster, es decir, en una red de múltiples computadoras interconectadas.
Características principales de ROS:
- Modularidad: ROS apuesta por la modularidad, lo que significa que diferentes áreas del proyecto se conjugan de manera independiente pero colaborativa.
- Autonomía de los módulos: Cada módulo en ROS es autónomo, similar a las computadoras en una red LAN. Esto permite una mayor flexibilidad y robustez en el desarrollo del software.
- Interacción mediante mensajes: Los módulos en ROS interactúan entre sí a través de mensajes utilizando el protocolo XML-RPC, lo que permite la programación en diferentes lenguajes como C++, Python y Java.
- Esquema cliente-servidor: ROS utiliza el protocolo TCP/IP para implementar un esquema cliente-servidor, donde el servidor principal actúa como el núcleo de ROS, coordinando la comunicación y operación de los diferentes módulos.
Robots que utilizan ROS
Entre algunos de los robots que ya utilizan el Robot Operating System (ROS) se encuentran los siguientes:
- PR1: Un robot personal desarrollado por el laboratorio Ken Salisbury en la Universidad de Stanford.
- PR2: Un robot personal que está siendo desarrollado por Willow Garage.
- Baxter: Un robot creado por Rethink Robotics, Inc.
- Robot de Shadow: Una mano robótica diestra motorizada desarrollada por la empresa Shadow. Este proyecto se está llevando a cabo mediante un consorcio dentro del marco europeo, con participantes como la empresa Shadow Robot, la Université Pierre et Marie Curie-Paris (Francia) y la Universidad Carlos III de Madrid (España).
- HERB: Un robot desarrollado en la Universidad Carnegie Mellon (CMU) como parte del programa de robótica personal de Intel.
Nivel del sistema de archivos en ROS
Los conceptos a nivel del sistema de archivos en ROS se refieren principalmente a los recursos que se encuentran en el disco. Estos incluyen:
- Paquetes: Son la unidad principal para organizar el software en ROS. Un paquete puede contener procesos de ejecución de ROS (nodos), bibliotecas dependientes de ROS, conjuntos de datos, archivos de configuración o cualquier otro recurso que se organice de manera útil en conjunto. Los paquetes son el elemento más granular de compilación y publicación en ROS.
- Metapaquetes: Son paquetes especializados que sirven para representar un grupo de otros paquetes relacionados. Generalmente, los metapaquetes se utilizan como marcadores de posición compatibles con versiones anteriores para las pilas convertidas de rosbuild.
- Manifiestos de paquetes: Los manifiestos, definidos en archivos
package.xml
, proporcionan metadatos sobre un paquete, incluyendo su nombre, versión, descripción, información de licencia, dependencias y otros datos como los paquetes exportados. Estos manifiestos están definidos en REP-0127. - Repositorios: Son colecciones de paquetes que comparten un sistema de control de versiones (VCS) común. Los paquetes que comparten un VCS tienen la misma versión y pueden publicarse juntos utilizando la herramienta de automatización de publicación de catkin bloom. A menudo, estos repositorios se asignan a pilas convertidas de rosbuild, aunque también pueden contener un solo paquete.
- Tipos de mensajes (msg): Las descripciones de los mensajes, almacenadas en archivos como
my_package/msg/MyMessageType.msg
, definen las estructuras de datos de los mensajes que se envían en ROS. - Tipos de servicio (srv): Las descripciones de servicio, almacenadas en archivos como
my_package/srv/MyServiceType.srv
, definen las estructuras de datos de solicitud y respuesta para los servicios en ROS.
Acceso a sensores y paquetes de percepción en ROS
ROS proporciona acceso a una amplia variedad de sensores, incluyendo:
- Sensores ópticos 1D/2D
- Cámaras 2D/3D
- Sensores de audio y reconocimiento de voz
- Sensores de fuerza/contacto
- Sensores de captura de movimiento
- Sensores de estimación de posición inerciales/GPS
Un listado oficial de los sensores soportados en ROS está disponible en el enlace oficial. Entre los sistemas de percepción más desarrollados en ROS se encuentran aquellos basados en visión, tanto 2D como 3D. ROS ofrece un conjunto de sub-paquetes dentro del paquete de percepción para procesar imágenes y datos de visión, que incluyen:
- IMAGE-COMMON: Contiene componentes para el transporte y compresión de imágenes, así como para la lectura/escritura de datos de calibración de cámaras en XML y la gestión de la información de la cámara.
- IMAGE-PIPELINE: Incluye componentes para el procesamiento de imágenes en bruto provenientes de la cámara, como calibración, eliminación de distorsión, procesamiento de pares estéreo, procesamiento de imágenes de profundidad y visualización de imágenes.
- IMAGE-TRANSPORT-PLUGINS: Ofrece conectores (plugins) para el transporte de imágenes a través del sistema de suscripción/publicación de ROS, con diferentes niveles de compresión y codificadores de video para reducir la latencia y el ancho de banda en la red.
- VISION-OPENCV: Proporciona componentes que facilitan la interfaz entre ROS y la biblioteca OpenCV.
- PERCEPTION-PCL: Ofrece componentes para la interfaz entre ROS y la biblioteca Point Cloud Library (PCL).
Además, existen paquetes desarrollados sobre el paquete ros-perception
que emplean técnicas avanzadas y recientes, tales como:
- Modelos de inferencia basados en aprendizaje profundo generados en paquetes de terceros como TensorFlow o PyTorch.
- Técnicas de aprendizaje por refuerzo mediante el uso de la librería OpenAI.
Adaptación de dispositivos a ROS
Uno de los aspectos más destacados de la comunidad ROS es la facilidad de integración de diferentes hardware en los sistemas robóticos. Esto es posible gracias a la disponibilidad de nodos ROS o drivers ya desarrollados para una amplia gama de dispositivos, desde brazos robóticos hasta cámaras y sistemas LiDAR. ROS mantiene listas actualizadas de todos los dispositivos compatibles, incluyendo robots manipuladores, robots móviles, pinzas, manos mecánicas, entre otros componentes. Algunos fabricantes que desarrollan dispositivos nativamente compatibles con ROS incluyen Clearpath Robotics, Fetch Robotics, Pal Robotics, Robotnik y Shadow Robot.
La comunidad de ROS contribuye constantemente con nuevos drivers y proporciona directrices para desarrollar código de alta calidad. Es relativamente sencillo encontrar drivers ya existentes para un componente hardware específico, y estos suelen permitir la implementación completa de su funcionalidad y la disponibilidad inmediata de los datos asociados en un entorno basado en ROS. Sin embargo, no siempre se pueden garantizar drivers robustos, desarrollados con estándares y criterios de calidad adecuados, y con un nivel adecuado de pruebas e integración, además de una buena documentación.
Aunque estos requisitos de calidad pueden ser menos rigurosos en desarrollos académicos o de investigación aplicada, son cruciales para la integración en sistemas y productos comerciales, tanto en robótica de servicio como en robótica industrial. Los Integradores y Fabricantes de Equipamiento (OEM, por sus siglas en inglés) requieren altos niveles de fiabilidad y soporte técnico.
Un ejemplo de un paquete desarrollado cumpliendo estos requisitos es el psen_scan_v2
, creado por la empresa PILZ para su escáner de seguridad PSENscan. Este paquete de código abierto, desarrollado por el propio vendedor del equipo, ha sido probado a diferentes niveles en cada versión liberada. Las pruebas incluyen pruebas de código (unit tests e integration tests) y pruebas con el hardware real (acceptance tests), todas ellas documentadas y disponibles para la comunidad. Además, el paquete está ampliamente documentado tanto a nivel de usuario (guías de uso, manuales, tutoriales) como de desarrollador (diagramas y documentación de clases utilizando Lenguaje Unificado de Modelado – UML). El fabricante se encarga del mantenimiento del paquete y proporciona soporte técnico gratuito por correo electrónico.
Esta imagen representa la estructura de los test realizados al código psen_scan_v2, incluyendo Unit Test de diferentes componentes, Test de integración y Test de aceptación incluyendo el hardware.
Nivel de gráfico de cálculo en ROS
El gráfico de cómputo en ROS es la red de pares de procesos que procesan datos en conjunto. Los conceptos básicos de este gráfico incluyen nodos, maestro, servidor de parámetros, mensajes, servicios, temas y bolsas, los cuales proporcionan datos al gráfico de diferentes maneras. Estos conceptos se implementan en el repositorio ros_comm
.
- Nodos: Los nodos son procesos que realizan cálculos. ROS está diseñado para ser modular a una escala de grano fino; un sistema de control de robot generalmente comprende muchos nodos. Por ejemplo, un nodo puede controlar un telémetro láser, otro los motores de las ruedas, otro realizar la localización, otro la planificación de la ruta, y otro proporcionar una vista gráfica del sistema, entre otros. Un nodo ROS se escribe utilizando una biblioteca de cliente ROS, como
roscpp
orospy
. - Maestro: El maestro de ROS proporciona registro de nombres y búsqueda al resto del gráfico de cómputo. Sin el maestro, los nodos no podrían encontrarse entre sí, intercambiar mensajes o invocar servicios.
- Servidor de parámetros: Permite almacenar datos por clave en una ubicación central. Actualmente, forma parte del servidor maestro.
- Mensajes: Los nodos se comunican entre sí mediante el envío de mensajes. Un mensaje es simplemente una estructura de datos que comprende campos tipificados. Se admiten tipos primitivos estándar (entero, punto flotante, booleano, etc.), así como matrices de tipos primitivos. Los mensajes pueden incluir estructuras y matrices anidadas de forma arbitraria, similar a las estructuras en C.
- Temas: Los mensajes se enrutan a través de un sistema de transporte con semántica de publicación/suscripción. Un nodo envía un mensaje publicándolo en un tema determinado, que es un nombre utilizado para identificar el contenido del mensaje. Un nodo interesado en un tipo de datos específico se suscribirá al tema apropiado. Puede haber varios publicadores y suscriptores simultáneos para un solo tema, y un solo nodo puede publicar y/o suscribirse a varios temas. En general, los publicadores y suscriptores no conocen la existencia de los demás, disociando la producción de información de su consumo. Lógicamente, se puede pensar en un tema como un bus de mensajes fuertemente tipado.
- Servicios: El modelo de publicación/suscripción es flexible, pero su transporte unidireccional de muchos a muchos no es adecuado para interacciones de solicitud/respuesta, que a menudo se requieren en un sistema distribuido. La solicitud/respuesta se realiza a través de servicios, que se definen mediante un par de estructuras de mensajes: una para la solicitud y otra para la respuesta. Un nodo proveedor ofrece un servicio bajo un nombre y un cliente lo utiliza enviando el mensaje de solicitud y esperando la respuesta. Las bibliotecas de cliente de ROS presentan esta interacción al programador como si fuera una llamada a un procedimiento remoto.
Bolsas: Las bolsas son un formato para guardar y reproducir datos de mensajes de ROS. Son un mecanismo importante para almacenar datos, como datos de sensores, que pueden ser difíciles de recopilar pero son necesarios para desarrollar y probar algoritmos.
Nuevos paquetes en ROS para funcionalidades específicas
Se han desarrollado nuevos paquetes para funcionalidades que anteriormente no contaban con paquetes ROS disponibles. Entre estos nuevos paquetes se incluyen:
- Paquete para control de máquina a alto nivel: Este paquete utiliza un enfoque de máquina de estados y está diseñado específicamente para el control de maquinaria industrial. Incluye características para la gestión de eventos relacionados con la seguridad (como cruce de barreras y paros de emergencia), gestión de alarmas, mensajes al operador y control del proceso.
- Paquete para interacción con dispositivos: Este paquete facilita la integración con otros dispositivos, como lectores de código de barras, interfaces con PLC (Controladores Lógicos Programables), y el sistema de visión Cognex para la parametrización y control.
Interfaz de visualización y control (HMI): La interfaz está basada en el software PASVisu de PILZ, que utiliza OPC-UA para el intercambio de datos entre el PLC de seguridad y el sistema ROS. Esta interfaz permite la visualización y control del sistema de manera efectiva.
Maquina en producción
Detalle del robot con la cámara embarcada
Arquitectura del software basado en ROS
¿Cuáles son los casos de uso de ROS?
Los casos de uso de ROS (Robot Operating System) son diversos y abarcan varias industrias y aplicaciones, gracias a su flexibilidad y capacidad para integrarse con diferentes plataformas hardware. Aquí algunos ejemplos destacados:
- Conducción autónoma: En esta área, ROS se utiliza para integrar y gestionar sensores como cámaras, termómetros, odometría, entre otros, en vehículos autónomos. Los algoritmos de inteligencia artificial procesan los datos capturados para permitir que el vehículo tome decisiones en tiempo real y navegue de manera autónoma. Aunque Tesla utiliza su propio software, otros fabricantes de vehículos también desarrollan soluciones basadas en ROS para la conducción autónoma.
- Industria: En entornos industriales, plataformas móviles equipadas con ROS pueden realizar tareas de transporte autónomo de cargas pesadas. Esto se aplica en almacenes inteligentes y otras instalaciones donde es necesario mover objetos grandes de manera eficiente y segura, sin necesidad de intervención humana constante.
- Vigilancia y exploración: En aplicaciones de vigilancia de tierras y exploración, se utilizan drones equipados con ROS. Estos drones pueden ser empleados para la detección de incendios forestales, monitoreo de actividad volcánica, operaciones de búsqueda y rescate, y otras tareas donde la movilidad y la percepción son críticas para el éxito de la misión.
Estos casos de uso muestran cómo ROS facilita el desarrollo de sistemas robóticos avanzados en diversas aplicaciones, aprovechando su capacidad para gestionar la percepción del entorno, la planificación de trayectorias y la interacción con hardware diverso de manera efectiva y eficiente.