Mobot#
Article de Cosku Acay, Edwin Cho, Kenneth Li et Nishant Pol. PDF.
Description du projet#
Lors de la compétition Mobot de Carnegie Mellon, les robots doivent franchir une série de 14 portes positionnées le long d’une ligne blanche courbe de 255 pieds sur un trottoir extérieur. Le parcours comprend deux rampes escarpées et une zone de point de décision où le robot doit choisir le bon itinéraire pour franchir 14 portes dans l’ordre. Comme la ligne est en extérieur et soumise au climat de Pittsburgh, le robot doit fonctionner dans des conditions variées. Cette année, le jour de la compétition, il pleuvait et il y avait du vent. Plus d’informations sont disponibles sur http://www.cs.cmu.edu/mobot/mobot.html


Solution avec la CMUcam4#
Nous avons choisi d’aborder la tâche de suivi de ligne à l’aide de la CMUcam4 car elle nécessitait un matériel minimal et disposait d’une interface bien adaptée au suivi d’une ligne.

La CMUcam4 capture une image de la ligne à 30 images par seconde et transmet l’image de suivi de couleur à l’Arduino Mega via l’une des trois lignes série. L’Arduino Mega traite ensuite cette image (voir la description du logiciel ci-dessous) et transmet des commandes de vitesse moteur et de virage au contrôleur PID via une autre ligne série. Le contrôleur PID fournit à son tour à l’Arduino Mega les comptes d’encodeur pour les roues droite et gauche, ce qui nous permet de suivre notre position et notre cap par rapport à la porte 0.
Le contrôleur PID (MD-25) est fabriqué par Robot-Electronics au Royaume-Uni. Il pilote deux moteurs à balais à courant continu avec réducteur, dotés d’encodeurs magnétiques sur l’arbre moteur. L’écran LCD sert à des fins de débogage. Nous avions deux rails d’alimentation, 12V pour les moteurs et 5V pour la logique, partageant la même masse et tous deux alimentés par une seule batterie rechargeable de 12V.
Nous avions initialement prévu de fabriquer un prototype à partir d’une base en bois pour entrer rapidement dans la phase de programmation, puis de travailler sur une base plus rapide et plus fiable comme une voiture RC. Cependant, nous avons constaté que le prototype était très fiable et facile à utiliser, nous l’avons donc conservé pour la conception finale. L’imperméabilisation du corps consistait en une couche de cellophane sous une couche de ruban d’emballage. La pluie s’infiltrait toutefois à travers le ruban d’emballage mais heureusement pas à travers le film de cellophane. La caméra était recouverte d’un carré de plastique provenant d’un sac Ziploc, car nous avons constaté que ce « filtre » améliorait la capacité de la caméra à ignorer les petites zones de la ligne qui, pour la caméra, ressemblaient au béton d’arrière-plan.
Description de l’algorithme#
Contexte#
Nous utilisons la CMUcam4 en mode de suivi de couleur avec le mode YUV activé, ce qui nous donne une représentation en image binaire de la ligne. Le logiciel de la caméra filtre tout ce qui n’est pas blanc (c’est-à-dire l’arrière-plan) et place un pixel « allumé » là où il y a une ligne (là où c’est blanc). Nous utilisons le mode YUV afin que le suivi de couleur soit insensible à l’intensité de la lumière, de sorte que notre robot puisse fonctionner dans une grande variété de conditions, y compris en intérieur et en extérieur.
Suivi de ligne#
La CMUcam4 fournit à notre puce Arduino une image binaire de 80 sur 60. Nous échantillonnons 10 rangées de pixels équidistantes de l’image et calculons le centroïde des pixels « allumés » (voir ici : https://en.wikipedia.org/wiki/Centroid#Of_a_finite_set_of_points). Nous supposons ensuite que la ligne se trouve sur le centroïde. En faisant cela sur 10 rangées différentes de l’image, nous obtenons une bonne approximation de la ligne en reliant les points. Nous pouvons ensuite utiliser ces données en déterminant à quelle distance chaque point de la ligne se trouve de la ligne verticale située au centre de l’image, afin d’obtenir une valeur représentant à quel point la ligne est courbée. Cela peut être vu comme quelque chose comme trouver l’aire entre la tangente et une courbe et utiliser cette aire pour déterminer de combien nous devons tourner. Le signe détermine si le virage est à gauche ou à droite, tandis que l’amplitude détermine de combien nous devons tourner pour suivre la ligne. Comme on pourrait s’y attendre, si nous mesurions une aire nulle, alors la ligne se trouve directement devant le robot et est une ligne droite. Si l’amplitude de l’aire est grande, alors le robot doit tourner pour tenter de minimiser l’amplitude de cette aire.
Points de décision#
Pour déterminer si le robot se trouve à un point de décision, nous prenons les données que la caméra recueille lors du suivi de ligne et vérifions combien de points centraux moyens apparaissent dans l’espace noir. Cela fonctionne en partant du principe que le point moyen entre deux lignes ne devrait se trouver sur aucune des deux lignes, à moins que les lignes ne soient la même ligne. Si le robot détecte plusieurs points moyens dans l’espace noir, il peut en conclure qu’il doit y avoir deux lignes ici. Il sélectionne alors le virage approprié et oriente son virage vers cette direction jusqu’à ce qu’il ne voie plus qu’une seule ligne.
Veuillez vous rendre sur https://github.com/cacay/Mobot pour voir une version simplifiée de notre code ou ici pour une copie locale.

