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.

Vision code can be embedded into the main robot program on the roboRIO. Building and running the vision code is straightforward because it is built and deployed along with the robot program. The vision code can be written in C++, Java, or Python. The disadvantage of this approach is that having vision code running on the same processor as the robot program can cause performance issues. This is something you will have to evaluate depending on the requirements for your robot and vision program.

In this approach, the vision code simply produces results that the robot code directly uses. Be careful about synchronization issues when writing robot code that is getting values from a vision thread. The VisionRunner class in WPILib make this easier.

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.

When vision code is running on the DS computer, the video is streamed back to the Driver Station laptop for processing. Even the older Classmate laptops are substantially faster at vision processing than the roboRIO. You can write your own vision program using a language of your choosing. Python makes a good choice since there is a native NetworkTables implementation and the OpenCV bindings are very good.

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.

The video stream can be displayed on Shuffleboard or SmartDashboard.

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í.