Chapitre 11

PID : on répare tout

Comment supprimer l'affaissement et arrêter les oscillations ?

Chapitre 11 : PID : on répare tout ↗

L'affaissement qui ne veut pas mourir

Theo: Vous vous souvenez du chapitre 2 ? Notre correcteur P laissait le drone suspendu sous les 2 m, et aucun KpK_p ne pouvait arranger ça. Il est temps de trouver ce qui le peut.

Pour tenir le drone en l'air, les moteurs doivent pousser mg≈4,9mg \approx 4{,}9 N, pour toujours. Un correcteur P ne pousse que s'il y a une erreur : T=Kp e\eff{T} = K_p\,\err{e}. Donc pour pousser 4,9 N, il lui faut une erreur de e=mg/Kp\err{e} = mg/K_p. Avec KpK_p = 20 N/m, ça fait e\err e = 4,9/20 ≈ 24,5 cm, pour toujours. L'affaissement n'est pas un bug de notre réglage. C'est le prix que P fait payer pour tenir quoi que ce soit en l'air.

June: Donc il nous faut un morceau de correcteur capable de pousser 4,9 N avec une erreur nulle. Quelque chose qui a de la mémoire.

I : un tas d'erreur passée

Voici l'idée. On tient un total courant de l'erreur, l'aire sous la courbe d'erreur, exactement l'« aire accumulée » du chapitre 3. Et on pousse proportionnellement à ce tas :

TI=Ki∫0te dt\eff{T_I} = K_i \int_0^t \err{e}\,dt

Tant que le drone est sous les 2 m, l'erreur est positive et le tas continue de grossir, donc la poussée aussi. Le tas n'arrête de grossir que quand l'erreur est exactement nulle. À ce moment-là, il reste simplement tel quel, en maintenant toute la poussée qu'il a accumulée. C'est la mémoire que voulait June.

Theo: Oh, c'est malin. Le drone ne peut se stabiliser nulle part ailleurs qu'à 2 m, parce que partout ailleurs, le tas changerait encore.

Chapitre 11 : PID : on répare tout ↗

Prédis d'abord ! Mika veut faire disparaître l'affaissement vite, et compte monter KiK_i très haut. Que va-t-il se passer ?

Le widget démarre à KiK_i = 10 N/(m·s). Observe trois choses : l'aire ombrée en rouge (l'erreur qu'on empile), la partie intégrale de la poussée en orange en tirets qui grimpe jusqu'à la ligne violette de la gravité, et l'affichage de l'affaissement. Ramène KiK_i à 0 pour retrouver l'affaissement du chapitre 2, puis essaie de plus grandes valeurs. KpK_p est fixé à 20 N/m.

Chapitre 11 : PID : on répare tout ↗

Chapitre 11 : PID : on répare tout ↗

Mika: À fond ! Ki=50K_i = 50 ! Qu'on en finisse !

Mika: …pourquoi il ne s'arrête pas ? Les rebonds ont grandi, grandi, et maintenant il fait le yo-yo d'un demi-mètre, pour toujours !

Theo: À 50, tu as franchi une sorte de bord. J'ai essayé quelques valeurs : en dessous d'environ 40, ça se stabilise, au-dessus, non (et le yo-yo met environ une seconde par oscillation). On verra pourquoi dans un instant. Le tas est toujours un peu en retard : il continue de pousser vers le haut après que le drone a dépassé 2 m.

C'est l'erreur de Mika, et elle est très courante : l'intégrale corrige l'affaissement, mais elle ajoute du retard, et le retard fait osciller (la douche nous l'a appris). Il nous faut quelque chose qui pousse contre la vitesse. (D'après les maths, ses oscillations devraient grandir indéfiniment. Elles s'arrêtent vers un demi-mètre seulement parce que la poussée tombe à 0 N à chaque oscillation : les hélices ne savent pas tirer vers le bas, c'est la limite du chapitre 10.)

D : un amortisseur virtuel

June: Au chapitre 7, c'est l'amortisseur qui calmait le ressort. Et si le correcteur faisait semblant d'être un amortisseur ?

Un amortisseur pousse contre la vitesse. Alors ajoutons un terme qui pousse contre la vitesse à laquelle le drone se déplace :

TD=−Kd dhdt\eff{T_D} = -K_d\,\frac{d\out{h}}{dt}

Regarde l'équation du drone : la traînée donne déjà −c h˙-c\,\dot h. Le terme D ajoute −Kd h˙-K_d\,\dot h par-dessus, donc le drone se comporte comme si sa traînée valait c+Kdc + K_d. On ajoute de la résistance de l'air par logiciel.

Chapitre 11 : PID : on répare tout ↗

Chapitre 11 : PID : on répare tout ↗

Active le gros gain I de Mika, puis ajoute de l'amortissement. Même Kd=0,5K_d = 0{,}5 N·s/m le fait rebasculer du côté stable (ça repousse le bord jusqu'à Ki=60K_i = 60) : le yo-yo sans fin devient un rebond qui s'éteint. Mais il dépasse toujours d'au moins un quart, quelle que soit la quantité de D. Ce tas énorme se souvient tout simplement de trop de choses. Maintenant, désactive le KiK_i de Mika (retour à 10) et essaie Kd≈3K_d \approx 3–5 : c'est calme. I et D sont un compromis : D te donne de la marge pour I, mais pas une marge illimitée.

June: Si 4, c'est bien, 10, c'est forcément mieux. Amortisseur maximal !

Mika: Il monte si lentement… et puis il dépasse quand même les 2 m ? En retard ?

Theo: June, c'est encore ton drone dans le miel du chapitre 7 ! Au-delà de Kd≈5,3K_d \approx 5{,}3, la paire rapide est sur-amortie. Mais maintenant il y a aussi un tas, et un drone lent laisse au tas le temps de trop se remplir.

L'amortissement critique, c'est là où ζ = 1 : Kd=2mKp−c≈5,3K_d = 2\sqrt{m K_p} - c \approx 5{,}3 N·s/m pour KpK_p = 20. Avec KiK_i = 10, passer de KdK_d = 4 à 10 fait monter le dépassement de 0 à environ 8 %, et le temps de réponse de moins d'une seconde à environ 5 s. Plus de D, ce n'est pas toujours mieux ; le widget te le dit maintenant quand tu en fais trop.

Mika: Donc D prédit l'avenir ! Il voit où va le drone et il y arrive en premier.

Theo: Pas vraiment. Il ne connaît que la pente maintenant. C'est comme deviner où une balle va tomber en supposant qu'elle continue tout droit. Souvent une supposition correcte, mais ce n'est pas magique. Attends qu'on lui donne un capteur qui tremble.

Ce que chaque bouton fait aux pôles

Il est temps d'utiliser la carte du chapitre 10. Écrivons toute la boucle, avec e=r−h\err{e} = \sp{r} - \out{h} :

mh¨+ch˙=Kp e+Ki ⁣∫ ⁣e dt−Kd h˙⏟T−mgm\ddot{\out h} + c\dot{\out h} = \underbrace{K_p\,\err e + K_i\!\int\!\err e\,dt - K_d\,\dot{\out h}}_{\eff{T}} - \dis{mg}

L'intégrale est gênante, alors prenons la pente des deux côtés. Pente et aire se défont l'une l'autre (chapitre 3), donc la pente de ∫e dt\int \err e\,dt est simplement e\err e. La gravité est constante, donc sa pente est nulle : elle disparaît tout simplement. Avec une consigne fixe, e˙=−h˙\dot{\err e} = -\dot{\out h}. Terme par terme :

ddt(Kp e)=−Kp h˙ddt(Ki ⁣∫ ⁣e dt)=Ki (r−h)ddt(−Kd h˙)=−Kd h¨\begin{aligned} \tfrac{d}{dt}\big(K_p\,\err e\big) &= -K_p\,\dot{\out h} \\ \tfrac{d}{dt}\Big(K_i\!\int\!\err e\,dt\Big) &= K_i\,(\sp r - \out h) \\ \tfrac{d}{dt}\big(-K_d\,\dot{\out h}\big) &= -K_d\,\ddot{\out h} \end{aligned}

Rassemble tout et fais passer à gauche tout ce qui contient h\out h. Les trois points sur h...\dddot{\out h} veulent dire la pente de la pente de la pente :

mh...+(c+Kd) h¨+Kp h˙+Ki h=Ki r\begin{aligned} m\dddot{\out h} + (c + K_d)\,\ddot{\out h} &+ K_p\,\dot{\out h} + K_i\,\out h \\ &= K_i\,\sp r \end{aligned}

Theo: La gravité a disparu de l'équation. C'est le tueur d'affaissement sous forme algébrique : la hauteur finale se fiche complètement de mgmg. Du moins, tant que ça se stabilise. Le drone de Mika à Ki=50K_i = 50 ne s'est jamais stabilisé.

Devinons encore este^{st}. Avec I actif, l'équation est du troisième degré, donc il y a trois pôles. Si Ki=0K_i=0, il n'y a pas d'intégrateur : prendre la pente a ajouté une fausse racine en s=0s = 0, le facteur commun ss se simplifie, et le drone PD a deux pôles.

ms3+(c+Kd) s2+Kp s+Ki=0m s^3 + (c + K_d)\,s^2 + K_p\,s + K_i = 0

Pour un polynôme du troisième degré à coefficients tous positifs a3s3+a2s2+a1s+a0a_3 s^3 + a_2 s^2 + a_1 s + a_0, il existe un test classique (le critère de Routh–Hurwitz) qui dit que les trois pôles sont dans la moitié gauche exactement quand a2a1>a3a0a_2 a_1 > a_3 a_0. Pour notre drone, c'est le bord de la falaise :

(c+Kd) Kp>m Ki⟺Ki<(c+Kd) Kpm(c + K_d)\,K_p > m\,K_i \quad\Longleftrightarrow\quad K_i < \frac{(c+K_d)\,K_p}{m}

Mika: Une règle qui porte le nom de deux personnes. On doit juste y croire ?

Theo: Non. On peut trouver le bord nous-mêmes.

À l'instant où une paire oscillante atteint l'axe vertical, sa partie réelle est nulle, donc essayons s=iωs=i\omega dans le polynôme. Comme i2=−1i^2 = -1 et i3=−ii^3 = -i, les parties réelles et les parties « de côté » doivent chacune s'annuler :

Ki−(c+Kd) ω2=0,ω (Kp−m ω2)=0K_i - (c+K_d)\,\omega^2 = 0, \qquad \omega\,\big(K_p - m\,\omega^2\big) = 0

La deuxième dit ω2=Kp/m\omega^2 = K_p/m. Mets ça dans la première :

ω2=Kpm,Ki=(c+Kd)ω2=(c+Kd)Kpm\omega^2=\frac{K_p}{m},\qquad K_i=(c+K_d)\omega^2=\frac{(c+K_d)K_p}{m}

Chapitre 11 : PID : on répare tout ↗

Aux valeurs de départ (KpK_p = 20, pas de D), le bord est à 40. C'est exactement là que le drone de Mika s'est affolé, et son yo-yo mettait environ une seconde par oscillation : 6,32 rad/s, c'est la ωn du drone P lui-même, au chapitre 7. Ajouter Kd=4K_d = 4 repousse le bord jusqu'à 200. Ne nous crois pas sur parole : change les nombres ci-dessus, ou les curseurs ci-dessous, et observe les pôles, la mini-carte et la réponse indicielle.

Chapitre 11 : PID : on répare tout ↗

  • Le bouton I (KiK_i) ajoute un troisième pôle à la boucle et peut pousser une paire vers la droite. Trop de I, et elle franchit la ligne.
  • Le bouton D (KdK_d) relève la limite de stabilité du gain I en ajoutant de l’amortissement. Les trajectoires peuvent tourner : plus de D ne déplace pas tous les pôles à gauche.
  • Le bouton P (KpK_p) écarte surtout la paire oscillante vers le haut et le bas : plus rapide, mais plus oscillante si D ne suit pas.

Le terrain de jeu du réglage

Maintenant, le vrai défi : décoller du sol jusqu'à 2 m avec de vrais moteurs (0–20 N). Gagne les quatre étoiles. À chaque fois que tu changes un gain, le dernier vol reste affiché en fantôme pâle.

Chapitre 11 : PID : on répare tout ↗

June: J'ai coupé l'anti-emballement, mis KpK_p = 30, KiK_i = 60, KdK_d = 2… et le drone a filé jusqu'à 4 m, carrément hors de son dessin !

Theo: Le tas a grossi tout le temps où les moteurs étaient à fond. Avec l'anti-emballement, les mêmes gains culminent à 2,8 m. Mêmes boutons, mémoire très différente.

Deux avertissements sur D

Avertissement 1 : l'à-coup de dérivée

Le drone est en vol stationnaire à 1 m. À t=1t = 1 s, on déplace la consigne à 1,5 m. Si D utilise la pente de l'erreur, alors l'erreur saute d'un demi-mètre en un instant. Sa pente est énorme, et la poussée aussi.

Chapitre 11 : PID : on répare tout ↗

Chapitre 11 : PID : on répare tout ↗

Mika: Sur l'erreur, il demande plus de 200 N ? À des moteurs qui plafonnent à 20 ?

June: Et ils ne savent pas dire non poliment. Ils se mettent à fond un instant, et le drone reçoit un coup de pied aux fesses.

Prendre plutôt la pente de la hauteur mesurée règle le problème : le drone ne peut pas se téléporter, donc sa hauteur ne fait pas de sauts. Même amortissement, pas d'à-coup. Presque tous les vrais PID font ça.

Avertissement 2 : le bruit

Les vrais capteurs de hauteur tremblotent de quelques centimètres. Quelques centimètres de tremblement, mille fois par seconde, ça fait une pente énorme. D l'amplifie et l'envoie droit dans les moteurs. La solution : lisser la mesure avant de prendre sa pente (un filtre de constante de temps τf\tau_f), au prix d'une réaction un peu plus tardive.

Chapitre 11 : PID : on répare tout ↗

Chapitre 11 : PID : on répare tout ↗

Mika: Bon, D ne prédit pas l'avenir. Il prédit ce que le bruit avait envie de faire il y a une milliseconde.

Ce qu'on a réparé

Ce qu'on a compris

  • P pousse proportionnellement à l'erreur, mais doit laisser un affaissement pour tenir le drone en l'air.
  • I empile l'erreur passée ; le seul point de repos, c'est une erreur nulle, donc il tue l'affaissement, qui meurt avec une constante de temps d'environ Kp/KiK_p/K_i. Il ajoute du retard, donc trop de I fait osciller.
  • D pousse contre la vitesse : un amortisseur virtuel qui s'ajoute à la traînée cc, donc ζ=(c+Kd)/(2mKp)\zeta = (c+K_d)/(2\sqrt{mK_p}). Plus de D, ce n'est pas toujours mieux : sur-amorti, le drone se traîne et le tas déborde.
  • La boucle fermée est ms3+(c+Kd)s2+Kps+Kim s^3 + (c + K_d)s^2 + K_p s + K_i ; elle est stable exactement quand (c+Kd)Kp>mKi(c+K_d)K_p > mK_i.
  • Prendre D sur la mesure (pas d'à-coup) et le filtrer (moins de bruit).

June a essayé notre PID façon drone sur la douche… et elle a oscillé exactement comme nous au chapitre 0. Qu'est-ce qu'il a, ce retard ?

Chapitre 11 : PID : on répare tout ↗