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 est une librairie de vision par ordinateur de type open-source largement utilisée dans le monde universitaire et l’industrie. Elle est supportée par les fabricants de matériel fournissant un traitement accéléré par GPU, et dispose de liens pour un certain nombre de langages, notamment C++, Java et Python. Elle est également bien documentée avec de nombreux sites Web, livres, vidéos et cours de formation Il existe donc de nombreuses ressources disponibles pour vous aider à apprendre à l’utiliser. Les versions C++ et Java de WPILib incluent les librairies OpenCV, celle-ci se charge de la capture, du traitement et de la visualisation de vidéos et comprend des outils pour vous aider à créer vos algorithmes de vision. Pour plus d’informations sur OpenCV, consultez 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.

Une fois les images traitées, les valeurs clés telles que la position cible, la distance ou tout autre élément dont vous avez besoin peuvent être renvoyées au robot avec NetworkTables. Cette approche a généralement une latence plus élevée, car un délai est ajouté en raison des images devant être envoyées à l’ordinateur portable. Les limitations de bande passante limitent également la résolution maximale et le FPS des images utilisées pour le traitement.

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.