Rozdział 11

PID: naprawiamy wszystko

Jak pozbyć się zwisu i zatrzymać kołysanie?

Rozdział 11: PID: naprawiamy wszystko ↗

Zwis, który nie chce zniknąć

Theo: Pamiętacie rozdział 2? Nasz regulator P zostawiał drona wiszącego poniżej 2 m i żadne KpK_p nie mogło tego naprawić. Czas się dowiedzieć, co może.

Żeby utrzymać drona w górze, silniki muszą pchać z siłą mg≈4,9mg \approx 4{,}9 N, bez końca. Regulator P pcha tylko wtedy, gdy jest uchyb: T=Kp e\eff{T} = K_p\,\err{e}. Więc żeby pchać z siłą 4,9 N, potrzebuje uchybu e=mg/Kp\err{e} = mg/K_p. Przy KpK_p = 20 N/m to e\err e = 4,9/20 ≈ 24,5 cm, na zawsze. Zwis to nie błąd w strojeniu. To cena, jaką P pobiera za utrzymywanie czegokolwiek w górze.

June: Czyli potrzebujemy części regulatora, która potrafi pchać z siłą 4,9 N przy zerowym uchybie. Czegoś z pamięcią.

I: stos dawnego uchybu

Pomysł jest taki. Prowadź bieżącą sumę uchybu, czyli pole pod krzywą uchybu, dokładnie to „zbierane pole” z rozdziału 3. Pchaj proporcjonalnie do tego stosu:

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

Dopóki dron jest poniżej 2 m, uchyb jest dodatni i stos ciągle rośnie, więc pchnięcie też ciągle rośnie. Stos przestaje rosnąć dopiero wtedy, gdy uchyb jest dokładnie zerowy. Wtedy po prostu zostaje, trzymając ciąg, jaki zdążył zbudować. To właśnie pamięć, której chciała June.

Theo: O, to sprytne. Dron nie może się ustalić nigdzie poza 2 m, bo wszędzie indziej stos wciąż by się zmieniał.

Rozdział 11: PID: naprawiamy wszystko ↗

Najpierw zgadnij! Mika chce się pozbyć zwisu szybko, więc planuje mocno podkręcić KiK_i. Co się stanie?

Widżet startuje z KiK_i = 10 N/(m·s). Obserwuj trzy rzeczy: czerwone zacieniowane pole (uchyb, który się gromadzi), przerywaną pomarańczową część całkującą ciągu, która wspina się do fioletowej linii grawitacji, oraz odczyt zwisu. Przesuń KiK_i do 0, a wróci zwis z rozdziału 2, potem spróbuj większych wartości. KpK_p jest ustalone na 20 N/m.

Rozdział 11: PID: naprawiamy wszystko ↗

Rozdział 11: PID: naprawiamy wszystko ↗

Mika: Podkręcaj! Ki=50K_i = 50! Spalić to ogniem!

Mika: …czemu to się nie zatrzymuje? Podskoki rosły i rosły, a teraz dron jeździ w górę i w dół jak jojo o pół metra, bez końca!

Theo: Przy 50 przekroczyłaś jakąś krawędź. Sprawdziłem kilka wartości: poniżej mniej więcej 40 się ustala, powyżej nie (a jedno wahnięcie jojo trwa około sekundy). Zaraz zobaczymy dlaczego. Stos jest zawsze trochę spóźniony: pcha w górę jeszcze po tym, jak dron minął 2 m.

To błąd Miki i to bardzo częsty: całka naprawia zwis, ale dodaje opóźnienie, a opóźnienie powoduje wahania (nauczył nas tego prysznic). Potrzebujemy czegoś, co odpycha się od prędkości. (Według matematyki wahania jej drona powinny rosnąć w nieskończoność. Zatrzymują się na mniej więcej pół metra tylko dlatego, że przy każdym wahnięciu ciąg spada do 0 N: śmigła nie potrafią ciągnąć w dół, to ograniczenie z rozdziału 10.)

D: wirtualny amortyzator

June: W rozdziale 7 to tłumik uspokajał sprężynę. A gdyby regulator udawał tłumik?

Tłumik działa przeciwnie do prędkości. Więc dodajmy składnik, który działa przeciwnie do tego, jak szybko porusza się dron:

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

Spójrz na równanie drona: opór już daje −c h˙-c\,\dot h. Składnik D dodaje do tego −Kd h˙-K_d\,\dot h, więc dron zachowuje się tak, jakby jego opór wynosił c+Kdc + K_d. Dodajemy opór powietrza w oprogramowaniu.

Rozdział 11: PID: naprawiamy wszystko ↗

Rozdział 11: PID: naprawiamy wszystko ↗

Włącz duże wzmocnienie I Miki, a potem dodaj tłumienia. Nawet Kd=0,5K_d = 0{,}5 N·s/m przywraca stabilność (przesuwa krawędź do Ki=60K_i = 60): niekończące się jojo zamienia się w podskakiwanie, które wygasa. Ale przeregulowanie wciąż wynosi co najmniej jedną czwartą, ile D byś nie dodała. Ten ogromny stos po prostu za dużo pamięta. Teraz wyłącz KiK_i Miki (z powrotem na 10) i spróbuj Kd≈3K_d \approx 3–5: spokój. I i D coś za coś: D daje miejsce na I, ale nie nieograniczone.

June: Skoro 4 jest dobre, to 10 musi być lepsze. Maksymalny amortyzator!

Mika: Pełznie w górę tak powoli… a potem i tak przelatuje 2 m? Z opóźnieniem?

Theo: June, to znowu twój miodowy dron z rozdziału 7! Powyżej Kd≈5,3K_d \approx 5{,}3 szybka para jest przetłumiona. Ale teraz jest jeszcze stos, a powolny dron daje stosowi czas, żeby się przepełnił.

Tłumienie krytyczne to ζ = 1: Kd=2mKp−c≈5,3K_d = 2\sqrt{m K_p} - c \approx 5{,}3 N·s/m przy KpK_p = 20. Przy KiK_i = 10 przejście z KdK_d = 4 na 10 podnosi przeregulowanie z 0 do około 8 %, a czas ustalania z poniżej sekundy do około 5 s. Więcej D nie zawsze znaczy lepiej; widżet mówi to teraz, gdy przesadzisz.

Mika: Czyli D przewiduje przyszłość! Widzi, dokąd dron leci, i jest tam pierwszy.

Theo: Nie do końca. Zna tylko nachylenie w tej chwili. To jak zgadywanie, gdzie wyląduje piłka, przy założeniu, że poleci prosto. Zwykle niezły strzał, ale to nie magia. Poczekaj, aż podłączymy mu rozedrgany czujnik.

Co każde pokrętło robi z biegunami

Czas użyć mapy z rozdziału 10. Zapiszmy całą pętlę, z 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}

Całka jest niewygodna, więc weźmy nachylenie obu stron. Nachylenie i pole znoszą się nawzajem (rozdział 3), więc nachylenie ∫e dt\int \err e\,dt to po prostu e\err e. Grawitacja jest stała, więc jej nachylenie wynosi zero: po prostu wypada. Przy stałej wartości zadanej e˙=−h˙\dot{\err e} = -\dot{\out h}. Składnik po składniku:

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}

Złóżmy je z powrotem i przenieśmy wszystko z h\out h na lewo. Trzy kropki nad h...\dddot{\out h} oznaczają nachylenie nachylenia nachylenia:

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: Grawitacja zniknęła z równania. To zabójca zwisu w wersji algebraicznej: końcowa wysokość w ogóle nie przejmuje się mgmg. O ile w ogóle się ustala. Dron Miki z Ki=50K_i = 50 nigdy się nie ustalił.

Znów zgadujemy este^{st}. Przy aktywnym I równanie jest trzeciego stopnia, więc są trzy bieguny. Jeśli Ki=0K_i=0, nie ma całkowania: branie nachylenia dodało fałszywy pierwiastek w s=0s = 0, wspólny czynnik ss się skraca i dron z PD ma dwa bieguny.

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

Dla wielomianu trzeciego stopnia o samych dodatnich współczynnikach a3s3+a2s2+a1s+a0a_3 s^3 + a_2 s^2 + a_1 s + a_0 istnieje klasyczny test (kryterium Routha–Hurwitza), który mówi, że wszystkie trzy bieguny leżą w lewej połowie dokładnie wtedy, gdy a2a1>a3a0a_2 a_1 > a_3 a_0. Dla naszego drona to krawędź urwiska:

(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: Reguła z nazwiskami dwóch osób. Mamy po prostu w nią uwierzyć?

Theo: Nie. Sami możemy znaleźć tę krawędź.

W chwili, gdy kołysząca się para dociera do osi pionowej, jej część rzeczywista jest zerowa, więc wstawmy s=iωs=i\omega do równania trzeciego stopnia. Ponieważ i2=−1i^2 = -1 i i3=−ii^3 = -i, części rzeczywiste i części „w bok” muszą osobno sumować się do zera:

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

Drugie mówi, że ω2=Kp/m\omega^2 = K_p/m. Wstawmy to do pierwszego:

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

Rozdział 11: PID: naprawiamy wszystko ↗

Przy wartościach startowych (KpK_p = 20, bez D) krawędź leży na 40. Dokładnie tam dron Miki oszalał, a jego jojo robiło mniej więcej jedno wahnięcie na sekundę: 6,32 rad/s to własne ωn drona z P z rozdziału 7. Dodanie Kd=4K_d = 4 przesuwa krawędź do 200. Nie wierz nam na słowo: zmieniaj liczby powyżej albo suwaki poniżej i obserwuj bieguny, minimapę i odpowiedź skokową.

Rozdział 11: PID: naprawiamy wszystko ↗

  • Pokrętło I (KiK_i) dodaje do pętli trzeci biegun i może pchać parę w prawo. Przy zbyt dużym I para przekracza granicę.
  • Pokrętło D (KdK_d) przez dodatkowe tłumienie podnosi granicę stabilnego wzmocnienia I. Tory biegunów mogą zawracać: większe D nie przesuwa każdego bieguna w lewo.
  • Pokrętło P (KpK_p) głównie rozsuwa oscylującą parę w górę i w dół: szybciej, ale bardziej chwiejnie, jeśli D nie nadąża.

Poligon do strojenia

Teraz na serio: start z ziemi na 2 m z prawdziwymi silnikami (0–20 N). Zdobądź wszystkie cztery gwiazdki. Za każdym razem, gdy zmienisz wzmocnienie, ostatni lot zostaje jako blady duch.

Rozdział 11: PID: naprawiamy wszystko ↗

June: Wyłączyłam anti-windup, ustawiłam KpK_p = 30, KiK_i = 60, KdK_d = 2… i dron wystrzelił na 4 m, prosto poza swój obrazek!

Theo: Stos rósł przez cały czas, gdy silniki szły na maksa. Z włączonym anti-windupem te same wzmocnienia dają szczyt na 2,8 m. Te same pokrętła, zupełnie inna pamięć.

Dwa ostrzeżenia w sprawie D

Ostrzeżenie 1: szarpnięcie różniczkujące

Dron wisi na 1 m. W chwili t=1t = 1 s przestawiamy wartość zadaną na 1,5 m. Jeśli D używa nachylenia uchybu, to uchyb w jednej chwili skacze o pół metra. Jego nachylenie jest ogromne, a pchnięcie również.

Rozdział 11: PID: naprawiamy wszystko ↗

Rozdział 11: PID: naprawiamy wszystko ↗

Mika: Na uchybie żąda ponad 200 N? Od silników, które dają najwyżej 20?

June: A one nie umieją grzecznie odmówić. Na chwilę walą na maksa, a dron dostaje kopa w tyłek.

Branie nachylenia zmierzonej wysokości rozwiązuje problem: dron nie potrafi się teleportować, więc jego wysokość nie ma skoków. To samo tłumienie, bez szarpnięcia. Robi tak prawie każdy prawdziwy PID.

Ostrzeżenie 2: szum

Prawdziwe czujniki wysokości drżą o kilka centymetrów. Kilka centymetrów drżenia, tysiąc razy na sekundę, ma ogromne nachylenie. D wzmacnia je prosto w silniki. Rozwiązaniem jest wygładzenie pomiaru przed wzięciem nachylenia (filtr ze stałą czasową τf\tau_f), kosztem nieco późniejszej reakcji.

Rozdział 11: PID: naprawiamy wszystko ↗

Rozdział 11: PID: naprawiamy wszystko ↗

Mika: Dobra, D nie przewiduje przyszłości. Przewiduje to, jak szum się czuł milisekundę temu.

Co naprawiliśmy

Co udało nam się ustalić

  • P pcha proporcjonalnie do uchybu, ale musi zostawić zwis, żeby utrzymać drona w górze.
  • I gromadzi dawny uchyb; jedynym punktem spoczynku jest zerowy uchyb, więc eliminuje zwis, który gaśnie ze stałą czasową około Kp/KiK_p/K_i. Dodaje opóźnienie, więc przy przesadzie powoduje wahania.
  • D działa przeciwnie do prędkości: wirtualny tłumik, który dodaje się do oporu cc, więc ζ=(c+Kd)/(2mKp)\zeta = (c+K_d)/(2\sqrt{mK_p}). Więcej D nie zawsze znaczy lepiej: przetłumiony dron pełznie, a stos się przepełnia.
  • Układ zamknięty to ms3+(c+Kd)s2+Kps+Kim s^3 + (c + K_d)s^2 + K_p s + K_i; jest stabilny dokładnie wtedy, gdy (c+Kd)Kp>mKi(c+K_d)K_p > mK_i.
  • Licz D z pomiaru (bez szarpnięcia) i go filtruj (mniej szumu).

June wypróbowała nasz dronowy PID na prysznicu… i kołysało się dokładnie tak jak nam w rozdziale 0. O co chodzi z tym opóźnieniem?

Rozdział 11: PID: naprawiamy wszystko ↗