Essayons de programmer par étape le suivi de ligne
Affichons le niveau de batterie car si celle-ci est inférieure à un certain niveau, le comportement du robot devient incohérent :
Sous le lancement du MBOT CyberPi crée les variables suivantes :
vitesse_droite : pour gérer la vitesse du moteur EM1
vitesse_gauche : pour gérer la vitesse du moteur EM2
vitesse_maxi : vitesse maximum du robot
vitesse_mini : vitesse moyenne du robot
position : poids de la position du robot par rapport à la ligne noire
correction : correction à appliquer aux moteurs pour suivre la ligne noire
Gestion du bouton B pour lancer le suivi de ligne puis l’arrêter
Tester le bouton B , les leds s’allument en vert puis en rouge
Calcul pour lancer les moteurs en fonction de la position du robot par rapport à la ligne noire
Teste, le robot roule tout droit
Faire tourner le robot
Teste des valeurs de position de -2 à 2 :
Teste le robot pour qu’il tourne plus ou moins à gauche ou à droite
Une première version pour un Suivi de ligne
Plus de détail :
Capteur central pour aller tout droit :
Détail du si :
Et les 4 capteurs du Quad RGB du MBOT :
Teste le suivi de ligne
Tu peux rajouter plus de précision :
Plus de détail sur le rajout :
Modifie le suivi de ligne avec le calcul du PID
derivee : afin de suivre quand le robot passe de gauche à droite de la ligne noire
Kp : pour accentuer ou diminuer pour prendre le angles droits,
1 ne fait rien
< 1 diminue l’angle des virages
> 1 augmente l’angle des virages
Kd : pour empêcher le robot de faire des zigzags
0 ne fait rien
0 à 3 diminuer les zigzags en ligne droite
Tu peux jouer sur ces deux valeurs pour ajuster ton suivi de ligne surtout pour le passage de la ligne en pointillé :
Passage d’un obstacle
Si le robot reste bloqué devant un obstacle, l’objectif est de détecter qu’il est à l’arrêt, et qu’il tente de franchir l’obstacle sans y parvenir.
Ce blocage peut être identifié par un état de secousses répétées pendant une certaine durée. Lorsque le robot est reconnu dans cet état, une stratégie de forçage est déclenchée : le robot recule légèrement, puis effectue une accélération franche vers l’avant afin de franchir l’obstacle.
Puis rajouter l’appel de la fonction dans le code :
Lors de nos participations à la RoboCup Junior, nous avons constaté que notre robot rencontrait des difficultés dans les virages très serrés. Il avait tendance à zigzaguer, à se balancer de gauche à droite et parfois à perdre la ligne, en particulier lorsque celle-ci est en pointillée.
L’année dernière, sur nos mBot 2, nous avons ajouté un capteur central, ce qui a permis d’améliorer le suivi de ligne.
Afin de progresser cette année, nous devons nous reposer plusieurs questions, notamment :
le choix d’une traction avant ou arrière ;
le positionnement des capteurs, afin d’éviter qu’ils ne s’éloignent du sol lors des montées de pente ;
la maîtrise du robot lors des descentes.
Pour résoudre ces problèmes, nous devons revoir :
l’adhérence du robot au sol, en choisissant des pneus en caoutchouc de meilleure qualité ;
le choix d’un suivi de ligne basé sur un calcul PID, afin d’améliorer la stabilité et la précision du robot
Traction avant ou traction arrière : avantages et inconvénients
Le choix entre une traction avant (roues motrices à l’avant) et une traction arrière (roues motrices à l’arrière) a un impact important sur :
le suivi de ligne
la montée et la descente des pentes
l’évitement et le franchissement des obstacles
Traction avant (moteurs à l’avant). les avantages
Bon guidage de la trajectoire
Les roues motrices tirent le robot
Le robot suit plus facilement la direction des capteurs
Intéressant pour le suivi de ligne précis
Meilleur passage des petits obstacles
Les roues motrices montent directement sur l’obstacle
Moins de risque de rester bloqué
Robot plus stable en descente
Le poids vers l’avant aide à garder le contrôle
Moins de risque de « glissade »
Traction avant (moteurs à l’avant). Inconvénients
Moins d’adhérence en montée
Le poids se déplace vers l’arrière
Les roues avant peuvent patiner
Problème d’adhérence sur des pentes fortes (25 %)
Direction plus sensible
Peut surcorriger dans les virages serrés
Demande un réglage PID précis
Traction arrière (moteurs à l’arrière). Avantages
Meilleure adhérence en montée
Le poids du robot repose sur les roues motrices
Très efficace sur les pentes raides (25%)
Robot plus stable en ligne droite
Le robot est “poussé” plutôt que tiré
Moins de patinage
Traction arrière (moteurs à l’arrière). Inconvénients
Suivi de ligne moins précis
Les roues arrière poussent le robot
Risque de dérapage de l’arrière
Virages serrés plus difficiles
Passage d’obstacles plus délicat
Les roues avant ne sont pas motrices
Elles peuvent buter sur l’obstacle
Moins de contrôle en descente
Le robot peut accélérer trop vite
Risque de perte de contrôle, glissade surtout avec les roues bidirectionnelles
Choix d’un suivi de ligne basé sur un calcul PID
Le suivi de ligne simple, qui consiste à tourner à gauche ou à droite selon les capteurs, n’est pas suffisant. Il est nécessaire d’utiliser un système plus précis pour permettre au robot de rester bien centré sur la ligne.
Pourquoi utiliser un calcul PID pour suivre une ligne ?
Le PID est une méthode de calcul utilisée pour corriger automatiquement un mouvement. Le PID (Proportionnel – Intégral – Dérivé) est un algorithme de régulation inventé au début du XXᵉ siècle, notamment grâce aux travaux de Nicolas Minorsky en 1922, lors de l’étude du pilotage automatique des navires, pour aider à guider des bateaux sans les faire osciller.
Aujourd’hui, le PID est utilisé partout :
dans les avions
dans les voitures
dans les robots
dans les machines industrielles
Chaque fois qu’un système doit être stable et précis, on utilise un PID.
Pourquoi le PID est utile pour notre robot ?
Le PID aide le robot à :
mieux prendre les virages
éviter les balancements
suivre la ligne de manière fluide
mieux passer les lignes en pointillée
Grâce aux moteurs avec encodeurs, notre robot avance droit. Nous utilisons donc seulement une partie du PID (P et D), ce qui est suffisant et plus simple.
Conclusion
Le calcul PID permet à notre robot de :
mieux suivre la ligne
être plus stable
être plus performant en compétition
C’est pour cela que nous devons expérimenter ce calcul pour améliorer notre robot en RoboCup Junior.
Quelque indications pour le mettre en œuvre avec le MBOT 2.
Les capteurs disent au robot où est la ligne :
Ligne au centre → erreur = 0
Ligne à gauche → erreur négative
Ligne à droite → erreur positive
Utilise une variable « position » pour affecter un poids d’erreur en fonction des capteurs, voir cet exemple :
Kp accentue proportionnellement l’erreur de positionnement par rapport à la ligne noire, Kp veut dire coefficient proportionnel.
Il sert à dire au robot : « Plus je suis loin de la ligne, plus je corrige fort. »
Si Kp est petit → le robot corrige doucement (il peut sortir de la ligne)
Si Kp est grand → le robot corrige fort (il peut zigzaguer)
Kd – Calmer le robot, Kd veut dire coefficient dérivé. Il va permettre de se remettre bien droit sur la ligne droite suite à des virages, notamment pour que le robot se positionne pour suivre une ligne en pointillée.
Il sert à dire au robot : « Attention, tu corriges trop vite, ralentis un peu. »
Kd faible → le robot zigzague
Kd plus grand → le robot devient plus stable
Kd trop grand → le robot devient lent à réagir
Ensemble : Kp + Kd
Kp fait tourner le robot vers la ligne
Kd empêche le robot de faire des zigzags
Ensemble, ils permettent au robot de :
suivre la ligne correctement
rester stable
passer les virages serrés plus facilement
Comment les régler :
Mettre Kd = 0 au départ
Augmenter Kp jusqu’à ce que le robot suive la ligne
Si le robot zigzague → augmenter Kd
Ajuster jusqu’à obtenir un mouvement fluide.
Configure MBLOCK pour le suivi de ligne
Utilise le bouton extension
Rajoute ces deux éléments :
Premier essai de fonctionnement du MBOT
Premier téléchargement
Teste ton programme
Teste une programmation des moteurs
Teste ton programme
Essayons de programmer par étape le suivi de ligne
Affichons le niveau de batterie car si celle-ci est inférieure à un certain niveau, le comportement du robot devient incohérent :
Sous le lancement du MBOT CyberPi crée les variables suivantes :
vitesse_droite : pour gérer la vitesse du moteur EM1
vitesse_gauche : pour gérer la vitesse du moteur EM2
vitesse_maxi : vitesse maximum du robot
vitesse_mini : vitesse moyenne du robot
position : poids de la position du robot par rapport à la ligne noire
correction : correction à appliquer aux moteurs pour suivre la ligne noire
Gestion du bouton B pour lancer le suivi de ligne puis l’arrêter
Tester le bouton B , les leds s’allument en vert puis en rouge
Calcul pour lancer les moteurs en fonction de la position du robot par rapport à la ligne noire
Teste, le robot roule tout droit
Faire tourner le robot
Teste des valeurs de position de -2 à 2 :
Teste le robot pour qu’il tourne plus ou moins à gauche ou à droite
Une première version pour un Suivi de ligne
Plus de détail :
Capteur central pour aller tout droit :
Détail du si :
Et les 4 capteurs du Quad RGB du MBOT :
Teste le suivi de ligne
Tu peux rajouter plus de précision :
Plus de détail sur le rajout :
Modifie le suivi de ligne avec le calcul du PID
derivee : afin de suivre quand le robot passe de gauche à droite de la ligne noire
Kp : pour accentuer ou diminuer pour prendre le angles droits,
1 ne fait rien
< 1 diminue l’angle des virages
> 1 augmente l’angle des virages
Kd : pour empêcher le robot de faire des zigzags
0 ne fait rien
0 à 3 diminuer les zigzags en ligne droite
Tu peux jouer sur ces deux valeurs pour ajuster ton suivi de ligne surtout pour le passage de la ligne en pointillé :
Passage d’un obstacle
Si le robot reste bloqué devant un obstacle, l’objectif est de détecter qu’il est à l’arrêt, et qu’il tente de franchir l’obstacle sans y parvenir.
Ce blocage peut être identifié par un état de secousses répétées pendant une certaine durée. Lorsque le robot est reconnu dans cet état, une stratégie de forçage est déclenchée : le robot recule légèrement, puis effectue une accélération franche vers l’avant afin de franchir l’obstacle.
Puis rajouter l’appel de la fonction dans le code :