Dans le précédent article, nous avons découvert le robot Scribbler 2 et son environnement de programmation graphique. Nous allons poursuivre cette découverte dans ce nouvel article en abordant des points précis comme le multitâche et l’utilisation de variables.
Dans cet article, nous allons illustrer les concepts précédents en réalisant un comportement complet d’évitement d’obstacles.
Algorithme d’évitement d’obstacle mis en œuvre par le robot Scribbler 2
L’algorithme que nous choisissons de mettre en œuvre n’est sans doute pas le meilleur algorithme qui soit mais il a le mérite de nous permettre d’explorer les différentes fonctionnalités du logiciel de programmation du robot Scribbler 2 que nous souhaitons aborder. Le principe est le suivant : nous découpons la zone frontale du robot en secteurs et tâchons de détecter où se trouvent les obstacles dans ces différents secteurs.
L’algorithme est le suivant :
- Le robot Scribbler 2 avance tout droit tant qu’il ne rencontre pas d’obstacle
- Si le robot rencontre un obstacle, il effectue quart de tour dans un sens (le choix du sens est aléatoire). Il effectue une seconde mesure et si aucun obstacle n’est rencontré, il avance tout droit. Si un obstacle est rencontré, il effectue un demi-tour dans l’autre sens. Si un obstacle est la aussi rencontré, alors il recule et effectue un peu plus qu’un demi tour (choix du sens aléatoire). Si au contraire aucun obstacle n’est rencontré, il avance tout droit.
- Le robot avance tout droit tant qu’il ne rencontre pas d’obstacle
- Enfin, si le robot patine, c'est-à-dire si les roues tournent mais que le robot est bloqué contre un obstacle que l’algorithme n’aurait pas su éviter, alors le robot doit reculer pendant quelques secondes et tourner soit à droite, soit à gauche, d’une manière aléatoire.
Dans cet algorithme, nous avons choisi des comportements identiques dans différentes situations afin de nous aider à illustrer certains concepts, notamment celui de sous routine.
La figure ci-dessous présente le programme d’évitement d’obstacle tel que nous l’avons conçu :
La source du programme est disponible en suivant ce lien : Programme d’évitement d’obstacle
Nous allons présenter chaque étape de ce programme.
La routine principale
Le programme est organisé en plusieurs parties. Chaque partie est appelée une routine. Par défaut, le programme débute avec la sous-routine verte (la roue crantée présente sur le bloc de démarrage est verte, ce qui en fait un bloc de démarrage de programme et pas seulement un bloc de démarrage de sous-routine).
Dans le programme principal, nous débutons par un bloc déplacement où les deux moteurs sont paramétrés pour tourner chacun dans le même sens à 100% de leur puissance. Le robot avance donc en ligne droite sans limitation de durée. Nous répondons là à un prérequis de notre algorithme. Rappelons-nous qu’un bloc « Déplacer » qui tourne sans limite de temps ne sera arrêté que par un autre bloc « Déplacer » qui indiquera au robot d’effectuer un déplacement différent ou bien par la fin du programme.
Nous effectuons ensuite des tests (blocs jaunes) pour savoir si le robot détecte un obstacle à sa gauche, devant ou à sa droite ou bien si le robot détecte qu’il patine (c'est-à-dire que ses deux moteurs soient en action mais qu’il n’avance pas pour autant).
A chaque test, nous décidons d’afficher un code couleur avec les 3 led et de jouer un petit code musical. Ceci n’est absolument pas obligatoire mais c’est une bonne pratique pour savoir si le code que nous produisons produit réellement les effets attendus lorsque nous l’activons.
Enfin, selon le cas rencontré, nous décidons d’appeler une sous-routine. Pour appeler une sous-routine, il faut utiliser le bouton suivant :
La fenêtre qui s’ouvre alors est présentée ci-dessous :
En cliquant sur la roue crantée représentée dans le bouton de gauche, cela change la couleur de la roue crantée, indiquant par là même quelle sous-routine vous souhaitez créer. Celle-ci est créée par le programme à côté de votre programme principal et est affichée en couleur semi-transparente comme le présente l’image ci-dessous.
Elle restera en couleur semi-transparente tant qu’il n’y aura pas quelque part dans votre programme un appel à cette sous-routine. Cela est très pratique car il permet d’identifier très facilement les parties « mortes » de votre programme.
Pour appeler une sous-routine, il faut utiliser le bouton suivant :
Lorsque vous cliquez sur ce bouton et que vous placez le bloc d’appel de sous-routine dans votre programme, il affiche une fenêtre de paramétrage qui est en tout point identique à la fenêtre de paramétrage qui est ouverte lorsque vous créez une sous-routine et qui est présentée ci-dessus. En cliquant sur le bouton de la fenêtre de paramétrage qui présente la roue crantée, vous changez la couleur de celle-ci, modifiant ainsi la sous routine appelée.
La routine principale contient ensuite un bloc de remise à zéro des 3 led, un bloc d’attente d’une seconde afin de pouvoir temporiser un peu le programme et mieux comprendre le fonctionnement de celui-ci (ce bloc conduit à un comportement saccadé du robot et vous pouvez le supprimer afin de supprimer ce fonctionnement saccadé).
Tout le programme vu jusqu’ici est inséré dans une boucle sans fin afin de répéter le comportement global (une boucle sans fin est très courante en robotique).
Après la boucle sans fin se trouvent deux blocs qui ne sont jamais exécutés si la boucle est effectivement sans fin. Ces blocs ne sont utilisés que si vous paramétrez un nombre de tour de boucle défini, ce qui peut être utile lors d’un débogage du programme. Ces deux blocs indiquent alors la fin du programme et stoppent le robot.
La sous-routine de test de l’environnement du robot S2
Il s’agit de la sous-routine orange dans notre programme. Elle commence par un bloc de test qui utilise le test du pile ou face.
Il s’agit d’un test aléatoire qui active le programme se trouvant dessous ou à côté avec une certaine probabilité (1/2 dans notre cas). Cela répond à la nécessité d’obtenir un comportement qui ne soit pas toujours le même de la part du robot lorsqu’il rencontre un obstacle.
Le code qui se trouve dessous fait tourner le robot d’un quart de tour vers la gauche et renseigne des variables (les drapeaux) s’il trouve ensuite des obstacles devant lui ou bien qui sort de la sous-routine orange s’il ne trouve rien. Le fait de sortir de la sous-routine orange va faire retourner le programme à l’endroit de la sous-routine principale où il était et va donc faire avancer le robot tout droit.
Le code qui se trouve à droite effectue le même traitement mais fait tourner le robot d’un quart de tour vers la droite et non pas vers la gauche.
L’utilisation des drapeaux avec le logiciel de programmation du S2
Le Scribbler Program Maker propose une gestion de variables très simple et qui sont uniquement de type oui/non (on parle de variables booléennes). Ces variables sont matérialisées par des drapeaux de couleurs qui sont levés ou baissés. Il y a 7 variables au maximum.
Pour lever ou baisser un drapeau, il faut utiliser le bouton suivant :
La fenêtre de paramétrage qui est ouverte lorsque l’on dépose le bloc Drapeau sur la feuille de travail est la suivante :
Le bouton de gauche présentant le drapeau vous permet d’indiquer quel drapeau vous souhaitez lever ou baisser. Une fois un drapeau levé ou baissé, vous pouvez tester son état plus loin dans votre programme à l’aide d’un bloc de test.
Dans notre programme, la sous-routine Orange réalise les opérations suivantes :
- D’une manière aléatoire, avec une probabilité d’un demi, l’une des deux propositions suivantes est exécutée :
- Le robot tourne d’un quart de tour vers la gauche et teste s’il trouve des obstacles. Si oui, un drapeau vert est levé si l’obstacle se situe à sa gauche et un drapeau jaune est levé si l’obstacle est situé à sa droite (nous aurions pu n’utiliser qu’un seul drapeau ici pour simplifier le programme mais nous avons laissé deux drapeaux pour ceux qui souhaitent créer un programme encore plus précis). Si aucun obstacle n’est trouvé, alors il n’est pas besoin d’aller plus loin dans la sous-routine et un bloc de sortie anticipée de la sous-routine est exécuté.
- Le robot tourne d’un quart de tour vers la droite et test s’il trouve des obstacles. Si oui, un drapeau rose est levé si l’obstacle se situe à sa gauche et un drapeau violet est levé si l’obstacle est situé à sa droite. Si aucun obstacle n’est trouvé, alors il n’est pas besoin d’aller plus loin dans la sous-routine et un bloc de sortie anticipée de la sous-routine est exécuté.
- On teste la couleur des drapeaux. En fonction de la couleur trouvée, le robot effectue un demi-tour vers la droite ou vers la gauche afin d’explorer une nouvelle zone. Si des obstacles sont trouvés, alors, le robot appelle l’une des sous-routines d’évitement. Si aucun obstacle n’est détecté, le programme sort de la sous-routine et retourne à la routine principale.
Les sous-routines d’évitement
Dans ces sous-routines, le programme met en œuvre un comportement d’évitement de l’obstacle. Les sous-routines violette et bleu clair sont identiques à la différence que le robot ne tourne pas dans le même sens, nous ne décrirons donc que la sous-routine violette.
Sous-routine violette : contournement d’un obstacle par la gauche
Dans cette sous-routine, nous utilisons une boucle sans fin. A chaque tour de boucle, le robot teste s’il voit toujours un obstacle sur sa droite. Si c’est le cas, il tourne sur lui-même vers la gauche et recommence. Si ce n’est pas le cas, il sort de la boucle par un bloc de fin anticipée de boucle.
Ce bloc, présenté par l’image ci-dessus est le bloc intitulé « Insère une interruption de boucle ».
Sous-routine rose de sortie d’un cul de sac
Cette sous-routine est appelée lorsque le robot a trouvé des obstacles tout autour de lui. Dans ce cas, il recule pendant 2,5 secondes puis tourne vers la droite ou vers la gauche de manière aléatoire en utilisant le test du pile ou face que nous avons déjà vu.
Conclusion
Dans cet article nous avons créé un comportement d’exploration aléatoire et d’évitement d’obstacle. Le programme proposé avait pour objectif majeur d’utiliser un maximum de nouveaux blocs de comportement. Nous avons vu en particulier :
- Le bloc de création de sous-routine
- Le bloc d’appel de sous-routine
- Le bloc d’attente
- Le bloc de test aléatoire
- La gestion des drapeaux
- Le bloc de sortie anticipée de sous-routine
- Le bloc de sortie anticipée de boucle
Ce programme nous a permis d’aller un peu plus loin dans la découverte du Scribbler Program Maker. Ce logiciel est simple d’utilisation et particulièrement adapté aux élèves de niveau collège par exemple. Il ne nécessite aucune compétence particulière en programmation et est volontairement limitatif sur certains aspects comme les variables par exemples. Ce logiciel constitue une porte d’entrée intéressante dans la robotique pour les plus jeunes et les débutants.
Génération Robots (http://www.generationRobots.com)
Tout usage et reproduction soumis à autorisation explicite préalable.