Chapitre 4. Fonctions plus avancées

Table des matières

Le branchement conditionnel et les boucles
if
while
for, foreach
loop, loopn
Les mécanismes de capture d'événements
at
whenever
wait, waituntil
timeout, stopif, freezeif
Les tests coulés
Emettre un événement
Evénements simples
Les événements avec paramètres
Durée d'un événement
Evénements pulsés: la commande every
Etiquettes, drapeaux et contrôle des commandes
Le regroupement d'objets
Définir une fonction
Messages d'erreur et messages-système

Désormais, vous êtes capable de lire et de régler des capteurs et des moteurs dans votre robot, exécuter des scripts ou actions complexes et superposer des séquences de mouvements. Cela pourrait suffire pour la plupart des utilisateurs, mais URBI va plus loin en vous proposant l'ensemble des structures algorithmiques disponibles dans les langages de programmation modernes ainsi que de nouvelles adaptées à la robotique.

Le branchement conditionnel et les boucles

Le branchement conditionnel et les boucles disponibles avec le C et le C++ sont présents dans URBI : if ... else, for et while. Les exemples suivants illustrent ces constructions (la commande echo que vous trouverez parmi les exemples affiche tout simplement l'expression en tant que message-système).

if

if réalise un test et exécute la commande associée, à la condition que le test ait réussi:

if (backSensorM > 0) {
       appuye = 1;
       echo "Capteur du dos appuyé";
};

La dernière commande entre accolades ne nécessite pas d'être conclue par un point-virgule comme dans l'exemple précédent. En effet, les points-virgules sont des séparateurs de commande et non des terminateurs de commande. Vous pouvez conclure par un point-virgule comme en C, mais cela est inutile (cela ajoute une commande vide).

if (distance < 10)
  echo "Obstacle détecté"
else
  echo "Aucun obstacle";
[167322:notag] *** Aucun obstacle

Remarquez qu'il n'y a pas de point-virgule avant else mais qu'il y en a un (ou tout autre séparateur de commande) après l'accolade finale.

distance et backSensorM sont deux devices: l'un pour le capteur de distance infra-rouge situé dans la tête de l'Aibo et l'autre pour le capteur du dos du milieu.

while

La construction d'une boucle while est similaire à celle du C:

i=0;
while (i<=2) {
  i:echo i;
  i++;
};
[151228:i] *** 0
[151228:i] *** 1
[151228:i] *** 2

for, foreach

La construction d'une boucle for est similaire à celle du C:

for (i=0;i<=2;i++)
  i:echo i;
[151228:i] *** 0
[151228:i] *** 1
[151228:i] *** 2

Contrairement au C, URBI possède des constructions temporelles de for: for&, for| et while|. Ces constructions démarreront chaque itération en parallèle (avec &) ou en série (avec |) avec une garantie de contrainte temporelle. Plus de détails dans le document "URBI Language Specification".

Comme nous l'avons mentionné auparavant, il existe également foreach et foreach& pour énumérer les listes:

foreach i in [0,1,2] {
  i:echo i;
};
[151228:i] *** 0
[151228:i] *** 1
[151228:i] *** 2

foreach est une exception: même quand il n'y a qu'une seule commande, comme dans l'exemple précédent, vous devez l'encadrer par des accolades.

loop, loopn

Pour des raisons pratiques, URBI a ajouté deux constructions supplémentaires, loop et loopn, pour créer des boucles infinies pour le premier et pour boucler un nombre fixé de fois pour le second. La syntaxe est la suivante:

loop { ... }

et

loopn (n) { ... }