Stratégies pour la programmation de la vision

L’utilisation de la vision par ordinateur est un excellent moyen de rendre votre robot sensible aux éléments sur le terrain et de le rendre beaucoup plus autonome. Souvent dans les jeux FRC®, il ya des points bonus pour les balles tirées en mode autonome ou d’autres pièces de jeu dans les buts ou la navigation vers des endroits précis sur le terrain. La vision par ordinateur est un excellent moyen de résoudre bon nombre de ces problèmes. Et si vous avez du code autonome qui peut relever le défi, alors il peut être utilisé pendant la période de téléopéré et ainsi assister les conducteurs humains lors du pilotage.

Il existe de nombreuses options pour choisir les composants pour le traitement de la vision et où le programme de vision va s’exécuter. WPILib et les outils associés prennent en charge un certain nombre d’options et offrent aux équipes une grande flexibilité pour décider quoi faire. Cet article va tenter de vous donner un aperçu de la plupart des choix et des compromis disponibles.

Différents flux de travail de vision en FRC.

Librairie de vision par ordinateur 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.

Vision Code sur roboRIO

La chaîne partant d’une webcam USB puis au roboRIO et à un commutateur Ethernet sur un flux vidéo à l’ordinateur contenant l'application driver station.

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.

En utilisant les fonctions fournies par la classe CameraServer, le flux vidéo peut être envoyé à des tableaux de bord tels que Shuffleboard afin que les opérateurs puissent voir ce que la caméra voit. De plus, des annotations peuvent être ajoutées aux images à l’aide des commandes OpenCV afin que les cibles ou autres objets intéressants puissent être identifiés dans la disposition du tableau de bord.

Code de vision sur ordinateur DS

Identique au diagramme ci-dessus, mais l’ordinateur contenant l'application Driver station doit traiter cette vidéo et renvoyer les mises à jour NetworkTables au 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.

Code de vision sur coprocesseur

Le coprocesseur est sur le même réseau que le roboRIO, il charge donc le calcul sans avoir la latence d’aller à l'application Driver Station station et en revenir.

Les coprocesseurs tels que le Raspberry Pi sont idéaux pour prendre en charge le code de vision (voir Utilisation du Raspberry Pi pour FRC). L’avantage est qu’ils peuvent fonctionner à pleine vitesse et ne pas interférer avec le programme du robot. Dans ce cas, la caméra est probablement connectée au coprocesseur ou (dans le cas des caméras Ethernet) à un interrupteur Ethernet sur le robot. Le programme peut être écrit dans n’importe quelle langage; Python est un bon choix en raison de ses liaisons simples à OpenCV et NetworkTables. Certaines équipes ont utilisé des coprocesseurs de vision haute performance tels que le Nvidia Jetson pour sa vitesse très rapide et sa plus haute résolution, bien que cette approche nécessite généralement des connaissances avancées sur Linux et en programmation.

Cette approche nécessite un peu plus d’expertise en programmation et ajoute un léger poids supplémentaire au robot, cependant, c’est le meilleur des deux mondes par rapport aux deux autres approches. Les coprocesseurs sont beaucoup plus rapides que le roboRIO et le traitement d’image peut être effectué avec latence minimale ou utilisation de la bande passante.

Les données peuvent être envoyées du programme de vision vers le coprocesseur via les NetworkTables ou par un protocole privé sur un réseau ou une connexion série.

Options de caméra

WPILib prend en charge un certain nombre d’options de caméra. Les caméras ont plusieurs paramètres qui influencent le fonctionnement; par exemple, la fréquence d’images et la résolution d’image influencent la qualité des images reçues, mais lorsqu’elles sont réglés trop hautes, elles contribuent à un temps de traitement très élevé et, si elles sont envoyées à l’ordinateur portable Driver Station pour traitement, elles peuvent causer un dépassement de la bande passante disponible sur le terrain.

La classe CameraServer en C++ et Java est utilisée pour interfacer avec les caméras connectées au robot. Elle récupère les trames pour le traitement local via un objet Source et ensuite envoie le flux au poste de pilotage pour visualisation ou traitement.