Dans cette expérience nous allons apprendre à un robot Thymio à naviguer comme une fourmi cherchant sa nourriture. Elle a déjà été effectuée ici mais sans forcément en montrer toutes les difficultés, comment les résoudre et avec quel code. Si ce dernier est écrit dans le langage Aseba propre à Thymio, l'algorithme et sa mise en œuvre doivent permettre de le traduire dans d'autres langages pour d'autres robots. Cliquez sur la vidéo ci-dessous pour voir ce que cela donne, le code est lui tout en bas de la page. A vous de jouer !

Faire la fourmi ?

Lorsque les fourmis partent de leur nid à la recherche d'une source de nourriture, elles commencent par aller au hasard. Lorsqu'elles en trouvent une, elles reviennent vers leur nid en déposant une trace chimique permettant ainsi de marquer un chemin de la nourriture au nid que pourront désormais suivre leurs congénères. C'est ce comportement que nous allons tenter de reproduire avec un Thymio dans un carton. Partant d'une base, il ira au hasard à la recherche d'une cible symbolisée par un rond noir. Lorsqu'il la trouvera, il reviendra à sa base en marquant le chemin de la cible à la base. Après quelques passages, cette marque sera suffisamment visible pour qu'il la détecte et la suive pour aller directement à la cible.

Réaliser ceci avec un Thymio, un vrai usagé, avec ses capteurs qui ne viennent pas juste d'être réglés en usine, est un vrai défi. Cela permet de se confronter à la programmation événementielle d'un robot, très différente de celle d'un ordinateur qui, lui, ne bouge pas ! Un robot qui a donc un corps dont il faut tenir compte, des capteurs qu'il faut maîtriser, des actionneurs qui ne font pas forcément ce que l'on attend d'eux, des bugs qu'il faut tenter de reproduire avec les bonnes conditions physiques, etc. Les difficultés sont nombreuses mais permettent de comprendre toute la difficulté de la programmation d'un robot.

Dans ce qui suit nous vous décrivons l'algorithme, très simple, qui permet à Thymio de faire la fourmi. Mais aussi sa mise en œuvre, parfois complexe, avec ses "trucs et astuces" et enfin un code qui vous permettra de reproduire cette expérience.

Le matériel nécessaire

Commençons par décrire le matériel nécessaire pour monter l'expérience. Les dimensions sont celles que nous avons utilisées et sont indicatives.

Il vous faut un Thymio ou tout autre robot avec des détecteurs d'obstacles devant et dessous, des roues et de quoi y fixer un feutre.

Il vous faut un carton (92x71x9 cm), un feutre noir (épais mais pas trop) qui rentre dans le trou du thymio prévu à cet effet avec un peu de jeu (le feutre ne doit pas être coincé dans le trou), des feuilles blanches, deux gros élastiques et du scotch.

Tapisser le fond de votre carton de feuilles blanches scotchées entre elles. En son milieu, dessiner un rond noir (diamètre 16cm) qui sera la cible recherchée par Thymio. Incliner le carton en plaçant l'un de ses coins au plus haut (18cm de hauteur). C'est dans cette zone que sera située la base de Thymio qu'il retrouvera en suivant justement cette pente.

Thymio laissera une trace grâce à un feutre placé dans son trou. Il est important que le feutre ne soit pas coincé dans le trou mais qu'il y ait un peu de jeu. En effet, s'il est coincé, il pourrait faire béquille: l'une des roues du Thymio risque de moins adhérer que l'autre et la trajectoire du robot sera perturbée. Afin que le feutre appuie bien sur la feuille pour y laisser une belle trace, il va falloir le lester un peu. Pour cela, on peut l'enrouler de deux gros élastiques que l'on maintient avec du scotch. Ce lest ne doit pas être au bout du feutre mais le plus proche possible du Thymio afin de ne pas perturber son équilibre.

Le feutre avec son élastique autour.
Le feutre avec son élastique autour.
Le carton, sa cible noire, et son inclinaison.
Le carton, sa cible noire, et son inclinaison.

L'algorithme

L'agorithme est simple:
  • Thymio part de sa base
  • Thymio se promène au hasard dans son carton tant qu'il n'a pas détecté
    • soit la cible sous la forme d'un rond noir
    • soit une trace bien marquée qu'il aurait laissé précédemment et indiquant le chemin entre la base et la cible
  • Si Thymio trouve la cible
    • il remonte la pente pour trouver la base
    • en faisant cela, il va d'avant en arrière pour bien marquer la piste entre le la base et la cible.
  • Si Thymio trouve la piste en allant dans le sens de la pente descendante, il la suit jusqu'à la cible
  • Lorsque Thymio est revenu à la base, il se promène à nouveau au hasard, tentant de détecter la cible ou la piste.
Thymio et son feutre lesté par des élastiques.
Thymio et son feutre lesté par des élastiques.

Mise en œuvre de l'algorithme

L'algorithme est simple mais le reproduire avec un Thymio l'est moins. On explique ci-dessous les difficultés rencontrées et les solutions trouvées.

Déplacement aléatoire
La première chose à faire est que Thymio soit capable de se déplacer au hasard dans le carton. De manière évidente, il doit en éviter les bords grâce à ses capteurs de proximité. Aussi lorsqu'il détectera un obstacle, on le fera tourner d'un angle aléatoire avant qu'il ne reprenne tout droit son chemin jusqu'au prochain obstacle. C'est ainsi qu'il se déplacera aléatoirement. Le faire tourner d'un angle aléatoire, cela veut dire le faire tourner un temps aléatoirement long avant qu'il ne file à nouveau tout droit. Pour cela, on va utiliser un évènement "timer" que l'on peut déclencher aléatoirement et qui contiendra donc la fonction de "marche en avant" du Thymio.

Si vous vous contentez de faire cela, vous allez vite vous apercevoir que Thymio parcourra la surface de votre carton de manière assez uniforme, voire en tournant plus ou moins autour de la cible qu'il doit atteindre au hasard de ses pérégrination. Or, pour que l'expérience réussisse, il faut tout de même que Thymio trouve plus souvent la cible que le contraire sinon il va barbouiller le carton de feutre et finira par prendre tous ces traits pour la piste entre la cible et sa base. Afin que cela n'arrive pas, on peut utiliser deux astuces. La première est de toujours faire tourner Thymio dans le même sens. La seconde est que si Thymio va trop longtemps en ligne droite, il tourne d'un angle déterminé. C'est assez naturel: une fourmi à la recherche de nourriture ne va pas éternellement en ligne droite, elle aussi elle finit toujours par faire demi tour ! De cette manière, la trajectoire du Thymio restera aléatoire mais pas trop: elle ressemblera un peu à une spirale qui l'amènera ainsi plus souvent vers la cible au centre du carton.

Détection de la cible
La cible est un rond noir. Elle peut donc être détectée à l'aide des capteurs sous le Thymio. Lorsque ceux-ci ne détectent plus de lumière (<400), c'est que Thymio a atteint sa cible. On pourrait s'arrêter là et se dire que désormais il peut chercher à retourner à son nid mais deux problèmes pratiques se posent alors. Si vous demandez à ce que les deux capteurs de Thymio détectent la cible, il ne va pas la trouver souvent car la plupart du temps, seul un capteur passera sur la cible. Il faut donc que même si un capteur voit la cible, l'on considère que Thymio l'a détectée. Mais si l'on fait cela, la trace que Thymio laissera entre la cible et la base va être large, plus large que le diamètre de la cible. Elle sera donc difficile à marquer clairement. Pour éviter ce problème, il faut que Thymio, lorsqu'il détecte la cible, se place au milieu de celle-ci. Si seul un de ces capteurs la voit, il doit donc se mettre à pivoter pour placer le second capteur dessus. Et lorsque les deux capteurs la voit, il doit avancer un peu vers le centre de la cible.

Direction de la base
Ca y est, Thymio est immobile au centre de la cible et doit retourner à sa base. Celle-ci étant à l'endroit le plus haut du carton incliné, on va se servir des accéléromètres de Thymio pour déterminer dans quelle direction elle se trouve. Problème: ses accéléromètres ne sont pas précis du tout, leurs valeurs varient...erratiquement. Pour parvenir à les stabiliser, il faut faire une moyenne sur 8 mesures consécutives de chaque accéléromètre. Pour trouver les deux valeurs sumaccA et sumaccB (deux constantes dans le programme ThymioFourmi.aesl) qui désignent la direction de la base du Thymio, utilisez le programme TestPente.aesl. Il permet de poser Thymio sur le carton dans la direction de sa base et de lire les valeurs moyennées des accéléromètres que l'on devra donner à sumaccA et sumaccB dans ThymioFourmi.aesl. Une fois tout ceci fait, faite tourner le Thymio sur lui-même. Lorsque que les valeurs moyennées des accéléromètres valent sumaccA et sumaccB, Thymio peut commencer son retour vers sa base.

Retour à la base et dépôt d'une trace
Thymio doit retourner à sa base en laissant une trace grâce au feutre noir. Elle doit évidemment être plus marquée que celle qu'il laisse lorsqu'il se balade au hasard dans le carton. Pour trouver la "bonne" trace, celle qui marchera, de nombreux essais sont nécessaires. Une solution est de faire alternativement avancer et reculer le robot en le faisant pivoter du même angle alternativement à droite et à gauche lorsqu'il recule. Ainsi cette trace est plus épaisse et mieux marquée que celle qu'il laisse lorsqu'il se déplace tout droit. Quel que soit le va et vient que vous imaginerez pour laisser cette trace, vous allez rencontrer un nouveau problème: la trajectoire de Thymio tend à dévier de la direction de sa base. Cela peut autant venir de la rotation inégale de ses roues que des accélérations au cours du va et vient qui en modifie l'adhérence, sans compter l'influence des frottements du feutre sur sa trajectoire. Il est donc nécessaire lorsque Thymio réalise ce mouvement de va et vient de contrôler en permanence ses accéléromètres pour être sûr qu'il continue d'aller dans la direction de sa base et, s'il en dévie, de corriger sa trajectoire. Quoi qu'il en soit, ne vous attendez pas à ce que Thymio retourne toujours précisément au même point qui serait sa base. Celle-ci est plutôt une zone qu'il faut essayer de rendre la plus petite possible en le faisant partir le plus possible du centre de la cible, en moyennant le mieux possible les accéléromètres et en corrigeant le plus possible sa trajectoire de retour.

La trace laissée par Thymio lors de son mouvement de va et vient.
La trace laissée par Thymio lors de son mouvement de va et vient.

Détection de la piste entre la base et le nid
La base de Thymio étant approximativement située vers le coin le plus élevé du carton, Thymio sait qu'il l'a atteinte lorsqu'il détecte les bords du carton. Il se met alors à nouveau à tourner aléatoirement et on espère qu'il va détecter la trace qu'il a laissé entre la cible et la base, soit là tout de suite lorsqu'il se tourne ou plus tard lorsqu'avançant au hasard, il tombera dessus. Cette trace est bien sûr moins marquée que la cible qui est un gros rond noir. Elle doit en revanche être mieux marquée que la trace laissée par Thymio lorsqu'il avance au hasard. Dans tous les cas, elle sera grosso modo un ensemble de grosses lignes constituant la piste de la cible à la base. Thymio vérifiant la loi de Murphy, celui que nous avons utilisé était quasiment borgne: l'un de ses capteurs du dessous voyait une trace de feutre beaucoup mieux que l'autre, d'où des intervalles de détection pour prox.ground.reflected[0] et prox.ground.reflected[1] très différents dans le code. Pour détecter la piste, nous avons choisi la méthode suivante: si les deux capteurs de Thymio détectent une trace lorsqu'il est en pente descendante, aller tout droit. Si l'un des deux capteurs perd sa trace, Thymio s'arrête, pivote de gauche à droite 4 fois maximum (pour que cela ne dure pas éternellement). Si l'un de ses capteurs retrouve une trace, Thymio avance et s'arrête à nouveau s'il l'a perd. Même un Thymio borgne peut ainsi suivre la piste qu'il a laissé.

Le code

Vous trouverez ci-dessous le code à télécharger. Il n'est probablement pas parfait mais il fonctionne, y compris si Thymio est borgne, boiteux et a des pertes d'équilibre ! Les valeurs des constantes sont adaptées aux cotes de notre expérience décrite plus haut ainsi qu'à l'état de notre Thymio. Il faudra donc peut-être les adapter au matériel que vous possédez. Les commentaires du code sont là pour vous y aider !