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 is an open source computer vision library that is widely used throughout academia and industry. It has support from hardware manufactures providing GPU accelerated processing, it has bindings for a number of languages including C++, Java, and Python. It is also well documented with many web sites, books, videos, and training courses so there are lots of resources available to help learn how to use it. The C++ and Java versions of WPILib include the OpenCV libraries, there is support in the library for capturing, processing, and viewing video, and tools to help you create your vision algorithms. For more information about OpenCV see 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.

After the images are processed, the key values such as the target position, distance, or anything else you need can be sent back to the robot with NetworkTables. This approach generally has higher latency, as delay is added due to the images needing to be sent to the laptop. Bandwidth limitations also limit the maximum resolution and FPS of the images used for processing.

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