SuiveurLigne2012-1 : Différence entre versions
(→Comment lui faire suivre une ligne discontinue ?) |
(→Comment lui faire suivre une ligne discontinue ?) |
||
Ligne 153 : | Ligne 153 : | ||
{partir tout droit ;} | {partir tout droit ;} | ||
} | } | ||
+ | |||
+ | Et si le marquage n’est pas retrouvé il faut faire demi-tour : | ||
+ | |||
+ | Tant que (infinie) | ||
+ | { Si I < max | ||
+ | Si le capteur de couleur détecte du bleu | ||
+ | Avancer tout droit ; | ||
+ | Sinon | ||
+ | Tant que (pas de bleu et I < max) | ||
+ | {Rotation successive ; | ||
+ | I <- I+1 ;} | ||
+ | Sinon | ||
+ | I <- 0 ; | ||
+ | Se remettre dans l’axe ; | ||
+ | Tant que (pas de bleu et d < max2) | ||
+ | { d <- d+1 ; | ||
+ | partir tout droit ; } | ||
+ | Si d >= dmax2 | ||
+ | { Se retourner ; | ||
+ | Tant que (pas de bleu) | ||
+ | {Avancer tout droit ;} | ||
+ | } | ||
… à suivre. | … à suivre. |
Version du 3 mai 2013 à 19:15
Sommaire
Introduction
/* Attentions aux coquilles et autres fautes d'orthographe et de grammaire */
A travers cette page, je vais vous présenter les étapes successives de mon travail dans le cadre des bureaux d’études PEIP. Premièrement, l’objectif sera de réaliser un robot en Lego MindStorm capable de suivre un marquage continu ou non. C’est le robot suiveur de ligne.
Toutefois, il existe de multiples procédés pour parvenir à un tel objectif. Afin de les limiter, le robot doit respecter divers directives que voici :
(1) en cas de perte du marquage, tourner dans un sens puis dans l'autre pour tenter de le retrouver avec des angles de plus en plus grands.
(2) si le marquage ne peut pas être retrouvé, se remettre dans la position de la perte initiale et partir tout droit.
(3) se remettre dans l'axe du marquage lorsque ce marquage est retrouvé.
(4) s'arrêter quand un obstacle se présente devant lui et repartir si l'obstacle disparait.
(5) changer de parcours sur commande, c'est à dire emprunter un parcours d'une couleur différente dès qu'il est rencontré.
(6) inverser son sens de parcours.
Les premiers pas …
… de la construction
Avant tout, j'ai monté le robot. La base de la structure a été réalisée avec le modèle de construction du manuel Lego; intégrant 3 moteurs et un boîtier NXT.
Enfin, pour que le robot ait des informations sur son environnement il est nécessaire d’y rajouter des capteurs. Pour débuter, seul deux capteurs m’ont paru les plus appropriés : le capteur de couleurs particulièrement utile pour suivre un marquage et le capteur à ultrasons pour détecter les obstacles (directive n°4).
Du travail est encore à faire concernant le montage du robot, l’emplacement pour la Fox Board est prévu mais celle-ci n’est pas encore parfaitement stable. Concernant les capteurs, il sera surement utile d’en rajouter d’autres. En outre, la base de la structure comprend 3 moteurs hors seul deux suffiraient. Et à l’usage, j’ai constaté qu’il n’était pas aisé de changer les piles du boîtier NXT.
… de la programmation
Une fois les deux capteurs et le boîtier NXT mis en place, j’ai tenté de faire rouler le robot avec le logiciel Lego MindStorm. Les premiers essais ont été concluants puisque j’ai réussi à mettre en mouvement le robot dans différentes directions et à faire fonctionner les capteurs. Cependant le logiciel ne me semblait pas facile à manipuler pour faire des programmes plus compliqués avec plusieurs boucles notamment. J’ai donc essayé avec le logiciel Bricx Command Center où il est possible de coder avec un langage proche du C. Malheureusement, j’ai beaucoup de difficulté à trouver les fonctions du logiciel et je ne suis pas parvenue à faire fonctionner les capteurs. Finalement, j’en avais effectué plus avec le logiciel Lego MindStrom. Les séances de cours passant rapidement, je suis donc retourné sur ce logiciel. Malgré que je ne le maîtrise pas encore très bien, j’ai décidé de commencer mes programmes pour atteindre les objectifs en espérant apprendre plus efficacement./* idem, il faut être précis */
Comment lui faire suivre un marquage continu ?
Dans un parcours à suivre, on peut évidemment distinguer les lignes droites, des virages. Dans les lignes droites ou les très légers virages le robot détecte toujours la couleur en continuant tout droit. Dés le premier virage, il va perdre le marquage. Pour le retrouver deux méthodes, me sont venues: la première qui est d’utiliser deux capteurs de couleurs un droit et un gauche. Dés que la couleur n’est plus détectée par l’un des capteurs il va falloir tourner d’un certain angle jusqu’à ce que le capteur qui avait perdu la ligne la perçoive de nouveau. Ceci impose un capteur supplémentaire et des contraintes importantes sur la largeur de la ligne à suivre. La deuxième idée est de lui faire retrouver le marquage qu’il a perdu en effectuant des rotations dans un sens puis dans l’autre. Celle-ci est préférable puisqu’elle peut servir pour les lignes discontinues.
Finalement, voici la première structure de mon programme pour un parcours dont le marquage est bleu :
Tant que (infinie) { Si le capteur de couleurs détecte du bleu Avancer tout droit ; Sinon faire la deuxième idée }
Il s’agit maintenant de programmer cette deuxième idée. Pour cela, il nous faut une boucle :
Tant que le capteur de couleurs ne détecte pas de bleu { Tourner d’un multiple d’un angle Alpha dans un sens et dans l’autre }
(Dans le schéma Alpha = 10°)
J’ai constaté que la rotation du robot était définie par un nombre K compris entre -100 et 100 dans le bloc moteur du logiciel Lego MindStorm. Si K est positif, il tourne dans le sens trigonométrique, négatif dans l’autre sens et |K| correspond à la valeur d’un angle.
J’ai d’abord pensé à faire l’algorithme ci-dessous :
K < - 1 ; Tant que le capteur de couleurs ne détecte pas de bleu { Bloc moteur < - f(K) ; K < - K+1 ; } Où f(K) = ((-1)^K) * (K) * Alpha
Le premier terme (-1)^K modifie le signe de la fonction à chaque incrémentation de K. Si K est pair (f(K) est positif), le robot va tourner dans le sens trigonométrique. Au contraire, si K est impair (f(K) est négatif), le robot va tourner dans l’autre sens. Le terme (K*Alpha) modifie l’amplitude de la rotation.
On a pour Alpha = 10° :
K: 1 2 3 4 f(K): -10° 20° -30° 40°
Malheureusement, je suis très vite tombée dans les inconvénients du logiciel. Pour programmer l’incrémentation d’une variable K, il est nécessaire d’utiliser 5 blocs. Donc la programmation de f(K) serait trop lourde, notamment à cause de la puissance. Avec les conseils de nos chers professeurs, j’ai appris qu’il était mieux de faire un « Switch » qui prend en compte toutes les valeurs de K.
Voici l’algorithme :
K < - 0 ; Tant que le capteur de couleurs ne détecte pas de bleu { K < - K +1 ; Switch (K) : { Cas K=1 : Bloc moteur < - (- Alpha) ; Cas K=2 : Bloc moteur < - (2* Alpha) ; Cas K=3 : Bloc moteur < - (-3* Alpha) ; . . . } }
Pour que le robot tourne par pas de 10°, Alpha doit être égal à 5,5. Cette valeur est obtenu par un simple produit en croix (200 * 10° / 360°).
Cependant, cela ne suffisait pas. En effet, les pivots du robot étaient accompagnés de translation et le robot ne retrouvait pas la ligne. J’ai constaté qu’en diminuant fortement la rotation des roues, la translation du robot devenait faible et après plusieurs essais j’ai réussi à obtenir l’effet voulu.
Tant que (infinie) { Si le capteur de couleurs détecte du bleu Avancer tout droit ; Sinon K < - 0 ; Tant que le capteur de couleur ne détecte pas de bleu { K < - K +1 ; Switch (K) : { Cas K=1 : Bloc moteur < - (- Alpha) ; Cas K=2 : Bloc moteur < - (2* Alpha) ; Cas K=3 : Bloc moteur < - (-3* Alpha) ; . . . } } }
Le robot suit maintenant correctement un marquage continu. Quand est-il pour les marquages discontinus et les directives (4), (5) et (6) ?
Comment lui faire suivre une ligne discontinue ?
(Des précisions des problèmes que j’aie eu pour effectuer ces programmes seront apportées)
Algorithme :
Tant que (infinie) { Si I < max Si le capteur de couleurs détecte du bleu Avancer tout droit ; Sinon Tant que ( pas de bleu et I < max ) {Rotation successive ; I <- I+1 ; } Sinon I <- 0 ; Se remettre dans l’axe ; Tant que (pas de bleu) {partir tout droit ;} }
Et si le marquage n’est pas retrouvé il faut faire demi-tour :
Tant que (infinie) { Si I < max Si le capteur de couleur détecte du bleu Avancer tout droit ; Sinon Tant que (pas de bleu et I < max) {Rotation successive ; I <- I+1 ;} Sinon I <- 0 ; Se remettre dans l’axe ; Tant que (pas de bleu et d < max2) { d <- d+1 ; partir tout droit ; } Si d >= dmax2 { Se retourner ; Tant que (pas de bleu) {Avancer tout droit ;} }
… à suivre.