Différences entre versions de « Projet 4A - Repérage par camera »
Ligne 60 : | Ligne 60 : | ||
===Capture des images=== | ===Capture des images=== | ||
+ | La librairie '''picamera''' nous permet de recevoir des images et de définir des paramètres comme la '''résolution''', le nombre des '''images par seconde''', la sensibilité '''ISO''', etc. Nous avons choisi les paramètres suivantes : | ||
+ | |||
+ | *'''Résolution : 1280x960 px''', compromis entre la précision et le temps de calcul | ||
+ | *'''Images par seconde (fps) : 30 fps''', la valeur minimale supportée par la caméra, vu que la Raspberry n’est pas capable d’analyse plus que ≈10 fps | ||
+ | *'''ISO : 800''', pour forcer la caméra à utiliser une courte durée d’exposition qui produit des images plus nettes et rendre la détection des tags en mouvement plus fiable. Le désavantage de ce réglage est l'augmentation du bruit. | ||
+ | |||
+ | Nous analysons l'efficacité de ce réglage dans la partie “Évaluation de la performance” | ||
+ | |||
+ | La librairie produit des '''matrices numpy''' de taille 1280x960x3 qui représente l’image capté, contenant l'information pour chaque pixel. A ce point, nous pouvons créer une boucle qui effectue les opérations de capture et de traitement en série. | ||
+ | |||
+ | Pour mieux gérer le flux des images générées par la caméra nous avons créer la classe python '''PiVideoStream'''. Cette classe, à l’aide de la librairie '''threading''' de python, permet à notre programme de paralléliser les tâches de la capture et du traitement des images. Cette technique de parallélisation a doublé la performance du système (~4fps à ~8fps) | ||
+ | |||
===Détection des tags=== | ===Détection des tags=== | ||
===Traitement des données=== | ===Traitement des données=== |
Version du 24 avril 2020 à 21:27
Le but du projet
EN CONSTRUCTION
[INTRO]
ARUCO est une librairie OpenSource qui permet la détection des marqueurs rectangulaires dans une image. Le projet est développé à l'Université de Cordoba en Espagne. Il s’agit des librairies des marqueurs (tags) et des algorithmes qui permettent leur détection et suivant une procédure d'étalonnage l’estimation précise de la position des tags et de la caméra qui les détecte.
Suivant le règlement de la coupe de robotique de France, tous les robots verront attribuer un marqueur, qui est placé au sommet du support de balises.
Ces marqueurs permettent à un système de vision présent sur le mât central d’identifier et de localiser chaque robot.
Le but est de créer ce système de vision pour identifier le positionnement de chaque robot, et un réseau pour envoyer ces coordonnées. Cette information peut être utilisée pour mieux synchroniser les deux robots à notre disposition, leur permettant de mieux collaborer, et pour éviter des collisions avec des robots adversaires.
Le système peut aussi être utilisé pour identifier des éléments de jeu et changer les actions des robots. Par exemple, cette année, le terrain de jeu dispose une girouette qui s’arrête de tourner après le début du match pour indiquer dans quel sens souffle le vent. La direction du vent (nord ou sud), indique l’emplacement d'arrêt des robots à la fin du match ainsi que le positionnement des certains éléments du jeu. La girouette est disposée d’un tag ARUCO.
Notre plan est de placer une caméra sur un de nos robots, capter l’angle d'arrêt de la girouette et transmettre l’information à l'autre robot afin d'exécuter les correctes actions. Le fait d’avoir cette information a notre disposition va nous permettre de gagner de points.
Participants
Prénom & Nom | Filière |
---|---|
Errikos Messara | IESE-4 |
Pedro Lopes | IESE-4 |
Tuteur: Sylvain Toru
Cahier des charges
Architecture du système
Travail réalisé
Le choix du matériel
Le système utilisé le langage Python et la librairie OpenCV et il est principalement composé d’un ordinateur Raspberry Pi et d’une caméra.
Nous avons choisi le Raspberry car ça petite taille et faible consommation d’énergie le rendre idéal pour les applications embarquées. Nous avons utilisé la version la plus performante, le Raspberry Pi 4 4GB. Le Raspberry est équipé d’un processeur ARM quadricoeur de Broadcom, d’un module WiFi dont nous utilisons pour la communication, et d’une interface CSI utilisée pour connecter une caméra.
La caméra du dispositif de repérage centrale, comme elle est positionnée à 1m du terrain et le terrain fait 3m de longueur et 2m de largeur, doit avoir un champ de vue assez large. Plus précisément, nous avons calculé le champ de vue nécessaire pour capter tout le terrain:
Côté | Angle minimale |
---|---|
Largeur (2m) | 113° |
Longueur (3m) | 63° |
D’après ce calcul nous avons choisi une caméra avec un champ de vue de 160°. Cela nous donne un peu de marge pour pouvoir capter les marqueurs qui sont placés sur les robots. De plus le capteur de la caméra ne produit pas des images en plein champ de vue en mode vidéo, donc nous avons besoin de marge complémentaire pour pouvoir visualiser tout le terrain. Malheureusement, cet objectif grand angle, produit une image aux fortes distorsions, dont nous devons prendre un compte plus tard. Une autre caractéristique perturbante des objectifs grand angle de est le fait que les coins des images peuvent apparaître floues même si la mise au point est bien réglée.
Nous avons placé le Raspberry dans un boîtier en aluminium qui le protège et qui dispose d’un ventilateur pour refroidire le processeur. Cela nous permet d'augmenter la fréquence maximale du processeur de 1,5 à 2,0 GHz, et gagner en temps de calcul.
Capture des images
La librairie picamera nous permet de recevoir des images et de définir des paramètres comme la résolution, le nombre des images par seconde, la sensibilité ISO, etc. Nous avons choisi les paramètres suivantes :
- Résolution : 1280x960 px, compromis entre la précision et le temps de calcul
- Images par seconde (fps) : 30 fps, la valeur minimale supportée par la caméra, vu que la Raspberry n’est pas capable d’analyse plus que ≈10 fps
- ISO : 800, pour forcer la caméra à utiliser une courte durée d’exposition qui produit des images plus nettes et rendre la détection des tags en mouvement plus fiable. Le désavantage de ce réglage est l'augmentation du bruit.
Nous analysons l'efficacité de ce réglage dans la partie “Évaluation de la performance”
La librairie produit des matrices numpy de taille 1280x960x3 qui représente l’image capté, contenant l'information pour chaque pixel. A ce point, nous pouvons créer une boucle qui effectue les opérations de capture et de traitement en série.
Pour mieux gérer le flux des images générées par la caméra nous avons créer la classe python PiVideoStream. Cette classe, à l’aide de la librairie threading de python, permet à notre programme de paralléliser les tâches de la capture et du traitement des images. Cette technique de parallélisation a doublé la performance du système (~4fps à ~8fps)
Détection des tags
Traitement des données
Le réseau
Support mécanique
Evaluation de la performance
Améliorations possibles
Mode d'emploi
Installation par image disque (recommandé)
Installation manuelle
- Mise à jour du système d’exploitation et des paquets installés:
sudo apt update, sudo apt upgrade
- Recompiler et installer la plus récente version de OpenCV et ses depandances avec des options d’optimisation (procédure longue >1h). Guide à suivre
- Pour activer des options de multithreading il faut ajouter les flags WITH_TBB=ON, WITH_OPENMP=ON, pendant la génération du makefile. Ces flags de compilation permettent à OpenCV de fonctionner en multithreading. De plus, les flags ENABLE_NEON=ON, ENABLE_VFPV3=ON, forcent la librairie d’utiliser d’instructions spécifiques à l'architecture ARM, qui en conséquence améliorent la performance.
Liste des flags complète :
- Pour activer des options de multithreading il faut ajouter les flags WITH_TBB=ON, WITH_OPENMP=ON, pendant la génération du makefile. Ces flags de compilation permettent à OpenCV de fonctionner en multithreading. De plus, les flags ENABLE_NEON=ON, ENABLE_VFPV3=ON, forcent la librairie d’utiliser d’instructions spécifiques à l'architecture ARM, qui en conséquence améliorent la performance.
cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \ -D ENABLE_NEON=ON \ -D ENABLE_VFPV3=ON \ -D BUILD_TESTS=OFF \ -D INSTALL_PYTHON_EXAMPLES=OFF \ -D OPENCV_ENABLE_NONFREE=ON \ -D CMAKE_SHARED_LINKER_FLAGS=-latomic \ -D WITH_TBB=ON \ -D WITH_OPENMP=ON \ -D BUILD_EXAMPLES=OFF ..
- 3. Installer imutils
pip3 install imutils