Cyaprana Project

Un projet étudiant (1ère année de master) dans le cadre de l'UE "M1If39 Projet Transversal Et Technologies Innovantes", qui consiste en la création d'un robot ramasseur de balle en environnement inconnu...

En vidéos »

Qui ?

Groupe d'étudiants de l'université Claude Bernard - Lyon 1 (dans l'ordre alphabétique) :

  • Areg Baghinyan
  • Pierre-loup Barazzutti
  • Nolan Declercq
  • Aurelien Grivollat
  • Romane Lhomme
  • Yoann Maret-verdant
  • Adam Sooga
  • Cyril Veve

Quoi ?

Construction d'un robot ramasseur / éjecteur de balles avec :

  • Environnement inconnu (obstacles...)
  • Exercices imposés (tri des balles selon couleur...)

Voir les différents exercices »

Quand ?

Projet basé sur une semaine intensive de programmation (donc hors construction du robot) lors du second semestre de la première année du Master d'informatique.

Où ?

A l'université Claude Bernard - Lyon 1.

En savoir plus »

Comment ?

Construction du robot avec Matériel LEGO Mindstorms imposé et smartphone (Android, IOS, WindowsPhone). Accès à un réseau de caméra placées autour du terrain.

Details »

Pourquoi ?

Idée principale : Travailler en groupe.
Différentes spécialitées mises en oeuvre :
Analyse d'image (Réseau de caméras et webcam du smartphone), Intelligence artificielle (Déplacement dans le terrain), Réseau (connectivité entre les éléments)

Répartition initiale des travaux

Intelligence artificielle

Mission : Calcul des déplacements du robot à effectuer au sein de l'environnement en fonction des données reçues (ex : position des éléments sur le terrain, obstacles...)

Groupe composé de :

  • Pierre-loup Barazzutti
  • Cyril Veve

Analyse d'image

Mission : Fournir au robot sa position au sein de l'environnement et les coordonnées des éléments à aller chercher (grâce aux données des caméras)

Groupe composé de :

  • Aurelien Grivollat
  • Nolan Declercq
  • Romane Lhomme
  • Yoann Maret-verdant

Réseau / Communication

Mission : Gérer la transmission des données entre l'ordinateur qui traite les images et le smartphone placé sur le robot, ainsi qu'entre le smartphone et les briques LEGO

Groupe composé de :

  • Areg Baghinyan
  • Adam Sooga

Choix de conception du Robot

Nous avons choisi de construire ce robot afin de remplir un maximum de contraintes imposées par le sujet. Grâce à ce dernier, nous pouvons donc ramasser les boules à n'importe quel endroit dans le terrain (contre un mur, dans les coins...).

D'autre part, il est démontable rapidement afin de permettre son rangement dans une boite de type feuille de format A4.

Il peut stocker 12 boules réparties sur 2 étages, ce qui lui permet de les sortir du terrain simultanément. Le mode d'éjection des boules a été réalisé afin de permettre une éjection organisée des boules.

Le mode de fonctionnement du robot est le suivant : Dès que le robot détecte une boule, il se dirige vers elle, la roue, étant sans cesse en rotation, lui permet de prendre la boule à l'étage 0 ou à l'étage 1 en fonction de l'ouverture du portail. De plus pour être sûr que la boule ne s'échappe pas lorsqu'on tente de la récupérer, la "mâchoire" du robot se referme forçant ainsi la boule à être capturée par le robot.

Intelligence artificielle

Pour tester les fonctionnalités du robot, nous avons programmé une télécommande Android. Celle-ci pouvait demander au robot de se déplacer, de tourner la roue qui attrape les boules, de monter / descendre la porte qui gère l'emplacement de la boule (les boules bleues en haut et les boules rouges en bas) et d'éjecter les boules.

Toute l'IA se trouve dans le téléphone. Celui-ci reçoit des informations des caméras du dessus par WIFI, utilise sa caméra et donne des ordres aux briques NXT/EV3 par bluetooth.

Le premier " test d'IA " a été réalisé sans aucune des caméras. Le robot connait la position des boules et sa position qui sont ajoutées manuellement dans le code. Le robot cherche la boule la plus proche, calcule l'angle et effectue la rotation. Puis il calcule la distance entre la boule choisie et le robot et avance vers la boule. Il calcule ensuite la nouvelle position du robot en fonction de ces 2 actions. Bien sûr la position n'était pas précise mais permettait d'obtenir des premiers résultats.

Pour la sortie des boules :
Le robot pouvait aussi se déplacer vers une sortie ou deux sorties ajoutées aussi dans le code. Le robot se dirige vers la sortie en effectuant le même procédé que pour attraper les boules. Une fois devant la sortie, il effectue une rotation de 180° pour pouvoir éjecter les boules.
Notre robot sait expulser les boules définies dans le sujet :

  • Sortir les balles dans une sortie
  • Sortir les balles d'une certaine couleur dans une sortie, les autres dans la deuxième sortie
  • Sortir les balles dans un certain ordre
  • Sortir du terrain
  • La première version d'IA que nous avons déployée utilise seulement la caméra du téléphone. Nous avons juste la connection entre les briques et Android. Le robot tourne sur lui-même et si il détecte une boule, il la centre avec la caméra et fonce dessus. Quand la balle disparait en bas de l'écran, le robot déclenche la phase de capture et recommence à tourner. Quand il ne voit plus de boule, il s'arrête. Avec cette première version, le robot est capable de se déplacer dans une map sans obstacle et de récupérer les boules en moins de 3 minutes (voir les vidéo).

    La deuxième version d'IA utilise la caméra du téléphone et les 4 caméras du dessus. Nous avons une communication entre les briques et les téléphones mais aussi entre le téléphone et l'ordinateur. Dans un premier temps, le téléphone attend les coordonnées des boules et du robot. Puis il recherche le boule la plus proche, calcule l'angle à effectuer pour voir la boule et demande au robot de tourner. Une fois la rotation terminée, le téléphone regarde s'il voit une boule. Si il en voit une, il se dirige vers elle comme dans la première version, sinon il avance de la distance qui sépare la boule du robot. Si le robot capte un obstacle, il le contourne, si il voit une boule, il la ramasse, sinon il recherche une nouvelle boule à ramasser.

    Pour les obstacles :
    N'ayant pas de positon des obstacles avec les caméras, nous avons pensé à développer un algorithme de contournement d'obstacle. Le robot possède 3 capteurs devant : un capteur au milieu détectant devant, un autre à droite légèrement incliné vers la droite et le dernier à gauche incliné vers la gauche. Le robot s'est arrêté devant l'obstacle grace à son capteur du milieu.
    Etape 0 : Nous demandons au robot de tourner vers la gauche tant que son capteur avant détecte un obstacle.
    Etape 1 : Le robot avance tant que le capteur de droite capte l'obstacle en vérifiant que ce dernier ne soit pas devant.

  • Si le capteur de droite ne capte plus d'obstacle, nous demandons au robot d'avancer de 40 cm pour qu'il puisse effectuer une rotation à droite sans toucher l'obstacle. Le robot tourne ainsi de 90° à droite en s'arrêtant si le capteur de droite voit un obstacle. Le robot revient à l'étape 1.
  • Si le capteur de devant ou (gauche) capte un obstacle, le robot revient à l'étape 0
  • Pour chaque étape du contournement d'obstacle, nous vérifions si une boule ne se trouve pas à l'écran. Avec ce contournement d'obstacle, le robot est capable de chercher les boules dans un terrain avec un ou plusieurs obstacles, dans un terrain en U ou en L.

    Nous pouvons améliorer la recherche des boules dans un labyrinthe en utilisant notre projet de TER qui permet au robot de se déplacer dans un terrain inconnu tout en construisant une représentation graphique de cet espace. Le robot pourra alors utiliser ce graphe pour savoir où il n'est pas passé et ainsi retourner à certain endroits en un minimum de temps grâce a des algorithme tel que A* ou Dijkstra.

    Pour la sortie des boules :
    Avec les caméras du haut, nous récupérons la position du robot. Le robot va alors effectuer une rotation pour pouvoir se diriger vers la sortie. Une fois devant la sortie, le robot tourne de 180° et éjecte les boules. Nous n'avons pas pu vérifier cette partie à cause d'une perte de connection avec le serveur.

    Partie Image

    Nous présenterons ici tout ce qui concerne la partie Imagerie du robot, à savoir la détection des balles dans l'espace de test, que ce soit au niveau des caméras fixes filmant la scène ou de celle du robot, ainsi que le calcul de leur coordonnées par rapport au repère de la scène.

    Choix de conception

    Pour concevoir cette partie du projet nous avons utilisé :

    • La bibliothèque OpenCV pour sa facilité d'utilisation et sa grande documentation, et surtout pour sa gratuité.
    • Le langage C++, qui est de base utilisé par OpenCV, et qui reste un langage très performant, notamment pour le rendu temps réel, tâche au centre de cette partie.

    Détection des boules et du robot

    En ce qui concerne la détection des objets importants dans l'image, on utilise le même principe, quelle que soit la caméra : on commence par définir des plages de valeurs de type HSV (Hue Saturation Value). Il y a quatre couleurs à détecter : Rouge et Bleu (les boules), Vert et Jaune (les signalisations du robot, pour le retrouver facilement au sein de l'image). Chaque couleur possède deux plages propres : une pour la pleine lumière (si l'objet est correctement éclairé) et l'autre pour l'ombre (si l'objet se trouve à l'ombre d'un obstacle par exemple).

    Ensuite l'algorithme de détection se déroule comme suit :

    • On commence par mettre en place les caches qui vont permettre d'effectuer la détection uniquement sur la partie qui nous intéresse, à savoir le labyrinthe.
    • On met en place un fond appelé "fond vide", qui est en fait le labyrinthe sans aucun élément à l'intérieur : ainsi on ne fait la détection que sur les pixels modifiés entre ce fond et la frame actuelle.
    • On commence à détecter dans chacune des frames les plages définies plus hauts, en utilisant les fonctions Erode, Dilate et GausssianBlur pour affiner la détection. Puis on recherche le point clé central à chaque tâche de couleur, que l'on stocke dans le vecteur approprié.
    • On contrôle enfin si on a bien réuni tous les points, notamment les deux du robot : si ce n'est pas le cas, on recommence à détecter le jeune et le vert, mais sans la suppression du fond cette fois-ci.

    Calcul des coordonnées

    Pour calculer la coordonnées de chaque point trouvé, il nous faut connaˆtre les paramètres intrinsèques et extrinsèques des caméras, ainsi que la hauteur des points par rapport au sol dans le monde réel (2,6 cm pour le centre de la boule, 18,5 et 24,5 cm pour nos marqueurs de robot).

    Le calcul à effectuer :
    Vecteur Direction = Inverse(matrice Intrinsèque)*coordonnées pixel du point clé
    Vecteur Direction = Transpose(MatriceRotation de la caméra) * Vecteur Direction
    Coordonnées Globales du Point = Coordonnées de la Caméra + Distance au Point * Vecteur Direction

    D'où :
    CGP.x = CC.x + DP * VD
    CGP.y = CC.y + DP * VD
    CGP.z = CC.z + DP * VD
    Comme on connait CGP.z, on est alors en mesure de résoudre ce système.

    Une fois ces coordonnées acquises, on doit ensuite les comparer pour contrôler les possibles chevauchements : Si deux points sont à moins d'un diamètre de boule (5,2 cm), on considère qu'il s'agit en fait d'un même point. De même, si les points vert et jaune du robot ne sont pas situés à la distance mesurée à la main entre eux, il s'agit d'une erreur et ils ne doivent alors pas être pris en compe. Pour être sûr de toujours avoir des coordonnées vraisemblables pour le robot, on garde en mémoire la dernière position fiable. Cette partie de calcul des coordonnées n'est pas utilisée pour la caméra du téléphone, où l'on considère que le robot doit juste se diriger vers le point clé le plus proche de lui, et donc le plus proche d'une coordonnée pixel (voir partie IA).

    Il n'a malheureusement pas été possible de mettre en place une détection efficace des obstacles via les caméras, ce qui a été reporté sur la partie IA : cela aurait été intérressant à développer, notamment pour éviter du travail supplémentaire au robot et à son calcul de trajectoire.