1. Introduction

J’ai découvert cette année, dans le cadre de l’OC Informatique, le petit robot Thymio et la diversité des actions qu’on peut lui faire exécuter (allant de lui faire compter en binaire à lui faire jouer de la musique tel un ocarina). Toutes ces possibilités ont titillé mon imagination et j’ai alors décidé, pour mon projet hivernal, de faire dessiner mon robot (alias Raoul). L’idée est, à partir d'un fichier de format vectoriel contenant un motif simple, de réussir à amener le Thymio à le reproduire sur un support papier.

2. Matériel et méthodes

2.1 Matériel

  • Raspberry pi 3
  • robot Wireless Thymio 2
  • Aseba Studio
  • Inkscape
  • de quoi écrire
  • support papier

2.2 Méthode

Shéma

2.2.1 Accéder au D-Bus

Aseba suporte le logiciel de communication inter-processus D-Bus. Celui-ci nous permet de contrôler le Thymio avec un language de programmation tiers tel que python. L'outil en ligne de commande asebamedulla fournit par Aseba nous permet d'acceder au réseau d'Aseba par le D-Bus.

>asebamedulla "ser:name=Thymio-II"

Après cette commande le Raspberry identifie le Thymio et sur quel port il est connecté. On peut dès à présent lancer des programmes python exploitant le thymio en important le dbus:

>import dbus
>import dbus.mainloop.glib

Notes:

  • Il faut évidemment installer Aseba Studio avant toute chose!
  • Asebamedulla n'a jusqu'ici été testée uniquement sous Linux.
  • Bien que cette partie semble tout à fait basique, il n'a pas été évident d'y parvenir en grande partie à cause du manque de documentation disponible à ce sujet.

2.2.2 Motif

Le logiciel de dessin vectoriel Inkscape nous permet de créer notre propre motif, celui-ci est exprimé comme un chemin unique.

 Inkscape

Depuis le terminal on installe la libraire nous permetant de travailler avec de fichiers svg:

> pip3 install svgpathtools

Dans un fichier python, on importe notre fichier svg, le code qui suit détermine les coordonnées des points du chemin. Le nombre de points est prédéfini, plus il est grand plus le motif sera reproduit avec précision mais plus le Thymio mettra du temps à le reproduire. Aussi, étant donné le peu de précision que nous offre les manoeuvres des moteurs du robot, il ne serait pas pertinent de définir un nombre trop élevé de point.

>from svgpathtools import svg2paths2
>paths, attributes, svg_attributes = svg2paths2('drawing.svg') #insérer le fichier svg
> >redpath = paths[0]
>NUM_SAMPLES = 100 #nombre de points
> >X, Y = [ ],[ ]
>for i in range(NUM_SAMPLES):
> point = redpath.point(i/(NUM_SAMPLES-1))#pourcentage du chemin
> X.append(point.real) #partie réele sur x
> Y.append(point.imag) #projection des coordonnées complexes sur l'axe y
ATTENTION! à partir d'ici aucun code n'a réellement été testé et seule une approche conceptuelle est donc présentée

2.2.3 Calculs

Une fois tout les points obtenus, on peut calculer la distance séparant chaque point et leure orientation relative.

Admettons que le robot soit toujours à l'origine et orienté vers l'axe y, on détermine qu'il est au premier point du chemin. Soit le point suivant P(x;y), en calcule la distance d= sqrt(x^2+y^2) et l'angle entre le vecteur de l'axe y et le vecteur qui a comme point d'application l'origine et point vers le point(x;y) alpha=sin^−1(x/d).

Voici les formules en python:

>import math
> >def Sqr(a):
> return a*a > >def Distance(x1,y1,x2,y2): #avec (x1;y1) l'origine et (x2;y2) le point P
> return math.sqrt(Sqr(x2-x1)+Sqr(y2-y1)) > >def Angle(x1,y1,x2,y2):
> return math.asin(x2/Distance(x1,y1,x2,y2)) #l'angle est donné en radian

Nous pouvons ainsi déterminer ces informations pour chaque points du chemin.

2.2.4 Gérer le Thymio

Une fois avoir déterminer la distance et l'orientation que le robot devra adopter pour évoluer de point en point du chemin, nons devons maintenant parvenir à faire progresser le robot selon le chemin en manipulant ses moteurs. Attaquons nous d'abord au déplacement en ligne droite du robot. Pour faciliter ce procès, déterminons ce qu'une unité de distance représente en terme de temps et de vitesse: admettons que le robot avance à une vitesse constante v=50, en un laps de temps t=1s, le robot avance de 1 unité. Pour avance de la distance d (calculée plus tôt), le Thymio devra donc simplement avancer à la vitesse choisie, 50, pendant d secondes (t=d). De la même manière nous choisissons une unité d'angle, déterminons le temps que prend le Thymio pour faire un tour complet (2π rad) à vitesse constante (vitesse moteur droit = 20 vitesse moteur gauche = -20 pour faire une rotation positive), calculant ensuiste le temps pour 1 radian: nous avons maintenant notre unité à une une vitesse v=±20 en un temps t=T (qu'on aura calculé plus haut) le robot tourne de ±1 rad. Pour tourner d'un angle alpha (calculé plus tôt), le Thymio devra tourner à vitesse choisie, ±20 (attention la rotation peut être positive ou négative !) pour T*alpha secondes.

>network.SetVariable("thymio-II", "motor.left.target", 50)
>network.SetVariable("thymio-II", "motor.right.target", 50)

Les lignes ci-dessus déterminent la vitesse des moteurs du robot.

Ainsi, le code mettre en place un timer qui chronométera les manoeuvres qui seront produites par la gestion des moteurs, il faudra faire en sorte que le programme attende que le Tymio effectue chaque manoeuvre avec la commande:

> time.sleep(1)

2.2.5 Mise en forme

Après avoir téerminer toutes les étapes précédentes, on pourra fusionner le tout en un script complet final. Je ne suis malheureusement pas arrivée jusque-là.



3. Résultats

Je n'ai pas réussi à mener à terme mon projet.

4. Discussion

Je me suis lancée trop vite dans des recherches sur des sujets dont je ne connaissais rien sans avoir au préalable correctement décomposer mon projet et identifier des étapes claires et précises. Je n'est pas décidé d'un planning et m'y suis prise au final trop tard. J'ai aussi eu une multitude de petits problèmes qui m'ont fait perdre beaucoup de temps, à commencer par le hardware (et conection internet) inadéquat dont je disposais à mon domicile, des soucis liés aux préférences système du Raspberry, et autres... A cause de tout ces problèmes, certes communs et inévitables en informatique, conjugés avec mes connaissances initiales quasi-inexistantes et une mauvaise façon d'aborder le projet, j'ai rapidement développé le sentiment que je ne parviendrai pas à mener mon projet à bout, ce qui m'a fait perdre une grande part de ma motivation.

5. Conclusion

En plus de n'avoir pas attteint mon objectif premier, j'ai le sentiment de n'avoir presque rien appris et me retrouve passablement frustrée... Je regrette mon manque d'impliquation dans ce projet. Je vais tout de même essayer de finir ce projet pour ma satisfaction personnelle et surtout repartir motivée pour le prochain projet en essayant toujours de faire mieux (ce qui ne sera sûrement pas trop complliqué étant donné l'échec total de ce premier projet!).

Références