Système de contrôle dynamique de conduite de ballon pour robot de football à base de BLDC Arduino

Système de contrôle dynamique de conduite de ballon pour robot de football basé sur Arduino et moteurs BLDC

Ce système intégré combine perception visuelle, modélisation dynamique et commmande de couple souple des moteurs BLDC (Brushless DC) en temps réel. Son objectif est de faire évoluer le robot de la simple « poursuite du ballon » vers une « maîtrise du ballon », en utilisant un réglage précis du couple moteur pour assurer une protection stable et une évasion dynamique lors des confrontations.

Principales caractéristiques techniques

1. Modélisation de la sensibilité au ballon par fusion vision-force

Le système traite le ballon comme une composante de la dynamique du robot, et non comme une simple cible à suivre. Un asservissement visuel (Visual Servoing) est utilisé via une caméra embarquée (ex : OV7670+OpenMV) ou un système de vision globale pour calculer en temps réel la pose relative ballon-robot (distance d, angle θ). L'accent n'est pas seulement mis sur la position du ballon, mais aussi sur sa tendance de mouvement (vitesse de roulis, direction de rotation). Une relation de mappage « pose relative → couple moteur » est ensuite établie. Par exemple, lorsque le ballon se trouve sur le côté avant du robot, le moteur BLDC du côté correspondant applique un léger couple de freinage (Iq négatif) pour simuler une action de « crochet ». Lorsqu'il faut accélérer en conduisant le ballon, le système délivre un couple positif tout en maintenant le ballon dans une « zone idéale » située vers l'avant.

2. Commande d'interaction souple pilotée par FOC pour BLDC

La conduite du ballon exige que le moteur commute rapidement entre l'entraînement et la rétention. Le FOC (Field Oriented Control) est l'actionneur clé pour cela. En mode d'impédance, le moteur ne vise pas un suivi de vitesse strict mais se comporte comme un système virtuel ressort-amortisseur. Lorsque le ballon touche la roue, le moteur, via la boucle de courant (Iq), permet un léger déplacement pour absorber l'impact et éviter de faire rebondir le ballon. Les moteurs BLDC doivent également supporter la freinage par récupération (Regenerative Braking). Lors d'arrêts brusques ou de changements de direction, le moteur se transforme instantanément en générateur pour dissiper rapidement l'énergie cinétique du ballon, créant un effet de « collage » du ballon.

3. Coopération dynamique du centre de gravité et du différentiel

La conduite du ballon n'est pas un mouvement linéaire, mais un équilibre dynamique. La répartition du couple pour la direction différentielle permet des virages à petit rayon grâce à la différence de couple (ΔTorque) entre les roues gauche et droite. À haute vitesse, en intégrant l'angle de tangage de l'IMU, le centre de gravité est ajusté dynamiquement (en modifiant la répartition du couple) pour éviter de « lever le nez » et de perdre le ballon lors des accélérations. Une stratégie anti-perturbation est également implémentée : lorsqu'une collision latérale est détectée (par un pic soudain de vitesse angulaire de l'IMU ou de courant), le système active immédiatement un « mode protection du ballon ». Le moteur du côté de la collision augmente son couple et accélère dans la direction opposée, utilisant l'inertie de la carrosserie pour contrer l'impact et conserver la possession.

4. Stratégie de conduite pilotée par machine à états

Une machine à états finis (FSM) est construite sur l'Arduino pour gérer la logique complexe de la conduite. Les états comprennent : Recherche (pas de ballon, balayage sectoriel), Attraper (le ballon approche, ralentissement et ajustement de la posture pour que le ballon entre dans la zone de contrôle), Conduire (état principal, fonctionnement de la boucle fermée vision-couple) et Percée (défense détectée, déclenchement de fausses manœuvres comme un arrêt brusque changement de direction).

Scénarios d'application typiques

Cette architecture est pertinente pour les compétitions de type RoboCup (petite ligue ou humanoïde), où une précision millimétrique de contrôle du ballon est requise dans un contexte de confrontation à haute vitesse. La réponse rapide des moteurs BLDC (boucle de courant ≥ 10 kHz) constitue un avantage décisif face aux systèmes pilotés par servomoteurs.

Dans un contexte de recherche et d'éducation universitaire, cette plateforme à faible coût est idéale pour la validation d'algorithmes d'apprentissage par renforcement (RL) ou de commande prédictive (MPC). Elle offre plus de réalisme qu'une simulation tout en étant plus sûre qu'un robot à échelle réelle.

Enfin, le système de conduite peut être transposé à des applications de manutention (par exemple, déplacer des caisses dans un entrepôt via une commande souple pour éviter les dommages causés par les chocs).

Notes d'implémentation pratique (points clés)

  • Sélection du matériel : Un MCU comme l'Arduino Uno (AVR) est inadapté. Le traitement visuel et le calcul du FOC pour deux moteurs sont très exigeants. Il est fortement recommandé d'utiliser un ESP32-S3 (double cœur, pour séparer les tâches vision et moteurs) ou un STM32F4 (avec FPU). Des encodeurs à haute résolution (≥ 1000 lignes) sont indispensables car le FOC sans capteur présente de grandes erreurs d'observation aux basses vitesses et lors des arrêts brusques, ce qui entraînerait des pertes de ballon. Le refroidissement des pilotes (ex : DRV8313) est crucial en raison des courents de pointe fréquents lors de la conduite.
  • Compensation du délai vision-contrôle : Si un hôte (PC) traite les images, il faut synchroniser via des horodatages et ajouter un filtre prédictif (comme un filtre de Kalman) côté Arduino pour compenser le délai de communication (typiquement 50-100 ms). Pour une vision locale (ex : OpenMV), il faut réduire la résolution (ex : QQVGA) et optimiser les algorithmes pour garantir un cycle de contrôle ≤ 30 ms.
  • Calibrage des paramètres dynamiques : Les coefficients de « viscosité » virtuelle (Kp, Kd) du système ressort-amortisseur doivent être calibrés par essais. Des valeurs trop faibles provoquent un glissement du ballon ; des valeurs trop élevées rendent l'action rigide, énergivore et vulnérable aux interceptions. L'adaptation aux différents revêtements de sol (moquette, parquet) avec des coefficients de friction variables nécessite une loi d'adaptation, par exemple via un test initial de poussée légère pour ajuster automatiquement les paramètres de mappage.
  • Sécurité et mécanismes de tolérance aux pannes : La détection de perte de ballon (vision perdue et feedback d'encodeur sans résistance) doit basculer immédiatement vers l'état « Recherche » pour éviter que le robot ne tourne à vide ou n'entre en collision. Des limites strictes de courant maximal des moteurs doivent être définies pour éviter la combustion des pilotes en cas de blocage mécanique, avec un déclenchement du mode de décroissance rapide (Fast Decay).
  • Optimisation mécanique : La surface de contact avec le ballon (roue ou mécanisme) doit être en matériau à haute friction (silicone, revêtement PTFE) avec une structure concave pour augmenter la stabilité. Les éléments lourds (batterie) doivent être placés bas et près des roues motrices pour abaisser le centre de gravité et améliorer la stabilité contre les chocs.

Exemples de code réimplémentés

Exemple 1 : Commande de suivi par conduite différentielle basée sur PID

Cet exemple récupère la position relative du ballon (via capteur ultrason ou vision) et utilise un algorithme PID pour ajuster dynamiquement la vitesse des roues permettant au robot de suivre et de « pousser » le ballon de manière fluide.

#include <SimpleFOC.h>

BLDCMotor leftDrive = BLDCMotor(7);
BLDCMotor rightDrive = BLDCMotor(7);
// ... Initialisation des pilotes et encodeurs ...

float desiredDistance = 20.0;
float kP = 2.0, kI = 0.1, kD = 0.5;
float errorIntegral = 0, previousError = 0;

void setup() {
  leftDrive.init(); leftDrive.initFOC();
  rightDrive.init(); rightDrive.initFOC();
}

void loop() {
  leftDrive.loopFOC(); rightDrive.loopFOC();
  
  float ballDistance = readBallSensor();
  float distanceError = desiredDistance - ballDistance;
  
  errorIntegral += distanceError;
  float errorDerivative = distanceError - previousError;
  float speedOutput = kP * distanceError + kI * errorIntegral + kD * errorDerivative;
  
  float lateralOffset = readLateralOffset(); // Ex: décalage horizontal du ballon dans le champ de vision
  float turnFactor = lateralOffset * 1.5;
  
  float leftCommand = constrain(speedOutput - turnFactor, -5.0, 5.0);
  float rightCommand = constrain(speedOutput + turnFactor, -5.0, 5.0);
  
  leftDrive.move(leftCommand);
  rightDrive.move(rightCommand);
  previousError = distanceError;
  delay(10);
}

float readBallSensor() { return 25.0; } // Fonction simulée
float readLateralOffset() { return 5.0; } // Fonction simulée

Exemple 2 : Système d'arrêt d'urgence par fusion multi-capteurs

Cet exemple ajoute des capteurs ultrason avant/arrière pour créer une « boîte de sécurité ». Dès qu'un obstacle imprévu est détecté, un arrêt d'urgence est déclenché, prioritaire sur la logique de suivi.

#include <NewPing.h>

NewPing frontSensor(2, 3, 200); // Capteur avant (direction de conduite)
NewPing rearSensor(4, 5, 200);  // Capteur arrière

const int STOP_FRONT = 30;
const int STOP_REAR = 20;
int baseMotion = 0;

void loop() {
  delay(50);
  unsigned int frontDist = frontSensor.ping_cm();
  unsigned int rearDist = rearSensor.ping_cm();
  
  // Logique de sécurité prioritaire
  if ((frontDist > 0 && frontDist < STOP_FRONT) || (rearDist > 0 && rearDist < STOP_REAR)) {
    baseMotion = 0;
    driveMotors(0, 0);
    return;
  }
  
  // Logique de suivi normal (simplifiée)
  if (frontDist > 0 && frontDist < 100) {
    if (frontDist > desiredDistance) {
      baseMotion = 150; // Approcher pour conduire
    } else {
      baseMotion = 0;   // Maintenir la distance
    }
    driveMotors(baseMotion, baseMotion);
  }
}

void driveMotors(int left, int right) {
  // Contrôler les moteurs BLDC gauche et droit
}

Exemple 3 : Allocation de couple vectoriel pour l'anti-patinage et l'optimisation énergétique

Cet exemple détecte le patinage en surveillant la différence de vitesse entre les roues et y remédie par une compensation du couple. Il ajuste aussi la limite de courant en fonction de l'état de mouvement.

#include <SimpleFOC.h>
// ... Initialisation de leftDrive, rightDrive ...

float antiSlipGain = 0.1;
float slipThreshold = 0.5;
enum MotionState { ACCELERATING, CRUISING, TURNING };
MotionState currentState = CRUISING;

void loop() {
  leftDrive.loopFOC(); rightDrive.loopFOC();
  
  float mainThrust = 1.0;
  float steeringInput = 0.2;
  
  // Allocation initiale
  float torqueDelta = mainThrust * steeringInput;
  float leftTorqueTarget = mainThrust - torqueDelta;
  float rightTorqueTarget = mainThrust + torqueDelta;
  
  // Compensation anti-patinage
  float velocityDiff = rightDrive.shaft_velocity - leftDrive.shaft_velocity;
  if (abs(velocityDiff) > slipThreshold) {
    float compensation = antiSlipGain * velocityDiff;
    leftTorqueTarget += compensation;  // Couper plus de couple à la roue lente
    rightTorqueTarget -= compensation; // Réduire le couple de la roue rapide
  }
  
  // Optimisation énergétique dynamique
  currentState = (abs(steeringInput) > 0.3) ? TURNING : CRUISING;
  switch (currentState) {
    case TURNING:
      leftDrive.current_limit = 3.0;
      rightDrive.current_limit = 3.0;
      break;
    case CRUISING:
      leftDrive.current_limit = 2.0;
      rightDrive.current_limit = 2.0;
      break;
  }
  
  leftDrive.move(leftTorqueTarget);
  rightDrive.move(rightTorqueTarget);
  delay(10);
}

Concepts clés interprétés

Le FOC (Field Oriented Control) est la pierre angulaire d'une conduite précise. En contrôlant directement le courant de l'axe q (le couple), il élimine les à-coups et les vibrations à très basse vitesse, essentiels pour une conduite souple et réactive.

La fusion multi-capteurs construit une enveloppe de sécurité dynamique. En combinant des capteurs avant, arrière et latéraux (ultrasons, infrarouge, force), le système crée un périmètre de sécurité temps réel. La logique d'évitement d'obstacles doit toujours avoir une priorité plus élevée que la logique d'attaque. Dès qu'un obstacle (autre que le ballon) est détecté, un arrêt ou une manœuvre d'évitement doit être immédiatement déclenché.

L'algorithme PID avec commande différentielle assure des trajectoires fluides. En transformant l'erreur de distance en commande de vitesse de châssis, il permet au robot de décélérer en douceur à l'approche du ballon. La direction différentielle (basée sur le décalage latéral du ballon) permet des trajectoires extrêmement lisses, évitant de perdre le ballon.

L'allocation de couple vectoriel résout le patinage à haute vitesse. En lisant en temps réel la différence de vitesse entre les roues via les encodeurs, un simple contrôleur P calcule un couple de compensation. En appliquant ce couple à la roue qui patine, le système supprime efficacement le glissement et assure la stabilité lors des changements de direction à haute vitesse.

La programmation non bloquante et la garantie du temps réel sont cruciales. Dans le contrôle dynamique, le cycle de contrôle doit être strictement fixe (ex : 1ms ou 10ms). L'utilisation de la fonction delay() est strictement interdite dans la boucle principale car elle bloque la lecture des capteurs et le calcul des algorithmes FOC, rendant le robot réactif et incontrôlable. Il faut utiliser millis() ou des interruptions de timer matériel pour déclencher la logique de contrôle et assurer la synchronisation en temps réel.

Exemples additionnels de contrôle de la conduite du ballon

Contrôle en boucle fermée de position pour le mécanisme de conduite basé sur la vision : Dans ce scénario, le mécanisme de conduite (palette ou roue) est contrôlé en position via son moteur BLDC pour maintenir un contact précis avec le ballon alors que la position relative change (ballon qui roule, robot en virage). Un contrôle PID de position ajuste l'angle du mécanisme pour compenser l'écart détecté par la caméra et d'autres capteurs.

Ajustement dynamique de la vitesse et du couple basé sur l'état de mouvement : Lorsque le robot accélère, la vitesse de rotation du mécanisme de conduite est augmentée pour empêcher le ballon de tomber en arrière. Lors des freinages, le couple est réduit pour éviter que le ballon ne rebondisse vers l'avant. En virage, la direction et le couple sont ajustés pour que le ballon suive la trajectoire. Un capteur de force peut être intégré pour maintenir une force de contact constante et optimale.

Compensation dynamique anti-interférence pour la conduite en confrontation : Lors d'une poussée ou d'un choc latéral d'un adversaire, le système de conduite doit réagir pour amortir l'impact et maintenir le ballon. Des capteurs de force multidimensionnels et l'IMU détectent l'intensité et la direction de la perturbation. Le couple et la vitesse du moteur de conduite sont alors ajustés dynamiquement pour contrebalancer la force externe, par exemple en augmentant le couple de contact lors d'une poussée ou en inversant la direction de rotation latérale lors d'un choc de côté.

Remarque importante : Ces exemples de code sont fournis à titre d'illustration conceptuelle et de piste de réflexion. Ils ne garantissent pas une crorection absolue, une adaptation à tous les scénarios ou une compilation directe. En raison des différences de plateforme matérielle, de contexte d'utilisation et de version d'Arduino, leur adaptabilité et leur utilisation peuvent varier. Lors du développement pratique, il est impératif d'effectuer des ajustements ciblés basés sur sa propre configuration matérielle, ses besoins fonctionnels spécifiques et de valider l'efficacité par des tests répétés. Il faut également s'assurer du câblage matériel correct et comprendre à fond les spécifications techniques des capteurs et actionneurs utilisés.

Étiquettes: arduino BLDC FOC Robot football Contrôle moteur

Publié le 15 juin à 05h59