5.1 MODE RÉEL ET MODE SIMULATION

 

 

INTRODUCTION

 

On considère généralement comme un robot toute machine contrôlée par ordinateur capable de réaliser une activité d’ordinaire réservée à l’être humain. Si la machine est également capable de percevoir son environnement à l’aide de caméras et de capteurs et si elle peut y réagir de manière appropriée par ses actuateurs (moteurs, synthèse vocale, leds, …), on parle de système intelligent. Si le comportement d’un tel système imite l’humain, on parle de robot androïde

Un exemple typique d’un tel système est le robot du film WALL-E, doué de sa propre conscience, à tel point qu’il recherche des pièces de rechange pour lui-même et qu’il se passionne pour des objets qu’il collectionne. Il est également capable de résoudre un Rubik's cube, ce qui est sans conteste généralement perçu comme un signe d’intelligence.  

L’intelligence artificielle (IA), en anglais Artificial Intelligence (AI), traite de la question fondamentale consistant à décrire de manière précise ce qui caractérise un système intelligent. Pour répondre à cette question, il est nécessaire de définir au préalable ce que l’on entend par machine « intelligente ». Une approche possible à cette problématique reside dans le test de Turing.

Dans ce chapitre, nous nous pencherons sur des questions plus terre-à-terre et verrons comment gérer un robot équipé de capteurs tactile, photosensible, infrarouge et ultrasonique ainsi que de roues actionnées par deux moteurs électriques capables de faire avancer, reculer et même tourner le robot.

Les moteurs et les capteurs sont contrôlés par l’ordinateur de bord, raison pour laquelle un robot est parfois qualifié de système embarqué. S’il s’agit d’une simple puce électronique, on parle de microprocesseur ou microcontrôleur. De nos jours, les systèmes embarqués jouent un rôle très important et la plupart des appareils électroniques courants comme les smartphones en sont dotés. Il faut savoir que la plupart des machines à café, lave-linges, lave-vaisselles, télévisions, appareils photo et autres appareils électroniques sont des systèmes embarqués. Les voitures modernes sont équipées en moyenne d’une centaine de microcontrôleurs différents jouant le rôle de systèmes embarqués permettant de contrôleur le moteur, les gaz, le système ABS et autres. Sachez donc qu’en apprenant à comprendre le fonctionnement des robots, vous apprendrez les principes généraux qui régissent tous ces systèmes embarqués dont vous dépendez quotidiennement.

Si le processeur embarqué exécute un programme qui se suffit à lui-même, on parle d’un robot autonome. Le processeur embarqué, au lieu de contrôler lui-même le robot, peut également envoyer les valeurs lues sur les capteurs par une liaison de données quelconque vers un ordinateur externe qui se chargera alors d’effectuer le traitement et de lui renvoyer des instructions à exécuter en fonction des valeurs lues. On parle alors d’un robot contrôlé à distance. Finalement, un robot peut également être simulé, ce qui signifie qu’en lieu et place de capteurs et moteurs matériels, on utilise des composants logiciels. Dans cette perspective, on fait correspondre à l’assemblage de composants physiques du monde réel un assemblage d’objets et de classes dans le monde simulé. En pratique, on commence généralement par simuler les robots sur ordinateur pour faciliter leur programmation et l’étude de leur comportement, ce qui permet d’éviter tout risque matériel ou environnemental.

Avec le fameux kit éducatif de robotique LEGO Mindstorms, il est possible d’étudier les aspects importants de la robotique en s’amusant. Le kit est constitué d’une brique intelligente contenant le microcontrôleur et plusieurs composants permettant l’élaboration de différents modèles de robots. Ce kit a subi plusieurs révisions : le premier de la série était le RCX, suivi par le NXT et, plus récemment, par le EV3.

La brique EV3 est un système embarqué constitué de moteurs et de capteurs pilotés par un processeur ARM semblable à ceux qui se trouvent dans les smartphones. Voici les composants électroniques observables si l’on ouvre la brique intelligente.


 
Port micro USB pour la connexion au PC
4 ports pour les moteurs
Port USB (pour un dongle Wifi par exemple)
Haut-parleur
Slot pour carte SD pour le système d’exploitation
Processeur 32 bit ARM9
Texas Instrument AM1808
avec 64 MB de RAM et
16 MB de mémoire flash
4 ports pour les capteurs
       

Une fois la brique allumée, le micrologiciel (firmware) va démarrer sur le microcontrôleur (il s’agit d’un OS Linux complet sur le EV3) faisant apparaître un menu très simple sur l’écran. Cela permet déjà d’exécuter des programmes stockés dans la mémoire de la brique en mode autonome. Pour permettre un contrôle à distance, il faut, dans le cas du EV3, lancer un programme annexe, BrickGate, chargé d’interpréter les commandes reçues par Bluetooth demandant par exemple de tourner un moteur d’un certain angle ou de lire les valeurs mesurées par l’un des capteurs. Sur le NXT, ce programme est déjà inclus dans le firmware.

Comme toujours en développement de systèmes embarqués, il faut un ordinateur externe pour développer les programmes. Ceux-ci sont téléchargés sur la brique en mode autonome et exécutés directement sur le PC en mode de contrôle à distance.

Mode autonome

  Mode de contrôle à distance

1. Éditer le programme

 

 

2. Télécharger le programme sur le EV3 et terminer la connexion
3. Exécuter le programme sur le EV3

1. Éditer le programme

 

 

2. Exécuter le programme sur le PC. Celui-ci communique avec le EV3

 

  CONCEPTS DE PROGRAMMATION:
Robots, robots androïdes, intelligence artificielle, systèmes embarqués, microprocesseurs, microcontrôleurs, méthodes bloquantes / non bloquantes

 

 

PRÉPARATIFS

 

Avec TigerJython, il est possible de simuler le robot (mode simulation) ou d’utiliser le mode autonome ou de contrôle à distance (mode réel). On passe d’un mode à l’autre en utilisant différentes bibliothèques de classes Python qui présentent cependant toutes exactement la même interface de programmation (API = Application Programming Interface) de sorte que les programmes seront pratiquement identiques quel que soit le mode d’exécution utilisé. Les seuls ajustement à apporter résident dans la ligne d’importation de modules et éventuellement dans certaines valeurs temporelles utilisées dans le programme.

Mode simulation :
Si vous ne disposez pas d’un kit NXT ou EV3, les activités de ce chapitre sont néanmoins réalisables en mode simulation. Les images nécessaires pour le mode simulation sont déjà incluses dans la distribution de TigerJython.

Mode réel :
La plupart des exemples utiliseront le modèle de robot de base fourni avec le kit LEGO Mindstorms NXT ou EV3 qui est une plateforme à deux roues sur laquelle on peut disposer divers capteurs. Il est également possible d'utiliser un robot personnalisé, pourvu qu'il se déplace de manière identique. Du fait que le robot communique avec le PC par une liaison Bluetooth, il faut disposer d’un PC équipé d’un contrôleur Bluetooth activé. De plus, il est nécessaire de jumeler la brique intelligente au PC.  

Avec la brique LEGO NXT:
Il est possible d’utiliser le firmware original du robot NXT ou le firmware alternatif LeJOS. Normalement, le nom du périphérique Bluetooth associé à la brique est « NXT ».

Pour jumeler la brique au PC, on procède exactement de la même manière que pour tout périphérique Bluetooth tel que smartphone, casque d’écoute ou imprimante Bluetooth.

Comme il n’est pas possible d’exécuter l’interpréteur Python directement sur le microcontrôleur du NXT en raison de ses ressources trop limitées, il faut obligatoirement utiliser le mode de contrôle à distance pour piloter le NXT à l’aide de Python. Pour ce faire, on développe un programme comme d’habitude dans TigerJython en important le module ch.aplu.nxt et en l’exécutant à l’aide du bouton vert « Exécuter ». Une boîte de dialogue demande alors le nom Bluetooth de la brique à laquelle la connexion doit être établie. Une fenêtre affichant les informations de connexion reste ouverte durant toute l’exécution du programme. La fermeture de cette fenêtre cause l’interruption de la communication entre le PC et la brique NXT.

 

Si la salle contient plusieurs briques NXT, il est indispensable de leur attribuer des noms uniques tels que NXT1, NXT2, etc … Un outil permettant de changer le nom des briques est disponible ici. Il est également possible d’utiliser l’identifiant unique Bluetooth du périphérique au lieu d’utiliser son nom. L’identifiant est indiqué dans la fenêtre de connexion montrée ci-dessus et peut également se découvrir avec divers outils à disposition sur le Web. La bibliothèque BlueCove est nécessaire pour assurer la communication Bluetooth. Pour l’installer, il faut télécharger l’archive compressée disponible ici et la décompresser dans le sous-dossier Lib du dossier dans lequel l’archive tigerjython2.jar est située.

Avec la brique LEGO EV3:
La brique EV3 est nettement plus puissante que le NXT et exécute un système d’exploitation Linux conjointement avec LeJOS depuis la carte SD. Vous trouverez un guide détaillé pour créer la carte SD appropriée ici. En retirant la carte SD, il est possible d’utiliser le EV3 dans son état original. Si le EV3 est démarré en utilisant LeJOS, la communication s’opère par une liaison Bluetooth PAN. Pour ce faire, il faut appairer la brique au PC et la définir comme un point d’accès réseau. Vous trouverez des instructions détaillées ici.

Une fois la brique démarrée avec LeJOS et correctement connectée par un réseau PAN Bluetooth, il faut y démarrer le serveur BrickGate qui se trouve dans le menu « programs ».
Comme la brique EV3 est assez puissante pour faire tourner l’interpréteur Python, il est possible de l’utiliser en mode autonome avec des programmes Python, contrairement au NXT. Pour ce faire, il faut se rendre dans les préférences de TigerJython, dans le panneau Librairie, et cocher les deux options montrées dans les illustrations ci-dessous, à savoir « Sélection du robot = EV3 » et « Exécuter après téléchargement ». Ceci va faire apparaître un nouveau bouton « Télécharger vers EV3 » dans la barre d’outils de TigerJython.


Pour exécuter le programme en contrôle à distance, il faut cliquer sur le bouton vert comme pour le NXT et entrer les informations de connexion à la brique par Bluetooth. Pour exécuter le programme en mode autonome directement sur la brique, il faut cliquer sur le bouton « Télécharger vers EV3 ». Le script Python est alors téléchargé sur le EV3 et exécuté de manière autonome par l’interpréteur Python installé sur la brique. Le nom du script apparaît également sur l’écran du EV3 et peut être relancé à tout moment, sans nécessité de connexion avec le PC, en appuyant sur le bouton « Enter » de la brique.

Les programmes exemples montrés dans ce chapitre supposent l’utilisation d’une brique EV3 et des nouveaux capteurs et moteurs de la série EV3. Le capteur de couleur EV3 joue également le rôle de capteur photosensible. Les anciens moteurs et capteurs NXT sont cependant encore supportés par la brique EV3. Il faut juste préfixer tous les noms de classes par « Nxt », à savoir NxtMotor, NxtGear NxtTouchSensor, etc.

 

 

AVANCER ET RECULER EN LIGNE DROITE, TOURNER

 

Dans votre premier programme, le robot devra avancer pendant une durée définie codée en dur dans le programme. La bibliothèque permettant de contrôler le robot est orientée objets et représente la réalité par un modèle. Ainsi, alors que dans la réalité on utilise la brique intelligente LEGO pour construire le robot, on crée une instance de la classe LegoRobot() du point de vue logiciel avec la ligne robot = LegoRobot(). Ensuite, on va prendre deux moteurs et les coupler à des roues dans la réalité alors que dans le monde logiciel, on instancie la classe Gear pour modéliser l’essieu de deux roues avec gear = Gear(). Ensuite, on connecte les moteurs à la brique avec des fils électriques dans le monde réel alors que, dans le monde logiciel, on « connecte » le couple des roues au robot avec l’appel addPart().

La commande gear.forward() va faire tourner le couple des deux moteurs avec le même vitesse angulaire ce qui va faire avancer le robot en ligne droite. Cet état de mouvement va rester identique jusqu’à ce que le robot reçoive un ordre différent.  Cependant, l’appel de fonction retourne immédiatement et le programme se poursuit avec l’exécution de la prochaine instruction. On appelle ceci une méthode non bloquante. De ce fait, il faut s’assurer que le robot fasse quelque chose d’autre que d’avancer après un certain laps de temps en invoquant la méthode Tools.delay() qui permet ou d’arrêter le mouvement ou de le modifier en envoyant une autre commande.  

Dès qu’une nouvelle commande est envoyée au robot, l’état d’exécution actuel est terminé et remplacé par un nouvel état. Lorsque l'on travaille en mode de contrôle à distance, il faut toujours appeler la méthode exit() en fin de programme car elle est responsable de couper tous les moteurs et d’interrompre la connexion Bluetooth afin que le prochain programme puisse s’exécuter sans encombre. De ce fait, si le programme s’interrompt de manière brutale suite à une erreur d’exécution, il n’aura pas le temps d’appeler la méthode exit() et il sera nécessaire d’éteindre et de redémarrer la brique.

from simrobot import *
#from nxtrobot import *
#from ev3robot import *
  
robot = LegoRobot()
gear = Gear()
robot.addPart(gear)

gear.forward()
Tools.delay(2000)
gear.left()
Tools.delay(545)
gear.forward();
Tools.delay(2000)
robot.exit()
Sélectionner le code (Ctrl+C pour copier, Ctrl+V pour coller)

 

 

 

MEMENTO

 

Un essieu est constitué de deux moteurs synchronisés. Au lieu de les contrôler individuellement, il est possible d’utiliser certaines commandes qui les contrôlent en tant que paire solidaire.

Les bibliothèques de classes gérant le mode simulé et réel sont conçues de telle manière que les programmes soient pratiquement identiques dans les différents cas, à la ligne d’importation près. Ainsi, il est possible de commencer par développer le programme en mode simulation pour mettre en place et tester son comportement et, avec quelques adaptations mineures, l’exécuter ensuite en mode réel sur le robot physique. La brique EV3 peut se programme en mode autonome ou en contrôle à distance mais dans les deux cas, le serveur BrickGate doit être démarré sur le EV3 car c’est lui qui reçoit et interprète les commandes transmises par le programme Python. Du fait que les erreurs ne sont pas signalées en mode autonome, il faut toujours commencer par contrôler la brique à distance en exécutant le programme sur le PC (bouton vert) avant de passer au mode autonome et exécuter le programme Python directement sur le EV3 (bouton EV3).

 

 

FAIRE BOUGER LE ROBOT AVEC DES MÉTHODES BLOQUANTES

 

Au lieu de faire avancer le robot en ligne droite avec la commande forward() et de dire ensuite au programme de se mettre en pause pendant 2000 ms avec delay(2000), il est également possible d’utiliser la méthode bloquante forward(2000) qui fait également avancer le robot en ligne droite mais en ne retournant qu’après 2000 ms. Il existe également des variantes bloquantes pour les commandes left() et right().

Les méthodes bloquantes permettent ainsi de simplifier légèrement le précédent programme.
from simrobot import *
#from nxtrobot import *
#from ev3robot import *
  
robot = LegoRobot()
gear = Gear()
robot.addPart(gear)
gear.forward(2000)
gear.left(545)
gear.forward(2000)
robot.exit()
Sélectionner le code (Ctrl+C pour copier, Ctrl+V pour coller)

 

 

MEMENTO

 

Il faut faire la distinction entre les méthodes bloquantes et les méthodes non bloquantes. Les méthodes non bloquantes ne font que de changer l’état d’exécution du robot en retournant immédiatement à l’appelant. Autre contraire, dans le cas d’un appel bloquant, l’exécution du programme est suspendue pendant l’intervalle de temps spécifié, jusqu’à ce que l’appel bloquant soit complètement terminé et que le temps indiqué soit écoulé.

À première vue, il peut paraître plus facile d’utiliser systématiquement de méthodes bloquantes mais il faut savoir qu’elles comportent un inconvénient majeur. Pendant que le programme est bloqué en attendant la fin de l’exécution de la fonction bloquante, il lui est impossible de faire autre chose d’utile comme lire les valeurs d’un capteur !

Si le programme se plante durant l’exécution, il est possible de l’interrompre en fermant la fenêtre de connexion à la brique présente dans TigerJython sur le PC. En cas d’urgence durant une exécution en mode autonome, on peut interrompre le programme en appuyant simultanément sur les boutons BAS+ENTER du EV3.

 

 

EXERCICES

 

1.

Développer un programme demandant au robot de se déplacer sur un carré en utilisant des méthodes bloquantes.

 

2.

Écrire un programme utilisant de méthodes non bloquantes faisant en sorte que le robot se déplace sur des demi-cercles successifs.

 

 
3.

Fabriquer un parcours avec quelques objets à portée de main et écrire un programme permettant au robot de se déplacer dans le parcours de puis le départ jusqu’à l’arrivée.

Pour travailler en mode simulation, on peut utiliser l’image de fond bg.gif située dans le dossier sprites et l’afficher avec RobotContext.useBackground().

L’appel RobotContext.setStartPosition() permet alors de disposer le robot à une certaine position de départ au début du programme. Les coordonnées de la fenêtre s’étendent entre 0 et 500 dans les deux directions, l’origine se trouvant au coin supérieur gauche.

 
RobotContext.setStartPosition(200, 455)
RobotContext.useBackground("sprites/bg.gif")

Vous pouvez également créer votre propre image de parcours qui doit avoir une taille de 501x501 pixels.

 

 

   

MATÉRIEL BONNUS


 

CONTRÔLE À DISTANCE PAR INFRAROUGE

 

Le EV3 est livré avec un capteur infrarouge assez polyvalent présentant de nombreux usages. Ce capteur est déjà livré dans le kit EV3 grand public mais doit être acheté séparément pour les kits éducatifs. Le tableau synoptique suivant montre les trois usages possibles du capteur IR (Infra Rouge).

Class Grandeurs mesurées
IRSeekSensor Distance et direction à la source IR de la télécommande
IRRemoteSensor Boutons pressés de la télécommande
IRDistanceSensor Distance à une cible réfléchissant les rayons IR

 

L’utilisation de la télécommande peut être amusante et motivante pour une première prise en main du robot. A contrario d’un programme de contrôle à distance prédéterminé, il est possible de définir, par simple programmation Python, les actions qui seront conduites par le robot en réponse aux différents boutons de la télécommande.

 

 


Dans le programme suivant, on décide d’utiliser de la manière suivante les différentes commandes possibles de la télécommande:

Boutons de la télécommande Action entreprise par le robot
Haut-Gauche Se déplacer sur un arc de cercle vers la gauche
Haut-Droite Se déplacer sur un arc de cercle vers la droite
Left-Down+Right-Up moves straight forward
Bas-Gauche Arrête le robot
Bas-Droite Termine le programme

 

from ev3robot import *

robot = LegoRobot()
gear = Gear()
robot.addPart(gear)
irs = IRRemoteSensor(SensorPort.S1)
robot.addPart(irs)
isRunning = True

while not robot.isEscapeHit() and isRunning:
    command = irs.getCommand()    
    if command == 1:
        gear.leftArc(0.2)
    if command == 3:
        gear.rightArc(0.2)
    if command == 5:
        gear.forward()
    if command == 2:
        gear.stop()
    if command == 4:
        isRunning = False       
robot.exit()
Sélectionner le code (Ctrl+C pour copier, Ctrl+V pour coller)

 

 

MEMENTO

 

Les méthodes isEscapeHit(), isEnterHit(), isDownHit(), isUpHit(), isLeftHit(), isRightHit() retournent True si les boutons correspondants de la brique EV3 sont actionnés en mode autonome.

En mode contrôle à distance, ces fonctions sont par contre liées aux touches suivantes du clavier : ESCAPE, ENTER, BAS, HAUT, GAUCHE, DROITE à condition que la fenêtre de connexion à la brique soit active et possède le focus (il faut donc cliquer dessus pour que cela fonctionne).