1 kh5hxxzrzoocruvavtbjzg

Aceptando el desafío de las 16 cámaras Intel RealSense

Por Piotr Rybicki

En Nomagic, enseñamos a los robots a comprender el mundo real. No es ningún secreto que el mundo real es increíblemente complejo, y para algunas tareas, uno desearía tener un par de ojos extra. Algunos de nuestros robots sentían lo mismo, así que decidimos ayudarlos.

En esta publicación, compartimos nuestra experiencia en la creación de un sistema que permite capturar rápidamente fotos en color y con profundidad desde hasta 16 cámaras Intel RealSense con un uso mínimo de CPU, utilizando el Sistema Operativo para Robots (ROS1). ¡Código fuente incluido!

Conexión física

A primera vista, podrías pensar que bastaría con comprar algunos concentradores USB 3, conectar todas las cámaras y listo. Sin embargo, conseguir un número suficiente de puertos USB 3 es solo una cuestión superficial.

El verdadero desafío reside en el ancho de banda limitado de USB 3. Intel tiene un excelente artículo que explica los diversos detalles relacionados con la conexión de varias cámaras. La conclusión principal es que se debe procurar maximizar la cantidad y la calidad de los controladores USB 3 que gestionan las cámaras. Dado que nuestros ordenadores solo tienen un controlador USB, decidimos comprar esta tarjeta USB PCIe, que cuenta con un controlador USB independiente para cada puerto. https://www.delock.com/produkte/2072_Type-A/89365/merkmale.html.

Controlador USB para el desafío de la cámara RealSense

Para lograr el número deseado de puertos (16) y garantizar que cada cámara tenga suficiente energía, también compramos cuatro concentradores USB externos con alimentación adicional: https://www.delock.de/produkte/G_64053/merkmale.html.

Concentradores USB para el desafío de la cámara RealSense

Conectar todas las cámaras fue muy divertido:

Bajo vigilancia extrema

Puedes esconderte de muchos robots, pero no de este 🙂

La batalla

Normalmente, un robot solo necesita una cámara, e incluso cuando se usan más, suelen ser entre 2 y 4. Conectar 16 cámaras a un solo PC suena bastante ambicioso. Así que pensamos: ¡vamos a hacerlo!

Conectamos y activamos las cámaras una por una, observando el video de profundidad en una pantalla usando ros-realsense y RViz. Después de un tiempo, notamos que los fotogramas por segundo (FPS) comenzaron a disminuir. Una investigación rápida reveló la causa principal:

Código FPS

Una de las señales de que las cámaras funcionan 🙂

La captura de pantalla anterior probablemente les resultará familiar a los usuarios de Linux: uso máximo de la CPU, lo cual es indeseable, especialmente si se pretende ejecutar otros programas en el equipo. En nuestro PC, una sola cámara consumió aproximadamente 1,2 núcleos de la CPU. El siguiente paso fue determinar la causa de la carga de la CPU.

Código de carga de la CPU

Perfilar el problema

Realizamos un ejercicio de perfilado y descubrimos que la mayor parte de la carga de la CPU fue causada por el posprocesamiento en ros-realsense. Cada fotograma que llega de la cámara se somete a un filtrado para eliminar el ruido y rellenar los datos faltantes mediante interpolación espacial y/o temporal. Filtrar un solo fotograma lleva unos pocos milisegundos, por lo que unas 10 cámaras son suficientes para saturar incluso una CPU de alto rendimiento. Mientras que el filtrado en ros-realsense Es opcional, pero mejora significativamente la calidad de las imágenes de profundidad, por lo que quisimos conservarlo.

Observamos que en realidad no necesitábamos filtrar todos los fotogramas, ya que en última instancia solo usamos un fotograma cada pocos segundos. Para abordar esto, bifurcamos y modificamos ros-realsense Consideramos este caso de uso. En lugar de filtrar cada fotograma, almacenamos los fotogramas más recientes en un búfer circular y aplicamos filtros solo cuando se solicitaban mediante una llamada al servicio ROS. Conservar y filtrar varios fotogramas (en lugar de solo uno) era necesario porque algunos procesos de filtrado dependen de imágenes anteriores.

Esta optimización redujo considerablemente el uso de la CPU a alrededor de 20% por cámara. Sin embargo, la batalla aún no había terminado. Las bajas velocidades de fotogramas persistieron, aunque el patrón cambió: en lugar de afectar a todas las cámaras, el problema se volvió más localizado, provocando que cámaras arbitrarias redujeran su rendimiento intermitentemente. El culpable (predecible) fue identificado en ros-realsense registros, que estaban llenos de mensajes como:

13/05 10:16:06,190 ADVERTENCIA [140247325210368] (backend-v4l2.cpp:1057) Fotograma incompleto recibido: ¡Fotograma de vídeo incompleto detectado! Tamaño 541696 de 1843455 bytes (29%)

Aunque estábamos por debajo del rendimiento teórico del USB, las cámaras tenían dificultades para transmitir fotogramas completos. Redujimos la velocidad de fotogramas a 6 fotogramas por segundo y desactivamos la transmisión infrarroja. Afortunadamente, esto fue suficiente para lograr la estabilidad.

Resultados

Una vez ganada la batalla, probamos nuestra solución para evaluar las latencias que podíamos lograr.

Luchando contra la latencia

Los fotogramas de color (azul) no requieren procesamiento, por lo que se reciben rápidamente, generalmente en menos de 10 milisegundos. La solicitud de un fotograma de profundidad (verde) activa el filtrado pendiente, que tarda alrededor de 150 ms, dependiendo de la planificación de subprocesos. Los fotogramas de profundidad alineados (rojo) requieren un procesamiento ligeramente mayor, de ahí el ligero aumento de la latencia.

Al operar las cámaras a una baja velocidad de fotogramas con tiempos de procesamiento más prolongados, las imágenes que proporciona nuestro servicio presentan cierto desfase. Sin embargo, si la escena es mayormente estática, como la nuestra, un retraso de 0,5 segundos es aceptable.

Luchando contra la latencia y ganando

El histograma anterior muestra la antigüedad de los fotogramas recibidos, medida mediante marcas de tiempo creadas al inicio de la exposición (por lo tanto, la antigüedad mínima es igual al intervalo entre fotogramas: 166 milisegundos).

Conclusión

En resumen, nuestra modificación reduce significativamente el uso de la CPU causado por las cámaras Intel RealSense cuando solo se necesita recuperar un fotograma ocasionalmente. Con esta modificación y hardware adicional, es posible conectar y utilizar más de una docena de cámaras.

El código fuente de esta modificación se puede encontrar aquí: https://github.com/NoMagicAi/realsense-ros.

Compartir artículo:

También te puede gustar

Tu futuro en la robótica comienza aquí.

Ponte en contacto con Nomagic para descubrir cómo nuestra tecnología innovadora puede llevar tus procesos de logística al siguiente nivel.