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