NXT-G, leçon n°8 : Choisir... Décider...

Pour expliquer certains fonctionnements, principes et fondements.
Avatar de l’utilisateur
roboleo
Level 8
Level 8
 
Messages: 955
Localisation: Hauts de Seine
expertnxt

Messagepar roboleo » Mar Fév 17, 2009 7:41 pm

NXT-G, Leçon n°8: Choisir… Décider…

Cette leçon couvre un dernier bloc de la palette Commun. Lorsque vous l'aurez assimilée, vous serez en mesure d'offrir à vos robots des talents supplémentaires, notamment de faire des choix parmi de multiples et possibles actions.

Mais d'abord, rappel des règles:
* Première règle: familiarisez-vous avec les outils de programmation.
* 2ème règle: les capteurs doivent être connectés aux ports d’entrée (1,2,3 & 4) et les moteurs doivent être connectés aux ports de sortie (A, B & C).
* 3ème règle: Un bloc ne peut accomplir qu'une seule tâche à la fois. Il faut autant de blocs que de tâches à accomplir.
* 4ème règle: un programme NXT-G se termine une fois le dernier bloc exécuté.
* 5ème règle: les seules données qui peuvent circuler entre les blocs sont du TEXTE, des NOMBRES et du type LOGIQUE - et seulement ces trois.
*6ème règle: Les blocs de programmation ne peuvent répondre qu'à une condition à la fois, en ne fournissant qu'un type de réponse logique: Vrai ou Faux.
Il faut autant de blocs que de conditions à satisfaire.
* 7ème règle: dans le cas de BOUCLES IMBRIQUEES, le programme commence toujours par la boucle de plus bas niveau (à l'intérieur) et se termine par la boucle de 1er niveau (à l'extérieur).

A Droite ou à Gauche? … Sortie A ou Sortie B? …

Pour commencer je vais adresser à BONG un pseudo-code pour cette nouvelle tâche.
LEO :cri: > BONG avance de 3 rotations (du moteur) puis stop. Si le capteur PHOTOSENSIBLE détecte un niveau lumineux supérieur à 30, tourne à droite. Sinon, tourne à gauche.
Vous savez comment programmer BONG pour le faire avancer à l'aide du bloc DEPLACER. Mais comment saisir la valeur issue du capteur PHOTOSENSIBLE et l'employer, pour aider BONG à prendre une décision: tourner à droite ou à gauche?
La réponse est simple: vous allez utiliser un nouveau bloc COMMUTATEUR.

Voici à quoi il ressemble, présenté avec ses paramètres de défaut:

Image

Ce bloc COMMUTATEUR utilisera une valeur en ENTREE pour déterminer son chemin. Cette valeur peut-être numérique, une portion de texte, ou une valeur Logique (VRAI ou FAUX).
Mais le plus intéressant est que le nombre de chemins n'est pas limité à 2. On pourrait par exemple configurer le bloc COMMUTATEUR pour répondre à ce pseudo-code:

LEO :cri: > BONG, prends une valeur au hasard comprise entre 1 et 5.

LEO :cri: > Si le nombre est 1, tourne à droite.

LEO :cri: > Si le nombre est 2, tourne à gauche.

LEO :cri: > Si le nombre est 3, fais un demi-tour.

LEO :cri: > Si le nombre est 4, fais un tour complet.

LEO :cri: > Si le nombre est 5, avance.

Dans cet exemple, j'ai demandé à BONG de choisir au hasard un nombre. Cela est possible en utilisant un bloc particulier pas encore abordé (nous en reparlerons un peu plus loin). Mais pour l'instant, supposons que BONG est capable de générer par lui-même ces nombres.
Bien, étant donné que BONG dispose de 5 nombres (1, 2, 3, 4 et 5), il existe 5 actions possibles qui leurs sont associées. Je vais aussi utiliser le terme chemin au lieu de action, parce que le bloc COMMUTATEUR offre aux robots différents chemins possibles.
A chaque chemin suivi par le robot, correspond des actions différentes.
Un chemin peut ordonner au robot d'avancer, de vérifier, grâce au capteur à ULTRASONS, de la présence d'un obstacle.
Un autre chemin pourrait diriger le même robot vers une direction opposée, attendant que le capteur TACTILE soit heurté, tout en comptant le nombre de rotations du moteur.
C'est la grande affaire de ce bloc: chaque chemin dispose de blocs de programmation spécifiques qui donnent au robot encore plus de puissance. Vous pouvez même ajouter à l'intérieur d'un chemin un nouveau bloc COMMUTATEUR, multipliant à l'infini les chemins…

Avant de voir comment fonctionne ce bloc, je dois préciser un point particulier figurant dans le panneau de configuration:
pour les besoins d'explication, j'ai choisi dans la zone Contrôle du panneau de configuration valeur, type Logique.

Image

Vous noterez dans la zone Afficher que la case Vue à plat est cochée.
Décochez cette case.
La présentation graphique du bloc change quelque peu et se présente ainsi:

Image

La différence réside dans l'affichage des chemins.

* Dans le premier cas, les 2 chemins sont visibles, le bloc étant fractionné en 2 rayons de séquence, séparés par un trait horizontal. A chacune des parties est associé un symbole: V (pour VRAI) et X (pour FAUX).
On placera les blocs de programmation sur chacun de ces 2 rayons selon les actions envisagées.
La Vue à plat (case cochée) est limitée à 2 chemins uniquement: L'un est associé au symbole V, l'autre au symbole X. Le symbole V est aussi appelé chemin de défaut (mais il peut être modifié).

* Dans le 2ème cas, le fractionnement a disparu et les symbole V ou X sont visibles grâce à des onglets. Chacun rayon de séquence recevra ses blocs de programmation tout en dissimulant l'autre. Il suffira de cliquer sur l'onglet pour faire apparaître le chemin sélectionné. Cet inconvénient est compensé par un grand avantage: celui de définir plus de 2 chemins.

En choisissant le bloc COMMUTATEUR, et selon le nombre de chemins envisagés, vous devrez décocher ou non la vue à plat.

Rappelez-vous du pseudo-code précédent où 5 choix étaient envisagés. Voici à quoi ressemblerait le bloc COMMUTATEUR dans ce cas:

Image

Comme nous sommes en présence de 5 choix, on ne peut plus appliquer le type Logique (limité à 2 choix), mais Numérique.
Nous verrons plus loin comment utiliser ce bloc pour des chemins plus nombreux que 2.

Je vais à présent vous montrer comment configurer le bloc COMMUTATEUR:
J'ai choisi un simple bloc en mode Vue à plat: cela signifie que j'ai seulement 2 chemins possibles pour mon robot. Le premier chemin (symbole V) est sur la partie haute du bloc, le 2ème chemin (symbole X) est sur la partie basse.

Image

Dans la zone Contrôle le champ de saisie offre 2 options: Capteur et Valeur. J'ai choisi capteur puis Ultrasons. Les symboles V et X ont disparu, cela signifie que l'option capteur doit préciser lequel des 2 chemins doit correspondre au symbole V (valeur VRAI) quand le point de déclenchement est atteint.
Dans cet exemple j'ai configuré le capteur à ULTRASONS de telle sorte qu'il détecte un objet à moins de 30 cm. Si cette condition est vérifiée, alors le bloc COMMUTATEUR exécutera tous les blocs (s'il y en a) placés sur le chemin VRAI, c'est à dire le chemin du haut. Si cette condition n'est pas vérifiée (distance supérieure à 30 cm), le bloc COMMUTATEUR exécutera tous les blocs (s'il y en a) placés sur le chemin FAUX, c'est à dire chemin du bas.

Je suppose maintenant que BONG dispose d'un capteur à ULTRASONS et un capteur SONORE fixés sur sa structure.
Je lui adresse ce pseudo-code suivant:
LEO :cri: > BONG, quand le capteur à ULTRASONS détecte un objet à moins de 30 cm, tourner à gauche si le capteur SONORE relève un niveau plus grand que 20.

J'ai déjà configuré le premier bloc COMMUTATEUR pour détecter une distance inférieure à 30cm: cela signifie que la suite de mon programme se placera sur le chemin du haut (VRAI), puisque cette première condition est vérifiée. Ensuite je veux que BONG tourne à gauche si seulement le capteur SONORE relève un son plus grand que 20. Comment traduire cela? Simplement en utilisant un 2ème bloc COMMUTATEUR.
D'abord je glisse un autre bloc COMMUTATEUR sur le rayon de séquence supérieur ainsi:
en prenant le soin de sélectionner par la suite, le bon capteur.

Image

Ensuite, je configure le 2 ème bloc COMMUTATEUR pour un point de déclenchement à 20. Si cette valeur est dépassée, alors la suite du programme (c'est à dire tourner à gauche), trouvera sa place dans le rayon de séquence supérieur de ce 2 ème bloc.

Image

Cet exemple est à l'image de ce que nous avons déjà vu pour les BOUCLES: nous sommes dans un dispositif de blocs COMMUTATEURS IMBRIQUES. En combinant ces blocs, on devine comment donner à BONG la manière de contrôler de complexes décisions.

Un autre exemple combinant le bloc BOUCLE avec celui de COMMUTATEUR:

Image

Le premier bloc AVANCER dans la BOUCLE, réglée sur pour toujours, provoque le déplacement du robot en droite ligne. Le capteur à ULTRASONS associé au bloc COMMUTATEUR, mesure en permanence la distance entre le robot et un obstacle. Si la distance est inférieure à 40 cm (condition VRAI) il prend le chemin du haut et tourne à gauche. Si la distance est supérieure à 40 cm (chemin du bas), il se contente de ne rien faire et passe la main.
Le bloc COMMUTATEUR ayant accompli sa tâche, on passe au bloc suivant qui est en fait la BOUCLE: on recommence donc le processus.
Le robot va continuer à avancer jusqu'à trouver un nouvel obstacle, et ainsi de suite…
Ce programme très simple permet à un robot d'éviter en permanence un obstacle placé devant lui. Dans cet exemple le robot tourne toujours à gauche; nous verrons plus tard comment lui laisser décider de tourner à gauche ou à droite (2 choix possibles).
Remarque: Le chemin du bas étant de fait vide, il est plus commode pour la lecture du programme de décocher la case Vue à plat. Le graphique y gagne en clarté.


Multiples décisions

Voyons à présent comment votre robot peut décider pour un plus grand nombre de choix.
Il existe des tas de situations ayant plus de 2 options, non? Aussi, je prendrai un autre exemple pour BONG.

Image

Le pseudo-code:
LEO :cri: > BONG, en arrivant au croisement, choisir un chiffre entre 1, 2 et 3.
Si le chiffre est 1, tourner à gauche. Si le chiffre est 2, tourner à droite, et si le chiffre est 3 aller tout droit.

En préalable, 2 observations:
Nous avons 3 choix possibles, donc il faut décocher la case Vue à plat.
Ensuite, pour configurer le bloc COMMUTATEUR à 3 chemins, il faut choisir dans le panneau de configuration Valeur et Numérique.

Image

Vous remarquerez que le bloc COMMUTATEUR dispose de 2 onglets et d'un plot de données en entrée que nous allons utiliser. Ce plot accepte les 3 types de données déjà évoqués au cours des dernières leçons. Pour la cause, j'ai choisi Numérique, parce que des valeurs numériques caractériseront les différents chemins. Evident, non?
Observez maintenant dans la zone Conditions ce petit tableau comprenant 2 lignes et 2 colonnes. La première colonne contient le numéro du chemin. La 2 ème colonne contient une valeur numérique. Ici, pour le chemin 1, c'est 0, et pour le chemin 2, c'est 1.
Donc, si par le plot de donnée j'entre une valeur 0, le chemin n° 1 sera sélectionné. Si j'entre la valeur 1, c'est le chemin n° 2 qui sera sélectionné.
Vous suivez? …Bien.
Or, mes besoins m'imposent 3 chemins. Il faudra donc que j'ajoute un chemin supplémentaire. Pour cela, appuyez sur la case + (Ajouter une nouvelle condition), en haut et à droite du tableau.

Image

J'ai à présent un 3 ème chemin avec une valeur de défaut de 2.

Les valeurs numériques que j'ai décidé d'attribuer à chaque chemin le seront d'une manière aléatoire, grâce à un bloc particulier que nous verrons tout à l'heure.
Pour le moment, il s'agit pour chacun des chemins de leur attribuer une valeur de défaut correspondant à leur numéro: 1 pour le chemin n°1, 2 pour le chemin n°2 et 3 pour le chemin n°3.
Le tableau se présente actuellement ainsi:
1. 0
2. 1
3. 2
Nous allons le modifier de la manière suivante:

Image

Chaque ligne étant sélectionnée (en orange), on portera successivement les valeurs dans le champ de saisie au dessous.
Cette modification a fait disparaître le zéro, nous verrons pourquoi.
On remarquera que la valeur de défaut est cochée en ligne n°1; cela signifie que le 1er onglet correspond au chemin n°1, chemin de défaut.

Je vais à présent introduire un nouveau bloc ALEATOIRE devant le bloc COMMUTATEUR.
Ce bloc est un bloc mathématique qui ne sert qu'à générer une valeur quelconque, au hasard, comprise entre 2 bornes (maximum et minimum) qui en font aussi partie. Par défaut, ces bornes sont 0 et 100. Nous allons les remplacer par 1 et 3. Ensuite, nous tirerons un fil de données, pour obtenir le résultat suivant:

Image

Ce bloc a la particularité de produire une valeur 1, 2 ou 3, chaque fois qu'il sera sollicité. Le zéro ayant été éliminé, c'est la raison pour laquelle il ne doit pas se retrouver dans la valeur du chemin n°1.
On a rendu cohérent les n° de chemin avec leurs valeurs associées

Et maintenant, on peut insérer les blocs DEPLACER dans chaque chemin en fonction de l'ordre des onglets:
Onglet 1: tourner à gauche,
Onglet 2: tourner à droite
Onglet 3: tout droit

Image

Et si on souhaite que l'opération se répète, il suffira de placer l'ensemble dans une BOUCLE pour toujours.
A chaque passage de la boucle, le bloc ALEATOIRE produira au hasard un nombre 1, 2 ou 3 qui sera comparé aux conditions du bloc COMMUTATEUR, lequel ouvrira la chemin du même n°.

Simple, élégant et sans fin!
Et que se passerait-il si le bloc ALEATOIRE devenait fou et produisait une valeur 4?
Cette valeur n'existant pas dans les conditions, c'est la valeur de défaut qui serait alors sollicitée; dans ce cas le chemin n°1 (valeur cochée). De plus quelle que soit la valeur sauf 2 ou 3, c'est toujours ce chemin n°1 qui sera choisi.

Enfin et pour terminer:
Encore un autre exemple pour se faire plaisir:
Voulez-vous faire évoluer un robot à l'intérieur d'un tracé fermé? Essayez alors ce programme: Un bloc BOUCLE avec 2 blocs COMMUTATEUR IMBRIQUEES.

Image

Le bloc ALEATOIRE est utilisé ici pour choisir au hasard une valeur comprise entre 0 et 100. Cette valeur est ensuite comparée à un valeur constante B = 25. Selon le résultat qui est une valeur logique (VRAI ou FAUX), le robot empruntera le chemin du haut (tourne à gauche) ou celui du bas (tourne à droite).



Retenez que le bloc COMMUTATEUR est un bloc puissant qui donne énormément de possibilités de décisions selon le type de données en entrées, et les capteurs associés.

Exercice plus conplexe:
réponse à une question posée par Semtou et Tutur, sans oublier cybermaster pour qui les variables sont un mystère…

Problème: comment afficher sur l'écran du NXT des valeurs défilantes d'un compteur, croissantes ou décroissantes, en utilisant les boutons flèche droite et flèche gauche, puis valider une valeur (pour usage ultérieur) en appuyant sur le bouton ENTREE.

Image>>
>>Image>>
>>Image

image entière : http://img165.imageshack.us/img165/4573 ... tutur3.jpg

Le programme est constitué de 2 boucles imbriquées contenant 2 blocs COMMUTATEUR:
le 1er bloc permet d'afficher les valeurs croissantes, le 2ème les valeurs décroissantes (quand on appuie sur les boutons respectifs).
En appuyant sur le bouton ENTREE on valide la dernière valeur affichée et on sort de la 1ère boucle. La boucle externe contient l'affichage de cette valeur.
Si cette valeur ne convient pas, on recommence avec les flèches.
Il n'est pas prévu ici de mettre fin au programme. Pour l'arrêter, appuyer sur le bouton gris.
Quelques observations:
On utilise qu'une seule variable appelée "Compteur" par laquelle transitent toutes les valeurs. Le dernier bloc COMPTEUR contient la valeur recherchée (à utiliser pour la suite).
Le 1er bloc AFFICHER efface l'écran. Les 2 suivants affichent les valeurs. Le dernier associé au bloc TEXTE confirme le choix (champ A) et affiche la valeur (champ B).
On constate la répétition de certains groupes de blocs. Nous verrons plus tard comment simplifier en créant des blocs personnalisés uniques qui les remplacent.
A+
Roboleo
" Je ne cherche pas, je trouve…" P. Picasso

cybermaster
Level 11
Level 11
 
Messages: 2205
Localisation: Valence
Âge: 30 ans

Messagepar cybermaster » Dim Fév 22, 2009 12:46 pm

Erf, on ne voit pas la droite de l'image, sa coupe :(
Image

Le jour où on mettra les con* sur orbite, j'en connait qui n'ont pas fini de tourner

Avatar de l’utilisateur
roboleo
Level 8
Level 8
 
Messages: 955
Localisation: Hauts de Seine
expertnxt

Messagepar roboleo » Dim Fév 22, 2009 2:38 pm

cybermaster a écrit:Erf, on ne voit pas la droite de l'image, sa coupe :(

Agrandis ta fenêtre et fait glisser vers la gauche cette fenêtre si insuffisant (la partie déjà vue disparaît pour laisser la place à la suite). :)
A+
Roboleo
" Je ne cherche pas, je trouve…" P. Picasso

cybermaster
Level 11
Level 11
 
Messages: 2205
Localisation: Valence
Âge: 30 ans

Messagepar cybermaster » Dim Fév 22, 2009 2:41 pm

Non, ça ne marche pas, c'est l'image qui est trop large, donc le forum coupe un bout (j'avais déjà remarqué ça). :/

J'ai téléchargé l'image, y'a que comme ça que j'arrive à voir :)
Image

Le jour où on mettra les con* sur orbite, j'en connait qui n'ont pas fini de tourner

Avatar de l’utilisateur
Anio
Administrateur
Administrateur
 
Messages: 19681
Âge: 38 ans
revieweurmoceurstarwarsexpertambassadeur

Messagepar Anio » Dim Fév 22, 2009 3:06 pm

J'ai coupé l'image en 3 morceaux consécutifs. J'ai aussi laissé l'image entière.

En espérant que ca satisfasse tout le monde. :)
Think outside the box.

Tout plein de liens utiles dans mon profil ! :P

Avatar de l’utilisateur
roboleo
Level 8
Level 8
 
Messages: 955
Localisation: Hauts de Seine
expertnxt

Messagepar roboleo » Dim Fév 22, 2009 3:34 pm

Anio a écrit:J'ai coupé l'image en 3 morceaux consécutifs. J'ai aussi laissé l'image entière.

En espérant que ca satisfasse tout le monde. :)

Hé… Tu m'as pris de vitesse.
Merci pour la lisibilité, j'allais réduire… :D
A+
Roboleo
" Je ne cherche pas, je trouve…" P. Picasso

Avatar de l’utilisateur
semtou
Level 7
Level 7
 
Messages: 525
Localisation: Toulouse
Âge: 56 ans

Messagepar semtou » Mer Fév 25, 2009 3:35 pm

Super la vidéo Roboléo on a la totale ici le cours, la vidéo, le programme. C'est le top. Merci cette fois-ci j'imprime aussi c'est génial. :clap:
"Ce qui se conçoit bien s’énonce clairement et les mots pour le dire viennent aisément..." Nicolas Boileau-Despreaux
Mon blog = http://semtou.skyrock.com/
Ma galerie photos = http://www.brickshelf.com/cgi-bin/gallery.cgi?m=SEMTOU


Retourner vers De la théorie à la pratique

Qui est en ligne ?

Utilisateurs parcourant actuellement ce forum : Aucun utilisateur inscrit et 2 invités