1 Equipe Pédagogique : Jerôme Cantaloube, Laurent
Transcription
1 Equipe Pédagogique : Jerôme Cantaloube, Laurent
Equipe Pédagogique : Jerôme Cantaloube, Laurent Bernard et Yann Bertrand. Elouen TRAVAUX 1 I – Présentation du Projet NXT Dans ce dossier, nous allons traiter de notre projet portant sur les Robots NXT «MINDSTORM». Ces robots ont été conçus en 2006 par l'entreprise LEGO, dans le but de toucher le milieu de l’éducation et de l’enseignement des sciences, du collège aux universités. Ces robots sont d'ailleurs le centre de nombreux concours. Le kit Lego Mindstorm NXT est actuellement en version 2.0. Ces robots sont composés d'une brique intelligente, permettant de relier des servomoteurs, ainsi que des capteurs. Il y a, dans le pack d'origine un capteur d'ultrasons, un capteur sonore, un capteur tactile, ainsi qu'un capteur de luminosité. Ces capteurs peuvent par exemple servir à faire intérragir le robot avec son environnement. Ce sont bien sûr les servomoteurs qui permettent au robot de se mouvoir. Ces robots sont vendus avec un logiciel de programmation simple, propre aux NXT, permettant à n'importe qui de pouvoir s'en servir sans avoir besoin de connaissances spécifiques. Il est également possible de programmer les robots NXT avec le logiciel PROCESSING, en installant des librairies extérieures, développées spécialement pour les NXT par des développeurs extérieurs. Avant de commencer notre travail, nous nous sommes renseignés sur ce qui existait déjà, et avons trouvé des choses très étonnantes. Par exemple un programme NXT ayant pour objectif de terminer le plus rapidement possible un «Rubik's Cube», seul et sans aide extérieure : des bras ont été conçus, et sont commandés par les servomoteurs. Il est bien évident que nous n'avions ni les connaissances nécessaires, ni le temps pour réaliser ce genre de programme, et surtout pour penser une utilisation réellement utile. Nous nous sommes donc simplement lancés dans des interfaces de contrôle à distance, via le dispositif Bluetooth : diriger un robot NXT via une interface, directement depuis un ordinateur. Nous allons maintenant nous intéresser à notre projet concernant les robots NXT. L'objectif premier de ce projet était de proposer des interfaces de contrôle différentes de celles qui existaient déjà, mais surtout de les programmer différemment, puisqu'il n'y a pas énormément d'interfaces programmées avec le logiciel Processing. L'enjeu de départ était que chacun propose une interface différente, dans le but de les rassembler par la suite dans un menu que nous imaginerions, programmerions nous-mêmes, toujours avec le même logiciel, Processing, dont nous nous servons depuis le début de l'année en cours d'ISN. Nous avons donc tout mis en œuvre pour atteindre notre objectif, et avons réalisé des interfaces personnelles tout en gardant une collaboration importante. Elouen TRAVAUX 2 II – Analyse du besoin Le domaine de la robotique est aujourd'hui un milieu en plein essor, pouvant servir dans de nombreux domaines tels que la médecine, l'exploration spatiale, la domestique, l'industrie ou encore les loisirs. L'objectif visé était clairement de proposer plusieurs interfaces, gérées dans un menu, pour permettre à l'utilisateur de se servir de l'interface qui lui correspond le mieux, pour contrôler son robot de la façon la plus simple possible, directement depuis son ordinateur, via une connexion Bluetooth et le logiciel Processing. Le choix de la technologie Bluetooth nous est apparue évidente car elle répondait aux besoins (communication sans fil de courte de distance). De plus, le robot Nxt est équipé de série de la technologie de communication Bluetooth. Nous avons constaté que beaucoup d'applications sous Androïd éxistaient, mais le pilotage depuis un ordinateur n'était pas aussi développé, c'est donc la raison pour laquelle nous avons décidé de développer une multi-interface, pour les non possesseurs de tablettes ou autres périphériques Androïd, leur permettant de piloter leur robot NXT de façon confortable et ludique, depuis leur ordinateur. III – Recherche d'idées Nous nous sommes d'abord lancés dans des interfaces, mais nous nous sommes rendus compte qu'elles avaient toutes des fonctions très proches et un fonctionnement similaire, et donc sans grand intérêt. Après concertation, nous nous sommes donc lancés dans 3 nouvelles interfaces dans l'objectif de les rassembler ensuite dans notre menu. Pour ce faire, nous avons pris du temps pour nous renseigner sur ce dont nous aurons besoin pour réaliser notre travail, en utilisant bien évidemment les outils Numériques, avec Internet, mais aussi en s'appuyant sur les notices d'utilisation du robot. Après ces recherches, nous avons opté pour les librairies NXT Com développées par Jorge Cardoso. Nous avons donc utilisé le langage «Java» pour établir nos programmes de contrôle de nos robots NXT, ainsi que l'interface Bluetooth pour établir une connexion instantanée entre l'ordinateur et la brique NXT, à l'aide d'une clef Bluetooth extérieure (ou directement depuis une interface Bluetooth intégrée à un ordinateur). Ce dispositif nous a d'ailleurs malheureusement beaucoup pénalisé au niveau du temps, car le matériel ne fonctionnait pas du tout de façon régulière, et il nous est arrivé de ne pas avoir le temps de faire beaucoup de choses pendant une séance, car la connexion entre l'ordinateur et le robot ne se faisait pas. Nous avons donc eu des séances où nous avons été contraints de travailler «à l'aveugle», sans pouvoir tester nos programmes en conditions réelles. Elouen TRAVAUX 3 IV – Répartition des tâches Marco TURENNE Interface «Déplacement Vitesse Variable Lecture de la valeur de la boussole et action à faire en fonction de l’angle donné par le programme d’Elouen TRAVAUX Sullivan VILLA Interface « mode parcours » Elouen TRAVAUX Interface «Souris, clavier» Partie «Calcul de l’angle» du mode boussole. Nous nous sommes ainsi répartis les tâches de façon à ce que nous puissions collaborer le plus possible, mais en réalisant chacun sa part de travail, et ainsi pouvoir terminer le projet tel que nous le prévoyions au départ. Il y a également la création du menu, que nous avons décidé de faire tous ensemble, afin qu'il représente au mieux le groupe. Vous découvrirez ce menu dans quelques pages (page7), grâce à une capture d'écran. V - Réalisation Après nous être répartis les tâches dans le groupe, nous nous sommes chacun lancé dans une interface différente de contrôle d'un robot NXT, dans l'idée de toutes les rassembler ensuite dans un menu que nous établirons. Pour ma part, l'objectif était de penser et de réaliser une interface de contrôle du robot, qui rassemble la souris d'un ordinateur mais aussi son clavier. En effet, la première interface que j'ai réalisé fait fonctionner le robot dans les conditions suivantes : La souris doit être positionnée dans un des cadres à l'écran (avancer, reculer, droite, gauche) et une touche du clavier doit être activée, afin d'éviter de faire fonctionner le robot lorsque l'on n'est pas à côté de l'ordinateur mais que l'on a laissé la souris sur un des cadres. Dans cette interface, l'idée était de permettre à l'utilisateur de contrôler son robot de la façon la plus simple possible : j'ai donc mis au point une possibilité de contrôle qui comprend les fonctions : Elouen TRAVAUX 4 « Tourner à gauche/droite » : Cette fonction fait tourner les deux moteurs, mais un qui fonctionne 2,5 fois plus vite que l'autre, afin de permettre au robot de tourner, tout en avançant, et ainsi lui éviter de faire du sur-place. « Tourner Rapidement » : Cette fonction fait la même chose que la précédente, mais elle fait fonctionner l'un de moteurs 5 fois plus vite que l'autre, afin de permettre au robot de tourner beaucoup plus vite (exemple, si le robot doit faire un demi-tour, il sera plus rapide d'utiliser la fonction « Rapide » plutôt que la fonction normale. « Avancer/Reculer » : Cette fonction simple a été ajoutée à la suite, car si l'on voulait que le robot avance parfaitement droit, il fallait passer alternativement des cadres « Droite » et « Gauche », dans le même principe qu'un kayak, ce qui n'était pas pratique du tout. C'est pourquoi j'ai ajouté ces deux fonctions qui font tout simplement fonctionner les deux moteurs à la même vitesse, permettant au robot de rouler droit. L'intégralité de cette interface a donc été réalisée avec le logiciel Processing. Le contrôle du robot à distance nécessite un dispositif Bluetooth, qui nous a posé énormément de problèmes, puisque le matériel n'a quasiment jamais fonctionné correctement pendant les cours, alors qu'il marchait bien chez nous. La majeure partie de la réalisation graphique a donc été réalisée au lycée, et la partie matérielle a été effectuée à nos domiciles respectifs, afin d'éviter de perdre du temps avec du matériel qui ne fonctionnait pas toujours. Lorsque l'on passe la souris sur l'un des triangles, et qu'une touche du clavier est enclenchée, le triangle blanc devient bleu: à cet instant, le robot reçoit l'ordre de tourner à droite (voir photo cidessus). Pour la réalisation de ce programme, j'ai dessiné les triangles dans le void draw, et le passage au bleu lorsque la souris passe dessus se fait car, lorsque la souris passe entre tels et tels pixels (voir code source en annexe), et bien sûr qu'une touche du clavier est active, le programme redessine le même triangle par-dessus, de sorte que l'on voit que le triangle devient bleu. Il s'agit exactement du même principe pour les touches avancer et reculer. Pour ce qui est du contrôle du robot, il s'agit simplement de fonctions de base établies pour programmer via Processing, qui sont incluses dans des librairies extérieures à Processing, que nous avons téléchargé. La seule commande utilisée dans ce programme est la commande de faire marcher le moteur. En effet, il y a aussi la commande Stop, mais qui ne sert à rien ici puisque lorsque l'on relâche la touche du clavier, on ne se situe plus dans la boucle, et le programme s'arrête de lui-même. Lorsque nous avions chacun terminé notre première interface, nous avons remarqué qu'elles s’exécutaient quasiment toutes de la même manière, c'est-à-dire qu'il s'agissait simplement d'un « suivi » de la souris. Nous avons alors pensé à trois autres interfaces : une interface permettant à l'utilisateur de paramétrer et de gérer le parcours que devra faire son robot, une interface 5 Elouen TRAVAUX « autonome », qui détecte les obstacles et qui agit pour les éviter, ainsi qu'une interface munie d'une boussole. L'interface boussole est une interface qui se gère avec la souris. Sur l'écran s'affiche une rose des vents qui reste fixe, lorsque l'utilisateur passe la souris sur le Nord, le robot devra prendre en compte sa position initiale, tourner jusqu'à ce que l'avant du robot soit en direction du nord, et ensuite avancer vers le nord. Afin de pouvoir utiliser la boussole, il fallait d'abord faire un calcul d'angle entre la droite reliant la centre à la position Est, et la droite reliant le centre à la position de la souris. Ce calcul d'angle est réalisé sur Processing avec la fonction « arctan2 » qui donne un angle en radians, qu'on lui demande d'afficher en degrés afin de pouvoir renvoyer ces données au robot NXT, et ainsi pouvoir amorcer le début du mouvement. A la suite de cela, nous avons commencé à essayer de comprendre le fonctionnement du capteur boussole, et c'est ici que nous nous sommes rendus compte que la boussole ne renvoyait pas des signaux très compréhensibles pour nous. En effet, après avoir effectué des tests, Marco TURENNE s'est rendu compte que la boussole renvoyait des informations qui semblaient aléatoires (il est bien évident que ce n'est pas le cas, mais nous n'avons pas réussi à comprendre comment cette boussole fonctionnait). Nous avons donc décidé à ce moment-là de ne pas terminer cette interface. VI – Intégration et Validation L'objectif final de notre projet est de mettre en commun nos idées, les perfectionner si besoin est, mais surtout, d'établir un menu permettant de basculer d'une interface à une autre, sans difficulté. Pour la création de ce menu, nous avons encore utilisé le logiciel Processing, puis avons d'abord réalisé un travail graphique, pour intégrer des boutons permettant l'accès à nos différentes interfaces. Voici, à la page suivante, une capture d'écran qui montre l'avancée de notre menu reliant toutes nos interfaces (Déplacement Vitesse Variable, Classique, Parcours, Automatique). Ce menu n'est actuellement pas terminé, nous sommes, au moment de l'écriture de ce dossier en phase de finalisation de ce menu. Elouen TRAVAUX 6 VII – Bilan et conclusions Notre projet me paraît personnellement être un projet très intéressant, qui m'a beaucoup apporté, tant dans le domaine du travail en équipe que dans la réalisation du programme en lui-même, le sujet était un très bon sujet, très intéressant, avec un réel objectif, et c'était un réel plaisir de travailler dans ces conditions, bien qu'il y ait eu des hauts et des bas, notamment avec le matériel qui n'a pas toujours fonctionné, mais j'ai tout de même réellement apprécié travailler avec ce sujet, et j'ai le sentiment que nous formions une plutôt bonne équipe de travail avec mes camarades, Marco TURENNE ainsi que Sullivan VILLA. Pour ce qui est de la maquette d'interface finale, il y a un point sur lequel nous aurions pu travailler si nous avions eu plus de temps, car j'aime beaucoup le graphisme, et il se trouve que nos interfaces sont certes jolies, mais ne donnent pas forcément un résultat professionnel, graphiquement parlant. Avec un peu plus de temps, je pense que j'aurais aimé retoucher aux interfaces, et les rendre plus esthétiques, en plus du caractère fonctionnel de celles-ci. C'est donc un côté que nous aurions pu éventuellement améliorer dans la maquette finale, bien qu'elle soit tout de même assez jolie, et entièrement fonctionnelle, ce qui est bien sûr le plus important au final. Nous aurions aussi pu développer une interface se servant de la wifi. 7 Elouen TRAVAUX En tout cas, il est clair que ce projet m'a permis de commencer à vraiment travailler en équipe pour la première fois ce qui va beaucoup me servir dans mes futures études, car je suis candidat au BTS Audiovisuel, et ce sont des études qui privilégient énormément le travail en équipe, car nous serons amenés à travailler avec tous les corps de métiers que rassemblent le milieu de l'Audiovisuel (son, montage.. etc). En clair, et pour conclure, il est clair que ce projet d'ISN sur les robots NXT n'a fait que m'apporter des points positifs, que ce soit pour la suite de mes études, ou bien pour ma vie future, et j'espère travailler à nouveau en équipe le plus rapidement possible, afin de renouveler cette belle expérience, mais surtout cette belle ambiance de travail, avec une équipe qui a envie de travailler, parce que c'est un sujet qui nous a vraiment intéressés, et qui nous a permis de nous investir le plus possible. Et c'est cet investissement qui nous a motivés pour travailler, essayer de trouver des solutions aux problèmes que nous rencontrions, et surtout, le plus important, essayer de faire au mieux, avec les moyens que nous avions. Je tenais donc à remercier les autres membres de mon groupe qui ont contribué à ce que ce projet se passe au mieux, et je pense que l'on est tous d'accord pour dire que nous sommes satisfaits du résultat final, malgré les nombreux problèmes rencontrés tout au long du cycle de projet. VIII – Diffusion du Projet Mon projet est à retrouver sur la plateforme Github, qui permet le dépôt de fichiers importants sur un serveur web, nous permettant de retrouver des fichiers très facilement, sans avoir besoin de prendre avec soi une clef USB ou un disque dur lorsque l'on ne travaille pas chez soi. Mon profil GITHUB : www.github.com/Elouen Profil GITHUB de groupe : https://github.com/codelab-info/tratuvi CV HTML : http://data.codelab.info/workspace/elouts4/CV/CVFInal/CVFinalGillesHedesovetaj.html Pour protéger notre projet, et établir les droits correspondants, nous avons décidé d'utiliser une licence de diffusion «Créative Commons». Nous avons choisi la licence ci-dessus : Le sigle BY représente la signature personnelle de la personne ayant effectué le projet, et le sigle NC représente l'aspect non commercial du projet. C'est à dire que personne ne pourra tirer profit et gagner de l'argent grâce à ce projet : ni les créateurs, ni les personnes qui pour une raison quelconque ont accès au projet. Enfin, le projet appartient à quelqu'un et ne peux pas être usurpé, avec la licence BY. Elouen TRAVAUX 8 IX - Annexes CODES SOURCE : Mode Boutons et Clavier // Charger les librairies import processing.serial.*; import SpringGUI.*; import pt.citar.diablu.nxt.protocol.*; import pt.citar.diablu.processing.nxt.*; import pt.citar.diablu.nxt.brick.*; SpringGUI gui; LegoNXT nxt; void setup() { size(800, 800); //taille de la fenêtre background(0); //couloir noire frameRate(30); //vitesse d'exécution smooth(); } // Paramétrage de la connexion avec le NXT en Bluetooth println(Serial.list()); nxt = new LegoNXT(this, "COM4"); //COM4 du périphérique Bluetooth void draw() { fill(255, 255, 255); //Couleur blanche triangle(400, 400, 700, 400, 400, 100); //Triangle Droite-Haut triangle(400, 400, 700, 400, 400, 700); //Triangle Droite-Bas triangle(400, 400, 100, 400, 400, 100); //Triangle Gauche-Haut triangle(400, 400, 100, 400, 400, 700); //Tri Gauche Bas rect(325, 25, 150, 40); //Rectangle Avancer rect(325, 735, 150, 40); //Rectangle Reculer fill(0); //couleur noire //Positionnement des textes text("LEFT", 300, 300); text("RIGHT", 475, 300); text("LEFT FAST", 275, 500); text("RIGHT FAST", 450, 500); text("Avancer", 375, 50); text("Reculer", 375, 760); if (keyPressed == true) { //si une touche du clavier est activée //souris placée dans ces intervalles if (mouseX>100 && mouseX<400 && mouseY>100 && mouseY<400) { Elouen TRAVAUX 9 println("LEFT"); //pour vérifier fill(0, 255, 255); //couleur triangle(400, 400, 100, 400, 400, 100); //Triangle Gauche-Haut fill(0, 0, 0); //couleur noire text("LEFT", 300, 300); //texte //Start Motor C nxt.motorForward(2, -100); } //Start Motor B nxt.motorForward(1, -40); if (mouseX>400 && mouseX<700 && mouseY>100 && mouseY<400) { println("RIGHT"); fill(0, 255, 255); triangle(400, 400, 700, 400, 400, 100); //Triangle Droite-Haut fill(0, 0, 0); text("RIGHT", 475, 300); //Start Motor C nxt.motorForward(2, -40); } //Start Motor B nxt.motorForward(1, -100); if (mouseX>100 && mouseX<400 && mouseY>400 && mouseY<700) { println("LEFT FAST"); fill(0, 255, 255); triangle(400, 400, 100, 400, 400, 700); //Triangle Gauche-Bas fill(0, 0, 0); text("LEFT FAST", 275, 500); //Start Motor C nxt.motorForward(2, -150); } //Start Motor B nxt.motorForward(1, -30); if (mouseX>400 && mouseX<700 && mouseY>400 && mouseY<700) { println("RIGHT FAST"); fill(0, 255, 255); triangle(400, 400, 700, 400, 400, 700); //Triangle Droite-Bas fill(0, 0, 0); text("RIGHT FAST", 450, 500); //Start Motor C Elouen TRAVAUX 10 nxt.motorForward(2, -30); //Start Motor B nxt.motorForward(1, -150); } if (mouseX>325 && mouseX<475 && mouseY>25 && mouseY<65) { println("AVANCER"); fill(0, 255, 255); rect(325, 25, 150, 40); //Rectangle Avancer fill(0, 0, 0); text("Avancer", 375, 50); } //Start Motor B nxt.motorForward(1, -100); //Start Motor C nxt.motorForward(2, -100); if (mouseX>325 && mouseX<475 && mouseY>735 && mouseY<775) { println("RECULER"); fill(0, 255, 255); rect(325, 735, 150, 40); //Rectangle Reculer fill(0, 0, 0); text("Reculer", 375, 760); //Start Motor B nxt.motorForward(1, 100); //Start Motor C nxt.motorForward(2, 100); } } } CODE SOURCE : Calcul de l’angle PImage fond; //paramétrage de la zone de travail void setup () { size(800, 800); smooth(); frameRate(30); // vitesse d’execution } Elouen TRAVAUX 11 void draw () { fond = loadImage("boussole800.jpg"); //charger l’image boussole800 background(fond); //faire de l’image chargée l’image d’arrière-plan //si la souris se trouve à gauche de l’axe vertical central if (mouseY<400) { float x = mouseX - 400; float y = mouseY - 400; float angle = atan2(-y, x); //calcul de l’angle en radians entre la droite horizontale centrale, et la droite reliant les points O (centre de la zone de travail) et le point situé du côté de l’Est. float deg = (angle*180)/3.14; //Transformation de la valeur de l’angle en degrés println(deg); //afficher le résultat (simple verification en cours de programmation) } if (mouseY>400) { float x = mouseX - 400; float y = mouseY - 400; float angle = atan2(y, x); } float deg = 360 - ((angle*180)/3.14); println(deg); } Elouen TRAVAUX 12