Capitolo 11

PID: aggiustiamo tutto

Come eliminiamo l'abbassamento e fermiamo l'oscillazione?

Capitolo 11: PID: aggiustiamo tutto ↗

L'abbassamento che non vuole morire

Theo: Vi ricordate il Capitolo 2? Il nostro controllore P lasciava il drone appeso sotto i 2 m, e nessun KpK_p riusciva a sistemarlo. È ora di scoprire cosa ci riesce.

Per tenere su il drone, i motori devono spingere mg≈4,9mg \approx 4{,}9 N, per sempre. Un controllore P spinge solo quando c'è un errore: T=Kp e\eff{T} = K_p\,\err{e}. Quindi per spingere 4,9 N gli serve un errore di e=mg/Kp\err{e} = mg/K_p. Con KpK_p = 20 N/m fanno e\err e = 4,9/20 ≈ 24,5 cm, per sempre. L'abbassamento non è un difetto della nostra taratura. È il prezzo che P fa pagare per tenere su qualsiasi cosa.

June: Quindi ci serve una parte del controllore che possa spingere 4,9 N con errore zero. Qualcosa con una memoria.

I: una pila di errore passato

L'idea è questa. Tieni un totale progressivo dell'errore, l'area sotto la curva dell'errore, esattamente l'"area che si accumula" del Capitolo 3. Spingi in proporzione a quella pila:

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

Finché il drone è sotto i 2 m, l'errore è positivo e la pila continua a crescere, quindi la spinta continua a crescere. La pila smette di crescere solo quando l'errore è esattamente zero. A quel punto semplicemente resta lì, tenendo tutta la spinta che ha accumulato. Ecco la memoria che voleva June.

Theo: Oh, che furbata. Il drone non può assestarsi da nessuna parte se non a 2 m, perché ovunque altro la pila starebbe ancora cambiando.

Capitolo 11: PID: aggiustiamo tutto ↗

Prima indovina! Mika vuole eliminare l'abbassamento in fretta, quindi pensa di alzare KiK_i a manetta. Cosa succederà?

Il widget parte con KiK_i = 10 N/(m·s). Guarda tre cose: l'area ombreggiata in rosso (l'errore che si accumula), la parte integrale della spinta arancione tratteggiata che sale fino alla linea viola della gravità, e l'indicatore dell'abbassamento. Trascina KiK_i a 0 per riavere l'abbassamento del Capitolo 2, poi prova valori più grandi. KpK_p è fisso a 20 N/m.

Capitolo 11: PID: aggiustiamo tutto ↗

Capitolo 11: PID: aggiustiamo tutto ↗

Mika: Alziamolo! Ki=50K_i = 50! Sterminiamolo!

Mika: …perché non si ferma? I rimbalzi sono cresciuti e cresciuti, e ora fa lo yo-yo su e giù di mezzo metro, per sempre!

Theo: A 50 hai superato una specie di bordo. Ho provato qualche valore: sotto circa 40 si assesta, sopra no (e lo yo-yo ci mette circa un secondo per oscillazione). Tra poco vedremo perché. La pila è sempre un po' indietro: continua a spingere in su dopo che il drone ha superato i 2 m.

Ecco l'errore di Mika, ed è comunissimo: l'integrale sistema l'abbassamento, ma aggiunge ritardo, e il ritardo fa oscillare le cose (ce l'ha insegnato la doccia). Ci serve qualcosa che spinga contro la velocità. (Secondo la matematica le sue oscillazioni dovrebbero crescere per sempre. Si fermano a circa mezzo metro solo perché a ogni oscillazione la spinta arriva a 0 N: le eliche non possono tirare giù, il limite del Capitolo 10.)

D: un ammortizzatore virtuale

June: Nel Capitolo 7 era lo smorzatore a calmare la molla. E se il controllore facesse finta di essere uno smorzatore?

Uno smorzatore spinge contro la velocità. Quindi aggiungiamo un termine che spinge contro quanto in fretta si muove il drone:

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

Guarda l'equazione del drone: l'attrito dà già −c h˙-c\,\dot h. Il termine D aggiunge −Kd h˙-K_d\,\dot h in più, quindi il drone si comporta come se il suo attrito fosse c+Kdc + K_d. Stiamo aggiungendo attrito dell'aria via software.

Capitolo 11: PID: aggiustiamo tutto ↗

Capitolo 11: PID: aggiustiamo tutto ↗

Attiva il grande guadagno I di Mika e poi aggiungi smorzamento. Basta Kd=0,5K_d = 0{,}5 N·s/m per riportarlo alla stabilità (sposta il bordo fino a Ki=60K_i = 60): lo yo-yo infinito diventa un rimbalzo che si spegne. Però va ancora oltre di almeno un quarto, per quanta D tu aggiunga. Quella pila enorme ricorda semplicemente troppo. Ora spegni il KiK_i di Mika (di nuovo a 10) e prova Kd≈3K_d \approx 3–5: calmo. I e D si compensano: la D ti compra spazio per la I, ma non spazio infinito.

June: Se 4 va bene, 10 va ancora meglio. Ammortizzatore al massimo!

Mika: Sale così piano… e poi va oltre i 2 m lo stesso? In ritardo?

Theo: June, è di nuovo il tuo drone nel miele del Capitolo 7! Oltre Kd≈5,3K_d \approx 5{,}3 la coppia veloce è sovrasmorzata. Ma ora c'è anche una pila, e un drone lento dà alla pila il tempo di riempirsi troppo.

Lo smorzamento critico è dove ζ = 1: Kd=2mKp−c≈5,3K_d = 2\sqrt{m K_p} - c \approx 5{,}3 N·s/m con KpK_p = 20. Con KiK_i = 10, passare da KdK_d = 4 a 10 porta la sovraelongazione da 0 a circa l'8%, e il tempo di assestamento da meno di un secondo a circa 5 s. Più D non è sempre meglio; ora il widget te lo dice quando esageri.

Mika: Quindi la D prevede il futuro! Vede dove sta andando il drone e ci arriva prima.

Theo: Non proprio. Conosce solo la pendenza adesso. È come indovinare dove atterrerà una palla supponendo che continui dritta. Di solito un'ipotesi decente, ma non è magia. Aspetta di darle in pasto un sensore ballerino.

Cosa fa ogni manopola ai poli

È ora di usare la mappa del Capitolo 10. Scriviamo tutto l'anello, con 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'integrale è scomodo, quindi prendiamo la pendenza di entrambi i lati. Pendenza e area si disfano a vicenda (Capitolo 3), quindi la pendenza di ∫e dt\int \err e\,dt è semplicemente e\err e. La gravità è costante, quindi la sua pendenza è zero: sparisce e basta. Con un riferimento fisso, e˙=−h˙\dot{\err e} = -\dot{\out h}. Termine per termine:

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}

Rimetti insieme i pezzi e porta a sinistra tutto quello che contiene h\out h. I tre puntini su h...\dddot{\out h} vogliono dire la pendenza della pendenza della pendenza:

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à è sparita dall'equazione. Ecco l'ammazza-abbassamento in forma algebrica: all'altezza finale di mgmg non importa proprio niente. Sempre che si assesti, s'intende. Il drone di Mika con Ki=50K_i = 50 non ci è mai riuscito.

Proviamo ancora este^{st}. Con I attivo, l'equazione è cubica, quindi ci sono tre poli. Se Ki=0K_i=0, non c'è integratore: prendere la pendenza ha aggiunto una radice finta in s=0s = 0, il fattore comune ss si semplifica e il drone PD ha due poli.

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

Per una cubica con tutti i coefficienti positivi a3s3+a2s2+a1s+a0a_3 s^3 + a_2 s^2 + a_1 s + a_0, c'è un test classico (il criterio di Routh–Hurwitz) che dice che tutti e tre i poli stanno nella metà sinistra esattamente quando a2a1>a3a0a_2 a_1 > a_3 a_0. Per il nostro drone, quello è il bordo del precipizio:

(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: Una regola con sopra i nomi di due persone. Dobbiamo crederci e basta?

Theo: No. Possiamo trovare il bordo da soli.

Nell'istante in cui una coppia oscillante raggiunge l'asse verticale, la sua parte reale è zero, quindi prova s=iωs=i\omega nella cubica. Siccome i2=−1i^2 = -1 e i3=−ii^3 = -i, le parti reali e le parti di lato devono sommarsi a zero ciascuna per conto suo:

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 seconda dice ω2=Kp/m\omega^2 = K_p/m. Mettila nella prima:

ω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}

Capitolo 11: PID: aggiustiamo tutto ↗

Con i valori di partenza (KpK_p = 20, niente D) il bordo è 40. È esattamente dove il drone di Mika è impazzito, e il suo yo-yo ci metteva circa un secondo per oscillazione: 6,32 rad/s è la ωn del drone P del Capitolo 7. Aggiungere Kd=4K_d = 4 sposta il bordo fino a 200. Non fidarti di noi: cambia i numeri qui sopra, o i cursori qui sotto, e guarda i poli, la mini-mappa e la risposta al gradino.

Capitolo 11: PID: aggiustiamo tutto ↗

  • La manopola I (KiK_i) aggiunge un terzo polo all’anello e può spingere una coppia verso destra. Troppo I e attraversa la linea.
  • La manopola D (KdK_d) alza il limite di stabilità del guadagno I aggiungendo smorzamento. Le traiettorie possono piegare: più D non sposta ogni polo a sinistra.
  • La manopola P (KpK_p) allarga soprattutto la coppia oscillante in alto e in basso: più veloce, ma più oscillante se D non tiene il passo.

Il parco giochi della taratura

Ora si fa sul serio: decollo da terra fino a 2 m con i motori veri (0–20 N). Conquista tutte e quattro le stelle. Ogni volta che cambi un guadagno, l'ultimo volo resta come un fantasma sbiadito.

Capitolo 11: PID: aggiustiamo tutto ↗

June: Ho spento l'anti-windup, messo KpK_p = 30, KiK_i = 60, KdK_d = 2… e il drone è schizzato a 4 m, fuori dal suo disegno!

Theo: La pila ha continuato a crescere per tutto il tempo in cui i motori erano al massimo. Con l'anti-windup acceso, gli stessi guadagni arrivano al massimo a 2,8 m. Stesse manopole, memoria molto diversa.

Due avvertimenti sulla D

Avvertimento 1: il calcio derivativo

Il drone è sospeso a 1 m. A t=1t = 1 s spostiamo il riferimento a 1,5 m. Se la D usa la pendenza dell'errore, allora l'errore salta di mezzo metro in un istante. La sua pendenza è enorme, e anche la spinta: un picco quasi impulsivo del comando, che i libri in inglese chiamano derivative kick.

Capitolo 11: PID: aggiustiamo tutto ↗

Capitolo 11: PID: aggiustiamo tutto ↗

Mika: Sull'errore chiede più di 200 N? A motori che arrivano al massimo a 20?

June: E non sanno dire di no con garbo. Sbattono al massimo per un attimo, e il drone si prende un calcio nel sedere.

Prendere invece la pendenza dell'altezza misurata risolve il problema: il drone non può teletrasportarsi, quindi la sua altezza non ha salti. Stesso smorzamento, niente calcio. Quasi tutti i PID veri fanno così.

Avvertimento 2: il rumore

I sensori di altezza veri tremolano di un paio di centimetri. Un paio di centimetri di tremolio, mille volte al secondo, ha una pendenza enorme. La D lo amplifica dritto nei motori. La soluzione è smussare la misura prima di prenderne la pendenza (un filtro con costante di tempo τf\tau_f), al prezzo di reagire un po' più tardi.

Capitolo 11: PID: aggiustiamo tutto ↗

Capitolo 11: PID: aggiustiamo tutto ↗

Mika: Ok, la D non prevede il futuro. Prevede com'era il rumore un millisecondo fa.

Cosa abbiamo aggiustato

Cosa abbiamo capito

  • P spinge in proporzione all'errore, ma deve lasciare un abbassamento per tenere su il drone.
  • I accumula l'errore passato; l'unico punto di riposo è errore zero, quindi elimina l'abbassamento, che muore con una costante di tempo di circa Kp/KiK_p/K_i. Aggiunge ritardo, quindi se esageri le cose oscillano.
  • D spinge contro la velocità: uno smorzatore virtuale che si aggiunge all'attrito cc, quindi ζ=(c+Kd)/(2mKp)\zeta = (c+K_d)/(2\sqrt{mK_p}). Più D non è sempre meglio: sovrasmorzato, il drone striscia e la pila si riempie troppo.
  • L'anello chiuso è ms3+(c+Kd)s2+Kps+Kim s^3 + (c + K_d)s^2 + K_p s + K_i; è stabile esattamente quando (c+Kd)Kp>mKi(c+K_d)K_p > mK_i.
  • Prendi la D dalla misura (niente calcio) e filtrala (meno rumore).

June ha provato il nostro PID da drone sulla doccia… e ha oscillato esattamente come noi nel Capitolo 0. Cos'ha di speciale il ritardo?

Capitolo 11: PID: aggiustiamo tutto ↗