Estrategias para la programación de la visión

Usar la visión por computadora es una gran manera de hacer que tu robot responda a los elementos en el campo y hacerlo mucho más autónomo. A menudo en los juegos de FRC® hay puntos de bonificación por disparar de forma autónoma pelotas u otras piezas de juego a las metas o navegar a lugares en el campo. La visión por computador es una gran manera de resolver muchos de estos problemas. Y si tienes código autónomo que puede hacer el desafío, entonces puede ser usado durante el período de teleoperado para ayudar a los conductores.

Hay muchas opciones para elegir los componentes para el procesamiento de la visión y donde el programa de visión debería funcionar. WPILib y las herramientas asociadas apoyan un número de opciones y dan a los equipos mucha flexibilidad para decidir qué hacer. Este artículo tratará de darte un poco de de muchas de las opciones y compensaciones que están disponibles.

Different vision workflows in FRC.

Biblioteca de Visión por Computadora OpenCV

OpenCV es una biblioteca de visión de ordenador de código abierto que se utiliza ampliamente en todo el mundo académico y la industria. Cuenta con el apoyo de los fabricantes de hardware que proporcionan procesamiento acelerado en la GPU, tiene enlaces para varios lenguajes incluyendo C++, Java y Python. También está bien documentado con muchos sitios web, libros, vídeos y cursos de formación, por lo que hay muchos recursos disponibles para ayudar a aprender a usarla. Las versiones C++ y Java de WPILib incluyen las bibliotecas de OpenCV, hay apoyo en la biblioteca para la captura, procesamiento y para mostrar video, y herramientas para ayudarte a crear tus algoritmos de visión. Para obtener más información sobre OpenCV, ver https://opencv.org.

Código de visión en roboRIO

The chain from a USB Webcam to roboRIO to Ethernet Switch over a video stream to the driver station computer.

El código de visión puede ser incrustado en el programa principal del robot en el roboRIO. Hacer y ejecutar el código de visión es sencillo porque está construido y desplegado junto con el programa de robots. El código de la visión puede ser escrito a mano o generado por GRIP en C++ o Java. La desventaja de este enfoque es que al tener el código de visión corriendo en el mismo como el programa del robot puede causar problemas de rendimiento. Esto es algo que tienen que evaluar dependiendo de los requisitos de su robot y programa de visión.

En este enfoque, el código de visión simplemente produce resultados que el código del robot utiliza directamente. Tenga cuidado con los problemas de sincronización cuando escriba el código de robot que esté obteniendo valores de un hilo de visión. El código generado por el GRIP y la clase VisionRunner en WPILib hacen que este sea más fácil.

Utilizando las funciones proporcionadas por la clase CameraServer, el flujo de vídeo puede ser enviado a tableros como el Shuffleboard para que los operadores puedan ver lo que la cámara ve. Además, se pueden agregar anotaciones a las imágenes usando comandos OpenCV para que los objetivos u otros interesantes, los objetos pueden ser identificados en la vista del tablero.

Código de visión en computadora DS

Same as the above diagram but the Driver Station computer must process that video and send NetworkTables updates back to the roboRIO.

Cuando el código de visión se ejecuta en el ordenador DS, el vídeo se transmite de vuelta a la Estación portátil para el procesamiento. Incluso las computadoras viejas son sustancialmente más rápidas en el procesamiento de la visión que el roboRIO. GRIP puede ser ejecutado en el portátil de la Estación de Control directamente con los resultados enviados al robot usando las Tablas de Red. Alternativamente usted puede escribir su propio programa de visión usando un lenguaje de su elección. Python es una buena elección ya que hay una implementación nativa de las Tablas de Red y los enlaces de OpenCV son muy buenos.

Después de que las imágenes sean procesadas, los valores clave como la posición del objetivo, la distancia o cualquier otra cosa que necesite pueden ser enviados de vuelta al robot con NetworkTables. Este enfoque generalmente tiene una mayor latencia, ya que se añade un retraso debido a que las imágenes necesitan ser enviadas al portátil. Las limitaciones del ancho de banda también limitan la resolución máxima y el FPS de las imágenes sean utilizadas para el procesamiento.

El stream de video puede desplegarse en el tablero de conexión o en el GRIP.

Código de video en coprocesador

Coprocessor is on same network as the roboRIO so it off loads the compute without having the latency of going to the Driver Station and back.

Los coprocesadores como el Pi de Raspberry son ideales para apoyar el código de visión (ver docs/software/vision-processing/frcvision/using-the-raspberry-pi-for-frc:Using the Raspberry Pi for FRC). La ventaja es que pueden correr a toda velocidad y no interferir con el programa de robots. En este caso, la cámara está probablemente conectada al coprocesador o (en el caso de las cámaras Ethernet) un interruptor Ethernet en el robot. El programa puede ser escrito en cualquier idioma; Python es una buena elección por su simple unión a OpenCV y NetworkTables. Algunos equipos han utilizado coprocesadores de visión de alto rendimiento como el Nvidia Jetson para una mayor velocidad y resolución, aunque este enfoque generalmente requiere conocimientos avanzados de Linux y de programación.

Este enfoque requiere un poco más de experiencia en programación así como una pequeña cantidad adicional de espacio pero, por lo demás, aporta lo mejor de ambos mundos en comparación con los otros dos enfoques, ya que los coprocesadores son mucho más rápidos que el roboRIO y el procesamiento de la imagen se puede realizar con un mínimo de latencia o uso de ancho de banda.

Los datos pueden ser enviados desde el programa de visión en el coprocesador al robot usando NetworkTables o un protocolo privado a través de una red o una conexión en serie.

Opciones de cámara

Hay un número de opciones de cámara soportadas por WPILib. Las cámaras tienen un número de parámetros que afectan al funcionamiento; por ejemplo, la velocidad de fotogramas y la resolución de la imagen afectan a la calidad de las imágenes recibidas, pero cuando se establece un tiempo de procesamiento de impacto demasiado alto y, si se envía a la estación del conductor, puede exceder el ancho de banda disponible en el campo.

La clase CameraServer en C++ y Java se utiliza para interactuar con las cámaras conectadas al robot. Recupera cuadros para el procesamiento local a través de un objeto fuente y envía el flujo a su puesto de conductor para ser visto o procesado allí.