LYCÉE → PRÉPA · L21

Module L21 · Partie I · Robotique et systèmes embarqués

Décider comment bouger : cinématique, planification, commande.

Le robot sait où il est et voit les obstacles. Reste à choisir une trajectoire réalisable, puis à la suivre malgré les perturbations. Ce module relie trois disciplines : la cinématique (comment les moteurs déplacent le robot), la planification de mouvement (trouver un chemin dans un espace continu avec obstacles : RRT, fenêtre dynamique), et la commande (PID revisité, LQR, MPC : la théorie du contrôle que la prépa aborde en SI et que les ingénieurs utilisent partout).

Durée : 4 séances · Prérequis : L10, L12, L16, séances 27-29. Objectifs : modèles cinématiques (différentiel, Ackermann, holonome, bras), espace des configurations, RRT/RRT*, lissage, fenêtre dynamique, suivi de trajectoire (pure pursuit), analyse de stabilité (pôles), LQR, MPC, limites d’actionneurs et sécurité.

Ce que vous saurez faire à la fin
  • Écrire la cinématique directe et inverse d’un robot différentiel et d’un bras plan.
  • Planifier un chemin sans collision par RRT dans un espace continu.
  • Concevoir un LQR pour un pendule inversé et un MPC pour un robot avec contraintes.
  • Analyser la stabilité d’une boucle fermée par ses valeurs propres.

Références : Modern Robotics (Lynch & Park, gratuit), Planning Algorithms (LaValle, gratuit), cours « Underactuated Robotics » (Tedrake, MIT, gratuit), Feedback Systems (Åström & Murray, gratuit).

Fiche de cours · Définitions

Planification et contrôle : définitions

Définition (espace des configurations). Une configuration q décrit complètement la position du robot (2 ou 3 coordonnées pour un mobile, n angles pour un bras à n articulations). Clibre = configurations sans collision. Planifier = trouver un chemin continu dans Clibre de qdépart à qbut. Un obstacle du plan devient une région de C obtenue par « gonflement » (somme de Minkowski) pour un robot circulaire.
Définition (planificateurs). Sur grille : A*, D* (replanification). Par échantillonnage : PRM (graphe de configurations aléatoires reliées si le segment est libre), RRT (arbre qui croît vers des échantillons aléatoires), RRT* (asymptotiquement optimal). Complétude probabiliste : si une solution existe, la probabilité de la trouver tend vers 1 avec le nombre d’échantillons.
Définition (système dynamique, état, commande). ẋ = f(x, u) (temps continu) ou xk+1 = f(xk, uk). Linéaire : ẋ = Ax + Bu. Point d’équilibre : f(x*, u*) = 0. Stabilité : les trajectoires proches restent proches (Lyapunov) ; asymptotique : elles convergent. Pour un système linéaire : stable ⇔ toutes les valeurs propres de A ont une partie réelle < 0 (temps discret : module < 1).
Définition (PID). u = Kpe + Ki∫e dt + Kd de/dt, e = consigne − mesure. P : réaction proportionnelle (erreur statique résiduelle) ; I : annule l’erreur statique (risque d’oscillation, windup) ; D : anticipe (amortit, sensible au bruit).
Définition (commande optimale, LQR, MPC). LQR : pour ẋ = Ax + Bu, minimiser ∫(xᵀQx + uᵀRu)dt ; la solution est u = −Kx avec K issu de l’équation de Riccati. MPC : à chaque pas, résoudre un problème d’optimisation sur un horizon N sous contraintes (états, commandes), appliquer la première commande, recommencer.
Définition (fenêtre dynamique, DWA). Choisir (v, ω) parmi les vitesses atteignables au prochain pas (limites d’accélération), en simulant chaque candidate sur un court horizon et en notant : distance au chemin/but, dégagement des obstacles, vitesse.

Fiche de cours · Formules

Formules à connaître

Robot différentiel (unicycle) : ẋ = v cos θ, ẏ = v sin θ, θ̇ = ω ; non holonome (ne peut pas se déplacer latéralement)
Linéarisation autour de (x*, u*) : ẋ ≈ A δx + B δu avec A = ∂f/∂x, B = ∂f/∂u évalués à l’équilibre
Système du second ordre : ẍ + 2ζωnẋ + ωn²x = ωn²r ; dépassement = e−πζ/√(1−ζ²) ; temps de réponse à 2 % ≈ 4/(ζωn)
Régulateur P sur un intégrateur ẋ = u, u = −Kp(x − r) : ẋ = −Kp(x − r), convergence exponentielle en τ = 1/Kp
Ziegler-Nichols (à partir du gain ultime Ku et de la période Tu d’oscillation) : Kp = 0,6Ku, Ki = 1,2Ku/Tu, Kd = 0,075KuTu
Riccati (temps continu) : AᵀP + PA − PBR⁻¹BᵀP + Q = 0 ; K = R⁻¹BᵀP ; boucle fermée ẋ = (A − BK)x
Lyapunov : V(x) > 0 pour x ≠ 0, V(0) = 0, V̇(x) = ∇V·f(x) < 0 ⇒ équilibre asymptotiquement stable
Suivi de chemin « pure pursuit » : ω = 2v sin α / Ld (α : angle vers le point cible à distance Ld)
RRT : coût par itération O(log n) avec kd-tree ; RRT* rayon de connexion rn = γ(log n / n)1/d

Fiche de cours · Théorèmes et démonstrations

Démonstrations à savoir refaire (1/2)

Théorème 1 (stabilité d’un système linéaire). ẋ = Ax est asymptotiquement stable si et seulement si toutes les valeurs propres de A ont une partie réelle strictement négative.
(Cas diagonalisable.) A = PDP⁻¹ ; posons y = P⁻¹x : ẏ = Dy, donc yi(t) = yi(0)eλit. |eλt| = eRe(λ)t → 0 ssi Re λ < 0. x = Py tend vers 0 ssi tous les yi le font. (Le cas non diagonalisable ajoute des facteurs polynomiaux tkeλt, qui tendent aussi vers 0 si Re λ < 0.) Temps discret : xk = Akx₀, λk → 0 ssi |λ| < 1. Application : un régulateur u = −Kx est stabilisant ssi les valeurs propres de A − BK sont dans le demi-plan gauche — on peut les placer (si (A, B) est commandable) : c’est le placement de pôles.
Théorème 2 (Lyapunov, version directe). Si V est C¹, définie positive (V(0) = 0, V(x) > 0 sinon) et V̇ = ∇V(x)·f(x) < 0 pour x ≠ 0, alors l’équilibre 0 de ẋ = f(x) est asymptotiquement stable.
(Idée.) V décroît strictement le long de toute trajectoire non nulle : V(x(t)) est décroissante et minorée par 0, donc converge vers une limite c ≥ 0. Si c > 0, la trajectoire reste dans la couronne {c ≤ V ≤ V(x₀)}, compacte, où V̇ ≤ −δ < 0 (continuité sur un compact), donc V(x(t)) ≤ V(x₀) − δt → −∞ : contradiction. Donc c = 0 et x(t) → 0. Exemple : pendule amorti θ̈ = −sin θ − bθ̇, V = ½θ̇² + (1 − cos θ) (énergie) : V̇ = θ̇θ̈ + sin θ·θ̇ = −bθ̇² ≤ 0 (semi-définie ; LaSalle conclut). Pour un régulateur, V = xᵀPx avec P solution de Lyapunov AᵀP + PA = −Q donne V̇ = −xᵀQx < 0.
Théorème 3 (l’action intégrale annule l’erreur statique). Pour un système stable en boucle fermée avec régulateur PI et consigne constante, l’erreur en régime permanent est nulle, même en présence d’une perturbation constante.
En régime permanent, toutes les dérivées sont nulles ; la commande u = Kpe + Ki∫e dt est constante, donc d/dt(∫e) = e = 0 — sinon l’intégrale, et donc u, continueraient à varier. L’intégrateur « cherche » la valeur de u qui annule e, quelle que soit la perturbation constante (pente, charge). Avec un P seul, u = Kpe : compenser une perturbation d exige e = d/Kp ≠ 0. Contrepartie : l’intégrale ajoute un pôle en 0 et un retard de phase qui peuvent déstabiliser (d’où Ki modéré et anti-windup).

Fiche de cours · Théorèmes et démonstrations

Démonstrations à savoir refaire (2/2)

Théorème 4 (LQR : le retour d’état optimal est linéaire). Pour xk+1 = Axk + Buk et le coût Σk (xkᵀQxk + ukᵀRuk) sur un horizon N, la commande optimale est uk = −Kkxk avec Kk = (R + BᵀPk+1B)⁻¹BᵀPk+1A, et le coût optimal depuis xk est xkᵀPkxk (récurrence de Riccati à rebours, PN = Q).
Programmation dynamique (L04, L16) : notons Jk(x) le coût optimal restant. Hypothèse de récurrence : Jk+1(x) = xᵀPk+1x. Alors Jk(x) = minu [xᵀQx + uᵀRu + (Ax + Bu)ᵀPk+1(Ax + Bu)]. Le crochet est quadratique convexe en u ; dérivée nulle : 2Ru + 2BᵀPk+1(Ax + Bu) = 0 ⇒ u = −(R + BᵀPk+1B)⁻¹BᵀPk+1A·x = −Kkx. En substituant, Jk(x) = xᵀ[Q + AᵀPk+1A − AᵀPk+1B(R + BᵀPk+1B)⁻¹BᵀPk+1A]x = xᵀPkx : quadratique, l’hypothèse se propage. Initialisation JN = xᵀQx. Quand N → ∞, Pk converge vers la solution de l’équation de Riccati algébrique et K devient constant. LQR n’est donc rien d’autre que l’itération de valeur sur un MDP linéaire-quadratique.
Théorème 5 (complétude probabiliste de RRT — énoncé et idée). Si Clibre est connexe entre départ et but avec un chemin de « largeur » δ > 0, la probabilité que RRT n’ait pas atteint le but après n itérations décroît exponentiellement en n.
(Idée.) Couvrir le chemin par des boules de rayon δ/2 ; l’arbre atteint la boule suivante dès qu’un échantillon y tombe alors que l’arbre contient déjà un point de la boule courante (l’extension vers l’échantillon reste dans Clibre par construction des boules). Chaque boule a une probabilité p > 0 d’être échantillonnée ; le nombre d’itérations pour franchir les m boules est une somme de m géométriques : P(échec après n) ≤ m·(1 − p)n/m. RRT trouve un chemin, pas le plus court : RRT* rebranche localement et converge vers l’optimal (Karaman & Frazzoli 2011) au prix d’un facteur log n.
Théorème 6 (un robot non holonome ne peut pas suivre tout chemin). L’unicycle ne peut pas suivre un chemin qui présente une composante latérale instantanée ; mais tout chemin de Clibre peut être approché par une suite de manœuvres (le système est commandable, crochet de Lie [g₁, g₂] ≠ 0).
Les vitesses admissibles sont (v cos θ, v sin θ, ω) : le déplacement latéral (−sin θ, cos θ, 0) n’est pas dans leur espace vectoriel. Mais avancer, tourner, reculer, tourner (créneau) produit un déplacement net latéral au second ordre — l’argument formel est que le crochet de Lie des champs g₁ = (cos θ, sin θ, 0) et g₂ = (0, 0, 1) vaut (sin θ, −cos θ, 0), qui complète l’espace : condition de rang de Chow. Conséquence pratique : planifier dans (x, y) puis lisser avec des courbes réalisables (Dubins, Reeds-Shepp), ou planifier directement dans l’espace d’état avec les primitives de mouvement.

Fiche de cours · Méthodes

Méthodes et pièges

Méthode — régler un PID à la main. Ki = Kd = 0. Augmenter Kp jusqu’à une réponse rapide avec léger dépassement. Ajouter Kd pour amortir. Ajouter Ki juste assez pour supprimer l’erreur statique ; borner l’intégrale (anti-windup) ; filtrer la dérivée (passe-bas, ou dériver la mesure plutôt que l’erreur pour éviter le coup de pied à chaque changement de consigne). Tester sur des échelons et des rampes, avec perturbation.
Méthode — pile de navigation. Carte → planificateur global (A* sur grille gonflée, ou RRT*) → chemin → lissage → suivi local (pure pursuit ou DWA, avec évitement) → commande (v, ω) → boucle bas niveau (PID vitesse des roues à 100 Hz–1 kHz). Chaque couche à sa fréquence ; la sécurité (arrêt d’urgence sur distance minimale) court-circuite tout.
Méthode — passer de la simulation au réel. Identifier les paramètres (constante de temps du moteur, retard) par une réponse à l’échelon ; inclure retard et saturation dans le simulateur ; régler avec marge (un retard de 50 ms réduit la marge de phase de 18° à 1 Hz) ; commencer avec des gains faibles.

Pièges : dériver un signal bruité sans filtre ; windup de l’intégrale pendant une saturation ; gains réglés sans tenir compte de la période d’échantillonnage (Ki·Ts) ; chemin de A* qui frôle les murs (gonfler par le rayon + marge) ; DWA qui oscille entre deux candidats (hystérésis) ; oublier la non-holonomie (chemin impossible) ; LQR sans contraintes qui demande une commande irréalisable (saturer, ou passer au MPC).

Fiche de cours · Exercices corrigés

Exercices corrigés

Exercice 1. Moteur modélisé par ω̇ = −aω + bu avec a = 5 s⁻¹, b = 10. Régulateur P : u = Kpref − ω). Donner la constante de temps en boucle fermée et l’erreur statique pour Kp = 1 et 5 ; puis avec un PI, montrer que l’erreur statique est nulle et donner la condition de stabilité.
Correction. Boucle fermée : ω̇ = −(a + bKp)ω + bKpωref ; pôle −(a + bKp), τ = 1/(a + bKp) : Kp = 1 → τ = 1/15 = 67 ms ; Kp = 5 → 18 ms. Régime permanent : ω = bKpωref/(a + bKp) ; erreur relative a/(a + bKp) : 33 % (Kp = 1), 9 % (Kp = 5). PI : u = Kpe + Ki∫e ; en dérivant, ω̈ = −aω̇ + b(Kpė + Kie) ; avec e = ωref − ω constant en consigne : ë + (a + bKp)ė + bKie = 0. Polynôme s² + (a + bKp)s + bKi : stable ssi tous les coefficients > 0 (Routh, degré 2), c’est-à-dire Ki > 0 et a + bKp > 0 — toujours vrai ici ; en régime permanent e → 0 (Théorème 3). Amortissement ζ = (a + bKp)/(2√(bKi)) : pour ζ = 0,7 avec Kp = 1, Ki = 15²/(4·0,49·10) ≈ 11,5.
Exercice 2. Pendule inversé linéarisé : ẍ = u, θ̈ = θ + u (unités normalisées). Montrer que le système est instable en boucle ouverte et proposer un retour d’état u = −k₁θ − k₂θ̇ qui place les pôles de la dynamique de θ en −2 et −3.
Correction. Boucle ouverte : θ̈ − θ = 0, pôles ±1 : un pôle à partie réelle positive, instable (le pendule tombe). Avec u = −k₁θ − k₂θ̇ : θ̈ = θ − k₁θ − k₂θ̇ ⇒ θ̈ + k₂θ̇ + (k₁ − 1)θ = 0 ; polynôme souhaité (s + 2)(s + 3) = s² + 5s + 6 : k₂ = 5, k₁ = 7. Vérification : gains positifs (on pousse le chariot dans le sens de la chute), réponse sans oscillation (pôles réels). Reste à stabiliser x (le chariot dérive) : ajouter −k₃x − k₄ẋ et placer 4 pôles, ou LQR sur l’état (x, ẋ, θ, θ̇) — voir le module.
Exercice 3. Grille 20×20, cellules de 10 cm, robot de rayon 15 cm, obstacles connus. Décrire précisément comment obtenir un chemin sûr et réalisable par un robot différentiel, et estimer le coût de calcul.
Correction. (1) Gonfler les obstacles de 15 cm + marge 5 cm = 2 cellules (dilatation morphologique) : le robot devient un point. (2) A* 8-connexe avec coûts 1 et √2, heuristique octile ; 400 cellules : < 1 ms. (3) Le chemin en escalier n’est pas lisse : lissage par suppression des points intermédiaires quand le segment direct est libre (« string pulling »), puis spline ou arcs. (4) Vérifier la courbure maximale contre la contrainte non holonome (l’unicycle peut tourner sur place : toute courbure est réalisable, mais à vitesse réduite dans les virages : v ≤ vmax, |ω| = v·κ ≤ ωmax). (5) Suivi par pure pursuit à 20 Hz avec Ld ≈ 30 cm, DWA ou arrêt si un obstacle imprévu apparaît dans le couloir de sécurité. Replanifier (D* Lite ou simplement A* à nouveau, 1 ms) dès que la carte change.

01 / Cinématique

Robot différentiel : des vitesses de roues à la trajectoire, et retour

Les familles de robots mobiles
TypeCommandesContrainteExemples
Différentielv, ω (2 roues)Non holonome ; tourne sur placeAspirateurs, TurtleBot
Ackermannv, angle de braquageNon holonome ; rayon minimalVoitures
Holonome (mecanum, omni)v_x, v_y, ωAucune : peut aller de côtéRobots de logistique
Quadrupède / bipèdeCouples des articulationsContacts intermittents, équilibreSpot, Atlas
Drone4 pousséesSous-actionné : 4 entrées pour 6 degrés de libertéQuadrirotors

01 / Cinématique

Bras articulé : espace des configurations et espace de travail

La planification se fait dans l’espace des configurations (les angles), pas dans l’espace de travail : un obstacle simple y devient une région compliquée, mais le robot y est un point. Pour un bras à 7 axes, l’espace a 7 dimensions et on ne peut plus le quadriller : il faut échantillonner.

02 / Planifier

RRT : explorer un espace continu par un arbre aléatoire

Pourquoi échantillonner

Le RRT (LaValle, 1998) ne quadrille pas l’espace : il tire des points au hasard et étend l’arbre vers eux. Il est probabilistement complet (s’il existe un chemin, la probabilité de le trouver tend vers 1) et fonctionne en dimension 7, 12 ou 30 — là où A* sur une grille est impossible. Le chemin est mauvais (en zigzag) : d’où le lissage, ou RRT* qui recâble l’arbre pour converger vers l’optimal. Les contraintes cinématiques (voiture qui ne tourne pas sur place) s’intègrent en remplaçant « segment droit » par « arc réalisable » : kinodynamic RRT. En pratique : OMPL (dans MoveIt pour les bras) et les planificateurs de Nav2.

02 / Planifier

Fenêtre dynamique : choisir (v, ω) à chaque instant en simulant

La fenêtre dynamique respecte les limites physiques (accélérations) et réagit aux obstacles imprévus, mais elle est myope : elle peut rester coincée dans un cul-de-sac. D’où l’architecture à deux niveaux de Nav2 (module L20) : planificateur global (A*, RRT) pour la stratégie, planificateur local (DWA, MPPI) pour la tactique et la sécurité. Le score à trois termes est un choix de conception : chaque poids est un compromis.

03 / Contrôler

Suivre une trajectoire : pure pursuit et retour d’état

Du PID au retour d’état

Pure pursuit est un contrôleur géométrique simple et robuste (voitures autonomes DARPA 2005). Plus généralement, un contrôleur est une fonction u = k(x) de l’état vers la commande. Le PID (séance 29) est un retour sur l’erreur et ses dérivée/intégrale ; le retour d’état u = −Kx utilise tout l’état estimé (module L19). La question centrale : comment choisir K pour que le système bouclé soit stable et performant ? Réponse dans les deux slides suivantes.

03 / Contrôler

Stabilité et placement de pôles : où sont les valeurs propres ?

En continu, stable ⇔ parties réelles négatives ; en discret, ⇔ modules < 1. Plus les pôles sont « à l’intérieur », plus la réponse est rapide — mais plus la commande est violente, jusqu’à saturer l’actionneur (et là, l’analyse linéaire ne vaut plus rien : K = [200, 3] est stable sur le papier et diverge en pratique). Le placement de pôles choisit K pour des pôles voulus (formule d’Ackermann) ; le LQR choisit les pôles pour vous, selon un compromis explicite.

03 / Contrôler

LQR : le meilleur compromis entre précision et effort

Riccati = Bellman pour un système linéaire à coût quadratique

Le LQR est l’apprentissage par renforcement (module L16) résolu exactement : la fonction de valeur est quadratique V(x) = xᵀPx, l’équation de Bellman devient l’équation de Riccati, et la politique optimale est linéaire u = −Kx. Il est robuste (marge de gain infinie, marge de phase ≥ 60° en continu), facile à régler (Q et R ont un sens physique), et c’est le contrôleur des fusées, des drones et des Segways. Ses limites : linéaire (autour d’un point de fonctionnement), sans contraintes (la saturation n’est pas vue). Pour cela : MPC.

03 / Contrôler

MPC : optimiser un horizon, appliquer le premier pas, recommencer

Ce que le MPC apporte, et ce qu’il coûte

Le MPC voit les contraintes (actionneurs, obstacles, vitesses max) et l’avenir prévu (trajectoire de référence à venir) ; il gère naturellement le multivariable. C’est le contrôleur des raffineries depuis les années 1980, des voitures autonomes, des quadrupèdes de Boston Dynamics et des fusées SpaceX (atterrissage : MPC convexe). Le coût : résoudre une optimisation à chaque pas (1-100 ms) — d’où les solveurs spécialisés, le code généré (acados, CasADi), et MPPI (module L20 : version par échantillonnage, parallélisable sur GPU). Théorie : stabilité garantie sous conditions (coût terminal, ensemble terminal invariant) — sujet de recherche toujours actif, surtout pour le MPC non linéaire et le MPC appris.

04 / Sécurité

Le contrôleur ne suffit pas : limites, surveillance, arrêts

CoucheRôleExemple
LimitationSaturer vitesses, accélérations, couples avant les moteursvelocity_smoother, rampe de PWM
Bouclier (safety filter)Modifier au minimum la commande pour rester dans un ensemble sûrFonctions barrières de contrôle (CBF), zone de sécurité lidar
SurveillanceDétecter capteur en panne, dérive, timeoutNIS (L19), watchdog (L18), chien de garde de commande (arrêt si pas de /cmd_vel depuis 200 ms)
Arrêt d’urgenceMatériel, indépendant du logicielBouton coup-de-poing qui coupe l’alimentation des moteurs
VérificationProuver ou tester massivement avant déploiementSimulation Monte-Carlo (L11), atteignabilité, preuve (L09)

Principe : la sécurité ne dépend pas de la qualité du planificateur ni de l’IA. Chaque couche suppose que celle du dessus peut se tromper. Un robot dont la sécurité repose sur un réseau de neurones n’est pas sûr.

Cours

Cours 1 — Systèmes dynamiques linéaires : modèle d’état, discrétisation, réponse

Modèle d’état continu : ẋ = A x + B u, y = C x + D u. x : état (positions, vitesses, courants…), u : commandes, y : mesures. Toute équation différentielle linéaire d’ordre n se met sous cette forme avec n états (masse-ressort : x = (position, vitesse)). Réponse libre : x(t) = eAt x(0), somme de modes eλit ; stable ⇔ Re(λi) < 0.

Discrétisation à période T (le contrôleur numérique n’agit qu’aux instants kT, commande constante entre deux) : xk+1 = Ad xk + Bd uk avec Ad = eAT (exact, scipy.linalg.expm) et Bd = ∫0T e dτ B. Approximation d’Euler : Ad ≈ I + AT, Bd ≈ BT (valable si T ≪ constantes de temps). Les pôles discrets sont zi = eλiT : le demi-plan gauche devient l’intérieur du cercle unité.

GrandeurContinuDiscret
StabilitéRe λ < 0|z| < 1
Rapidité|Re λ| grand (constante de temps 1/|Re λ|)|z| petit (proche de 0 : réponse en quelques pas)
OscillationIm λ ≠ 0 (pulsation)z complexe (angle = pulsation × T)
Commandabilitérang [B, AB, A²B, …] = n : on peut placer les pôles où l’on veut (sinon, un mode est hors d’atteinte)
Observabilitérang [C ; CA ; CA² ; …] = n : on peut reconstruire l’état depuis y (sinon, un mode est invisible)

Cours

Cours 2 — Exemple travaillé : concevoir un contrôleur de vitesse de moteur, du PID au retour d’état

Ce qu’on retient. Le placement de pôles choisit la dynamique mais pas la commande (saturation possible) ; le LQR équilibre les deux ; un intégrateur est nécessaire pour rejeter une perturbation constante (comme le I du PID). Le vrai PID de la séance 29 est un cas particulier de retour d’état sur (erreur, ∫erreur, dérivée) — la théorie explique pourquoi il marche et comment le régler sans tâtonner.

Cours

Cours 3 — Planification de mouvement : garanties, coûts, et ce que RRT ne dit pas

MéthodeComplétudeOptimalitéCoût par requêteContraintes cinématiquesUsage
Grille + A*Complète à résolution fixéeOptimale sur la grilleO(cellules log)Difficiles (états augmentés)2D mobile, Nav2
PRM (roadmap probabiliste)ProbabilisteAsymptotique (PRM*)Précalcul lourd, requêtes rapidesMoyennesBras, environnements statiques, requêtes multiples
RRT / RRT-ConnectProbabilisteNonUne requête, rapideBonnes (kinodynamic)Bras 7 axes, planification unique
RRT* / Informed RRT*ProbabilisteAsymptotiquePlus lent (recâblage)BonnesQuand la qualité compte
Lattice (primitives de mouvement)Complète sur le latticeOptimale sur le latticeMoyenExactes (arcs précalculés)Voitures, Smac Planner
Optimisation de trajectoire (CHOMP, TrajOpt)LocaleLocaleMoyenExactesLisser/raffiner un chemin initial

Le coût réel est dans la détection de collision (90 % du temps d’un planificateur) : volumes englobants hiérarchiques (AABB, sphères), distances signées précalculées (L20), et pour un bras, tester chaque segment du bras contre chaque obstacle. Un planificateur est bon d’abord parce qu’il pose peu de questions de collision (RRT-Connect : deux arbres qui se rejoignent, très efficace).

TP guidé

TP — Identification, LQR et MPC sur un vrai moteur, puis un bras planifié (sur carte + PC, 4 h)

Exercices

Exercices auto-corrigés — cinématique et planification

Exercice 1 — Odométrie différentielle et son incertitude

odometrie(pose, ticks_g, ticks_d) : nouvelle pose à partir des ticks d’encodeurs (résolution TICKS_PAR_TOUR, rayon R_ROUE, entraxe L_ESSIEU), par intégration sur un arc exact. Puis incertitude(poses) : simulez 500 trajets « tout droit 2 m » avec ±2 % d’erreur aléatoire sur chaque roue et renvoyez l’écart-type latéral final — il doit être bien plus grand que l’écart-type longitudinal.

Correction
def odometrie(pose, tg, td):
    dg, dd = 2 * np.pi * R_ROUE * tg / TICKS_PAR_TOUR, 2 * np.pi * R_ROUE * td / TICKS_PAR_TOUR
    d, dth = (dg + dd) / 2, (dd - dg) / L_ESSIEU; x, y, th = pose
    if abs(dth) < 1e-9: return np.array([x + d * np.cos(th), y + d * np.sin(th), th])
    Rc = d / dth; return np.array([x + Rc * (np.sin(th + dth) - np.sin(th)), y - Rc * (np.cos(th + dth) - np.cos(th)), th + dth])
def incertitude(n=500, distance=2.0, pas=0.05, erreur=0.02):
    ticks = pas / (2 * np.pi * R_ROUE) * TICKS_PAR_TOUR; finales = []
    for _ in range(n):
        pose = np.zeros(3)
        for _ in range(int(distance / pas)):
            pose = odometrie(pose, ticks * (1 + rng.normal(0, erreur)), ticks * (1 + rng.normal(0, erreur)))
        finales.append(pose[:2])
    finales = np.array(finales); return finales[:, 0].std(), finales[:, 1].std()

Exercice 2 — Profil trapézoïdal de vitesse

profil(distance, v_max, a_max, dt) renvoie les positions échantillonnées d’un mouvement qui accélère à a_max, croise à v_max, décélère à a_max, et s’arrête exactement à distance ; cas triangulaire si v_max n’est pas atteint. C’est ce que fait tout contrôleur de servo/CNC.

Correction
def profil(distance, v_max, a_max, dt=0.01):
    v_pic = min(v_max, np.sqrt(distance * a_max)); t_acc = v_pic / a_max; d_acc = 0.5 * a_max * t_acc**2
    t_cro = (distance - 2 * d_acc) / v_pic; T = 2 * t_acc + t_cro; t = np.arange(0, T + dt, dt); pos = np.zeros_like(t)
    for i, ti in enumerate(t):
        if ti < t_acc: pos[i] = 0.5 * a_max * ti**2
        elif ti < t_acc + t_cro: pos[i] = d_acc + v_pic * (ti - t_acc)
        else: tau = min(T, ti) - t_acc - t_cro; pos[i] = d_acc + v_pic * t_cro + v_pic * tau - 0.5 * a_max * tau**2
    pos[-1] = distance; return pos

Exercices

Exercices auto-corrigés — contrôle

Exercice 3 — Régler un PID discret par la méthode et par l’expérience

Sur le modèle de moteur discret vk+1 = 0,98 vk + 0,4 uk (u en volts, saturé ±12), écrivez simuler_pid(Kp, Ki, Kd, consigne, n) (PID discret avec anti-emballement de l’intégrale par écrêtage) et meilleur_pid(grille) qui choisit les gains minimisant ∫|erreur| + pénalité de dépassement > 5 %. Le gagnant doit atteindre 95 % de la consigne en moins de 40 pas sans dépasser 5 %.

Correction
def simuler_pid(Kp, Ki, Kd, consigne=100.0, n=300):
    v, I, e_prec, V = 0.0, 0.0, 0.0, []
    for _ in range(n):
        e = consigne - v; I = np.clip(I + e, -2000, 2000); u = np.clip(Kp * e + Ki * I + Kd * (e - e_prec), -12, 12)
        e_prec = e; v = 0.98 * v + 0.4 * u; V.append(v)
    return np.array(V)
def meilleur_pid(grille):
    def cout(g):
        v = simuler_pid(*g); return np.abs(100 - v).sum() + 1e4 * (v.max() > 105) + 1e4 * (abs(v[-1] - 100) > 1)
    return min(grille, key=cout)

Exercice 4 — Observateur de Luenberger : estimer une vitesse qu’on ne mesure pas

Pour le moteur du cours 1 (états ω, i ; on ne mesure que ω), écrivez observateur(Ad, Bd, C, poles) qui renvoie le gain L (placement de pôles sur le système dual : Aᵀ, Cᵀ) et simuler_observateur(L) qui fait tourner en parallèle le vrai système et l’estimateur x̂k+1 = Adk + Bd uk + L (yk − C x̂k) à partir d’une estimation initiale fausse ; l’erreur d’estimation du courant doit converger vers 0 en quelques dizaines de pas.

Correction
def observateur(Adm, Bdm, Cm, poles): return ackermann(Adm.T, Cm.T, poles).T
def simuler_observateur(L, n=200):
    x = np.array([50.0, 1.0]); xh = np.array([0.0, 0.0]); err = []
    for k in range(n):
        u = 6.0; y = Cm @ x
        xh = Adm @ xh + (Bdm * u).ravel() + (L @ (y - Cm @ xh)).ravel(); x = Adm @ x + (Bdm * u).ravel()
        err.append(abs(x[1] - xh[1]))
    return np.array(err)

Le principe de séparation dit qu’on peut concevoir le contrôleur (K) et l’observateur (L) indépendamment : les pôles du système bouclé sont ceux de A − BK et de A − LC réunis. Avec du bruit, l’observateur optimal est… le filtre de Kalman (L19) : L est alors le gain de Kalman stationnaire.

05 / Défis

Défi ★ — RRT pour le bras, et Ackermann

Consigne

1) Faites tourner le RRT dans l’espace des configurations du bras à 2 segments (avec la fonction collision) d’une configuration de départ à une configuration but ; animez (ou tracez 10 poses intermédiaires) dans l’espace de travail. 2) Écrivez la cinématique d’une voiture (Ackermann : ẋ = v cos θ, ẏ = v sin θ, θ̇ = v tan φ / L) et montrez qu’un pure pursuit y fonctionne avec φ = arctan(2 L sin α / L_lookahead). 3) Quel est le rayon de braquage minimal pour L = 0,3 m et φ_max = 30° ?

Piste

Pour le bras : les nœuds sont des (θ1, θ2) ; libre devient not collision(q) ; les angles sont périodiques (distance modulo 2π). Rayon minimal : R = L / tan φ_max ≈ 0,52 m.

05 / Défis

Défi ★★ — LQR sur le vrai pendule non linéaire, avec observateur

Consigne

1) Appliquez le K du LQR (calculé sur le modèle linéarisé) au pendule non linéaire (sin θ) simulé par RK4 (module L12) : jusqu’à quel angle initial le contrôleur récupère-t-il (bassin d’attraction) ? 2) Supposez qu’on ne mesure que l’angle (bruité, σ = 0,01 rad) et pas la vitesse : ajoutez un filtre de Kalman (module L19) pour estimer l’état et bouclez sur l’estimation (principe de séparation). Comparez à une dérivée numérique brute de l’angle. 3) Ajoutez un retard de 40 ms dans la mesure : à partir de quel retard le système devient-il instable ? Expliquez avec les pôles (le retard ajoute des états).

Piste

Bassin d’attraction avec u_max = 10 N : environ ±0,35 rad ; il chute avec une saturation plus stricte. Le retard : modéliser z_k = x_{k−d} en augmentant l’état de d copies ; les pôles se rapprochent du cercle unité ; typiquement instable au-delà de ~80-100 ms pour ce pendule rapide. C’est pourquoi la latence caméra → commande est LA contrainte de conception des drones et des robots agiles.

05 / Défis

Défi ★★★ — Esprit prépa : commande optimale par principe de Pontryagin et MPC convexe

Consigne

1) Problème à temps minimal : amener un chariot (ẍ = u, |u| ≤ 1) de (x₀, 0) à (0, 0) le plus vite possible. Montrez (principe du maximum de Pontryagin, ou raisonnement direct) que la commande optimale est bang-bang : +1 puis −1 avec une seule commutation, sur la courbe x = −½ ẋ|ẋ|. Implémentez ce contrôleur et comparez son temps à celui du LQR. 2) Formulez le MPC du pendule comme un programme quadratique (variables : la séquence u, contraintes linéaires |u| ≤ u_max) et résolvez-le par la méthode du gradient projeté accéléré (Nesterov) ou par une implémentation maison d’ADMM ; mesurez le temps par pas et comparez à 20 ms. 3) Lisez l’introduction de Underactuated Robotics (Tedrake, chapitres 1-3) et expliquez pourquoi un pendule simple ne peut pas être stabilisé en haut avec un couple trop faible sans balancer (swing-up par énergie) : concevez ce swing-up.

Piste (bang-bang)
def bang_bang(x, v):
    """Courbe de commutation : s = x + 0.5 * v * abs(v). Au-dessus : freiner (−1), en dessous : accélérer (+1)."""
    s = x + 0.5 * v * abs(v)
    if abs(s) < 1e-3 and abs(v) < 1e-3: return 0.0
    return -1.0 if s > 0 else 1.0
x, v, t, dt = 3.0, 0.0, 0.0, 0.001
while abs(x) + abs(v) > 1e-2:
    u = bang_bang(x, v); v += u * dt; x += v * dt; t += dt
print(f"temps minimal ≈ {t:.2f} s (théorie : 2√3 ≈ {2 * np.sqrt(3):.2f})")

Le swing-up par énergie : u = k (E − E_haut) · signe(θ̇ cos θ) pompe de l’énergie jusqu’à approcher l’équilibre haut, puis on bascule sur le LQR quand |θ − π| < 0,3. Ce « contrôle hybride » (deux contrôleurs et une règle de commutation) est la solution classique et un beau sujet d’oral.

06 / Vérification

Un système discret bouclé x_{k+1} = (A − BK) x_k est stable si :

Deux questions supplémentaires

1. Pourquoi planifier dans l’espace des configurations ? Parce que le robot y est un point ; les collisions deviennent des régions à éviter et les algorithmes de graphe/échantillonnage s’appliquent.

2. Que fait un MPC qu’un LQR ne fait pas ? Respecter des contraintes (saturation, obstacles) et anticiper une référence future.

Référence

Les mots à retenir

MotDéfinition
Cinématique directe / inverseCommandes → mouvement / mouvement voulu → commandes.
Non holonomeContrainte sur les vitesses (pas de déplacement latéral).
Espace des configurationsEspace des paramètres du robot (angles) ; le robot y est un point.
RRT / RRT*Arbre aléatoire ; probabilistement complet / asymptotiquement optimal.
Fenêtre dynamiqueChoix de (v, ω) par simulation courte et score.
Pure pursuitSuivi géométrique par point d’anticipation.
PôlesValeurs propres du système bouclé ; |λ| < 1 en discret.
LQR / RiccatiRetour d’état optimal pour coût quadratique.
MPCOptimisation sur horizon glissant avec contraintes.
Bang-bangCommande saturée à temps minimal.
Bouclier de sécuritéFiltre qui garantit un ensemble sûr quelle que soit la commande demandée.

Pour continuer

Le robot bouge comme il faut

Module suivant : communication et réseaux — bus embarqués (SPI, I2C, CAN), protocoles, sockets, MQTT, sécurité : faire parler les composants entre eux et avec le monde.

À faire chez soi

← L20SommaireL22 : Communication et réseaux →