Algorithme de Suivi de Ligne & Évitement
Explication détaillée de la logique décisionnelle, de la boucle de rétroaction PID et du protocole d'évitement d'obstacles.
Résumé de l'Approche
Le système d'intelligence embarqué du robot THE WINNERS repose sur une boucle d'asservissement en temps réel. Le robot lit les états des capteurs infrarouges de sol pour déterminer sa déviation angulaire et latérale par rapport à une ligne noire tracée sur fond clair. Si un obstacle frontal est détecté par le capteur de distance à ultrasons, le programme interrompt le suivi pour effectuer une manœuvre d'évitement latérale pré-calculée avant de ré-acquérir la ligne.
Hypothèses Matérielles
- Capteurs IR : 5 capteurs phototransistors disposés en ligne frontale perpendiculaire à la trajectoire.
- Capteur de distance : Sonar ultrasonique frontal HC-SR04 pour l'évitement d'obstacle.
- Motorisation : Propulsion différentielle constituée de deux moteurs CC pilotés en modulation de largeur d'impulsion (PWM).
- Microcontrôleur : Raspberry Pi Pico (RP2040) gérant la logique temps réel.
Algorithme PID (Régulation Pondérée)
L'erreur de position par rapport à la ligne est calculée à chaque itération en appliquant des coefficients de pondération aux 5 capteurs :
Erreur = (-2 * L2 - 1 * L1 + 0 * C + 1 * R1 + 2 * R2) / (Somme des lectures)
Cette erreur alimente ensuite le régulateur PID pour calculer le correctif différentiel :
- ⚡ Terme Proportionnel (P) : Kp * Erreur (correction directe instantanée).
- ⚡ Terme Intégral (I) : Ki * Somme des erreurs (élimine l'erreur statique en courbe).
- ⚡ Terme Dérivé (D) : Kd * (Erreur - Erreur_Précédente) (anticipe les virages brusques et amortit les oscillations).
Gestion d'Évitement d'Obstacle
La machine à états finis du robot est structurée ainsi :
NORMAL
Suivi de ligne via PIDOBSTACLE
Arrêt + manœuvre de contournementRÉ-ACQUISITION
Recherche active de la ligneProtocole de contournement : Le robot s'arrête, tourne à droite à 45°, avance en ligne droite pour contourner l'obstacle, effectue un virage à gauche à 90° pour dépasser l'obstacle, puis pivote à gauche pour recouper la piste et ré-engager le suivi normal.
Pseudocode Global de la Boucle
while (true) {
// 1. Évitement prioritaire
dist = readUltrasonicDistance();
if (dist < 15) {
state = STATE_OBSTACLE;
}
// 2. Machine à états
switch (state) {
case STATE_NORMAL:
readIRSensors();
error = calculateWeightedError();
correction = computePID(error);
setMotors(baseSpeed + correction, baseSpeed - correction);
break;
case STATE_OBSTACLE:
stopMotors();
executeContourManœuvre();
state = STATE_REACQUISITION;
break;
case STATE_REACQUISITION:
setMotors(slowSearchSpeed, -slowSearchSpeed); // Pivot de recherche
if (lineDetected()) {
state = STATE_NORMAL;
clearPIDState();
}
break;
}
}