L’informatique
Architecture
générale :
On a vu dans la partie électronique que le robot
ne possède aucune intelligence ni aucun capteur. Ses déplacements sont
complètement pré-programmés par l’intermédiaire d’un fichier binaire qui
contient les positions des servos. Choisir la position des servos est donc
relativement simple. Ce qui est plus délicat, c’est d’enchaîné ces positions
afin d’obtenir des mouvements fluides. Le besoin au niveau informatique est
donc : une interface permettant de dessiné à la souris le mouvement des
pattes calculer le fichier binaire puis le télécharger dans la carte mémoire du
robot.
Ce programme ce décompose en fait en trois
interfaces principale :
-
la première qui permet de dessiné à la souris un
mouvement pour une patte (j’appelle ça une frame, fichiers .fra) Je me constitue ainsi une bibliothèque de mouvements
élémentaires.
-
la deuxième qui permet de programmer un
déplacement complet en attribuant des frames aux six pattes
(j’appelle ça un script, fichiers .scp).
-
La troisième à pour rôle de calculer le fichier
binaire à partir du fichier script. Elle permet également de télécharger ce
fichier (nommé mouvement, fichiers .mvt) dans l’un des 16 segments de la carte mémoire.
Une condition impérative pour que cette interface
fonctionne : avoir la loi de commande d’une patte. C’est à dire avoir les
équations qui donnent la positions à appliqué aux deux servos en fonctions de
la positions du bout de la patte dans un repère cartésien.
Etant personnellement un peu faiblard en math
(surtout en trigo à la X-Files) j’ai demandé à un copain de me calculer la loi
de commande (grand merci à BB, homme de génie). Tous ce que je sait, c’est que
c’est basé sur les Matrices Jacobienne. Pour donner une idées de l’aspect des
équations, voici celles de Moumoute :
On se retrouve donc avec deux équations, une pour
chaque servo qui donnent l’angle des têtes de servos en fonctions de X et Y.
Les angles sont exprimés en Radian, il faut donc
les traduire en « octet position ». Pour cela, il faut d’abord
caractériser individuellement chaques servos car évidemment aucun ne donne la
même position pour la même commande. Pour caractériser un servos, il suffit de
demander à la patte deux positions « connues » et de mesuré la
largeur de l’impulsion de commande. Ces positions connues sont des positions
pour lesquelles on connaît l’angle de la tête de servo. J’ai choisi les
positions extrêmes du diagramme de mouvement (cf partie mécanique) pour
lesquelles j’ai mesuré les angles sur le plan CAO. Connaissant angle1 = octet1
et angle2 = octet2, j’en déduit la relation octet = offset + facteur x angle.
Pour que cette caractérisation soit rapide, j’ai
fait une interface qui permet de piloter la position de chaque servo avec un
curseur :
Il y a un curseur par servo, la valeur prise par
le curseur est directement la largeur de l’impulsion (comme ça, pas besoin
d’oscilloscope !) Pour que la position soit actualisée en temps réel en
fonction du curseur, il faut bien sur charger un programme spécifique dans le
µcontrôleur. Pour matérialisé les positions caractéristique à atteindre, j’ai
fabriqué un outil spéciale : le caractériseur ! ! ! !
J’ai imprimer sur une feuille autocollante les diagrammes de mouvement dessiné
en CAO. J’ai coller cette feuille sur une plaque (isorel®) sur laquelle j’ai
également fixé deux axes verticaux qui viennent remplacer les axes des hanches.
Je caractérise donc deux pattes à la fois, je sauve le résultat dans un fichier
de calibration qui sera utilisé ensuite pour le calcul des octets positions. Le
servo de translation est également caractérisé mais c’est beaucoup plus facile,
une règle graduée suffi…
Etape
1 : faire bouger une patte
Comme expliqué plus haut, la première étape dans
la fabrication d’un programme pour Moumoute est de décrire chaque mouvement
élémentaire pour chaque patte. La première interface est donc un outil de
dessin de déplacement de patte :
Première chose qui saute aux yeux : y en a
deux ! C’est très pratique car bien souvent pendant un pas, le déplacement
d’une patte et le même que celui de ça voisine mais inversé ou décalé d’un
segment.
Ceux qui ont lu la page mécanique ont reconnu le
diagramme de mouvement de la patte. L’origine étant en haut à gauche, il suffit
de cliquer dans le diagramme pour obtenir les coordonnées cartésiennes du pied
dans le repère utilisé par les équations de la loi de commande (relire cette
phrase plusieurs fois avant de continuer ;o) On pose ainsi un point de passage
du pied. Lorsqu’on clique une deuxième fois, le programme relit le premier et
le deuxième point par une droite, on a ainsi défini un segment du mouvement de
la patte. On peut définir jusqu'à 30 segments par frame. Facile non ?
Au fur et a mesure, le programme écrit les
coordonnées des extrémité de chaque segment. Les points intermédiaires (les
segment eux mêmes) ne sont pas encore calculé. Cette étape ne sera réalisée
qu’a la fin, au moment de convertir le script en fichier mouvement.
Pour définir le nombre de point intermédiaire d’un segment, on dispose d’un
curseur « vitesse » (en bas à droite). l’ordinateur calcul la
longueur du segment puis la divise par la vitesse. Le nombre de pas ainsi
calculé et écrit à côté des coordonnées cartésienne du point à atteindre. Une
ligne d’un fichier frame se lis donc « atteins le point X,Y en faisant N
pas ». La vitesse de base (10) correspond à 1 point tous les millimètres.
Sachant que je peut donner 50 points par seconde aux servos, cela fait 5cm/s
(ce qui est lent !). La vitesse maxi est d’environ 40 = 4mm entre deux
points = 20cm/s.
Dans beaucoup de cas, il est nécessaire de
synchroniser le début et la fin des segments fait par les 6 pattes alors que
ces segments ne sont pas de même longueur. Il y a par exemple des phases
d’attente où 3 pattes ne bouge pas pendant que les 3 autres changent de
position. Il est donc nécessaire de pouvoir imposer de nombres d’étape pour
réaliser un segment. C’est à ça que sert le bouton « imposer nb
step = ». Lorsqu’on clique dessus, le facteur vitesse est inactif, la
valeur du champ à côté du bouton est simplement recopiée.
L’interface permet également d’éditer une frame
déjà enregistrée, de la modifier et de la sauver avec un autre nom. Pour
modifier, il suffit de double-cliquer sur un point dans la liste, les deux
segments ayant ce point pour extrémité deviennent bleu et suivent le pointeur
de la sourie, on repositionne le point simplement en cliquant sur le diagramme.
Pour être honnête, la convivialité de cette interface (et des autres) n’est pas parfaite ! Certaine fois, il faut vachement se creuser les méninges pour créer un pas (le pas en crabe par exemple : je l’ai refait dix fois, j’en ai chier à chaque fois !!). Mais bon, lorsqu’on a pigé l’esprit du truc, on va assez vite : dix minutes pour créer un nouveau pas et l’intégrer dans un mouvement.
Etape
2 : Construction d’un programme de déplacement
Cette interface à pour rôle d’attribuer les frames
à chaque patte pour faire un pas et d’enchaîner ces pas pour faire un déplacement.
Elle est Largement plus compliqué que la précédente :
Entrons dans le détail (allez, un peu de courage !) :
Zone centrale, les chronogrammes :
Chaque ligne représente le temps pour une patte
(P0 / ARD veux dire Patte n°0 / Patte arrière droite ). La septième c’est le
servo translation. Chaque instruction donnée à une patte sera représentée par
une boite de couleur dont la largeur représente son temps d’exécution. A droite
des chronogrammes, on trouve des compteurs qui indiquent le nombre totale de
points attribués à chaque patte (pour un match il y a 90 secondes x 50
points/sec = 4500 step). Il faut évidemment que les 7 compteurs indique la même
valeur pour qu’un programme soit « calculable » (de toute façon, si
c’est pas bon, le logiciel insulte l’utilisateur !).
A gauche, la bibliothèque de frame :
On peut ouvrir jusqu'à 8 frames
simultanément. Lorsqu’on a ouvert un fichier .fra, le mouvement est représenté
sur le petit diagramme gris, la liste des points apparaît dans la boite de
couleur, les coordonnées de début, de fin et la durée (nombre de step) sont
indiqués sous le bouton « open ».
Pour attribuer une frame à une
patte, on valide la patte (ou les pattes) et cliquant sur le bouton à gauche du
chronogramme. On double clique ensuite sur le dessin de la frame.
La frame est alors ajoutée au chronogramme de la patte en
utilisant la couleur de la boite qui contient la liste des points.
Pour faire un pas en crabe, il faut ouvrir quatre frames :
une pour milieu droit, une pour milieu gauche, une pour avant droit et arrière
droit (elle font la même chose), une pour avant gauche et arrière gauche.
Dans la marche en crabe, le servo translation ne
sert pas. Pour un pas en avant il faut programmer ce servo en utilisant cette
zone :
A gauche est indiqué la position du servo de 0 à
80, à droite le nombre de step (points intermédiaires). Pour attribué une
position et un nombre de step au servo translation, il suffit de double-cliquer
sur une lignes. On peut donc prédéfinir quatre couples position/nombre de step
(en générale on en a besoin que de 2 !)
A la position 0, les deux triangles sont
translatés aux maximum dans un sens. A 80 ils sont translatés aux maximum dans
l’autre sens. 40 représente donc la position neutre dans laquelle les pattes
droites et gauches sont alignées. 80 correspond à 8cm mais attention, c’est
compliqué : une translation fait 8cm, à chaque translation le corps du
robot se déplace de 4 cm, un pas est composé de deux translations et fait donc
8cm (faites un dessin !!!).
On voit donc que fabriquer un pas demande beaucoup
de manipulation. Pour ne pas avoir à refaire cent fois la même chose, la
dernière zone :
En bas à droite, le gestionnaire de
pattern :
Une pattern c’est un script !
C’est quoi un script ? Suivez un peu :
On est dans l’interface qui permet de les faire ! C’est un mouvement du
robot (6 pattes + translation) pas encore traduit en fichier binaire.
Une pattern est donc un pas élémentaires (1 pas en
avant rapide, 1 pas en crabe, 1 mouvement de tangage…) ou un assemblage de pas
(marche en avant de 40 cm, rodéo, homologation…). Cette notion
« hiérarchique » de pattern permet de construire très rapidement un
nouveau programme en assemblant des briques de bases plus ou moins grosses. Par
exemple, tout mes programmes de match commençaient par la brique homologation
(fichier Pattern homologation.scp)
qui consistait à renverser le premier palet.
Pour attribuer les pattern c’est très
simple : on choisit un fichier pattern avec « open », le nom du
fichier s’inscrit alors dans la zone en couleur (il vaut mieux avoir des noms
de fichiers qui veulent dire quelque chose !!!). Lorsqu’on clique sur
ajouter, la pattern est attribuées aux 7 chronogrammes avec la couleur de la
boite nom_du_fichier.
Etape
3 : Calculer et télécharger un programme