Robot aspirateur
Présentation
Un robot aspirateur doit se déplacer dans un bâtiment pour effectuer sa tâche. Lorsque le niveau de charge de sa batterie est faible, il doit retourner à sa base pour y être rechargé en énergie électrique. Pour cela, il est programmé en Python et son modèle numérique est un objet nommé robot.
Il peut réaliser différentes actions en utilisant les méthodes suivantes :
robot.avancer(d): fait avancer le robot d’une distanced(en m)robot.reculer(d): fait reculer le robot d’une distanced(en m)robot.pivoter(a): fait pivoter le robot d’un anglea(en degrés, positif ou négatif, le sens positif étant le sens trigonométrique)
Exemple : pour avancer de 3 mètres on écrit :
robot.avancer(3)
Le bâtiment à visiter a la forme suivante, découpé en « cases » de 1 mètre par 1 mètre :

Déplacement en boucle ouverte
Ajout de capteurs
Pour rendre le robot un peu plus autonome, on lui ajoute un capteur : un détecteur de présence, placé à l’avant, et délivrant une information binaire.
La méthode robot.voie_libre() renvoie False si un mur se trouve juste devant le robot (à moins de 1 mètre) et True dans le cas contraire.
De plus, pour déterminer si le robot est arrivé à sa base, il faut comparer sa position à celle (connue à l’avance) de sa base. Le bâtiment est découpés en cases et la position du robot est données par son attribut robot.position, de type tuple, donnant sa position dans le bâtiment sous la forme (ligne, colonne) (la case en haut à gauche du bâtiment est à la position (0, 0)).
Déplacement en boucle fermée
En boucle fermée, le robot utilise ses capteurs pour se déplacer en fonction de son environnement, et ainsi être capable de se déplacer dans n’importe quel bâtiment.
La stratégie adoptée consiste à forcer le robot à longer un mur, celui à sa droite par exemple :
- Tant que la base n’a pas été atteinte :
- Le robot se tourne sur sa droite (pour « voir » s’il y a un mur)
- Si la case en face de lui est libre :
- Le robot avance d’une case
- Sinon
- Le robot fait demi-tour
robot.avancer , robot.pivoter, et robot.voie_libre, ainsi que les structures algorithmiques.
Vérification
Le programme ci-dessous propose une implémentation en Python d’un « bâtiment » et d’un « robot ».
Dans ce programme, robot est un objet de type Robot, et possède les méthodes décrites plus haut : robot.avancer , robot.pivoter, et robot.voie_libre
Préparation
- Créer un dossier
robotsur votre disque (disque réseau tsi), - Télécharger l’archive ZIP suivante : robot.zip
- La déplacer dans le dossier
robot, - La dézipper (clic-droit puis 7-Zip > Extraire ici)
- Ouvrir un IDE Python (pyzo, Thonny, …) et le configurer :
-
- Depuis l’explorateur de fichier de Pyzo (File Browser) naviguer jusqu’au dossier
robotprécédemment créé, - Ouvrir le fichier
robot.pyqui s’y trouve (double-clic), - Depuis la console de Pyzo (Shells) faire un clic-droit puis Change current directory to editor file path.
- Depuis l’explorateur de fichier de Pyzo (File Browser) naviguer jusqu’au dossier
robot.py.
Phase de nettoyage
En phase de nettoyage, le robot doit parcourir toute la surface au sol, de la manière la plus efficace possible, c’est à dire en parcourant le moins de distance possible.
Hypothèses :
- La pièce est rectangulaire, sans mur intérieur (remplacer la 3ème ligne par
batiment = Batiment(piece)), - Le robot ne connaît pas à l’avance les dimensions de la pièce, mais dispose du capteur détectant les obstacles devant lui (utiliser la méthode
robot.voie_libre()),
mais il peut les déterminer et mémoriser ces dimensions lors de son parcours (utiliser une ou plusieurs variables), - Le robot part du coin haut-gauche.

Zigzag
On souhaite que le robot réalise un parcours en zigzag :

On suppose à présent que la pièce n’est plus rectangulaire : remplacer la 3ème ligne par batiment = Batiment(piece_A),
Spirale
On reprend le cas ou la pièce est rectangulaire, sans mur intérieur (remplacer la 3ème ligne par batiment = Batiment(piece)),
On souhaite que le robot réalise un parcours en spirale:

On suppose à présent que la pièce n’est plus rectangulaire : remplacer la 3ème ligne par batiment = Batiment(piece_A),
