De Logo à Snap! : Contrôler le Robot Thymio

Interfaçage et ateliers de programmation en collège
jeudi 3 juin 2021
par  Arnaud VERHILLE , Nathalie CARRIÉ

Dans cette narration de recherche IREM, nous vous proposons de survoler rapidement les étapes techniques de construction du logiciel ThymioHTTP permettant de programmer le robot Thymio via une interface web HTTP REST.

Cette interface qui permet de programmer le robot Thymio avec de multiples langages de programmation comme le très visuel Snap! ou le plus classique Python nous offre la possibilité pratique de réaliser des ateliers de programmation en classe de collège pour introduire des concepts comme la notion de variable, de boucle et même de programmation récursive.

Le robot Thymio, un micromonde en puissance

Seymour Papert a travaillé avec des tortues LOGO dans le monde réel, représentées sous la forme de robots traceurs. Nous avons choisi de suivre ses traces en utilisant le robot Thymio et le logiciel Snap! BYOB.

Le Thymio est un petit robot plutôt solide et contenant de nombreux capteurs intégrés pensé à l’origine par l’Université de Lausanne en Suisse : https://www.thymio.org/

La documentation ci-dessus résume les possibilités de ce robot Thymio qui sont divisées en deux parties : les capteurs et les actuateurs (moteurs).

Le logiciel officiel ne fonctionne pas sur les ordinateurs du collège (car il faut le support d’openGL) et les langages développés graphiques par blocs permettant de le programmer étaient assez limités (VPL, VPL3, Blockly, Scratch ne permettent pas de programmation fonctionnelle ou récursive).
Il a donc été décidé de fabriquer notre propre interface pour pouvoir programmer le robot Thymio en Snap! BYOB et en Python.

ThymioHTTP, une interface REST pour les contrôler tous

Pour pouvoir accéder au Thymio, l’idée a été de se connecter de l’interface ThymioHTTP directement sur le serveur Thymio en WS :// (windows socket) puis de transférer les appels entrants et sortants via l’API plus facilement accessible REST.

Ce logiciel : ThymioHTTP est basé sur node.js qui est un environnement Javascript. L’utilisation du Javascript nous permet d’utiliser les navigateurs internet qui offrent un environnement d’exécution portable et disponible facilement, même sur des ordinateurs relativement anciens (15 - 17 ans dans mon cas).

Le code de ThymioHTTP est disponible librement (Licence MIT) sur Internet chez Github à l’adresse suivante : https://github.com/habib256/thymioHTTP

Des blocs Snap! BYOB pour ThymioHTTP

Le logiciel Snap! BYOB est une amélioration incroyable de Scratch !
L’ergonomie de Scratch par blocs avec presque toute la puissance de la programmation Javascript sous le capot.

Pour les élèves de collège qui utilisent déjà Scratch avec leur professeur de Mathématiques, Snap! est parfait car ils sont déjà habitués au fonctionnement de l’interface.

Voici, par exemple, les blocs de mouvement liés au contrôle des moteurs :

Et les blocs (variables) qui permettent de récupérer les valeurs des capteurs :

Il devient alors possible de programmer simplement le robot Thymio avec Snap! BYOB à distance :

Acquérir des données des capteurs du Thymio et les représenter graphiquement

Il existe une librairie très pratique pour Snap! BYOB : DataSprite pour faire du machine learning [1], de la régression et de la représentation de courbe graphique.
Nous avons créé les blocs nécessaires pour permettre de récupérer les données des capteurs d’un Thymio et les importer dans DataSprite sous Snap! BYOB :

Ci-dessus, les valeurs des capteurs de sol lors d’un suivi de ligne du Thymio.

Algorithme de suivi de ligne et lenteur des communications

Tout cela fonctionne plutôt bien, mais il y a un problème de taille qui est le temps des communications.
En effet, lorsque le capteur de sol du thymio détecte, dans un programme de suivi de ligne, que le sol devient blanc, le message part vers ThymioHTTP puis arrive dans Snap! et ceci en environ dix millisecondes.
Puis, Snap! traite l’information et décide d’activer les moteurs pour tourner et retrouver la ligne noire mais cela prends encore dix millisecondes.
Au total, un échange aller-retour dure 20 millisecondes ce qui est vraiment énorme pour un programme qui demande une réaction la plus immédiate possible ...

Il va donc falloir trouver une autre solution pour que la réactivité du robot Thymio soit la plus rapide possible.

SnapToAseba : Un générateur de code pour Thymio

Il y a une solution : générer du code Aseba qui est le langage intégré du Thymio à partir de Snap! BYOB afin d’exécuter le programme directement et indépendamment sur le Thymio.

Quelques exemples de programmes demandant une exécution rapide qui vont s’exécuter directement sous le Thymio :

Un programme pour suivre la main d’un élève :

Un programme pour suivre une ligne :

Thymio et les élèves

Le robot Thymio est relativement solide, ce qui est fondamental pour une utilisation régulière avec des élèves ; ils sont tombés plusieurs fois et fonctionnent toujours parfaitement.

Il est possible d’utiliser des blocs LEGO sur le Thymio pour récupérer le mouvement des moteurs ou rajouter des nouvelles fonctionnalités.

Avec des feutres et du papier, le Thymio devient un traceur et on peut travailler de la géométrie de type LOGO.

Faire de la récursivité en classe

Si on laisse tout le temps au Thymio et à Snap! pour communiquer, il est possible de coder des blocs pour contrôler le Thymio à distance de façon récursive :

Et obtenir, en guidant fortement les élèves de collège, des courbes fractales comme celle de Von Koch :

Il est aussi possible de générer de la musique fractale avec Snap! chantée par le Thymio en utilisant la suite de Syracuse et en mappant les nombres modulo 12 sur les 12 notes de la gamme dodécaphonique :

Et Python, c’est pas au programme ?

Effectivement, au lycée, Python est le langage de choix pour les Mathématiques et pour les Sciences en général. Une interface basique en Python a été écrite pour échanger avec ThymioHTTP, ce qui permet d’écrire un suivi de ligne en Python.

def suiviDeLigne():
    while (True) :
        capteurs = lireCapteurs()
        
        #thymioCapteurs[16] = prox.ground.delta[1]
        if capteurs[16] > 400 :
            moteurs(80,150)
        else :
            #thymioCapteurs[15] = prox.ground.delta[0]
            if capteurs[15] > 400 :
                moteurs(150,80)
            else :
                moteurs(150,150)

Ce code est disponible sur le site Github et contient la structure de base sur laquelle on pourra construire ce que l’on désire en Python pour contrôler le Thymio.

Conclusion

Le Thymio est un robot sympathique, très agréable à manipuler et à coder avec les élèves. Ses nombreux capteurs offrent de très nombreuses possibilités et pouvoir maintenant utiliser Snap! BYOB (au collège et au lycée) ou Python (au lycée) nous permet de mieux nous adapter aux exigences des programmes de l’Éducation Nationale.

Les élèves ont véritablement été les « beta-testeurs » de ThymioHTTP et, petit à petit, nous avons avancé des bugs aux solutions, ce qui est une véritable démarche d’ingénieur confronté à la dure réalité.

Cela permet de se souvenir que les modèles ne sont que des modèles et que les facteurs négligeables ne le sont pas toujours ...


[1en français, apprentissage automatique, apprentissage artificiel ou apprentissage statistique : champ d’étude de l’intelligence artificielle qui se fonde sur des approches mathématiques et statistiques pour donner aux ordinateurs la capacité d’« apprendre » à partir de données.


Commentaires