Kapitel 11

PID: Alles reparieren

Wie werden wir das Durchhängen los und stoppen das Wackeln?

Kapitel 11: PID: Alles reparieren ↗

Das Durchhängen, das nicht sterben will

Theo: Erinnert ihr euch an Kapitel 2? Unser P-Regler hat die Drohne unter 2 m hängen lassen, und kein KpK_p konnte das reparieren. Zeit herauszufinden, was es kann.

Um die Drohne zu halten, müssen die Motoren mg≈4,9mg \approx 4{,}9 N drücken, und zwar für immer. Ein P-Regler drückt nur, wenn es einen Fehler gibt: T=Kp e\eff{T} = K_p\,\err{e}. Um 4,9 N zu drücken, braucht er also einen Fehler von e=mg/Kp\err{e} = mg/K_p. Mit KpK_p = 20 N/m sind das e\err e = 4,9/20 ≈ 24,5 cm, für immer. Das Durchhängen heißt nicht, dass wir falsch eingestellt haben. Es ist der Preis, den P fürs Halten verlangt.

June: Wir brauchen also einen Teil im Regler, der 4,9 N bei null Fehler drücken kann. Etwas mit Gedächtnis.

I: ein Haufen vergangener Fehler

Die Idee: Führ eine laufende Summe des Fehlers, die Fläche unter der Fehlerkurve, genau die „aufsummierte Fläche“ aus Kapitel 3. Drück proportional zu diesem Haufen:

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

Solange die Drohne unter 2 m ist, ist der Fehler positiv, und der Haufen wächst weiter. Also wächst auch der Schub weiter. Der Haufen hört erst auf zu wachsen, wenn der Fehler genau null ist. Dann bleibt er einfach und hält den Schub, den er aufgebaut hat. Das ist das Gedächtnis, das June wollte.

Theo: Oh, das ist raffiniert. Die Drohne kann sich nirgendwo anders einpendeln als bei 2 m, weil sich der Haufen überall sonst noch ändern würde.

Kapitel 11: PID: Alles reparieren ↗

Erst tippen! Mika will das Durchhängen schnell loswerden und plant, KiK_i ordentlich aufzudrehen. Was wird passieren?

Das Widget startet bei KiK_i = 10 N/(m·s). Achte auf drei Dinge: die rot schattierte Fläche (der Fehler, der sich anhäuft), den gestrichelten orangen Integralanteil des Schubs, der bis zur lila Schwerkraftlinie klettert, und die Anzeige fürs Durchhängen. Zieh KiK_i auf 0, dann ist das Durchhängen aus Kapitel 2 wieder da, und probier danach größere Werte. KpK_p ist fest auf 20 N/m.

Kapitel 11: PID: Alles reparieren ↗

Kapitel 11: PID: Alles reparieren ↗

Mika: Aufdrehen! Ki=50K_i = 50! Weg mit dem Ding!

Mika: …warum hört es nicht auf? Die Hüpfer wurden immer größer, und jetzt jojot sie für immer einen halben Meter auf und ab!

Theo: Bei 50 bist du über eine Art Kante gegangen. Ich hab ein paar Werte ausprobiert: Unter etwa 40 kommt sie zur Ruhe, darüber nicht (und das Jojo braucht etwa eine Sekunde pro Schwung). Warum, sehen wir gleich. Der Haufen ist immer etwas hinterher: Er drückt weiter nach oben, wenn die Drohne schon über 2 m hinaus ist.

Das ist Mikas Fehler, und er ist sehr verbreitet: Das Integral repariert das Durchhängen, aber es bringt Verzögerung mit, und Verzögerung bringt Dinge zum Schwingen (das hat uns die Dusche gelehrt). Wir brauchen etwas, das gegen das Tempo drückt. (Nach der Mathematik müssten diese Schwünge immer weiter wachsen. Sie hören bei etwa einem halben Meter nur deshalb auf, weil der Schub bei jedem Schwung auf 0 N fällt: Propeller können nicht nach unten ziehen, die Grenze aus Kapitel 10.)

D: ein virtueller Stoßdämpfer

June: In Kapitel 7 war der Dämpfer das, was die Feder beruhigt hat. Was, wenn der Regler so tut, als wäre er ein Dämpfer?

Ein Dämpfer drückt gegen das Tempo. Also fügen wir einen Term hinzu, der dagegen drückt, wie schnell sich die Drohne bewegt:

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

Schau dir die Gleichung der Drohne an: Der Luftwiderstand liefert schon −c h˙-c\,\dot h. Der D-Term legt −Kd h˙-K_d\,\dot h obendrauf, also verhält sich die Drohne, als wäre ihr Luftwiderstand c+Kdc + K_d. Wir fügen Luftwiderstand per Software hinzu.

Kapitel 11: PID: Alles reparieren ↗

Kapitel 11: PID: Alles reparieren ↗

Schalte Mikas große I-Verstärkung ein und nimm dann Dämpfung dazu. Schon Kd=0,5K_d = 0{,}5 N·s/m kippt es zurück ins Stabile (es schiebt die Kante raus auf Ki=60K_i = 60): Aus dem endlosen Jojo wird ein Hüpfen, das abklingt. Aber es schwingt immer noch um mindestens ein Viertel über, egal wie viel D du dazunimmst. Dieser riesige Haufen erinnert sich einfach an zu viel. Schalte jetzt Mikas KiK_i ab (zurück auf 10) und probier Kd≈3K_d \approx 3–5: Ruhe. I und D sind ein Tauschgeschäft: D verschafft dir Spielraum für I, aber keinen unbegrenzten.

June: Wenn 4 gut ist, muss 10 besser sein. Stoßdämpfer auf Maximum!

Mika: Sie kriecht so langsam hoch… und dann schießt sie trotzdem über 2 m hinaus? Mit Verspätung?

Theo: June, das ist wieder deine Honigdrohne aus Kapitel 7! Ab Kd≈5,3K_d \approx 5{,}3 ist das schnelle Paar überdämpft. Aber jetzt gibt es auch einen Haufen, und eine langsame Drohne lässt dem Haufen Zeit, überzulaufen.

Kritische Dämpfung heißt ζ = 1: Kd=2mKp−c≈5,3K_d = 2\sqrt{m K_p} - c \approx 5{,}3 N·s/m bei KpK_p = 20. Mit KiK_i = 10 steigt das Überschwingen von 0 auf etwa 8 %, wenn man KdK_d von 4 auf 10 dreht, und die Einschwingzeit von unter einer Sekunde auf etwa 5 s. Mehr D ist nicht immer besser; das Widget sagt es jetzt, wenn du übertreibst.

Mika: D sagt also die Zukunft voraus! Es sieht, wohin die Drohne will, und ist schon vorher da.

Theo: Nicht wirklich. Es kennt nur die Steigung genau jetzt. Das ist, als würdest du raten, wo ein Ball landet, indem du annimmst, dass er geradeaus weiterfliegt. Meistens eine ordentliche Schätzung, aber keine Magie. Wart ab, bis wir ihm einen zappeligen Sensor geben.

Was jeder Knopf mit den Polen macht

Zeit für die Karte aus Kapitel 10. Schreiben wir den ganzen Kreis auf, mit 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}

Das Integral ist unhandlich, also nehmen wir auf beiden Seiten die Steigung. Steigung und Fläche heben sich gegenseitig auf (Kapitel 3), also ist die Steigung von ∫e dt\int \err e\,dt einfach e\err e. Die Schwerkraft ist konstant, ihre Steigung ist also null: Sie fällt einfach raus. Bei festem Sollwert ist e˙=−h˙\dot{\err e} = -\dot{\out h}. Term für Term:

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}

Setz alles wieder zusammen und bring alles mit h\out h nach links. Die drei Punkte auf h...\dddot{\out h} bedeuten die Steigung der Steigung der Steigung:

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: Die Schwerkraft ist aus der Gleichung verschwunden. Das ist der Durchhäng-Killer in Algebraform: Der Endhöhe ist mgmg völlig egal. Jedenfalls, solange sie überhaupt zur Ruhe kommt. Mikas Drohne mit Ki=50K_i = 50 hat das nie getan.

Versuchen wir wieder este^{st}. Mit aktivem I-Anteil ist die Gleichung kubisch und hat drei Pole. Bei Ki=0K_i=0 gibt es keinen Integrator: Das Ableiten hat eine unechte Wurzel bei s=0s = 0 hinzugefügt, der gemeinsame Faktor ss kürzt sich heraus, und die PD-Drohne hat zwei Pole.

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

Für ein kubisches Polynom mit lauter positiven Koeffizienten a3s3+a2s2+a1s+a0a_3 s^3 + a_2 s^2 + a_1 s + a_0 gibt es einen klassischen Test (das Routh-Hurwitz-Kriterium). Er sagt: Alle drei Pole liegen genau dann in der linken Hälfte, wenn a2a1>a3a0a_2 a_1 > a_3 a_0. Für unsere Drohne ist das die Klippe:

(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: Eine Regel mit zwei Namen dran. Müssen wir die einfach glauben?

Theo: Nö. Die Kante finden wir selbst.

In dem Moment, in dem ein schwingendes Paar die senkrechte Achse erreicht, ist sein Realteil null. Setzen wir also s=iωs=i\omega in das kubische Polynom ein. Wegen i2=−1i^2 = -1 und i3=−ii^3 = -i müssen die realen und die senkrechten Teile jeweils null ergeben:

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

Die zweite sagt ω2=Kp/m\omega^2 = K_p/m. Setz das in die erste ein:

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

Kapitel 11: PID: Alles reparieren ↗

Bei den Standardwerten (KpK_p = 20, kein D) liegt die Kante bei 40. Genau da ist Mikas Drohne durchgedreht, und ihr Jojo brauchte etwa eine Sekunde pro Schwung: 6,32 rad/s ist das ωn der P-Drohne aus Kapitel 7. Mit Kd=4K_d = 4 wandert die Kante raus auf 200. Glaub uns nicht einfach: Ändere die Zahlen oben oder die Schieberegler unten und schau auf die Pole, die Mini-Karte und die Sprungantwort.

Kapitel 11: PID: Alles reparieren ↗

  • Der I-Knopf (KiK_i) bringt einen dritten Pol in den Kreis und kann ein Paar nach rechts schieben. Bei zu viel I überquert es die Linie.
  • Der D-Knopf (KdK_d) hebt durch zusätzliche Dämpfung die Stabilitätsgrenze für I an. Polbahnen können umkehren: Mehr D verschiebt nicht jeden Pol nach links.
  • Der P-Knopf (KpK_p) spreizt vor allem das schwingende Paar nach oben und unten: schneller, aber auch schwingender, wenn D nicht mithält.

Der Einstell-Spielplatz

Jetzt der Ernstfall: vom Boden auf 2 m starten, mit echten Motoren (0–20 N). Hol dir alle vier Sterne. Jedes Mal, wenn du eine Verstärkung änderst, bleibt der letzte Flug als blasser Geist stehen.

Kapitel 11: PID: Alles reparieren ↗

June: Ich hab Anti-Windup ausgeschaltet, KpK_p = 30, KiK_i = 60, KdK_d = 2 eingestellt… und die Drohne ist auf 4 m hochgeschossen, glatt aus ihrem Bild raus!

Theo: Der Haufen ist die ganze Zeit weitergewachsen, während die Motoren Vollgas gaben. Mit Anti-Windup kommen dieselben Verstärkungen nur auf 2,8 m. Gleiche Knöpfe, ganz anderes Gedächtnis.

Zwei Warnungen zu D

Warnung 1: der D-Stoß

Die Drohne schwebt auf 1 m. Bei t=1t = 1 s setzen wir den Sollwert auf 1,5 m. Wenn D die Steigung des Fehlers nimmt, springt der Fehler in einem Augenblick um einen halben Meter. Seine Steigung ist riesig, und der Schub auch.

Kapitel 11: PID: Alles reparieren ↗

Kapitel 11: PID: Alles reparieren ↗

Mika: Auf den Fehler verlangt er über 200 N? Von Motoren, die höchstens 20 schaffen?

June: Und höflich Nein sagen können sie nicht. Sie geben einen Moment lang Vollgas, und die Drohne kriegt einen Tritt in den Hintern.

Nimm stattdessen die Steigung der gemessenen Höhe, und das Problem ist weg: Die Drohne kann sich nicht teleportieren, also hat ihre Höhe keine Sprünge. Gleiche Dämpfung, kein Stoß. Fast jeder echte PID-Regler macht das so.

Warnung 2: Rauschen

Echte Höhensensoren zittern um ein paar Zentimeter. Ein paar Zentimeter Zittern, tausendmal pro Sekunde, haben eine riesige Steigung. D verstärkt das direkt in die Motoren. Die Lösung: die Messung glätten, bevor man ihre Steigung nimmt (ein Filter mit Zeitkonstante τf\tau_f). Der Preis: Man reagiert etwas später.

Kapitel 11: PID: Alles reparieren ↗

Kapitel 11: PID: Alles reparieren ↗

Mika: Okay, D sagt nicht die Zukunft voraus. Es sagt voraus, wonach dem Rauschen vor einer Millisekunde zumute war.

Was wir repariert haben

Was wir herausgefunden haben

  • P drückt proportional zum Fehler, muss aber ein Durchhängen übrig lassen, um die Drohne zu halten.
  • I häuft vergangene Fehler an; der einzige Ruhepunkt ist null Fehler, also killt es das Durchhängen, das mit einer Zeitkonstante von etwa Kp/KiK_p/K_i abklingt. Es bringt Verzögerung mit, also lässt zu viel davon alles schwingen.
  • D drückt gegen das Tempo: ein virtueller Dämpfer, der zum Luftwiderstand cc dazukommt, also ζ=(c+Kd)/(2mKp)\zeta = (c+K_d)/(2\sqrt{mK_p}). Mehr D ist nicht immer besser: Überdämpft kriecht die Drohne, und der Haufen läuft über.
  • Der geschlossene Regelkreis ist ms3+(c+Kd)s2+Kps+Kim s^3 + (c + K_d)s^2 + K_p s + K_i; er ist genau dann stabil, wenn (c+Kd)Kp>mKi(c+K_d)K_p > mK_i.
  • Nimm D von der Messung (kein Stoß) und filtere es (weniger Rauschen).

June hat unseren Drohnen-PID an der Dusche ausprobiert… und die hat genauso gewackelt wie wir in Kapitel 0. Was ist bloß mit dieser Verzögerung?

Kapitel 11: PID: Alles reparieren ↗