INTRODUCTION |
|
Robot auto-apprenant en mode autonome ou contrôlé à distance, mode apprentissage, mode exécution, boucle d’événements. |
LE ROBOT CONNAÎT LE CHEMIN |
|
MEMENTO |
Il faut déterminer expérimentalement les bonnes valeurs pour moveTime et turnTime en réalisant plusieurs expériences successives et en ajustant les valeurs de manière appropriée. Il est clair que ces valeurs dépendent de la vitesse du robot. En situation réelle, on préfèrera spécifier le trajet à parcourir et les angles de rotation des roues plutôt que des durées pour les mouvements. |
ROBOT CONTRÔLÉ PAR UN HUMAIN |
Dans le programme suivant, le robot connaît la longueur constante des éléments du canal mais ses mouvements de rotation sont contrôlés par un humain. Il n’est pas encore capable d’effectuer un apprentissage pour se souvenir du chemin emprunté. Il demeure donc pour le moment « stupide ». Afin de contrôler le robot en mode simulation ou en mode de contrôle à distance, il faut utiliser les touches directionnelles gauche et droite du clavier. Pour faire de même en mode autonome, il faudra utiliser les boutons gauche et droite de la brique EV3. Les méthodes isLeftHit() et isRightHit() permettent de déterminer si les touches directionnelles ou les boutons de la brique ont été pressés et relâchés. Pour terminer le programme, il faut utiliser la touche Escape du clavier.
|
MEMENTO |
Dans ce cas, il est moins intéressant d’utiliser le robot en mode autonome puisque l’on veut pouvoir le contrôler à distance à l’aide des touches du clavier. Il est également possible d’utiliser le capteur infrarouge et la télécommande au lieu du clavier pour contrôler le robot dans les virages (cf. le matériel supplémentaire disponible à la fin de cette section). |
MODE APPRENTISSAGE |
Des systèmes assistés par ordinateur dont le comportement n’est pas codé en dur dans le programme mais qui sont capables d’adapter leur comportement à leur environnement sont appelés systèmes adaptatifs. Ils sont donc plus ou moins capables d’effectuer des apprentissages. Les robots industriels sont « entrainés » par des spécialistes de la tâche à accomplir en « mode apprentissage ». Cela consiste par exemple à enseigner au robot les mouvements précis qu’il doit effectuer avec son bras robotisé. Dans la plupart des cas, l’opérateur du robot utilise un système d’entrée similaire à une télécommande. Le robot est ainsi déplacé successivement à la position désirée qui est immédiatement enregistrée. En mode exécution, le robot parcourt les états mémorisés de manière indépendante en adoptant toutefois une vitesse bien supérieure.
|
MEMENTO |
La lecture de l’état courant et sa traduction en une action sont effectuées dans une boucle while infinie au sein du programme principal et non dans les fonctions de rappel. En informatique, on appelle ce genre de boucles infinies une boucle d’événements. Les fonctions de rappel ne servent qu’à changer l’état du robot (state switch). Cette technique de programmation permet d’obtenir une synchronisation chronologique très claire entre les tâches de longue durée et les appels des fonctions de rappel en réponse aux événements qui peuvent survenir d’une seconde à l’autre. On utilise une liste pour mémoriser la succession des états appris en mode apprentissage en y stockant les nombres 0 ou 1 selon que le canal tourne à gauche ou à droite. |
ROBOT CAPABLE D’APPRENTISSAGE NON SUPERVISÉ |
Dans certaines situations, le robot doit être capable de s’adapter à son environnement et d’effectuer des apprentissages sans être supervisé par un opérateur humain. Le robot pourrait par exemple se trouver hors de portée de tout moyen de communication sur la planète Mars. Pour retrouver son chemin, le robot doit pouvoir percevoir son environnement grâce à ses capteurs intégrés et réagir de manière appropriée. Les humains perçoivent essentiellement l’environnement par la vue. Il est facile pour les robots de capturer des images de leur environnement mais il leur est très difficile d’analyser et d’interpréter ces images [plus... La reconnaissance d’images appartient au domaine de la reconnaissance de formes (Pattern recognition en anglais)].Pour s’orienter dans la canalisation, notre robot n’utilisera qu’un capteur tactile qui déclenchera un événement lorsqu’il sera pressé. On suppose que les canalisations sont composées de segments rectilignes de longueur identique. Lorsque le robot détecte une pression sur le capteur tactile après avoir parcouru toute la longueur d’un segment, il sait qu’il se trouve face à un mur et qu’il doit tourner à gauche ou à droite. Il va donc reculer un peu pour se dégager du mur qui lui fait face et tente d’effectuer un virage à gauche. Si, presque immédiatement, il détecte à nouveau une interaction avec le capteur tactile, il sait qu’il a pris la mauvaise décision en tournant à gauche. Il va donc à nouveau reculer un petit peu et faire un demi-tour afin de partir vers la droite. Le robot va mémoriser le sens du virage à cet endroit du parcours de sorte qu’il pourra ensuite refaire le parcours sans se tromper dans les virages et en évitant, en théorie du moins, tous les murs. Le programme suivant fait en sorte que le robot traverse le parcours en mode d’apprentissage non supervisé. Pour passer de la phase d’apprentissage au mode d’exécution, il faut presser la touche ENTER du clavier ou le bouton ENTER de la brique EV3.
|
MEMENTO |
Le capteur tactile est connecté au port S3, ce qui est interprété en mode simulation comme un positionnement du capteur en position centrale sur l’avant du robot. Le capteur signale les événements tactiles par l’intermédiaire de la fonction de rappel onPressed() qui est enregistrée avec le paramètre pressed du constructeur TouchSensor() . Le capteur tactile est un composant standard qui est rajouté au robot avec addPart(). Pour déterminersi le robot a foncé dans une paroi en ligne droite ou, au contraire, après avoir fait une tentative infructueuse en tournant à gauche, on peut se baser sur le temps écoulé depuis le dernier événement généré par le capteur tactile. On utilise pour cela la fonction clock() du module time intégré à Python. Si ce temps est supérieur à deux secondes, c’est que le robot a simplement foncé dans le mur en ligne droite alors que, dans le cas contraire, il a fait une tentative de virage infructueuse et s’est retrouvé coincé. Du fait que le robot tourne toujours à gauche dans un premier temps en stockant un 0 dans sa mémoire, il doit remplacer ce 0 par un 1 s’il se retrouve bloqué suite à un faux virage. |
UN ENVIRONNEMENT PLUS COMPLEXE |
Vous avez probablement compris que le robot pourrait facilement déterminer par lui-même de combien il doit avancer en ligne droite sur chaque segment avant de tourner puisqu’il peut mesurer le temps qui s’écoule jusqu’à ce qu’il fonce dans un mur. De cette manière, le robot pourrait apprendre à se mouvoir dans un dédale de canalisation dont les segments sont de longueur variable. Cela nécessite cependant de mémoriser non seulement s’il doit tourner à gauche ou à droite, mais encore le temps de parcours de chacun des segments droits. Le plus simple est de stocker, pour chaque segment, ces deux informations dans une liste à deux éléments node = [moveTime, k], où moveTime est le temps de parcours (en ms), k = 0 correspond à un virage à gauche et k = 1 à un virage à droite. On obtiendra bien ainsi le temps moveTime nécessaire pour parcourir le segment mais il ne faudra pas oublier de le corriger en déduisant le temps pendant lequel le robot a foncé dans la paroi de la canalisation. Une fois ce temps corrigé, il faut le stocker dans une variable globale réutilisable dans la situation où le robot s’est retrouvé bloqué suite à un faux virage.
|
MEMENTO |
À première vue, la structure de données représentant la mémoire du robot en tant que liste de nœuds peut paraître compliquée. Il faut cependant toujours stocker des valeurs intrinsèquement liées dans une structure de données commune. En l’occurrence, il est indispensable d’associer la durée de parcours du prochain segment de canalisation et le sens dans lequel tourner à la fin dans une structure de données commune regroupant les deux informations. Admirez la manière dont le robot est capable, avec un seul et même programme, de retrouver son chemin dans un canal complètement différent (par exemple bg3.gif). |
EXERCICES |
|
MATÉRIEL SUPPLÉMENTAIRE |
APPRENTISSAGE SUPERVISÉ À L’AIDE DE LA TÉLÉCOMMANDE IR |
(uniquement en mode autonome sur le EV3) Dans le dernier chapitre, vous avez déjà vu comment utiliser la télécommande IR pour commander le robot. Dans cette section, nous allons voir comment l’utiliser pour superviser l’apprentissage du robot. Le programme s’exécute en mode autonome directement sur le EV3, que ce soit en mode apprentissage ou en mode exécution. Cette approche imite de manière réaliste la manière dont les robots industriels sont entraînés par une commande à distance pour mémoriser les actions à entreprendre qui sont simplement rejouées par la suite en mode exécution. En mode apprentissage, l’opérateur utilise les deux boutons du haut de la télécommande pour faire tourner le robot à gauche ou à droite. Une pression sur le bouton inférieur gauche démarre le mode exécution. Une fois encore, il est élégant de travailler avec la notion d’états.
|