Projet 4A - Repérage par camera

De Polybot Grenoble
Sauter à la navigation Sauter à la recherche

Le but du projet

[INTRO - EN CONSTRUCTION]

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. En suite d'une procédure d'étalonnage l’estimation précise de la position des tags et de la caméra qui les détecte est possible.

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.

Position du support de balises.png

Ces marqueurs permettent à un système de vision présent sur le mât central d’identifier et de localiser chaque robot.

Terrain de jeu.png

Le but est de créer ce système de vision pour identifier le positionnement de chaque robot, et un réseau pour permettre la communication entre robots et système de repérage. 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 (élément 3) 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 (éléments 1&2) ainsi que le positionnement des certains éléments du jeu. La girouette est disposée d’un tag ARUCO.

Girouette .png

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

Schéma .png

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:

Fov camera.png
Côté Angle minimale
Longueur (3m) 136,4°
Largeur (2m) 73,3°

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)

Calibrage de la caméra

Détection et estimation de la pose des marqueurs

Traitement des données

A l’aide des fonctions utilisées pour l’estimation de la pose des marqueurs nous obtenons deux vecteurs qui décrivent leur translation (tvec) et leur rotation (rvec), par rapport à un système des coordonnées. Ce systeme de coordonnees a comme origine le centre de l’objectif de la caméra (modèle de caméra sténopé), les axes xy selon le plan de la caméra et l’axe z sortant de l'objectif. Ce système de coordonnées serait parfaitement adapté si nous souhaitons de mesurer la rotation des tags ou leur distance par rapport à la caméra, mais notre objectif est de repérer les robots sur leur terrain. Ainsi, le système de coordonnées le plus adapté aurait son plan xy coïncident avec le terrain de jeu, son axe z normal à ce plan et son origine au point (0,0) du terrain. Nous arrivons du coup au système exact cité dans le règlement de la coupe, utilisé pour repérer tous les objets du terrain.

Pour effectuer ce changement de base, il suffit de trouver la matrice de passage de la base de la caméra sur la basse du terrain. Pour construire cette matrice de passage nous pouvons utiliser le marqueur numéro 42, situé sur le terrain de jeu, comme référence.

L'aire de jeu.png

Au début du programme nous construisons la matrice de passage vers le système de coordonnées du tag no 42, suivant le méthode suivante:

  1. Nous effectuons une suite des mesures de la position du marqueur de référence au et nous calculons la moyenne des vecteurs tvec et rvec. Cette partie de la procédure de calibrage et faite en boucle et les mesures sont moyennées pour améliorer sa précision. La qualité de la matrice produite va directement influencer la précision de toutes
  2. En utilisant ces vecteurs tvec et rvec moyennés, nous construisons la matrice 4x4 de passage à l’aide de la fonction cv2.Rodrigues().
    Mcalib.png

  1. Cette matrice décrit le passage de la base du tag de calibration vers la base de la caméra. Pour obtenir la transformation inverse, il suffit de calculer la matrice inverse.
  2. Finalement, pour obtenir les coordonnées d’un autre marqueur dans la nouvelle base nous multiplions son vecteur de translation tvec, avec la matrice de passage.

Produit calib vec.png

Le réseau

Support mécanique

Modèle 3d de la boite conceptualisée pour supporter la caméra, la Raspberry Pi et une batterie usb

En suivant les contraintes d’homologation nous avons modélisé une boîte pour contenir Raspberry, la caméra et la batterie du dispositif de repérage central. Nous avons utilisé le maximum de volume autorisé pour pouvoir placer la caméra le plus haut possible pour maximiser le champ de vue et minimiser la distorsion de la caméra. La caméra est mis en angle de 130° pour cibler le centre du terrain.

Lim support.png

Afin d’assurer que le système soit homologable nous l’avons modélisé avec la plateforme pour vérifier ces dimensions et sa compatibilité. Nous allons probablement imprimer la boîte en utilisant une imprimante 3d et en suite nous allons ajouter un boulon de 8mm et un écrou papillon, pour fixer la boîte sur la plateforme.

Evaluation de la performance

Résolution spatiale

Résolution temporelle

Consommation énergétique

Améliorations possibles

Mode d'emploi

Installation par image disque (recommandé)

Installation manuelle

  1. Mise à jour du système d’exploitation et des paquets installés:
    sudo apt update, sudo apt upgrade
  2. Recompiler et installer la plus récente version de OpenCV et ses depandances avec des options d’optimisation (procédure longue >1h). Guide à suivre
    1. 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 :
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

Programmes de base

Calibrage

Pendant la coupe