Aseba Manuel de l`utilisateur Français - MOBOTS
Transcription
Aseba Manuel de l`utilisateur Français - MOBOTS
1 ASEBA Manuel de l'utilisateur Français Table des matières Introduction Didacticiel Studio Language de script 2 3 7 9 Stéphane Magnenat Version du festival de robotique de l'EPFL, édition 2008 2 Introduction ASEBA est un système pour prototyper rapidement le comportement de microcontrôleurs connectés en un réseau. Dans le contexte de la robotique, les microcontrôleurs peuvent soit être chacun un robot, soit être tous dans le même robot. De plus, les robots et les microcontrôleurs peuvent aussi être virtuels et fonctionner dans un simulateur, comme c'est le cas dans challenge (Page 3). Avec ASEBA, vous écrivez et debuggez vos programmes à partir d'une application unique (Page 7) en utilisant un language de script de haut niveau (Page 9). Puis ASEBA compile le script en bytecode et le charge sur les microcontrôleurs à travers le bus de communication. Les microcontrôleurs exécutent le bytecode dans des machines virtuelles qui fournissent aussi un debugger intégré. Les machines virtuelles assurent une exécution sûr (aucune erreur de script ne peut perturber le microcontrôleur) et une indépendance envers le fabricant (tout microcontrôleur 16 bits ou mieux est suffisant). Les microcontrôleurs communiquent entre eux par des messages asynchrones diffusés, que nous appelons événements. Ces messages peuvent également contenir des données. Cette architecture est avantageuse par rapport à un modèle client/serveur car elle supporte une large plage de stratégies de contrôle et de communication. ASEBA est un logiciel libre, ainsi la communauté peut l'utiliser et le modifier librement. Vous trouverez plus d'informations sur la dernière version sur : http://mobots.epfl.ch/aseba.html 3 Didacticiel Pou r commencer ASEBA challenge (Figure 1) est un monde simulé où des robots contrôlés par ASEBA cherchent de la nourriture. Vous pouvez l'utiliser comme espace de jeu pour écrire des scripts ASEBA ou comme un jeu éducatif pour apprendre ou enseigner la programmation. Pour démarrer, vous devez lancer ASEBA challenge, puis cliquer sur «Ajouter un robot» et lui choisir un nom. Si vous êtes un groupe, il faut ajouter un robot pour chaque joueur. Vous pouvez enlever tous les robots en cliquant sur «Enlever tous les robots». Vous pouvez cacher les boutons en cliquant sur «Cacher auto» : les boutons ne seront visibles que lorsque le curseur de la souris sera proche. Vous pouvez laisser la caméra bouger automatiquement en cliquant sur «Caméra auto». Si vous bougez la caméra manuellement, les contrôles sont les suivants : • ctrl + bouton gauche souris : rotation • ctrl + maj. + bouton gauche souris : déplacement sur x/y • ctrl + maj. + bouton droite souris : déplacement sur z Challenge affiche le score de chaque robot sur des tableaux translucides suspendus au dessus de l'arène. Le but de chaque robot est de rester vivant en collectant de l'énergie. Tant que le robot est vivant, ses points augmentent ; quand il meurt, ils sont divisés par deux. Quatre sources d'énergie bleues nourissent les robots à proximité. Quand une source est vide, elle devient rouge et ne fournit plus d'énergie. De temps à autres, une source plonge dans le sol et les robots ne la voient plus jusqu'à ce qu'elle réapparaisse. Une fois qu'ASEBA challenge fonctionne, vous devez démarrer ASEBA studio (Figure 3) pour programmer votre robot. Pour chaque robot, vous devez lancer une instance de studio, qui peut être sur n'importe quel ordinateur (Figure 2). Nous donnons une description détaillée de studio en page 7. Figure 1 ASEBA challenge Figure 2 dialogue de connection d'ASEBA studio Figure 3 ASEBA studio 4 Votre premi er contrôl l eu r d e robot robot ordinateur Pour programmer un robot, vous devez d'abord comprendre comment il fonctionne. Un robot interagit en boucle avec capteurs actuateurs le monde : il perçoit son état à grâce à ses capteurs, prends des décisions avec son ordinateur intégré, et effectue des acmonde tions avec ses actuateurs ; ces actions changent l'état du monde, et le robot perçoit ce nouvel état au moment où il lit Figure 4 Un robot interagit en ses capteurs à nouveau (Figure 4). boucle avec le monde à travers ses Dans challenge, vous programmez un robot e-puck simcapteurs et ses actuateurs. ulé. Il possède 8 capteurs de proximité répartis autour de son corps et une caméra simplifiée pointée en avant et composée de 3 pixels de 20° d'ouverture chacun. Vous pouvez lire ces valeurs et aussi choisir la vitesse des roues (Figure 5). Écrivons maintenant votre premier contrôlleur de robot. Nous donnons une description prox[7] prox[0] du language de script d'ASEBA en page 9. Dans l'éditeur de texte au milieu de la fenêtre de prox[6] camX[1] prox[1] studio, écrivez les lignes suivantes : camX[0] camX[2 ] prox[5 ] prox[2 ] leftSpeed = 5 rightSpeed = -5 Cliquez «Charger» et puis «Lancer». Vous devriez voir votre robot tourner sur place. Ce code ne fait que spécifier la vitesse des roues au démarrage du robot puis ne fait rien. Pour avoir un meilleur comportement, il nous faut prox[4] prox[3 ] permettre au robot de percevoir son environFigure 5. Les capteurs et les acnement, par exemple les obstacles ; et prendre des décisions, par exemple éviter les obstacles. tuateurs du robot e-puck simulé Pour interagir avec le monde en continu, le robot doit exdans challenge. écuter un script périodiquement. Ceci est possible grâce au Les capteurs de proximité, prox[0] à prox[7], retournent la mot clé ontimer. Par exemple, en utilisant un capteur de proximité avant, nous pouvons spécifier la vitesse des roues distance en cm [0..12] aux obstacles dans une direction spécien fonction de la distance à l'objet devant le robot : fique, indiquée par une ligne pointillée. ontimer La caméra se compose de trois leftSpeed = prox[0] - 6 rightSpeed = prox[0] - 6 pixels, camX[0] à camX[2], pour chaque composante de couleur X (R, G ou B — rouge, vert, bleu), et Comme les capteurs de proximité retournent des distances retourne le pourcentage [0..100] entre 0 et 12 cm (si l'objet est plus loin que 12 cm, ils rede la composante correspondante tournent quand même 12), la vitesse du robot sera de -6 cm/s quand l'objet est proche, 0 cm/s quand l'objet est à dans un arc donné limité par les 6 cm de distance, et 6 cm/s quand l'objet est éloigné. Le rolignes traitillées. bot aura donc tendance à rester à 6 cm de tout objet devant Les roues permettent au robot de se déplacer et vous pouvez spécilui. fier leurs vitesses (leftSpeed et rightSpeed) en cm/s [0..13]. leftSpeed rightSpeed 5 Un contrôlleur de robot plus élaboré Garder une distance de sécurité à l'objet devant le robot est une bonne chose, mais pour l'instant le robot ne peut pas aller ailleurs. Pour faire que le robot se promène, nous devons comprendre son principe de déplacement. Le robot e-puck simulé dans challenge est de type robot à roues différentielles ; ce type de robot choisit sa direction en fixant des vitesses différentes à ses roues gauche et droite (Figure 6). Si chaque roue a la même vitesse, le robot va en avant ; sinon il tourne ; si les vitesses sont opposées, le robot tourne sur place. Les véhicules à chenilles comme les pelleteuses de chantier utilisent le même principe. Écrivons maintenant un petit code qui permet au robot d'éviter les obstacles et d'aller tout droit s'il n'y en a aucun : ontimer leftSpeed = prox[1] - 6 rightSpeed = prox[6] - 6 Ce contrôleur lit la valeur des capteurs de proximité avant gauche et droite. Tant qu'il n'y a pas d'obstacle, tant prox[1] que prox[6] retournent 12 et donc le robot avance tout droit à vitesse 6. Mais lorsqu'il y a un obstacle d'un côté, la valeur du capteur correspondant descend. Par exemple, s'il y a un obstacle à gauche, prox[6] (qui regarde à gauche) pourrait valoir 10 alors que prox[1] (qui regarde à droite) restera à 12 ; et donc leftSpeed vaudra encore 6 mais rightSpeed vaudra 4, ce qui fera tourner le robot à droite et donc éviter l'obstacle présent à gauche. Prendre des décisions Les contrôleurs que nous avons vus jusqu'à maintenant liaient les valeurs des capteurs aux vitesses des roues à travers des expressions mathématiques, mais ne prenaient pas de décision de type «si, alors». Néanmoins c'est parfois désirable ; par exemple lorsque nous voulons que le robot aille soit tout droit, soit qu'il tourne sur place, et non pas qu'il fasse des trajectoires courbes, nous pouvons écrire : ontimer var dists = prox[6] + prox[7] + prox[0] + prox[1] if dists < 48 then leftSpeed = 5 rightSpeed = -5 else leftSpeed = 5 rightSpeed = 5 end leftSpeed == rightSpeed leftSpeed > rightSpeed Figure 6. La trajectoire du robot change en fonction de la différence de vitesse entre les roues gauche et droite. 6 Ce contrôleur somme les distances à tous les capteurs de proximité avant, et si cette somme est inférieur à 48 cm (ce qui signifie qu'au moins un capteur voit un obstacle), le robot tourne sur place. Sinon il va tout droit. Le language de script fournit aussi d'autres constructions intéressantes, comme la boucle while qui exécute un bloc de code plusieurs fois tant qu'une condition est vraie, ou la boucle for qui exécute un bloc de code un certain nombre de fois et change la valeur qu'une variable à chaque fois. Les pages 9 et 10 listent toutes les constructions disponibles ; n'hésitez pas à aller les voir. Votre tour Jouez un moment avec l'évitement d'obstacle afin de bien comprendre les capteurs, les actuateurs, et la dynamique du robot. N'hésitez pas à essayer des choses, le robot est dans un simulateur et donc ne risque rien. Une fois que vous vous sentez à l'aise, essayez de programmer le robot pour qu'il se dirige vers les sources de nourriture quand elles sont bleues (0, 0, 100) (en rouge, vert, bleu), et de les éviter quand elles sont rouges (100, 0, 0). Les murs de l'arène sont gris (50, 50, 50). Essayez de jouer avec vos amis et de programmer le meilleur contrôleur de robot. Vous pouvez changer la couleur de votre robot (en modifiant les variables colorR, colorG et colorB), et donc feindre d'être une source de nourriture. Si les autres trompent votre robot de cette façon, vérifiez la variable energy ; si sa valeur n'augmente pas alors que le robot voit du bleu, c'est qu'un autre robot le trompe. Le but de challenge est d'apprendre la robotique, la programmation et ASEBA tout en s'amusant. 7 Studio 1 5 2 6 7 4 3 8 ASEBA studio est un environnement de développement intégré dans lequel nous éditons et debugons les scripts pour tous les microcontrôleurs (Figure 7). Il fournit les fonctionnalités suivantes : • Édition concurrente. Chaque microcontrôleur possède son propre onglet avec son script, le contenu de sa mémoire, son statut d'exécution et ses commandes de debug. De plus, une barre fournit des commandes générales de debug qui affectent tous les microcontrôleurs. Ceci permet à la fois un contrôle global de tous les microcontrôleurs et un contrôle particulier de chacun. • Colorisation de syntaxe. L'éditeur de script colorise la syntaxe et affiche les erreurs en rouge. Ceci améliore la lisibilité des scripts. • Compilation instantannée. Studio recompile les scripts pendant que le développeur les écrit. Le résultat de la compilation (succès ou description de l'erreur) est affiché sous l'éditeur. Ceci permet la correction des erreurs dès qu'elles apparaissent, ce qui améliore la qualité du code. • Inspection des variables. Studio liste les variables disponibles sur chaque microcontrôleur avec leurs valeurs. Nous pouvons mettre à jour cette liste en un click. Cette liste Figure 7. Photo d'écran d'ASEBA studio. Les éléments entourés sont les suivants : 1. Barre des commandes générales de debug et onglets des microcontrôleurs 2. Éditeur avec colorisation syntaxique 3. Bar des messages de la compilation instantannée 4. Contenu de la mémoire avec le nom des variables et leurs valeurs 5. Commandes de debug spécifiques au microcontrôleur 6. Définitions des constantes 7. Définitions et journal des événements 8. Documentation des fonctions natives 8 fournit une vision rapide de l'état du microcontrôleur. • Debugger. Studio intègre un debugger ; pour chaque microcontrôleur, il donne l'état courant d'exécution. Ce debugger supporte l'exécution continue, pas à pas, ainsi que les points d'arrêts. Un click droit dans l'éditeur de script permet de mettre ou d'enlever un point d'arrêt sur une ligne donnée. Après un point d'arrêt ou un pas, les valeurs des variables sont mises à jour. • Événements. Nous pouvons spécifier les noms des événements, et, en double-cliquant sur un nom, nous pouvons envoyer l'événement correspondant. Sous la liste des événements, un journal affiche les événements récents avec leur heure et leurs paramètres. • Documentation des fonctions natives. Studio liste les fonctions natives disponibles sur chaque microcontrôleur. La bulle d'aide de chaque fonction donne une brève documentation. • Définition des constantes. Nous pouvons définir des constantes qui sont disponibles sur tous les microcontrôleurs. 9 Language de script En utilisant ASEBA studio, nous programmons les microcontrôleurs en écrivant des scripts dans un language simple. Syntaxiquement, ce language ressemble à matlab ; sémantiquement, c'est un language de programmation impératif avec un seul type simple (nombres entiers signés sur 16 bits) et des tableaux. Nous allons maintenant décrire ses fonctionnalités : • Commentaires. Les commentaires commencent avec un # et finissent à la fin de la ligne. # commentaire var b # autre commentaire • Variables. Les variables font référence soit à des valeurs scalaires, soit à des tableaux de valeurs scalaires. Les valeurs sont comprises entre -32768 et 32767, ce qui correspond à la plage des nombres entiers signés sur 16 bits. Nous pouvons accéder aux éléments des tableaux avec l'opérateur parenthèse carrée ; l'index des tableaux commence à zéro. var var var var • Expressions et assignations. Les expressions permettent les calculs mathématiques et sont écrites en syntaxe mathématique infixée commune. L'assignation utilise le mot clé = et affecte le résultat du calcul d'une expression à une variable scalaire ou à l'élément d'un tableau. ASEBA fournit les opérateurs +, -, *, /, % (modulo), << (décalage à gauche) et >> (décalage à droite). Les opérateurs de plus grande précédence sont *, /, % ; suivis de + et - ; suivis de << et >>. Pour évaluer une expression dans un ordre différent, nous pouvons utiliser une paire de parenthèses afin de grouper une sous-expression. a = 1 + 1 b = (a - 7) % 5 b = b + d[0] c[a] = d[a] • Conditions. ASEBA fournit deux types de conditions : if et when. ASEBA fournit les opérateurs ==, !=, >, >=, < et <=. Tant if que when exécutent un bloc de code différent selon qu'une condition est vraie ou fausse ; mais when exécute le bloc correspondant à vrai seulement si la dernière évaluation de la condition était fausse et que l'évaluation courante est vraie alors que if exécute le code chaque fois que la condition est vraie, et le mot clé else exécute un code si la condition est fausse. Cette différentiation permet l'exécution de code seulement quand quelque chose change, ce qui est très pratique pour les applications robotiques. if a - b > c[0] then c[0] = a else b = 0 end a b = 0 c[10] d[3] = 2, 3, 4 when a > b do leds[0] = 1 end 10 while i < 10 do v = v + i * i i = i + 1 end for i in 1:10 step 2 do v = v + i * i end • Boucles. Deux constructions permettent la création de boucles : while et for. Une boucle while exécute un bloc de code plusieurs fois tant qu'une condition est vraie. La condition est de même type que celle utilisée par if. Une boucle for fait itérer une variable sur un intervalle d'entiers, avec en option une taille de pas. var a[3] = 1, 2, 3 var b[3] = 2, 3, 4 var c[5] = 5, 10, 15 var d call vecprod(a, b, d, 3) call vecprod(a, c[0:2], d,3) • Fonctions natives. Nous avons conçu le language de script d'ASEBA simple afin de permettre une compréhension aisée par des développeurs novices et pour implémenter la machine virtuelle efficacement. Pour implémenter des calculs complexes ou lourds, nous fournissons des fonctions natives implémentées en code natif pour une exécution rapide. Par exemple, une fonction native est la solution de choix pour effectuer un calcul de produit scalaire. Les fonctions natives sont sûrs, dans le sens qu'elles spécifient et vérifient les tailles de leurs arguments, qui peuvent être des constantes, des variables ou des accès à des tableaux. Dans ces derniers, nous pouvons accéder à tout le tableau, à un élément discret ou à un sous-intervalle du tableau. Les fonctions natives prennent leurs arguments par référence et peuvent modifier leurs contenus, mais ne retournent aucune valeur. Les fonctions natives sont appellées par le mot-clé call. var run = 0 • Événements. Les événements déclenchent l'exécution du script et transportent des données de façon asynchrone ; ils peuvent être externes, par exemple un événement défini par l'utilisateur venant d'un autre microcontrôleur par le bias du bus de communication, ou internes, par exemple générés par un timer. La récéption d'un événement exécute, si défini, le bloc de code commençant par le mot clé onevent suivi du nom de l'événement. Le code au début du script est exécuté quand ce dernier est chargé ou au reset. Le timer interne lance périodiquement l'exécution du bloc de code commençant par le mot clé ontimer, si celui-ci est présent. Afin de permettre l'exécution du code lors de la réception d'un nouvel événement, le script ne doit pas bloquer et donc ne pas contenir de boucle infinie. Par exemple, alors qu'un programme de contrôle de robot traditionnel travaille à l'intérieur d'une boucle infinie, un script ASEBA fait le travail dans l'événement timer après le mot clé ontimer. Un script peut aussi envoyer des événements en utilisant le mot clé emit. Cela permet à un script de déclencher l'exécution de code sur un autre microcontrôleur ou de communiquer avec le développeur. Les microcontrôleurs recoivent les événements qu'ils envoient. ontimer if run == 1 then leftSpeed = prox[1] rightSpeed = prox[6] if prox[1]+prox[6]<6 then emit wall prox end else leftSpeed = 0 rightSpeed = 0 end onevent start run = 1 onevent stop run = 0