How to Use Ros2 for Real-Time Robot Data Processing
Table of Contents
Comprensión de datos en tiempo real procesando con ROS2
El sistema operativo Robot 2 (ROS2) se ha convertido en el marco estándar para la construcción de sistemas robóticos de grado de producción que requieren comunicación determinista y de baja latencia. El procesamiento de datos en tiempo real es esencial en aplicaciones como conducción autónoma, manipulación industrial y drones aéreos, donde faltar un plazo puede causar falla del sistema. ROS2 aborda estos desafíos a través de su arquitectura modular de subscriptor, respaldado por el servicio de distribución de datos en tiempo real ROS2
Arquitectura básica: Nodos, Temas, Servicios y Acciones
El paradigma de comunicación de ROS2 se basa en cuatro abstracciones clave:
- Nodos son ejecutables independientes que realizan la computación. En sistemas en tiempo real, cada nodo normalmente se ejecuta en su propio proceso, proporcionando aislamiento de memoria y permitiendo al diseñador del sistema asignar afinidades de CPU y políticas de programación por nodo.
- Temas permite la publicación asincrónica de mensajes de suscripción. Los productores de datos publican un tema llamado, y los consumidores se suscriben a recibir mensajes. El middleware DDS maneja descubrimiento, serialización y transporte, permitiendo que los nodos sean agregados o eliminados en tiempo de ejecución sin reconfiguración.
- Servicios Proporcionar comunicación sincrónica de solicitud de respuesta. Aunque no es inherentemente en tiempo real, los servicios son útiles para los cambios de configuración o actualizaciones de parámetros que no requieren plazos difíciles.
- Acciones extender servicios para objetivos de largo plazo con retroalimentación periódica, adecuado para tareas como el punto de navegación después de donde se necesita el estado intermedio.
Para aplicaciones en tiempo real, el modelo de subscripción de publicación basado en temas es la opción más común porque admite la comunicación desacoplada y puede ser sintonizado para la entrega determinista a través de ajustes de calidad de servicio DDS.
Configuración ROS2 para procesamiento de datos en tiempo real
Instalación y selección DDS
Comience por instalar una distribución reciente ROS2 como Humble Hawksbill, Iron Irwini, o Rolling Ridley en un sistema operativo que soporta la programación en tiempo real -Linux con un parche de kernel en tiempo real, QNX o VxWorks. La implementación predeterminada del DDS (Fast DDS) funciona bien para muchos sistemas, pero para requisitos estrictos en tiempo real consideran alternativas:
- DDS de ciclones – Conocido por baja latencia y alta escalabilidad; utilizado en sistemas de producción de vehículos autónomos.
- RTI Connext Pro – Un DDS comercial que ofrece programación avanzada en tiempo real, características de seguridad y memoria compartida de copia cero.
- DDS rápido – La opción predeterminada; las versiones recientes incluyen un transporte de memoria compartido con baja velocidad.
Después de la instalación, configure el dominio DDS y los predeterminados QoS para que coincidan con los requisitos de tiempo de su aplicación. Establezca la variable entorno para aislar su sistema de otras redes ROS2. Ajuste el archivo de configuración DDS (por ejemplo, ] para DDS rápido o para Cyclone DDS) para permitir el transporte de memoria compartido y establecer prioridades de hilo.
Planificación de módulos y procesos en tiempo real
Lograr el tiempo determinista requiere ejecutar el circuito de control de tu robot con prioridad elevada. En Linux:
- Instale un kernel en tiempo real – para Ubuntu, use . Alternativamente, aplique el parche PREEMPT RT a su kernel.
- Editar para permitir que su usuario establezca prioridades en tiempo real, por ejemplo: .
- Asignar políticas de programación en tiempo real a sus nodos ROS2 utilizando o la llamada del sistema . Típicamente, con una prioridad de 80–95 funciona bien para los bucles de control.
Para el aislamiento avanzado, utilice el parámetro de arranque del núcleo para reservar núcleos de CPU para tareas en tiempo real, luego pinte los hilos de cada nodo a núcleos dedicados utilizando o . Esto evita la interferencia de procesos no reales y interrupciones.
Desarrollar los Nodos de Datos en Tiempo Real
Principios de diseño de nodos
Escribir nodos en tiempo real en ROS2 requiere una atención cuidadosa al uso de recursos dentro de callbacks:
- Evitar la asignación de memoria dinámica Use búferes pre-alocados y evite , , o operaciones de contenedores STL como que pueden causar fragmentación de montones. Si la asignación dinámica es inevitable, realizarlo durante la inicialización de nodos, no en el camino caliente.
- Mantenga los callbacks cortos y determinísticos. El procesamiento complejo debe ser descargado a un hilo o ejecutor separado, con callbacks relegados a la parización de datos y la publicación a nuevos temas.
- Use el ejecutor apropiado. La pre-alloca la memoria para todos los temporizadores y suscripciones, proporcionando programación de callback predecible. Para los nodos multi-teleados, aplicar con un número fijo de hilos. Evite el predeterminado para los nodos críticos del tiempo porque no garantiza el orden determinista.
Además, considere utilizar el ROS2 ejecutor de apoyo en tiempo real (disponible en hierro y más tarde) que respeta las prioridades de los hilos y evita la inversión prioritaria durante la ejecución de callback.
Aplicación de la calidad de las políticas de servicio
Las políticas ROS2 QoS son la herramienta principal para hacer cumplir el comportamiento en tiempo real. Las políticas clave para el procesamiento de datos en tiempo real incluyen:
- Confiabilidad: Establecer a para la entrega garantizada de comandos críticos; utilizar para datos de sensores donde las gotas ocasionales son tolerables pero la latencia mínima es esencial.
- Durabilidad para datos de sensores transitorios; para información de estado persistente como los datos de mapa.
- Fecha límite: Ejecute que se reciba un mensaje dentro de una duración determinada. Si el editor no cumple con el plazo, el middleware alerta a los suscriptores. Esto es vital para los lazos de control que requieren datos a un ritmo fijo (por ejemplo, cada 10 ms).
- Presupuesto de la competencia: Indica al middleware el retraso aceptable de fin a extremo. Las implementaciones DDS optimizan el transporte en consecuencia, por ejemplo, mediante el uso de memoria compartida en lugar de red si el presupuesto es muy ajustado.
- Lifespan: Descarta automáticamente datos mayores que un umbral, evitando que se procese información de establo.
- Historia: Conjunto a con profundidad 1 o 2 para minimizar el uso de la memoria y reducir el tiempo de búsqueda.
Ejemplo C++ para un editor con QoS en tiempo real:
Para suscriptores, configure perfiles iguales. Ajustes inconsistentes de QoS entre editor y suscriptor pueden causar fallos de conexión; siempre prueba con para verificar la compatibilidad.
Pruebas y optimización
Medición de la eficiencia y la comprensión
ROS2 ofrece varias herramientas para evaluar el rendimiento en tiempo real:
- con el registro de la bandera timetamps mensaje para el análisis offline de jitter.
- (del paquete ) mide la demora de ida y vuelta entre dos nodos.
- Medición de latencia personalizada utilizando mensajes estampados: publicar un mensaje con un timetamp sintético y calcular el retraso en el lado del suscriptor. Esto da mayor granularidad que las herramientas de línea de comandos.
- cheques para problemas comunes como los desajustes QoS y la congestión de red.
Uso de nodos de perfil CPU con o ] para identificar los cuellos de botella. Preste especial atención al tiempo de ejecución de callback; si los callbacks exceden unos pocos microsegundos, el procesamiento de descarga a un hilo separado o reducen la tasa de mensaje. Use en los callbacks para medir el tiempo de ejecución, pero tenga cuidado de no introducir asignación dinámica a través del objeto del reloj.
Optimización del transporte de mensajes
Las grandes corrientes de datos – nubes de puntos, imágenes, datos de UI de alto rango – se benefician de las optimizaciones del transporte:
- Memoria compartida de cero copias: Habilitar esto cuando use un DDS que apoye SHMEM (DDS rápido con ], Cyclone DDS con memoria compartida activada, o RTI Connext Pro con transporte de memoria compartido). Esto elimina la serialización en la cabeza y reduce copias de memoria para mensajes grandes.
- Reducir la sobrecarga de serialización: Use estructuras de mensajes planos en lugar de tipos anidados profundamente. Evite campos en mensajes de alta frecuencia; use arrays de longitud fija o identificadores enteros en su lugar.
- Ajuste de la profundidad de la historia del DDS: Con profundidad 1, el middleware sólo mantiene la muestra más reciente, minimizando la memoria y el tiempo de búsqueda.
- Utilizar la comunicación de procesos intra (IPC) función cuando los nodos corren en el mismo proceso. Habilitar y establecer en su nodo. Esto supera completamente el DDS para la comunicación del mismo proceso, ofreciendo la menor latencia posible.
Técnicas avanzadas en tiempo real
Ejecución en tiempo real y programación de temporizador
El es ideal para la ejecución de callback determinista porque pre-alloca toda la memoria necesaria y evita decisiones de programación dinámica. Para los circuitos de control con temporizadores periódicos, crea el temporizador con un intervalo fijo y lo conecta a un ejecutante dedicado a un núcleo en tiempo real:
Para sistemas de multi-tarea, utilice ejecutantes separados para cada grupo de tarifas, cada uno conectado a un núcleo diferente. Esto evita que un callback de baja tasa bloquee una de alta calidad.
Integrando con Linux en tiempo real (PREEMPT RT)
Al utilizar el parche del kernel PREEMPT RT, asegúrese de que los nodos ROS2 eviten bloquear llamadas del sistema dentro de los hilos en tiempo real.
- Asignación dinámica de memoria: Use piscinas pre-alocadas en callbacks.
- Archivo I/O: Logging to disco debe suceder en un hilo separado no-real-time.
- Debugging de estilo Printf: Use solamente en desarrollo; estas llamadas pueden bloquear los mutexes.
- Inversión prioritaria: Use los mutex de herencia prioritaria () al proteger los recursos compartidos. Las implementaciones DDS de ROS2 suelen manejar esto correctamente, pero los mutex personalizados deben configurarse explícitamente.
Prueba tu sistema bajo carga de peor maletín con herramientas como para medir la latencia máxima y asegurar que permanezca por debajo de tus plazos.
Manejo de la crítica multirretimiento y mezclado
Los sistemas robóticos suelen tener sensores que operan a diferentes velocidades: una cámara a 30 Hz, LiDAR a 10 Hz, UI a 1 kHz. Utilice ejecutadores separados para cada grupo de tarifas, cada uno conectado a un núcleo dedicado de CPU. Asignar prioridades superiores a tareas con plazos más estrictos (por ejemplo, procesamiento de UI a prioridad 95, control a 90, LiDAR a 80, logging no crítico a 50tical rclcpp lifecycle marco para gestionar las transiciones estatales de nodos (inconfigurado → inactivo → activo) y asegurar que los componentes en tiempo real sólo están activos cuando el sistema está listo.
Caso práctico de uso: Procesamiento de datos LiDAR en tiempo real
Considere un robot móvil autónomo que debe procesar un escáner de Velodyne LiDAR (300,000 puntos por segundo) y producir una nube de puntos filtrados con una latencia máxima de 10 ms. El gasoducto consiste en:
- Nodo del conductor: Lea datos brutos del LiDAR a través de un socket Ethernet y publica paquetes crudos () a la tasa nativa del sensor (10 Hz).
- Nodo de filtro en tiempo real: Suscribirse a paquetes crudos, aplica un filtro de paso (puntos de movimiento por encima de 2 metros de altura), y publica puntos filtrados (]).
- Nodo de localización: Utiliza la nube filtrada para escanear a 10 Hz.
Para cumplir con la fecha límite de 10 ms:
- Establecer QoS plazo a 10 ms en temas tanto crudos como filtrados.
- Pin el nodos de controlador y filtro para núcleos de CPU dedicados con prioridad SCHED FIFO 95.
- Utilice el transporte de memoria compartido para evitar la serialización de 2 MB de datos de nube de puntos. Con el DDS rápido, establecer y configurar el tamaño de cola de memoria compartida para que coincida con el rendimiento esperado.
- Dentro del callback de filtro, utilice búferes de tamaño fijo pre-alocados. Por ejemplo, asigne un con durante la inicialización del nodo, luego reutilizarlo en cada callback con (que no realloca la capacidad).
- Evite las estructuras dinámicas: no use ; en lugar de seguir el número de puntos válidos con un contador e insertar mediante el indexado de matriz.
Después del despliegue, monitorea latencia usando un nodo personalizado que timetamps cada nube filtrada y lo compara con el horario original del paquete.Uso para comprobar los tiempos de ida y vuelta y para detectar preempos innecesarios. Si los plazos siguen perdidos, considere aumentar la prioridad del nodo del filtro o moverse a una implementación DDS más rápida como Cyclone DDS con memoria compartida.
Conclusión
ROS2 proporciona un robusto ecosistema para el procesamiento de datos robot en tiempo real, combinando flexibilidad informática distribuida con el determinismo requerido por los sistemas autónomos modernos. El éxito depende de seleccionar la implementación DDS correcta, configurar correctamente las políticas QoS y diseñar nodos con restricciones en tiempo real desde el principio. Mediante el uso de núcleos en tiempo real, programación prioritaria y transporte de cero copia, los desarrolladores pueden construir sistemas que procesan capacidades predecibles
Para más información, consulte la documentación oficial en tiempo real ROS2 (Tutorial de programación en tiempo real), los parámetros de rendimiento de DDS de eProsima (DDS rápido), y el proyecto PREEMPT RT (Linux Wiki en tiempo real). El ROS2 Fondo en tiempo real artículo proporciona una inmersión más profunda en la filosofía de diseño detrás del soporte en tiempo real del marco. Para la experimentación práctica, el repositorio ROS2 demos incluye ejemplos en tiempo real con código ejecutable.