Documentation URBI pour mindstorms

(book compiled from )

Gostai

Benjamin Renoust

Benoit Pothier

Traduction de l'anglais Antoine (zelig) Hue

This document is released under the Attribution-NonCommercial-NoDerivs 2.5 Creative Commons licence (http://creativecommons.org/licenses/by-nc-nd/2.5/deed.en).


Table of Contents

1. Introduction
2. Lancement d'URBI pour Mindstorms NXT
3. Premiers pas avec URBI pour contrôler Mindstorms NXT
Faire des mouvements de base
Amméliorer les déplacements
Lire des capteurs
Tagging commands
jouer des sons
mouvements cycliques
Parallèlisme
Utiliser les fonctions
Charger des fichiers
Conclusion
4. Réferences d'agencement par défaut
Introduction
Motors
Sensors
Bumper
Sonar
Decibel
Light
Battery
Beeper
Command
5. Comment créer son propre agencement
Introduction
Instancer les Moteurs
Instancer les capteurs
Autres périphériques
A. UObject pour périphériques disponibles
Servo
UltraSonicSensor
SoundSensor
LightSensor
Switch
Battery
Beeper
Command
Instances
Groupes
B. Copyright

List of Tables

A.1. Les attributs de servo:
A.2. Les attributs du UltraSonic Sensor:
A.3. Les attributs du Sound sensor :
A.4. Les attributs du Light sensor :
A.5. Les attributs de Switch :
A.6. Les attributs de Battery :
A.7. Les méthodes de Beeper :
A.8. Les méthodes de command :
A.9. TriBot.ini layout
A.10. liste des groupes

Chapter 1. Introduction

Cette documentation contient des informations sur le URBI engine du Lego Mindstorms NXT.

Les deux premiers chapitres fournissent un petit tutoriel sur l'utilisation de URBI pour contrôler le robot TriBot.

Le reste de la documentation contient une référence approfondie pour le moteur URBI du Lego Mindstorms NXT.

Chapter 2. Lancement d'URBI pour Mindstorms NXT

En premier vous devez construire le modèle tribot depuis le Lego Mindstorms NXT basic model.

Puis installez le driver NXT que vous trouverez sur le NXT CD officel.

Synchronisez votre robot avec votre ordinateur, si vous voulez contrôler votre NXT par bluetooth, ou le faire reconnaître par votre ordinateur si vous voulez le contrôler par USB.

Pour installer l'URBI engine pour Mindstorms NXT, lancez l'installateur et suivez les instructions.

Puis lancez le serveur URBI (par le menu start) qui interceptera votre commande et contrôlera votre robot en conséquence.

Finalement, lancez un programme capable de lui envoyer des commandes et de recevoir des informations venant du serveur URBI. Différents programmes pourront être utilisés pour ça, par exemple vous trouverez URBI_Console dans le menu Gostai.

Puis, cliquez sur le bouton Connect to LEGO Mindstorms NXT de la URBI_Console.

Vous êtes maintenant prêt à commencer de programmer avec URBI dans la URBI_Console. Vous pouvez essayez de lancer des commandes simples dans la ligne de commande en bas de l'interface ou de charger des fichiers en utilisant le bouton prévu pour ça.

Chapter 3. Premiers pas avec URBI pour contrôler Mindstorms NXT

Cette section est un court tutoriel pour utiliser URBI sur le modèle TriBot de Lego avec la configuration par défaut fournie avec le serveur URBI. Les utilisateurs familiarisés avec URBI pourront passer directement à la section suivante pour une liste détaillée des périphériques disponibles.

Faire des mouvements de base

Nous ferons en premier tourner les roues.

Dans URBI, toutes les vitesses de moteur et les valeurs des capteurs dans un robot sont associées à des variables. Vous pouvez régler la vitesse des moteurs ou récupérer la valeurs des capteurs en assignant ou en lisant les valeurs des variables correspondantes.

Dans la mise en page par défaut du serveur pour le modèle TriBot, la roue gauche est assignée à la variable wheelL et la roue droite est assignée à la variable wheelR. [1]. Les valeurs de ces variables contrôlent la vitesse de la roue correspondante. En premier retournez le TriBot sur le dos pour éviter tout accident, puis vous pouvez faire tourner la roue gauche juste en faisant :

  wheelL = 50;

N'oubliez pas le point-virgule à la fin de la ligne, ou la commande ne s'exécutera pas. Vous pouvez aussi faire tourner la roue droite (une valeur négative est un mouvement inverse) :

  wheelR = -50;

Un groupe est défini aussi de tel façon que vous pouvez donner des ordres à plusieurs moteurs en même temps. Dans notre cas, le groupe wheels contient les deux roues du robot. Donner à wheels une valeur appliquera cette valeur aux deux roues :

  wheels = 0;

arrêtera les deux roues.

Le troisième moteur du TriBot est associé à la variable claw.

Amméliorer les déplacements

Les commandes données appliquent une vitesse aux roues, mais vous pouvez utiliser URBI pour exécuter des séquences précises de déplacements. Il est par exemple possible d'appliquer une vitesse pour un temps déterminé, puis de s'arrêter.

Pour en finir avec cela, URBI fourni une commande pour temporiser pendant un temps donné : wait(duration). Et vous pouvez faire des séquences de commandes séparées par des point-virgules qui seront exécutées les unes après les autres. aussi la ligne suivante :

  wheels = 50; wait(10s); wheels = 0;

fera avancer le robot tout droit durant 10 secondes puis s'arrêter.

Il est aussi possible avec URBI de contrôler la façon dont les valeurs vont changer. Dans les exemples précédents, la vitesse du moteur monte le plus vite possible de 0 à 50. Vous pouvez utiliser un modifier dans l'assignation de la variable pour contrôler la façon dont la valeur de la variable changera. Par exemple, si vous voulez atteindre une valeur dans un temps donné, utilisez le modifier time: :

  wheels = 50 time:3s; wheels = 0 time:3s;

En utilisant ce code, le robot va accélérer pour atteindre la vitesse de 50 après 3 secondes, puis ralentir pour s'arrêter après 3 autres secondes.

D'autres modifiers sont disponibles dans URBI, ils sont décrit dans le tutoriel disponible à http://www.gostai.com/doc.php.

Lire des capteurs

A toutes les étapes précédentes les commandes ne prennent pas en compte l'environnement. Pour cela, vous devez obtenir les valeurs des capteurs. Avec URBI, vous avez juste à taper le nom de la variable associée. par exemple quand vous tapez :

  sonar;

Le serveur retourne un message avec la valeur du capteur d'ultrasons :

  [146711:notag] 48.000000

Dans ce message, 146711 est le marqueur de temps (de l'horloge du serveur) qui indique à quelle heure relative la valeur a été lue, notag est le tag(étiquette) de la commande, qui sera décrit dans la prochaine section. 48.00000 est la valeur du capteur sonar, dans ce cas c'est la distance de l'obstacle en face de lui.

Vous avez aussi besoin d'une façon de réagir aux valeurs des capteurs. Dans URBI, ceci est prévu en utilisant event catching commands. Ces commandes vérifies quelques conditions et lancent d'autres commandes quand ces conditions sont vérifiées. Par exemple la commande suivante :

  at (sonar < 50) wheels = 0;

arrêtera le robot si un obstacle est détecté à moins de 50 centimètres. Notez que cette commande reste active dans le serveur. Si vous faites avancer le robot en lui donnant une vitesse :

  wheels = 50;

le robot s'arrêtera à nouveau quand un autre obstacle sera rencontré.

Les autres capteurs disponibles pour le TriBot sont le capteur de son decibel, le capteur de pare-chocs bumper et le capteur de lumière light. La commande suivante :

  at (bumper == 1) wheels = -50;

fera reculer le robot si quelque chose heurte le pare-chocs.

Notez que la commande at réagit seulement quand la condition devient vraie. Si vous voulez qu'une action tourne en boucle jusqu'à ce que la condition devienne vraie, utilisez la commande whenever (voyez l'exemple dans the section called “jouer des sons” ).

Tagging commands

Les commandes at que vous avez entrées avant sont encore actives dans le serveur. Vous avez besoin d'une façon de les arrêter si vous voulez faire quelque chose d'autre. Le mécanisme de tagging va vous permettre de le faire.

Un tag dans un nom associé à une commande. Pour tagger une commande avec le nom mytag, préfixez simplement la commande. Par exemple :

  mytag: at (decibel > 0.7) wheels = 0;

lancera la commande de saisie de l'event (événement) en utilisant le capteur decibel avec un tag mytag.

Plus tard vous serez à même d'arrêter cette commande :

  stop mytag;

arrêtera la commande précédente et le robot ne réagira plus au son.

Le tag par défaut quand vous n'en spécifiez pas est notag. par conséquent :

  stop notag;

arrêtera toutes les commandes que vous avez tapé depuis le début de ce tutoriel.

Il est aussi possible de geler temporairement une commande :

  freeze mytag;

arrêtera la commande taggée avec mytag, mais elle n'est pas effacée, et

  unfreeze mytag;

relancera la commande.

jouer des sons

Le Lego Mindstorms NXT peut jouer des sons. L'objet beeper est associé à cette capacité. Toutefois, vous pouvez juste assigner une valeur à la variable beeper, parceque jouer un son demande plusieurs paramètres. Vous aurez donc à appeler la méthode de l'objet beeper :

  beeper.play(200, 3s);

Ceci émettra un beep à 200Hz durant 3 secondes (la fréquence du beep doit être entre 200Hz et 14000Hz).

Les paramètres de la méthode peuvent aussi être le résultats d'opérations, ou dépendrent d'autres variables. Par exemple, il est possible de jouer un son qui dépends de la distance de l'obstacle :

  mytag:whenever (sonar < 100) beeper.play(200+6*sonar,3ms);

Ceci émet des beeps dont la fréquence baisse à mesure que l'obstacle se rapproche ( inférieure à un mètre).

mouvements cycliques

Nous vous présentons maintenant un modifier dans URBI qui rends possible de faire des mouvements cycliques suivant une sinusoïde. Ce modifier a la particularité que son assignation ne se termine jamais. Pour être à même d'entrer de nouvelles commandes après que ce modifier ait été utilisé, vous avez besoin de mettre cette commande en tâche de fond de telle façon que le serveur URBI continu de traiter les commandes suivantes. Ce sera le cas en terminant la commande avec une virgule au lieu d'un point-virgule. Plus de détail à propos de ces séparateurs de commande seront donnés dans the section called “Parallèlisme”

Le modifier sinus peut être utilisé de cette façon :

  mytag:wheels = 0 sin:10s ampli:100,

Cette commande fera osciller la vitesse de la roue autour de 0, entre -100 et 100 avec une période de 10s. Utiliser un tag pour être à même d'arrêter la commande. Pour faire changer la vitesse de 0 à 100 avec une période de 3 secondes, utiliser la commande :

  tag2:wheels = 50 sin:3s ampli:50,

Parallèlisme

URBI gère le parralèlisme des commandes d'une façon très simple. Le parallèlisme est mis en oeuvre avec différents séparateurs de commandes :

  • Comme il est habituel dans les langages de programmation, 2 commandes séparées par un point-virgule ";" seront exécutées l'une après l'autre :

      wheels = 100; wait(2s); wheels = 0;
    

    fera tourner les roues, attendra 2 secondes puis s'arrêtera.

  • Dans URBI, deux commandes séparées par "&" seront exécutées en parallèle et commenceront exactement en même temps :

      wheelL = 50 & wheelR = -50;
    

    actionnera en même temps la roue gauche en avant et la roue droite en arrière (donc le robot tournera vers la droite).

  • La virgule "," fait tourner la première action en tâche de fond et commencer la suivante dés que possible, sans mettre en oeuvre un démarrage simultané des deux commandes :

      wheelL = 50 time:10s, wheelR = -40 time:10s,
    

    n'attendra pas que wheelL monte à 50 pour faire ralentir wheelR à -40, mais ne fera pas se terminer les deux commandes en même temps, ce qui serait le cas avec le séparateur "&".

Ceci explique pourquoi la virgule était nécessaire dans la section précédente. Si nous finissons une commande qui dure sans fin avec un point-virgule, le serveur attendra sans-fin avant de commencer une nouvelle commande. S'il vous arrive de faire cette erreur, il est possible d'ouvrir une nouvelle connection au serveur URBI en utilisant un autre client et en utilisant la commande stop tag;.

Voici un exemple où nous utilisons le parallélisme pour déplacer le tribot maladroitement tout en jouant des sons :

  wheelR = 0 sin:3s ampli:50 & 
  wheelL = 0 sin:4s ampli:30 &
  beeper.play(200,3s),

Le support du parallélisme est un élément crucial d'URBI, qui a, en fait, quatre séparateurs de commandes. Voyez avec le tutoriel disponible à http://www.gostai.com/doc.php pour plus d'informations.

Utiliser les fonctions

Comme dans la plupart des langages de programmation, il est possible d'écrire des fonctions dans URBI. Les fonctions sont utiles pour faire des programmes plus complexes ou les les mêmes commandes sont utilisées plusieurs fois.

L'exemple suivant définit une fonction qui déplace le robot pour un temps donné à une vitesse donnée :

  function global.forward(speed,timer)
  {
    wheels = speed;
    wait(timer);
    wheels = 0;
  },


Une fois définie, cette fonction peut être appelée simplement :

  global.forward(100,3000);

Plus de détails sur les fonctions, les objets et les variables dans URBI sont disponibles dans le tutoriel URBI à : (http://www.gostai.com/doc.php).

Charger des fichiers

Lorsque l'on fait de grands programmes en URBI, il est facile de les sauver dans des fichiers et de commander au serveur de charger ces fichiers.

Les fichiers sont des simples fichiers textes dans lesquels vous écrivez des commandes URBI. Ces fichiers devront être sauvés dans le sous-répertoire data/ du répertoire de votre serveur. Les fichiers utiliseront l'extension .u qui est l'extension utilisée pour les fichiers de script URBI.

Un exemple demo.u est fournis avec le serveur. Pour faire exécuter ce script par le serveur, tapez la commande URBI :

  load("demo.u");

Conclusion

Ce chapitre à souligné les principales caractéristiques d'URBI avec le robot Mindstorms Tribot. Le prochain chapitre détaille tous les périphériques disponibles pour le TriBot dans l'agencement par défaut. Pour plus de détail à propos du langage URBI, référez vous s'il vous plaît au tutoriel disponible à http://www.gostai.com/doc.php



[1] Pour être précis, capteurs et moteurs sont associés avec les objets. Le moteur gauche est associé avec l'objet wheelL et la vitesse du moteur gauche est associée avec l'attribut wheelL.speed de cet objet. Par commodité, wheelL est aussi un alias de wheelL.speed.

Chapter 4. Réferences d'agencement par défaut

Introduction

Ce chapitre décrit les objets définis dans l'agencement du TriBot.ini fourni avec le serveur URBI mindstorms NXT.

Motors

Trois moteurs sont définis, wheelL, wheelR et claw.

Un groupe, wheels, est défini pour grouper wheelL et wheelR :

  wheels = 10;

est équivalent à

  wheelL = 10 & wheelR = 10; 

Chaque moteur est aliasé avec son attribut .speed :

  wheelL = 10; 

est équivalent à

  wheelL.speed = 10;

L'attribut .speed vous permet de fixer la vitesse du moteur. Cette valeur est réglée entre -100 et 100.

La position du moteur (en degrés) peut être lue en utilisant l'attribut .val. Cet attribut est réglé à 0 quand vous mettez le robot en marche. Nous avons ajouté un contrôle du PID, aussi vous pouvez fixer une position :

  claw.val = 360 ;

demande une rotation entière du moteur claw. Le paramètre PID claw.PGain, claw.IGain, claw.DGain et claw.Precision peut être réglé pour changer le comportement du PID.

Sensors

Tous les capteurs sont aliasés à leur attribut .val.

Les capteurs sont groupés dans le groupe des sensors et tous les périphériques matériels (sensors + motors + battery + beeper) sont groupés dans le groupe hardware.

Bumper

Le périphérique switch à l'avant du robot est appelé bumper. Sa valeur est à 1 si il est appuyé, sinon il est à 0.

Sonar

Le capteur d'ultrasons est appelé sonar.

Sa valeur est la distance mesurée par le capteur en centimètres entre 0 et 255. Quand l'opération de lecture échoue, il retourne la valeur 255.

Decibel

Le capteur de sons est appelé decibel.

Sa valeur rapporte le niveau ambiant du son. Il est entre 0 et 1.

Deux modes différents peuvent être utilisés pour changer l'attribut .mode à "DB" ou "DBA".

  • "DBA" est un mode mesurant seulement les fréquences comprises entre 200 et 14000Hz.
  • "DB" mesure une bande fréquences plus large.

La valeur par défaut est "DBA".

Light

Le capteur de lumière est appelé light.

La valeur retournée est entre 0 et 1 représentant la quantité de lumière mesurée.

Trois modes différents sont disponibles en changeant l'attribut .mode.

  • "Reflector" signifie que le capteur allume sa led et mesure la lumière réfléchie.
  • "Ambiant" éteint la led et mesure la lumière ambiante.
  • "Normal" éteint aussi la led et retourne la valeur brute mesurée.

La valeur par défaut est "Reflector".

Battery

Le périphérique batterie est appelé battery.

Sa valeur est le niveau de la batterie entre 0 et 1, 1 quand elle est complètement chargée.

Beeper

Le périphérique émetteur sonore est appelé beeper.

Vous pouvez demander au beeper de jouer un son en utilisant la méthode :

  play(frequency, time);

frequency est un integer entre 200 et 14000, qui est la fréquence du son. time est un integer, qui est la durée du son en millisecondes. Une durée de 0 est infinie.

La commande retourne immédiatement. Si vous voulez attendre jusqu'à la fin du beep, utilisez :

  { beeper.play(myFrequency, myDuration) & wait(myDuration) },

Command

L'UObject Command n'est pas un périphérique. Elle permet d'envoyer directement des commandes comme vous le faisiez avec la NXT SDK. Vous trouverez plus d'informations sur http://mindstorms.lego.com/Overview/NXTreme.asp

Cet objet a des méthodes pour envoyer et recevoir des données au NXT :

  Command.send(myBuff) ;

où :

  • myBuff est un buffer de commandes (liste d'integers entre 0 et 255).

Par exemple :

  Command.send([3, 10, 10, 0 , 0]);

jouera un beep.

  answer = Command.request(myBuff, size) ;

où :

  • myBuff est un buffer de commandes (demandant une réponse)
  • size est la taille du buffer en retour (il doit être de la taille exacte)
  • answer est une liste contenant les valeurs du buffer en retour ([ ] est retournée quand la requête échoue)

Cette commande est réservée aux utilisateurs experts. L'utiliser n'est pas recommandé si vous ne savez pas ce que vous faites et provoquera des crashs du serveur.

Voici un exemple :

  answer = Command.request([7,0], 15); 

qui retourne les informations sur le port 1.

Chapter 5. Comment créer son propre agencement

Introduction

Dans ce chapitre, la méthode pour construire un agencement personnalisé pour un robot différent est expliquée. Une bonne compréhension des objets en URBI est utile et la lecture du tutoriel URBI est conseillée (disponible à http://www.gostai.com/doc.php).

Ils y a trois sortes de périphériques fournis par le serveur Mindstorms NXT : moteurs, capteurs et autres périphériques. Il y a un type de moteur appelé Servo. Il y a quatre type de capteurs : Switch, SoundSensor, UltraSonicSensor et LightSensor. Deux autres sortes de périphériques sont disponibles : Battery et Beeper. Une description complète de ces périphériques est disponible dans Appendix A, UObject pour périphériques disponibles

Ecrire un agencement entraîne d'instancer des objets particuliers pour le périphérique ci dessus.

Instancer les Moteurs

Le constructeur d'initialisation du Servo a la syntaxe suivante :

  myServoObject = new Servo(myPort);

myPort est soit "A", "B" ou "C". L'objet créé fait qu'il est possible de contrôler le moteur connecté au port en paramètre.

Comme exemple, dans le TriBot.ini courant, trois objets Servo sont créés :

  wheelL = new Servo("C");
  wheelR = new Servo("A");
  claw = new Servo("B");

La roue gauche est sur le port C, la roue droite est sur le A et la pince sur le port B.

Un contrôle du PID est fournit avec cet engine en ordre de contrôler la position d'un moteur. Vous pouvez fixer vos propres paramètres de PID :

  myServoObject.PGain     = 0.01;
  myServoObject.IGain     = 0.01;
  myServoObject.DGain     = 0.01;
  myServoObject.Precision = 0.01; 

Changer ces paramètres changera le comportement du PID. Le contrôle du PID est enfin lancé en changeant l'attribut val :

  myServoObject.val = myServoObject.val + 360;

Qui signifie que la position du servo tournera de 360 degrés.

Le contrôle du PID s'arrêtera lorsque la précision que vous avez demandée est atteinte, Si vous voulez un contrôle permanent, il suffit de régler la précision à 0.

Instancer les capteurs

Pour créer un objet Switch, la syntaxe est la suivante :

  mySwitchObject = new Switch(myPort);

myPort peut être 1, 2, 3 ou 4.

Dans Tribot.ini le switch est utilisé comme bumper relié sur le port 4 donc l'instanceur est :

  bumper  = new Switch(4);

Les objets UltraSonicSensor sont créés de la même façon :

  myUSSObject = new UltraSonicSensor(myPort);

myPort peut être 1, 2, 3 ou 4.

Dans TriBot.ini un capteur ultrasonic est connecté au port 2:

  sonar = new UltraSonicSensor(2);

L'objet SoundSensora un paramètre supplémentaire :

  mySoundObject = new SoundSensor(myPort, myMode);

myPort peut être 1, 2, 3 ou 4. myMode règle le mode du capteur. Il peut être "DB" ou "DBA", signifiant "decibel" ou "decibel adjusted" (le dernier enregistrement de sons dans la bande de fréquences 200-14000Hz).

Dans TriBot.ini, le capteur de sons est sur le port 1 utilisant le decibel adjusté:

  decibel = new SoundSensor(1,"DBA");

LightSensor a aussi deux paramètres :

  myLightObject = new LightSensor(myPort, myMode);

myPort peut être 1, 2, 3 ou 4. myMode règle le mode du capteur et il peut être "Ambiant" (ainsi le capteur mesure la lumière ambiante), "Reflector" (le capteur allume sa led et mesure la lumière réfléchie) et "Normal" (le capteur retourne la donnée brute).

Dans TriBot.ini, le capteur de lumière est en mode reflector sur le port 1 :

  light = new LightSensor(3,"Reflector");

Autres périphériques

Le périphérique Battery permet d'obtenir le niveau de la batterie.

  myBattery = new Battery();

Dans TriBot.ini :

  battery = new Battery();

Le périphérique Beeper permet d'émettre des beeps personalisés du haut-parleur NXT.

  myBeeper = new Beeper();

In TriBot.ini :

  beeper  = new Beeper();

Appendix A. UObject pour périphériques disponibles

Cette appendice décrit de manière exhaustive les UObjects disponibles dans le serveur URBI du Lego Mindstorm NXT.

Servo

Servo défini un moteur. Une instance Servo contient les attributs suivants :

Table A.1. Les attributs de servo:

NameDescription
valPosition du moteur. Lecture seulement.
speedVitesse du moteur, de -100 à 100.
PGainGain proportionnel pour le contrôle du PID.
IGainGain intégral pour le contrôle du PID.
DGainGain dérivé pour le contrôle du PID.
PrecisionPrécision requise pour le contrôle du PID.
portLe port auquel le servo est relié. Il peut être "A", "B" ou "C". Vous pouvez en changer la valeur pendant que le serveur tourne. Attention, si vous changez le port, cela libérera l'ancien port (aussi vous serez à même de créer un autre périphérique dessus) et rendra occupé le nouveau (aussi vous ne serez plus à même de créer un autre périphérique dessus).
init(port_)

Le constructeur d'UObject.

port_ est un nom de port. (voir les attributs précédents port).

Exemple:

wheel = new Servo("A");

UltraSonicSensor

UltraSonicSensor décrit un capteur d'ultrasons. Une instance UltraSonicSensor contients les attributs suivants :

Table A.2. Les attributs du UltraSonic Sensor:

NomDescription
valDistance en cm (de 0 à 255).
portLe port auquel le servo est relié. Il peut être 1, 2, 3 ou 4. Vous pouvez en changer la valeur pendant que le serveur tourne. Attention, si vous changez le port, cela libérera l'ancien port (aussi vous serez à même de créer un autre périphérique dessus) et rendra occupé le nouveau (aussi vous ne serez plus à même de créer un autre périphérique dessus).
init(port_)

Le constructeur d'UObject.

port_ est un nom de port. (voir l'attribut précédent port).

Exemple:

sonar = new UltraSonicSensor(1);

SoundSensor

SoundSensor décrit un capteur de sons. Une instance SoundSensor contient les attributs suivants :

Table A.3. Les attributs du Sound sensor :

NomDescription
valLe niveau du son mesuré (de 0 à 1).
mode"DB" est décibels ou "DBA" est décibels audibles (mesure seulement dans les fréquences audibles).
portLe port auquel le servo est relié. Il peut être 1, 2, 3 ou 4. Vous pouvez en changer la valeur pendant que le serveur tourne. Attention, si vous changez le port, cela libérera l'ancien port (aussi vous serez à même de créer un autre périphérique dessus) et rendra occupé le nouveau (aussi vous ne serez plus à même de créer un autre périphérique dessus).
init(port_, mode_)

Le constructeur d'UObject.

port_ est un nom de port. (voir l'attribut précédent port).

mode_ est un nom de mode. (voir l'attribut précédent mode).

Exemple:

decibel = new SoundSensor(1, "DB");

LightSensor

LightSensor décrit un capteur de lumière. Une instance LightSensor contient les attributs suivants :

Table A.4. Les attributs du Light sensor :

NomDescription
valLe niveau de lumière mesurée (de 0 à 1).
mode

"Ambiant" mesure la lumière ambiante.

"Reflector" allume une led et mesure la réflexion.

"Normal" Retourne la valeur brute

portLe port auquel le servo est relié. Il peut être 1, 2, 3 ou 4. Vous pouvez en changer la valeur pendant que le serveur tourne. Attention, si vous changez le port, cela libérera l'ancien port (aussi vous serez à même de créer un autre périphérique dessus) et rendra occupé le nouveau (aussi vous ne serez plus à même de créer un autre périphérique dessus).
init(port_, mode_)

Le constructeur d'UObject.

port_ est un nom de port. (voir l'attribut précédent port).

mode_ est un nom de mode. (voir l'attribut précédent mode).

Exemple:

light = new LightSensor(1, "Ambiant");

Switch

Switch décrit un capteur sensible au touché. Une instance Switch contient les attributs suivants :

Table A.5. Les attributs de Switch :

NomDescription
valLe status de switch (0 ou 1).
portLe port auquel le servo est relié. Il peut être 1, 2, 3 ou 4. Vous pouvez en changer la valeur pendant que le serveur tourne. Attention, si vous changez le port, cela libérera l'ancien port (aussi vous serez à même de créer un autre périphérique dessus) et rendra occupé le nouveau (aussi vous ne serez plus à même de créer un autre périphérique dessus).
init(port_)

Le constructeur d'UObject.

port_ est un nom de port. (voir l'attribut précédent port).

Exemple:

bumper = new Switch(1);

Battery

Battery décrit un périphérique batterie. Une instance Battery contient les attributs suivants :

Table A.6. Les attributs de Battery :

NomDescription
valCourant disponible de la batterie.
init()

Le constructeur d'UObject.

Exemple

battery = new Battery();

Beeper

Beeper décrit un périphérique bruiteur. Une instance Beeper contient les attributs suivants :

Table A.7. Les méthodes de Beeper :

NomDescription
init()

Le constructeur d'UObject.

Exemple

beeper = new Beeper();
play(frequency, duration)

joue un beep d'une fréquence donnée pour une duréedonnée.

frequency est la fréquence du beep (en Hz), entre 200 et 14000.

duration est la durée du beep (en ms), 0 est sans fin.

Exemple:

beeper.play(200,1000);

Command

Command vous autorise à utiliser des commandes expertes. L'UObject Command contient les méthodes suivantes :

Table A.8. Les méthodes de command :

NomDescription
send(buffer)

Envoie une commande ne demandant pas de réponse.

buffer doit être une liste d'integer entre 0 et 255.

Exemple:

Command.send([3,10,10,0,0]);

qui joue un beep.

request(bufferIn, sizeOut)

Envoie une commande demandant une réponse, et retourne dans le buffer de sortie. ceci est seulement recommandé aux utilisateurs experts. Attention au paramètre sizeOut. Bien sûr s'il est trop long, la requête disparaitra normalement et quand la taille est trop petite la commande marchera mais tout les buffers internes au mindstorm seront shift back (ainsi cela dérivera les autres requêtes).

bufferIn est le buffer de la commande.

sizeOut est la taille de la réponse.

Exemple:

answer = Command.request([7,0], 15); 

Retourne les informations vers le port d'entrée 0.


Instances

Voici les différentes instances dans l'agencement de TriBot.ini.

Table A.9. TriBot.ini layout

InstanceUObjectDescription
wheelLServoLeft wheel
wheelRServoRight wheel
clawServoClaw
sonarUltraSoundSensorDistance sensor
decibelSoundSensorSound sensor
lightLightSensorLight sensor
bumperSwitchTouch sensor
beeperBeeperEmits beeps
batteryBatteryBattery

Groupes

Voici les différents groupes fournis dans l'agencement courant.

Table A.10. liste des groupes

Nom du groupeDescription
wheels (roues)Les deux roues.
motorsTous les moteurs.
sensorsTous les capteurs.
hardwareTous les périphériques.

Appendix B. Copyright

 

THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF
THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK
IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE
WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS
PROHIBITED.

BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND
AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. THE LICENSOR GRANTS
YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF
SUCH TERMS AND CONDITIONS.

1. Definitions

  a. "Collective Work" means a work, such as a periodical issue,
     anthology or encyclopedia, in which the Work in its entirety in
     unmodified form, along with a number of other contributions,
     constituting separate and independent works in themselves, are
     assembled into a collective whole. A work that constitutes a
     Collective Work will not be considered a Derivative Work (as
     defined below) for the purposes of this License.

  b. "Derivative Work" means a work based upon the Work or upon the
     Work and other pre-existing works, such as a translation, musical
     arrangement, dramatization, fictionalization, motion picture
     version, sound recording, art reproduction, abridgment,
     condensation, or any other form in which the Work may be recast,
     transformed, or adapted, except that a work that constitutes a
     Collective Work will not be considered a Derivative Work for the
     purpose of this License. For the avoidance of doubt, where the
     Work is a musical composition or sound recording, the
     synchronization of the Work in timed-relation with a moving image
     ("synching") will be considered a Derivative Work for the purpose
     of this License.

  c. "Licensor" means the individual or entity that offers the Work
     under the terms of this License.

  d. "Original Author" means the individual or entity who created the
     Work.

  e. "Work" means the copyrightable work of authorship offered under
     the terms of this License.

  f. "You" means an individual or entity exercising rights under this
     License who has not previously violated the terms of this License
     with respect to the Work, or who has received express permission
     from the Licensor to exercise rights under this License despite a
     previous violation.

2. Fair Use Rights. 

  Nothing in this license is intended to reduce, limit, or restrict
  any rights arising from fair use, first sale or other limitations on
  the exclusive rights of the copyright owner under copyright law or
  other applicable laws.

3. License Grant. 

  Subject to the terms and conditions of this License, Licensor hereby
  grants You a worldwide, royalty-free, non-exclusive, perpetual (for
  the duration of the applicable copyright) license to exercise the
  rights in the Work as stated below:

  a. to reproduce the Work, to incorporate the Work into one or more
     Collective Works, and to reproduce the Work as incorporated in
     the Collective Works;

  b. to distribute copies or phonorecords of, display publicly,
     perform publicly, and perform publicly by means of a digital
     audio transmission the Work including as incorporated in
     Collective Works;

  The above rights may be exercised in all media and formats whether
  now known or hereafter devised. The above rights include the right
  to make such modifications as are technically necessary to exercise
  the rights in other media and formats, but otherwise you have no
  rights to make Derivative Works. All rights not expressly granted by
  Licensor are hereby reserved, including but not limited to the
  rights set forth in Sections 4(d) and 4(e).

4. Restrictions.

  The license granted in Section 3 above is expressly made subject to
  and limited by the following restrictions:

  a. You may distribute, publicly display, publicly perform, or
     publicly digitally perform the Work only under the terms of this
     License, and You must include a copy of, or the Uniform Resource
     Identifier for, this License with every copy or phonorecord of
     the Work You distribute, publicly display, publicly perform, or
     publicly digitally perform. You may not offer or impose any terms
     on the Work that alter or restrict the terms of this License or
     the recipients' exercise of the rights granted hereunder. You may
     not sublicense the Work. You must keep intact all notices that
     refer to this License and to the disclaimer of warranties. You
     may not distribute, publicly display, publicly perform, or
     publicly digitally perform the Work with any technological
     measures that control access or use of the Work in a manner
     inconsistent with the terms of this License Agreement. The above
     applies to the Work as incorporated in a Collective Work, but
     this does not require the Collective Work apart from the Work
     itself to be made subject to the terms of this License. If You
     create a Collective Work, upon notice from any Licensor You must,
     to the extent practicable, remove from the Collective Work any
     credit as required by clause 4(c), as requested.

  b. You may not exercise any of the rights granted to You in Section
     3 above in any manner that is primarily intended for or directed
     toward commercial advantage or private monetary compensation. The
     exchange of the Work for other copyrighted works by means of
     digital file-sharing or otherwise shall not be considered to be
     intended for or directed toward commercial advantage or private
     monetary compensation, provided there is no payment of any
     monetary compensation in connection with the exchange of
     copyrighted works.

  c. If you distribute, publicly display, publicly perform, or
     publicly digitally perform the Work, You must keep intact all
     copyright notices for the Work and provide, reasonable to the
     medium or means You are utilizing: (i) the name of the Original
     Author (or pseudonym, if applicable) if supplied, and/or (ii) if
     the Original Author and/or Licensor designate another party or
     parties (e.g. a sponsor institute, publishing entity, journal)
     for attribution in Licensor's copyright notice, terms of service
     or by other reasonable means, the name of such party or parties;
     the title of the Work if supplied; and to the extent reasonably
     practicable, the Uniform Resource Identifier, if any, that
     Licensor specifies to be associated with the Work, unless such
     URI does not refer to the copyright notice or licensing
     information for the Work. Such credit may be implemented in any
     reasonable manner; provided, however, that in the case of a
     Collective Work, at a minimum such credit will appear where any
     other comparable authorship credit appears and in a manner at
     least as prominent as such other comparable authorship credit.

  d. For the avoidance of doubt, where the Work is a musical
     composition:

    i. Performance Royalties Under Blanket Licenses. Licensor reserves
       the exclusive right to collect, whether individually or via a
       performance rights society (e.g. ASCAP, BMI, SESAC), royalties
       for the public performance or public digital performance
       (e.g. webcast) of the Work if that performance is primarily
       intended for or directed toward commercial advantage or private
       monetary compensation.

    ii. Mechanical Rights and Statutory Royalties. Licensor reserves
        the exclusive right to collect, whether individually or via a
        music rights agency or designated agent (e.g. Harry Fox
        Agency), royalties for any phonorecord You create from the
        Work ("cover version") and distribute, subject to the
        compulsory license created by 17 USC Section 115 of the US
        Copyright Act (or the equivalent in other jurisdictions), if
        Your distribution of such cover version is primarily intended
        for or directed toward commercial advantage or private
        monetary compensation.

  e. Webcasting Rights and Statutory Royalties. For the avoidance of
     doubt, where the Work is a sound recording, Licensor reserves the
     exclusive right to collect, whether individually or via a
     performance-rights society (e.g. SoundExchange), royalties for
     the public digital performance (e.g. webcast) of the Work,
     subject to the compulsory license created by 17 USC Section 114
     of the US Copyright Act (or the equivalent in other
     jurisdictions), if Your public digital performance is primarily
     intended for or directed toward commercial advantage or private
     monetary compensation.

5. Representations, Warranties and Disclaimer

  UNLESS OTHERWISE MUTUALLY AGREED BY THE PARTIES IN WRITING, LICENSOR
  OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF
  ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR
  OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE,
  MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT,
  OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE
  OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME
  JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO
  SUCH EXCLUSION MAY NOT APPLY TO YOU.

6. Limitation on Liability.

  EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL
  LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL,
  INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT
  OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN
  ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

7. Termination

  a. This License and the rights granted hereunder will terminate
     automatically upon any breach by You of the terms of this
     License. Individuals or entities who have received Collective
     Works from You under this License, however, will not have their
     licenses terminated provided such individuals or entities remain
     in full compliance with those licenses. Sections 1, 2, 5, 6, 7,
     and 8 will survive any termination of this License.

  b. Subject to the above terms and conditions, the license granted
     here is perpetual (for the duration of the applicable copyright
     in the Work). Notwithstanding the above, Licensor reserves the
     right to release the Work under different license terms or to
     stop distributing the Work at any time; provided, however that
     any such election will not serve to withdraw this License (or any
     other license that has been, or is required to be, granted under
     the terms of this License), and this License will continue in
     full force and effect unless terminated as stated above.

8. Miscellaneous

  a. Each time You distribute or publicly digitally perform the Work
     or a Collective Work, the Licensor offers to the recipient a
     license to the Work on the same terms and conditions as the
     license granted to You under this License.

  b. If any provision of this License is invalid or unenforceable
     under applicable law, it shall not affect the validity or
     enforceability of the remainder of the terms of this License, and
     without further action by the parties to this agreement, such
     provision shall be reformed to the minimum extent necessary to
     make such provision valid and enforceable.

  c. No term or provision of this License shall be deemed waived and
     no breach consented to unless such waiver or consent shall be in
     writing and signed by the party to be charged with such waiver or
     consent.

  d. This License constitutes the entire agreement between the parties
     with respect to the Work licensed here. There are no
     understandings, agreements or representations with respect to the
     Work not specified here. Licensor shall not be bound by any
     additional provisions that may appear in any communication from
     You. This License may not be modified without the mutual written
     agreement of the Licensor and You.