Capítulo 11

PID: arreglándolo todo

¿Cómo eliminamos la caída y paramos la oscilación?

Capítulo 11: PID: arreglándolo todo ↗

La caída que no desaparece

Theo: ¿Recuerdas el capítulo 2? Nuestro controlador P dejaba el dron colgando por debajo de 2 m, y ninguna KpK_p lo arreglaba. Hora de averiguar qué puede arreglarlo.

Para sostener el dron, los motores tienen que empujar mg≈4,9mg \approx 4{,}9 N, para siempre. Un controlador P solo empuja cuando hay error: T=Kp e\eff{T} = K_p\,\err{e}. Así que, para empujar 4,9 N, necesita un error de e=mg/Kp\err{e} = mg/K_p. Con KpK_p = 20 N/m eso es e\err e = 4,9/20 ≈ 24,5 cm, para siempre. La caída no es un fallo de nuestro ajuste. Es el precio que cobra P por sostener cualquier cosa.

June: Entonces necesitamos una parte del controlador que pueda empujar 4,9 N con error cero. Algo con memoria.

I: un montón de error pasado

Esta es la idea. Lleva la cuenta acumulada del error, el área bajo la curva del error, exactamente el "área acumulada" del capítulo 3. Empuja en proporción a ese montón:

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

Mientras el dron está por debajo de 2 m, el error es positivo y el montón no para de crecer, así que el empuje tampoco. El montón solo deja de crecer cuando el error es exactamente cero. En ese momento simplemente se queda como está, manteniendo el empuje que haya acumulado. Esa es la memoria que quería June.

Theo: Qué astuto. El dron no puede quedarse quieto en ningún sitio que no sea 2 m, porque en cualquier otro el montón seguiría cambiando.

Capítulo 11: PID: arreglándolo todo ↗

¡Primero, predice! Mika quiere que la caída desaparezca rápido, así que planea subir muchísimo KiK_i. ¿Qué pasará?

El widget empieza con KiK_i = 10 N/(m·s). Fíjate en tres cosas: el área sombreada en rojo (el error que se va amontonando), la parte integral del empuje, en naranja discontinuo, subiendo hasta la línea morada de la gravedad, y la lectura de la caída. Lleva KiK_i a 0 para recuperar la caída del capítulo 2 y luego prueba valores más grandes. KpK_p está fijo en 20 N/m.

Capítulo 11: PID: arreglándolo todo ↗

Capítulo 11: PID: arreglándolo todo ↗

Mika: ¡A tope! ¡Ki=50K_i = 50! ¡Fuego contra la caída!

Mika: …¿por qué no para? Los rebotes han ido creciendo y creciendo, ¡y ahora sube y baja como un yoyó medio metro, para siempre!

Theo: Con 50 te pasaste de algún tipo de borde. Probé unos cuantos valores: por debajo de unos 40 se estabiliza, por encima no (y el yoyó tarda más o menos un segundo por oscilación). Enseguida veremos por qué. El montón siempre va un poco retrasado: sigue empujando hacia arriba cuando el dron ya ha pasado los 2 m.

Ese es el error de Mika, y es muy común: la integral arregla la caída, pero añade retraso, y el retraso hace oscilar las cosas (eso nos lo enseñó la ducha). Necesitamos algo que empuje en contra de la velocidad. (Según las matemáticas, sus oscilaciones deberían crecer para siempre. Se frenan en torno al medio metro solo porque el empuje llega a 0 N en cada oscilación: las hélices no pueden tirar hacia abajo, el límite del capítulo 10.)

D: un amortiguador virtual

June: En el capítulo 7, el amortiguador era lo que calmaba al resorte. ¿Y si el controlador finge ser un amortiguador?

Un amortiguador empuja en contra de la velocidad. Así que añadamos un término que empuje en contra de lo rápido que se mueve el dron:

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

Mira la ecuación del dron: el rozamiento ya aporta −c h˙-c\,\dot h. El término D añade −Kd h˙-K_d\,\dot h encima, así que el dron se comporta como si su rozamiento fuera c+Kdc + K_d. Estamos añadiendo resistencia del aire por software.

Capítulo 11: PID: arreglándolo todo ↗

Capítulo 11: PID: arreglándolo todo ↗

Activa la gran ganancia I de Mika y luego añade amortiguamiento. Incluso Kd=0,5K_d = 0{,}5 N·s/m lo devuelve a estable (lleva el borde hasta Ki=60K_i = 60): el yoyó sin fin se convierte en un rebote que se apaga. Pero sigue pasándose al menos una cuarta parte, añadas la D que añadas. Ese montón enorme simplemente recuerda demasiado. Ahora quita la KiK_i de Mika (vuelve a 10) y prueba Kd≈3K_d \approx 3–5: calma. I y D se compensan: D te da margen para I, pero no un margen ilimitado.

June: Si 4 va bien, 10 tiene que ir mejor. ¡Amortiguador a tope!

Mika: Sube tan despacito… ¿y luego se pasa de los 2 m igualmente? ¿Tarde?

Theo: June, ¡es otra vez tu dron de miel del capítulo 7! Pasado Kd≈5,3K_d \approx 5{,}3, la pareja rápida está sobreamortiguada. Pero ahora también hay un montón, y un dron lento le da al montón tiempo de llenarse de más.

El amortiguamiento crítico está donde ζ = 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, pasar de KdK_d = 4 a 10 lleva el sobreimpulso de 0 a un 8 %, y el tiempo de establecimiento de menos de un segundo a unos 5 s. Más D no siempre es mejor; ahora el widget te lo dice cuando te pasas.

Mika: ¡O sea que D predice el futuro! Ve adónde va el dron y llega antes.

Theo: No exactamente. Solo conoce la pendiente ahora mismo. Es como adivinar dónde caerá una pelota suponiendo que sigue en línea recta. Normalmente es una suposición decente, pero no es magia. Espera a que le demos un sensor nervioso.

Lo que hace cada mando a los polos

Hora de usar el mapa del capítulo 10. Escribamos el lazo entero, 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}

La integral es incómoda, así que toma la pendiente de los dos lados. Pendiente y área se deshacen mutuamente (capítulo 3), así que la pendiente de ∫e dt\int \err e\,dt es simplemente e\err e. La gravedad es constante, así que su pendiente es cero: simplemente desaparece. Con una consigna fija, e˙=−h˙\dot{\err e} = -\dot{\out h}. Término a término:

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}

Vuelve a juntarlos y pasa a la izquierda todo lo que lleva h\out h. Los tres puntos de h...\dddot{\out h} significan la pendiente de la pendiente de la pendiente:

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 gravedad ha desaparecido de la ecuación. Ese es el mata-caídas en forma de álgebra: a la altura final le da igual mgmg. Siempre que llegue a estabilizarse, claro. El dron de Mika con Ki=50K_i = 50 nunca lo hizo.

Vuelve a suponer este^{st}. Con I activa, la ecuación es cúbica, así que hay tres polos. Si Ki=0K_i=0, no hay integrador: tomar la pendiente añadió una raíz falsa en s=0s = 0, el factor común ss se cancela y el dron PD tiene dos polos.

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

Para una cúbica con todos los coeficientes positivos, a3s3+a2s2+a1s+a0a_3 s^3 + a_2 s^2 + a_1 s + a_0, hay una prueba clásica (el criterio de Routh–Hurwitz) que dice que los tres polos están en la mitad izquierda justo cuando a2a1>a3a0a_2 a_1 > a_3 a_0. Para nuestro dron, ese es el borde del abismo:

(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 regla con el nombre de dos personas. ¿Nos la tenemos que creer sin más?

Theo: Para nada. Podemos encontrar el borde nosotros mismos.

En el instante en que una pareja oscilante llega al eje vertical, su parte real es cero, así que prueba s=iωs=i\omega en la cúbica. Como i2=−1i^2 = -1 e i3=−ii^3 = -i, las partes reales y las partes laterales tienen que sumar cero cada una por su lado:

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 segunda dice que ω2=Kp/m\omega^2 = K_p/m. Métela en la primera:

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

Capítulo 11: PID: arreglándolo todo ↗

Con los valores iniciales (KpK_p = 20, sin D) el borde está en 40. Justo ahí es donde el dron de Mika se volvió loco, y su yoyó tardaba más o menos un segundo por oscilación: 6,32 rad/s es la propia ωn del dron P del capítulo 7. Añadir Kd=4K_d = 4 lleva el borde hasta 200. No te fíes de nosotros: cambia los números de arriba, o los deslizadores de abajo, y mira los polos, el minimapa y la respuesta al escalón.

Capítulo 11: PID: arreglándolo todo ↗

  • El mando I (KiK_i) añade un tercer polo al lazo y puede empujar una pareja a la derecha. Si te pasas, cruza la línea.
  • El mando D (KdK_d) eleva el límite estable de ganancia I al añadir amortiguamiento. Las trayectorias pueden girar: más D no mueve todos los polos a la izquierda.
  • El mando P (KpK_p) sobre todo separa la pareja oscilante hacia arriba y abajo: más rápido, pero más oscilante si D no acompaña.

El patio de ajuste

Ahora lo de verdad: despegar del suelo hasta 2 m con motores reales (0–20 N). Consigue las cuatro estrellas. Cada vez que cambias una ganancia, el último vuelo se queda como un fantasma tenue.

Capítulo 11: PID: arreglándolo todo ↗

June: Quité el anti-windup, puse KpK_p = 30, KiK_i = 60, KdK_d = 2… ¡y el dron salió disparado hasta 4 m, fuera de su dibujo!

Theo: El montón siguió creciendo todo el tiempo que los motores iban a tope. Con el anti-windup activado, las mismas ganancias tienen su pico en 2,8 m. Los mismos mandos, una memoria muy distinta.

Dos avisos sobre D

Aviso 1: la patada derivativa

El dron flota a 1 m. En t=1t = 1 s movemos la consigna a 1,5 m. Si D usa la pendiente del error, el error salta medio metro en un instante. Su pendiente es enorme, y el empuje también.

Capítulo 11: PID: arreglándolo todo ↗

Capítulo 11: PID: arreglándolo todo ↗

Mika: ¿Con el error pide más de 200 N? ¿A unos motores que no pasan de 20?

June: Y no pueden decir que no con educación. Se ponen a tope un instante y el dron se lleva una buena patada.

Usar en su lugar la pendiente de la altura medida lo arregla: el dron no puede teletransportarse, así que su altura no tiene saltos. El mismo amortiguamiento, sin patada. Casi todos los PID reales lo hacen así.

Aviso 2: el ruido

Los sensores de altura reales tiemblan un par de centímetros. Un par de centímetros de temblor, mil veces por segundo, tiene una pendiente enorme. D lo amplifica y lo manda directo a los motores. La solución es suavizar la medida antes de calcular su pendiente (un filtro con constante de tiempo τf\tau_f), a costa de reaccionar un poco más tarde.

Capítulo 11: PID: arreglándolo todo ↗

Capítulo 11: PID: arreglándolo todo ↗

Mika: Vale, D no predice el futuro. Predice lo que le apeteció al ruido hace un milisegundo.

Lo que hemos arreglado

Lo que descubrimos

  • P empuja en proporción al error, pero tiene que dejar una caída para sostener el dron.
  • I amontona el error pasado; el único punto de reposo es error cero, así que elimina la caída, que se extingue con una constante de tiempo de unos Kp/KiK_p/K_i. Añade retraso, así que demasiada hace oscilar.
  • D empuja contra la velocidad: un amortiguador virtual que se suma al rozamiento cc, así que ζ=(c+Kd)/(2mKp)\zeta = (c+K_d)/(2\sqrt{mK_p}). Más D no siempre es mejor: sobreamortiguado, el dron se arrastra y el montón se llena de más.
  • El lazo cerrado es ms3+(c+Kd)s2+Kps+Kim s^3 + (c + K_d)s^2 + K_p s + K_i; es estable justo cuando (c+Kd)Kp>mKi(c+K_d)K_p > mK_i.
  • Calcula D a partir de la medida (sin patada) y fíltrala (menos ruido).

June probó nuestro PID de dron en la ducha… y oscilaba exactamente igual que nosotros en el capítulo 0. ¿Qué tiene el retardo?

Capítulo 11: PID: arreglándolo todo ↗