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.

Different vision workflows in 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

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

Le code de vision peut être intégré au programme principal du robot sur le roboRIO. Construire et exécuter le code de vision est simple car il est construit et déployé avec le programme du robot. Le code de vision peut être écrit à la main ou généré par GRIP en C++ ou Java. L’inconvénient de cette approche est que le fait d’avoir un code de vision s’exécutant sur le même processeur que le programme du robot peut entraîner des problèmes de performances. C’est quelque chose que vous devrez évaluer en fonction des exigences de votre programme de robot et de vision.

Dans cette approche, le code de vision produit simplement des résultats que le code du robot utilise directement. Cependant, faites attention aux problèmes de synchronisation lorsque vous écrivez du code pour votre robot qui obtient des valeurs à partir d’un thread de vision. Le code généré par GRIP et la classe VisionRunner dans WPILib facilitent cela.

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

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

Lorsque le code de vision est exécuté sur l’ordinateur principal (Driver Station), la vidéo est retransmise vers cet ordinateur portable pour traitement. Même les vieux ordinateurs portables de type Classmate sont sensiblement plus rapides pour traiter le flux de vision que le roboRIO. GRIP peut être exécuté directement sur l’ordinateur portable, et les résultats renvoyés au robot à l’aide de NetworkTables. Alternativement, vous pouvez écrire votre propre programme de vision en utilisant le langage de programmation de votre choix. Python est un bon candidat, car il supporte une implémentation native de NetworkTables et les liens OpenCV sont très bons.

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.

Le flux vidéo peut être affiché sur Shuffleboard ou dans GRIP.

Code de vision sur coprocesseur

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.

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.