Résolution Labyrinthe avec Lego Mindstorms
Résolution Labyrinthe avec Lego Mindstorms
Département Informatique
4e année
2012 - 2013
Projet Robotique
Encadrants Étudiants
Pierre Gaucher Fabien Buda
[email protected] [email protected]
Jean-louis Bouquard Alexandre Lefillastre
[email protected] [email protected]
1 Introduction 6
3 Notre robot 10
3.1 Description du robot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.1.1 Modules de sortie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.1.2 Modules d’entrée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.2 Programmation et environnement de développement . . . . . . . . . . . . . . . . . . . . 11
5 Résultat 20
6 Difficultés rencontrées 21
6.1 Aléas divers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
6.2 Fiabilité du robot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
7 Évolutions envisagées 23
7.1 Utiliser un calcul du plus court chemin . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
7.2 Modifications sur le robot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
7.3 Programme de calibrage automatique . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
7.4 Changer la structure de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
7.5 Utiliser les communications Bluetooth . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
8 Conclusion 26
La résolution d’un labyrinthe à l’aide d’un Lego Mindstorms s’inscrit dans la continuité d’un projet de
3ème année. En effet, l’année dernière, Benjamin Allée avait développé un logiciel qui permettait de sortir
d’un labyrinthe à l’aide de l’algorithme de parcours en profondeur. L’utilisateur positionnait graphiquement
sa souris sur la case de départ et le logiciel gérait la résolution du labyrinthe, ainsi que l’affichage graphique
permettant à l’utilisateur de suivre l’évolution du déplacement du robot.
Dans ce projet, nous allons mettre en pratique la résolution d’un labyrinthe : un robot de type Lego
Mindstorms sera positionné dans un vrai labyrinthe. Il devra alors parcourir ce dernier afin de trouver la
sortie, ou parcourir l’intégralité du labyrinthe s’il n’y a pas d’issue.
Le type de robot nous a été imposé, cependant les autres aspects, tels que la forme du robot construit, le
mode de déplacement, et le langage de programmation utilisé étaient laissés à notre choix.
Dans ce rapport, nous présenterons le robot utilisé, l’algorithme et la structure de données utilisée pour par-
courir le labyrinthe, les difficultés que nous avons rencontrées, et les évolutions que nous avons envisagées
mais que nous n’avons pas été en mesure de mettre en place.
En 1998, la société Lego, sur la base de ses jeux pour enfants, crée la plateforme Lego Mindstorms.
Elle se compose d’une "brique", qui contient le programme du robot et gère les moteurs et les différents
capteurs. L’assemblage d’un robot se fait au moyen des composants de la gamme Lego Technic, permettant
de créer tout type de robots (bras articulé, robot humanoïde ...). Enfin, la programmation peut être réalisée
avec le logiciel fourni, prévu pour être facilement utilisable par les enfants.
Pour notre projet, nous emploierons la version actuelle de la brique, la version NXT. Une nouvelle ver-
sion, la brique EV3 a été dévoilée par Lego le 09 Janvier 2013 pour une sortie dans le courant de l’année,
avec notamment un matériel plus récent (plus de rapidité, plus de mémoire) et une connectivité élargie
permettant par exemple le contrôle depuis les plateformes Android et iOS.
– Sorties moteurs : 3 ports de sortie notés A, B, C permettent de connecter et contrôler des moteurs.
– Entrée accessoires : 4 ports d’entrées notés 1, 2, 3 et 4 permettent le branchement de différents
types de capteurs.
– Port USB : Un port USB permet le branchement à un ordinateur pour programmer la brique.
– Haut-parleur : Un haut-parleur permet d’émettre des sons.
– Boutons : Quatre boutons sont visibles sur la façade :
– Le bouton orange, permet de confirmer un choix dans les menus.
– Le bouton gris foncé, permet un retour arrière dans les menus.
– Les boutons flèche gauche et droite permettent de naviguer dans les menus.
Les boutons peuvent être utilisés dans les programmes pour permettre une interaction avec l’utilisa-
teur. Nous avons aussi remarqué qu’avec leJOS, un appui simultané sur les boutons orange et gris
foncé provoquent un redémarrage de la brique, ce qui permet de sortir du programme si celui-ci ne
peut pas se terminer de lui même.
– Écran LCD : Celui-ci permet l’affichage du menu de la brique (lancement d’un programme enregistré
sans l’intervention d’un ordinateur), et permet aux programmes l’affichage de textes, ou d’images.
– Bluetooth : La brique dispose d’une connectivité sans fil Bluetooth permettant l’ajout de programmes
et de fichiers sans passer par le câble USB. Sur les briques utilisant leJOS, le Bluetooth peut être
utilisé pour faire communiquer plusieurs briques, ou communiquer avec un ordinateur pour proposer
un contrôle à distance ou pour utiliser la puissance de calcul de l’ordinateur.
L’alimentation électrique de la brique NXT est assurée par des piles, ou une batterie disponible en
option.
2.3 Programmation
Depuis leur création, les systèmes Mindstorms sont programmables via le logiciel fourni par la société
Lego. Une interface visuelle permet de définir très rapidement les actions à réaliser par le robot. Mais, cet
outil n’est pas pratique pour produire un programme complexe, car il permet seulement de réaliser des
structures algorithmiques simples conditionnées directement par les valeurs envoyées par les capteurs, et
ne permet pas d’utiliser la mémoire pour stocker des informations (la structure de données du labyrinthe
par exemple).
Cependant, grâce à la facilité de modification ("Hacking") de la brique, de nombreux langages sont apparus
pour pouvoir développer des applications. On peut citer, par exemple, le langage NXC (Not exactly C),
proche du langage C, ainsi que leJOS qui est semblable au Java. Dans certains cas, une mise à jour de la
brique est nécessaire.
Plus d’informations sur les facilités de programmation, sont disponibles à la page suivante : http://en.
wikipedia.org/wiki/Lego_Mindstorms_NXT#Programming.
En ce qui concerne le déplacement, nous avons privilégié les chenilles : lors de tests, nous avions conclus
que les roues ne permettaient pas vraiment de faire une rotation "sur place" (sans déplacer le robot). De
plus, les chenilles semblaient mieux adhérer aux différents types de sols.
Enfin, nous avons employé un capteur de couleur pour détecter la sortie du labyrinthe. A chaque dé-
placement sur une case (sauf en cas de sortie de la récursivité), le capteur essaye de détecter la présence
d’un sol rouge. A ce moment là, le robot se bloque et lance une musique de victoire.
A noter que ce capteur est positionné à l’arrière du robot et qu’il est connecté à l’entrée numéro 3 du
Mindstorms.
Le langage de programmation utilisé pour notre robot est leJOS, Java pour la plateforme NXT. La
documentation disponible est assez abondante : le site internet dispose d’une JavaDoc (http://leJOS.
sourceforge.net/p_technologies/nxt/nxj/api/index.html), ce qui permet de connaitre la définition des fonc-
tions. De nombreux exemples de code sont aussi disponibles sur Internet, ce qui nous a permis de réaliser
rapidement des opérations basiques telles que le déplacement ou l’utilisation des capteurs.
Par rapport à d’autres langages, la "brique" nécessite un flashage pour pouvoir être programmée en Java.
Cela est possible via l’utilitaire NXJ Flash : on relie le câble USB de l’ordinateur vers le NXT et il suffit
de suivre les instructions du logiciel. A noter qu’il faut impérativement un système Windows 32 bits, sans
quoi il est impossible de réaliser cette opération.
Pour l’écriture du code, nous avons privilégié l’environnement de développement Eclipse (http://www.
eclipse.org/). En effet, tous nos cours de programmation en Java se sont déroulés avec ce logiciel. De plus,
leJOS est bien intégré dans l’IDE depuis la dernière version du langage. Mais il est aussi possible, d’utiliser
NetBeans.
La programmation, via l’IDE, se déroule exactement comme un projet Java ordinaire. Seule la cible
change. La commande "Executer le programme" envoie le code par le câble USB ou par Bluetooth, ce qui
évite de devoir constamment brancher/débrancher le robot (le câble est trop court pour le laisser branché
pendant qu’il se déplace). Lors de l’exécution, un terminal présent dans Eclipse indique les fonctions em-
ployées. Signalons aussi que leJOS refuse de s’éxecuter sans l’utilsation du Java SE Development Kit 32 bits.
Enfin, le logiciel NXJ Browse permet d’envoyer des fichiers, comme par exemple des sons, des images
ou même du code sur la brique NXT.
Dans notre structure de données, chaque case contient les informations suivantes : un couple (x,y)
d’entiers de coordonnées, un booléen pour le marquage des visites, et des pointeurs vers les cases voisines
pour représenter les arêtes du graphe.
Les coordonnées permettent d’une part de faciliter la représentation du labyrinthe, mais permettent aussi
de reconnaitre les cases déjà connues. En effet, si le robot découvre à un moment une case X située à l’Ouest
de la case Y, mais ne la visite pas, puis se retrouve finalement à l’Ouest de la case X après un détour, les
coordonnées permettent de reconnaitre la case X dans la liste des cases connues. Si cette reconnaissance
n’est pas faite, le robot ne serait pas capable de reconstituer correctement le graphe correspondant au
labyrinthe et serait condamné à tourner en rond dès qu’il tombe sur un cycle.
Le booléen pour le marquage des visites est nécessaire pour parcourir un graphe : il évite de passer
plusieurs fois au même endroit. Dans notre programme, le marquage des cases est effectué quand le robot
arrive sur une case pas encore visitée. Il observe son environnement avec les capteurs pour créer les arêtes
vers les cases voisines et vérifier qu’il n’est pas sur la case de sortie, puis marque la case comme visitée.
Enfin, les 4 pointeurs vers les cases voisines permettent la représentation sous forme de graphe. Dans
notre cas, les pointeurs correspondent chacun à un point cardinal pour permettre au robot de savoir dans
quel sens se tourner pour se rendre sur une case voisine de la case en cours d’exploration. Comme notre
robot ne possède pas de boussole, on décide arbitrairement que le Nord correspond à l’orientation initiale
du robot lorsque le programme est démarré.
Les autres objets utilisés au sein de notre programme sont un objet de la classe "robot" et un objet
"écran" qui gère l’affichage.
L’objet robot possède un pointeur vers la case où il se situe, et une orientation pour savoir où il se dirige.
Il est aussi utilisé pour appeler les méthodes de déplacement. L’objet écran sert uniquement à appeler les
fonctions liées à l’affichage. Il sert notamment à afficher à l’écran le plan qui permet aux utilisateurs de
voir ce que le robot connait du labyrinthe.
41 temp = g e t C a s e ( nx , ny , l a b y r i n t h e ) ;
42 i f ( temp==n u l l ) {
43 temp = new L a b y c a s e ( r o b o t . C a s e C o u r a n t e , 2 , nx , ny ) ;
44 l a b y r i n t h e . add ( temp ) ;
45 }
46 e l s e temp . Ouest = r o b o t . C a s e C o u r a n t e ;
47 r o b o t . C a s e C o u r a n t e . E s t = temp ;
48 }
49 i f ( robot . SudExists () )
50 {
51 nx=r o b o t . C a s e C o u r a n t e . x ;
52 ny=r o b o t . C a s e C o u r a n t e . y +1;
53 temp = g e t C a s e ( nx , ny , l a b y r i n t h e ) ;
54 i f ( temp==n u l l ) {
55 temp = new L a b y c a s e ( r o b o t . C a s e C o u r a n t e , 3 , nx , ny ) ;
56 l a b y r i n t h e . add ( temp ) ;
57 }
58 e l s e temp . Nord = r o b o t . C a s e C o u r a n t e ;
59 r o b o t . C a s e C o u r a n t e . Sud = temp ;
60 }
61 i f ( robot . OuestExists () )
62 {
63 nx=r o b o t . C a s e C o u r a n t e . x −1;
64 ny=r o b o t . C a s e C o u r a n t e . y ;
65 temp = g e t C a s e ( nx , ny , l a b y r i n t h e ) ;
66 i f ( temp==n u l l ) {
67 temp = new L a b y c a s e ( r o b o t . C a s e C o u r a n t e , 4 , nx , ny ) ;
68 l a b y r i n t h e . add ( temp ) ;
69 }
70 e l s e temp . E s t = r o b o t . C a s e C o u r a n t e ;
71 r o b o t . C a s e C o u r a n t e . Ouest = temp ;
72 }
73
74 // A p r e s a v o i r e t u d i e l e s c a s e s a d j a c e n t e s , on r e g a r d e s i on e s t s u r l a c a s e de
s o r t i e , e t on t e r m i n e l ’ e x p l o r a t i o n
75 r e t u r n ( c s . g e t C o l o r I D ( ) == C o l o r S e n s o r . C o l o r . RED) ;
76 }
3
4 //On commence p a r l a n c e r l ’ e x p l o r a t i o n de l a n o u v e l l e c a s e p o u r c o n n a i t r e l e s
v o i s i n s disponibles , et s a v o i r s i l e robot a a t t e i n t la s o r t i e
5 boolean f i n i = exploreEnvironment ( robot , l a b y r i n t h e ) ;
6 //On a f f i c h e l e p l a n a c u t a l i s e a v e c l e s n o u v e a u x v o i s i n s
7 Ecran . A f f i c h e P l a n ( robot , l a b y r i n t h e ) ;
8
9 i f ( f i n i ) r e t u r n t r u e ; // S i on e s t s u r l a s o r t i e , on a r r e t e l e p a r c o u r s
10
11 i f ( t h i s . Nord != n u l l && ! t h i s . Nord . v i s i t e ) //On a un v o i s i n au Nord , q u i n ’ e s t p a s
e n c o r e marque
12 {
13 r o b o t . d e p l a c e r ( t h i s . Nord , E c r a n ) ;
14 f i n i = t h i s . Nord . DFS( r o b o t , l a b y r i n t h e , E c r a n ) ;
15 i f ( ! f i n i ) r o b o t . d e p l a c e r ( t h i s , E c r a n ) ; // p o u r l e r e t o u r en s o r t i e du DFS quand
on a f i n i d ’ e x p l o r e r une b r a n c h e
16 }
17 i f ( f i n i ) r e t u r n t r u e ; // S i l a b r a n c h e e x p l o r e e au Nord c o n t i e n t l a s o r t i e , on
a r r e t e l e p a r c o u r s s a n s a l l e r e x p l o r e r l e s sommets r e s t a n t s
18
19 //On r e p e t e l a meme o p e r a t i o n a v e c l e s 3 a u t r e s v o i s i n s p o t e n t i e l s
20
21 i f ( t h i s . Sud!= n u l l && ! t h i s . Sud . v i s i t e ) //On a un v o i s i n au Sud , q u i n ’ e s t p a s
e n c o r e marque
22 {
23 r o b o t . d e p l a c e r ( t h i s . Sud , E c r a n ) ;
24 f i n i = t h i s . Sud . DFS( r o b o t , l a b y r i n t h e , E c r a n ) ;
25 i f ( ! f i n i ) r o b o t . d e p l a c e r ( t h i s , E c r a n ) ; // p o u r l e r e t o u r en s o r t i e du DFS quand
on a f i n i d ’ e x p l o r e r une b r a n c h e
26 }
27 i f ( f i n i ) return true ;
28 i f ( t h i s . E s t != n u l l && ! t h i s . E s t . v i s i t e ) //On a un v o i s i n au Est , q u i n ’ e s t p a s
e n c o r e marque
29 {
30 r o b o t . d e p l a c e r ( t h i s . Est , E c r a n ) ;
31 f i n i = t h i s . E s t . DFS( r o b o t , l a b y r i n t h e , E c r a n ) ;
32 i f ( ! f i n i ) r o b o t . d e p l a c e r ( t h i s , E c r a n ) ; // p o u r l e r e t o u r en s o r t i e du DFS quand
on a f i n i d ’ e x p l o r e r une b r a n c h e
33 }
34 i f ( f i n i ) return true ;
35 i f ( t h i s . Ouest != n u l l && ! t h i s . Ouest . v i s i t e ) //On a un v o i s i n au Ouest , q u i n ’ Ouest
p a s e n c o r e marque
36 {
37 r o b o t . d e p l a c e r ( t h i s . Ouest , E c r a n ) ;
38 f i n i = t h i s . Ouest . DFS( r o b o t , l a b y r i n t h e , E c r a n ) ;
39 i f ( ! f i n i ) r o b o t . d e p l a c e r ( t h i s , E c r a n ) ; // p o u r l e r e t o u r en s o r t i e du DFS quand
on a f i n i d ’ e x p l o r e r une b r a n c h e
40 }
41 i f ( f i n i ) return true ;
42
43 // S i l a f o n c t i o n ne s ’ e s t p a s a r r e t e a v a n t d ’ a r r i v e r i c i , aucune d e s b r a n c h e s
p a r t a n t de l a c a s e c o u r a n t e ne c o n t i e n t l a s o r t i e , on f a i t donc r e m o n t e r c e
resultat
44 return false ;
45 }
22 g . f i l l R e c t ( x , y , 12 , 12) ;
23 //On d e s s i n e un c a r r e n o i r
24 }
25 e l s e i f ( ! Labytemp . v i s i t e ) { // S i l a c a s e c a s e e x i s t e , m a i s p a s e n c o r e v i s i t e
( on ne c o n n a i t donc p a s s e s v o i s i n s )
26 g . d r a w L i n e ( x +4 , y +2, x +7 , y +2) ;
27 g . f i l l R e c t ( x +3 , y +3 , 2 , 2 ) ;
28 g . f i l l R e c t ( x +7 , y +3 , 2 , 2 ) ;
29 g . d r a w L i n e ( x +6 , y +5, x +8 , y +5) ;
30 g . d r a w L i n e ( x +5 , y +6, x +6 , y +6) ;
31 g . f i l l R e c t ( x +5 , y +8 , 2 , 2 ) ;
32 //On d e s s i n e un p o i n t d ’ i n t e r r o g a t i o n
33 }
34 e l s e { // Sinon , l a c a s e e x i s t e , e t a d e j a e t e v i s i t e e , on c o n n a i t donc s e s
voisins
35 i f ( Labytemp . Nord==n u l l ) g . d r a w L i n e ( x , y , x +11 , y ) ;
36 i f ( Labytemp . Sud==n u l l ) g . d r a w L i n e ( x , y +11 , x +11 , y +11) ;
37 i f ( Labytemp . Ouest==n u l l ) g . d r a w L i n e ( x , y , x , y +11) ;
38 i f ( Labytemp . E s t==n u l l ) g . d r a w L i n e ( x +11 , y , x +11 , y +11) ;
39 //On d e s s i n e , un c a r r e b l a n c , e t on t r a c e d e s b o r d s n o i r s s u r l e s c o t e s q u i
p o s s e d e n t un mur
40 }
41 }
42 }
43 s w i t c h ( r o b o t . G e t O r i e n t a t i o n ( ) ) { // E n f i n , s u r l a c a s e c e n t r a l e on d e s s i n e une
f l e c h e p o u r i n d i q u e r l ’ o r i e n t a t i o n a c t u e l l e du r o b o t
44 case 1 : g . drawLine (46 , 33 , 49 , 30) ; g . drawLine (50 , 30 , 53 , 33) ; g . f i l l R e c t (49 ,
31 , 2 , 7) ; break ;
45 case 2 : g . drawLine (50 , 30 , 53 , 33) ; g . drawLine (53 , 34 , 50 , 37) ; g . f i l l R e c t (46 ,
33 , 7 , 2) ; break ;
46 case 3 : g . drawLine (46 , 34 , 49 , 37) ; g . drawLine (50 , 37 , 53 , 34) ; g . f i l l R e c t (49 ,
30 , 2 , 7) ; break ;
47 case 4 : g . drawLine (50 , 30 , 46 , 33) ; g . drawLine (46 , 34 , 49 , 37) ; g . f i l l R e c t (47 ,
33 , 7 , 2) ; break ;
48 }
49
50 }
Le but du projet était de permettre à un robot posé dans un labyrinthe, sans aucune information sur
ce dernier, de trouver la sortie.
Dans la pratique, notre robot est tout à fait capable de parcourir le labyrinthe à la recherche de la
sortie, si l’on omet toutefois les quelques problèmes de trajectoires liés à la fiabilité technique du robot
détaillés dans la suite (cf section 6.2). Il faut donc surveiller le robot pour s’assurer qu’il ne s’écarte pas
trop du centre des cases et le repositionner de temps en temps.
Pendant que le robot parcourt le labyrinthe, un plan miniature affiché sur l’écran permet de voir les cases
explorées par le robot avec leurs murs, celles connues mais pas encore explorées, et les zones inaccessibles
d’après les connaissances du robot (cf section 4.2.5).
Si le labyrinthe ne comporte pas de sortie, le robot explore la totalité du labyrinthe avant de revenir
à sa position de départ, puis affiche un message à l’écran indiquant "Labyrinthe sans issue" accompagné
d’une tonalité sonore.
Si le labyrinthe comporte une sortie (matérialisée par une surface rouge disposée au sol), le robot
s’arrête sur la case rouge, et affiche un message "Victoire !" accompagné d’une autre tonalité sonore.
lentement le robot des murs, tandis que les rotations ratées peuvent provoquer d’important décalages par
rapport au centre de la case, ce qui conduit inévitablement le robot à percuter les murs.
Pour essayer de résoudre ces problèmes, nous avons envisagé d’autres méthodes de déplacement : au
lieu d’avancer de manière aveugle, le robot pourrait utiliser ses capteurs latéraux pour se rapprocher du
centre des cases en modifiant la vitesse de ses moteurs, et s’il se retrouve face à un mur, il interromprait
son déplacement pour reculer de manière à rejoindre le centre de la case.
Cependant, la manipulation des moteurs avec le langage leJOS permet difficilement d’utiliser en parallèle
les capteurs pour effectuer de telles manœuvres sans interrompre complètement le mouvement. Si le robot
stoppe son mouvement, les manœuvres restent très compliquées et risquent d’être longues à cause des
temps de démarrage/stoppage des moteurs.
De plus, l’imprécision des capteurs risque de rendre les mouvements chaotiques.
Figure 7.1 – Avec le plus court chemin (flèche rouge), le robot n’aurait pas besoin de repasser par A
et B après avoir exploré C (flèches vertes)
En utilisant un calcul du plus court chemin, le robot pourrait se déplacer un peu plus rapidement, mais
cette amélioration ne servirait que dans le cas cité plus haut, donc l’amélioration aurait un impact plutôt
limité sur temps nécessaire pour le parcours du labyrinthe.
Une autre évolution possible serait de monter un capteur sur un axe en rotation, afin que le robot dispose
d’une sorte de radar qui lui fournirait une représentation 2D de son environnement au lieu d’une simple
distance vers l’obstacle le plus proche. Une telle représentation permettrait de mieux détecter les passages,
de repositionner plus rapidement le robot sur le centre des cases, ou d’envisager des types de labyrinthes
plus complexes (cf section 7.4).
palier le manque de mémoire des briques. En effet la version actuelle du robot embarque une petite quantité
de mémoire, et même si nous n’avons pas rencontré de problèmes avec, la mémoire risque de ne pas suffire
si le robot est utilisé dans un labyrinthe particulièrement grand.
La communication avec d’autres briques pourrait être utilisée pour gérer un groupe de robots : à chaque
intersection les robots se sépareraient pour explorer plus rapidement les branches du graphe, et s’ils tombent
sur une impasse, ils rebrousseraient chemin puis rejoindraient les autres robots.
Ce projet de résolution d’un labyrinthe nous a tout d’abord permis de nous initier à la robotique, ce
que nous n’avions jamais fait auparavant. De plus, la plateforme Lego NXT est un réel plaisir à utiliser et à
programmer : elle propose différents types de capteurs ainsi que de nombreux langages de programmation.
Les possibilités sont immenses.
Pour ce projet, nous avons donc eu le choix des technologies employées. Nous avons choisi des capteurs
ultra sonores pour gérer les obstacles mais aussi un capteur de couleur pour détecter la sortie. Au départ,
nos professeurs encadrants ont souhaité l’utilisation du langage C. Malheureusement, ce langage n’était
pas adapté. Après discussion, la technologie Java fut employée. Nous avons réellement apprécié cette réelle
autonomie.
Nous avons implémenté l’algorithme de parcours en profondeur pour pouvoir résoudre tout type de
labyrinthe. Nous avons aussi géré les déplacements du robot en fonction de sa direction ainsi que l’utilisation
des capteurs.
En pratique, notre robot réussit à trouver la sortie (si elle est disponible) mais on se heurte à des
problèmes inhérents au robot utilisé : les déplacements et les rotations ne sont pas bien réalisés. Au fur et
à mesure du parcours, le robot est décalé.
Nous pensons donc que la priorité dans le futur est de régler ce problème grâce à l’utilisation d’un capteur
de type boussole ou gyroscope. Le robot pourra alors se déplacer de manière optimale.
Département Informatique
4e année
2012 - 2013
Projet Robotique
Résumé : A l’aide du langage Java et de la technologie leJOS, nous avons implémenté l’algorithme de
parcours en profondeur sur un robot de type Lego NXT pour pouvoir résoudre un labyrinthe. Des capteurs
ultra-sonores ont été employés pour la détection des murs ainsi qu’un capteur de couleur pour détecter la
sortie.
Mots clefs : Résolution de labyrinthe, Lego , NXT, leJOS, Java, parcours en profondeur
Abstract: This project aims to solve a maze with a Lego NXT. Depth first search algorithm and sensors
(ultrasound sensors to detect walls and color sensor to detect goal) are employed to make this possible.
Implementation is realised in Java with the leJOS technology.
Keywords: Maze solver, Lego , NXT, leJOS, Java, DFS, Depth First Search
Encadrants Étudiants
Pierre Gaucher Fabien Buda
[email protected] [email protected]
Jean-louis Bouquard Alexandre Lefillastre
[email protected] [email protected]