Copyright © 2006-2007 Gostai™
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
List of Tables
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.
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.
Table of Contents
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.
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.
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.
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 commandeat 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” ).
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.
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).
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,
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.
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).
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");
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.
Ce chapitre décrit les objets définis dans l'agencement du
TriBot.ini fourni avec le serveur URBI
mindstorms NXT.
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.
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.
Le périphérique switch à l'avant du robot est appelé bumper.
Sa valeur est à 1 si il est appuyé, sinon il est à 0.
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.
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".
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".
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.
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) },
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.
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.
Le constructeur d'initialisation du Servo a la syntaxe suivante :
myServoObject = new Servo(myPort);
où 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.
Pour créer un objet Switch, la syntaxe est la suivante :
mySwitchObject = new Switch(myPort);
où 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");
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();
Table of Contents
Cette appendice décrit de manière exhaustive les UObjects disponibles dans le serveur URBI du Lego Mindstorm NXT.
Servo défini un moteur. Une instance Servo contient les attributs suivants :
Table A.1. Les attributs de servo:
| Name | Description |
|---|---|
| val | Position du moteur. Lecture seulement. |
| speed | Vitesse du moteur, de -100 à 100. |
| PGain | Gain proportionnel pour le contrôle du PID. |
| IGain | Gain intégral pour le contrôle du PID. |
| DGain | Gain dérivé pour le contrôle du PID. |
| Precision | Précision requise pour le contrôle du PID. |
| port | Le 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.
Exemple: wheel = new Servo("A");
|
UltraSonicSensor décrit un capteur d'ultrasons. Une instance UltraSonicSensor contients les attributs suivants :
Table A.2. Les attributs du UltraSonic Sensor:
| Nom | Description |
|---|---|
| val | Distance en cm (de 0 à 255). |
| port | Le 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.
Exemple: sonar = new UltraSonicSensor(1); |
SoundSensor décrit un capteur de sons. Une instance SoundSensor contient les attributs suivants :
Table A.3. Les attributs du Sound sensor :
| Nom | Description |
|---|---|
| val | Le 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). |
| port | Le 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.
Exemple: decibel = new SoundSensor(1, "DB"); |
LightSensor décrit un capteur de lumière. Une instance LightSensor contient les attributs suivants :
Table A.4. Les attributs du Light sensor :
| Nom | Description |
|---|---|
| val | Le 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 |
| port | Le 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.
Exemple: light = new LightSensor(1, "Ambiant"); |
Switch décrit un capteur sensible au touché. Une instance Switch contient les attributs suivants :
Table A.5. Les attributs de Switch :
| Nom | Description |
|---|---|
| val | Le status de switch (0 ou 1). |
| port | Le 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.
Exemple: bumper = new Switch(1); |
Battery décrit un périphérique batterie. Une instance Battery contient les attributs suivants :
Table A.6. Les attributs de Battery :
| Nom | Description |
|---|---|
| val | Courant disponible de la batterie. |
| init() | Le constructeur d'UObject. Exemple battery = new Battery(); |
Beeper décrit un périphérique bruiteur. Une instance Beeper contient les attributs suivants :
Table A.7. Les méthodes de Beeper :
| Nom | Description |
|---|---|
| init() | Le constructeur d'UObject. Exemple beeper = new Beeper(); |
| play(frequency, duration) | joue un beep d'une
Exemple: beeper.play(200,1000); |
Command vous autorise à utiliser des commandes expertes. L'UObject Command contient les méthodes suivantes :
Table A.8. Les méthodes de command :
| Nom | Description |
|---|---|
| send(buffer) | Envoie une commande ne demandant pas de réponse.
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
Exemple: answer = Command.request([7,0], 15); Retourne les informations vers le port d'entrée 0. |
Voici les différentes instances dans l'agencement de TriBot.ini.
Table A.9. TriBot.ini layout
| Instance | UObject | Description |
|---|---|---|
| wheelL | Servo | Left wheel |
| wheelR | Servo | Right wheel |
| claw | Servo | Claw |
| sonar | UltraSoundSensor | Distance sensor |
| decibel | SoundSensor | Sound sensor |
| light | LightSensor | Light sensor |
| bumper | Switch | Touch sensor |
| beeper | Beeper | Emits beeps |
| battery | Battery | Battery |
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.