Na studiach uczyłem się, że regulator (wtedy jeszcze pneumatyczny) parametryzuje się wzmocnieniem Kp, czasem zdwojenia Ti, oraz czasem wyprzedzenia Td. Wyobraźcie sobie moje zdziwienie i irytację, gdy wreszcie zrozumiałem, że wartości Ki i Kd jakimi parametryzuje się regulatory cyfrowe, to nie są znane ze szkoły czasy Ti i Td określające dynamikę regulatora, tylko statyczne wzmocnienia tych członów dynamicznych, określające, jaka część ich odpowiedzi ma wchodzić na wyjście.
O ile nie odczuwam dysonansu przy członie całkującym, gdzie całkowana, czyli w praktyce sumowana, jest wartość błędu od początku pracy do chwili bieżącej. Moje idealistyczne wyobrażenie czasu zdwojenia jako parametru powodującego, że po tym czasie wartość całki podwaja się, nie gryzie się ze współczynnikiem wzmocnienia Ki. Zmieniając współczynnik Ki, mnożymy przez niego błąd e, jaki wchodzi do całki, i wartość całki rośnie szybciej lub wolniej. Całkowanie samo w sobie jest dynamiczne, więc wyprowadzony na zewnątrz współczynnik nadal steruje dynamiką regulatora. Znając dynamikę procesu, można pokusić się o wyskalowanie tego parametru w sekundach.
Natomiast mam dysonans poznawczy z członem różniczkującym. W regulatorach dyskretnych, bo takie implementuje się w sterownikach lotu, wejście członu D to różnica wartości bieżącej i poprzedniej. Dopóki pętla regulacji była dosyć wolna, to wartość poprzednia była przyzwoicie oddalona w czasie od wartości bieżącej i jakoś to działało. Teraz, gdy pętla regulacji przyspieszyła do prawie 2 tys. obrotów na sekundę, porównywane wartości są tak małe, że nikną w szumie pochodzącym z czujnika i taki człon praktycznie nie działa jako różniczkujący, ale jest generatorem szumu z niewielką domieszką różniczkowania. Coś trzeba z tym zrobić, aby móc wyeliminować szum i sięgnąć do wcześniejszych niż poprzednie pomiarów.
Regulowany filtr członu różniczkującego
Ponieważ w regulatorach dyskretnych różniczkowanie realizuje się przez porównanie wartości bieżącej z poprzednimi, to aby dynamika procesu regulacji była zbliżona do dynamiki obiektu, trzeba mieć możliwość regulacji sięgania głębiej w przeszłość. Dynamika obiektu w przypadku bezzałogowca to czas, jaki potrzebny jest na wykonanie zmiany kąta przy pełnym wysterowaniu mechanizmów wykonawczych. Załóżmy, że w przypadku wirnikowca o przyzwoitych rozmiarach, będącego w zawisie, położone obok siebie silniki wysterujemy na maksa i nasz obiekt zaczyna zmieniać kąt z prędkością, którą możemy odczytać na wykresie telemetrii. Wydaje się oczywiste, że potrzeba jakiegoś czasu, aby osiągnąć zadany kąt, zmieniając go z daną prędkością kątową. Nie jestem jeszcze pewien, jak znormalizować taki pomiar, ale na razie zostawmy to. Załóżmy, że potrzeba 0,2 sekundy, aby nasza platforma wreszcie uzyskała wymagany kąt. Te 200 ms określa dynamikę naszego obiektu. Dla małego wirnikowca to może być 50 ms. Dynamika zmieni się, gdy obciążymy nasz BSP ładunkiem, ponieważ zmieni się proporcja wysterowania maksymalnego do wysterowania w zawisie. Wtedy mniej mocy będzie szło na zmianę kąta, a więcej na statyczne utrzymanie zawisu. Dynamika regulacji się zmniejszy, podczas gdy bezwładność obiektu, czyli zapotrzebowanie na nią, wzrośnie. Tak czy inaczej, dynamika musi mieć możliwość regulacji, co najmniej ręcznie.
Skorygujcie mnie, jeżeli się mylę, ale wydaje mi się, że dobrze byłoby, aby człon różniczkujący regulatora mógł porównywać wartość bieżącą z wartością oddaloną o taki sam czas, czyli te 200 ms. Pierwszy pomysł na implementację to bufor danych wejściowych o rozmiarze powiedzmy 500, co przy pętli 2 kHz pozwoli sięgnąć do pomiaru 250 ms przed obecną chwilą. Takie rozwiązanie ma dwie wady: Jest bardzo pamięciożerne. Dane typu float potrzebują 4 bajtów na każdy parametr. Pomnożone przez 12 regulatorów i rozmiar bufora da to 23,4 kB pamięci. Drugi problem polega na tym, że porównując dwie w sposób naturalny zaszumione wartości, wartość szumu w wyniku porównania się podwaja.
Rozwiązaniem eliminującym obie te niedogodności jest użycie filtra NOI – o Nieskończonej Odpowiedzi Impulsowej (ang. IIR – Infinite Impulse Response). Jest to prosty w implementacji filtr działający według wzoru:
wyjście = ((podstawa_filtra - 1) * wyjście + wejście) / podstawa_filtra
Przykładowo, jeżeli podstawa filtra wynosi 10, to do 9/10 bieżącej wartości filtra dodaje się 1/10 nowej wartości. Taki filtr ma łagodną, ciągłą odpowiedź w przeciwieństwie do filtra uśredniającego N ostatnich wartości, który ma ostrą charakterystykę, ponieważ wchodzą tam wartości od 0 do N, a wartość N+1 już jest odrzucana. Im większa podstawa filtra NOI, tym filtr mocniej uśrednia i dłużej przechowuje wartości z przeszłości. Regulując podstawę filtra, pozwalamy danym dłużej pozostawać w filtrze, czyli de facto sięgamy do pomiarów wykonanych wcześniej. Ponieważ filtr uśrednia więc usuwa tym więcej szumu, im większą ma podstawę. Przy odpowiednio mocnym filtrowaniu wynik porównania wartości bieżącej z wartością filtrowaną ma w sobie praktycznie tylko szum wartości bieżącej.
Obserwacja procesu regulacji
Aby móc obserwować przebiegi procesów w postaci wykresów, używam telemetrii, aby na bieżąco rysować wykresy wbudowane w aplikację NSK. W historycznych wersjach APL dostępne były podstawowe zmienne telemetryczne każdego regulatora. Poniżej przedstawione są fragmenty definicji nazw zmiennych telemetrycznych przykładowych regulatorów pochylenia i prędkości kątowej pochylenia dostępnych w NSK:
- "Kąt Theta BSP"; //kąt pochylenia
- "Wart.zadana pochylenia"; //wartość zadana regulatora sterowania pochyleniem
- "Wy P pochylenia"; //wyjście członu P
- "Wy I pochylenia"; //wyjście członu I
- "Wy D pochylenia"; //wyjście członu D
- "Wy PID pochylenia"; //wyjście regulatora sterowania pochyleniem
- "Predkość kątowa Q BSP"; //prędkość kątowa pochylenia
- "Wart.zad.pr.kąt.poch"; //wartość zadana regulatora prędkością kątowej pochylenia
- "Wy P pr.kąt.poch"; //wyjście członu P
- "Wy D pr.kąt.poch"; //wyjście członu D
- "Wy PID pr.kąt.poch"; //wyjście regulatora sterowania prędkością kątową pochylenia
Obecnie dodano do nich jeszcze zmienne pozwalające na wizualizację stanu filtrów zmiennych podlegających różniczkowaniu oraz wartość wyjściową wyprzedzenia.
- "Filtr wej. pochyl"; //przefiltrowana (0..15) wartość wejściowa dla wszystkich członów
- "Filtr różn.pochyl"; //przefiltrowana (0..255) wartość wejściowa dla członu różniczkującego
- "Fil.w.wej.pr.kąt.poch"; //przefiltrowana (0..15) wartość wejściowa dla wszystkich członów
- "Fil.różn.pr.kąt.poch"; //przefiltrowana (0..255) wartość wejściowa dla członu różniczkującego
- "Fil.w.zad.pr.kąt.poch"; //przefiltrowana (0..255) wartość zadana dla członu wyprzedzenia
- "Wyprzedz. pr.kąt.poch"; //wartość wyprzedzająca.
Eksperyment z regulacją czasu różniczkowania
Aby zweryfikować, jak się zachowują filtry, zrobiłem serię pomiarów dla kaskady regulatorów pochylenia i prędkości kątowej pochylenia podczas ręcznego wymuszenia niewielkiej zmiany kąta. Pomiary są zrobione dla filtrów członu różniczkującego obu regulatorów. Dla mnie wykres kąta jest bardziej intuicyjny, ale prezentuję oba. Zacznę od największej wartości podstawy filtra, ponieważ tam dzieje się najwięcej. Liniami niebieską i czerwoną przedstawione są wartości wejściowe: surowa i po przejściu przez filtr NOI. Prezentują one wykres zbliżony do prostokąta i jego wygładzoną przez filtr wersję. Na podstawie ich różnicy wyznaczana jest wartość pochodnej widocznej jako fioletowy wykres. W tej chwili nie interesuje nas jej amplituda, bo ją można niezależnie regulować, ale interesuje nas kształt i odwzorowanie rzeczywistości. Człon P ma wartości poniżej 0, gdyż regulator ustawiony dla Pentakoptera wymusza pewien kąt natarcia, a autopilot leży płasko na biurku, więc regulator próbuje go pochylić.

Podstawa filtra 250 bliska maksimum. Na pierwszy rzut oka widać ładną akcję różniczkującą. Jednak opadające zbocza odpowiedzi członu różniczkującego ciągną się bardzo długo. Zmiana kąta nastąpiła już dawno temu, a zbocze opadające jeszcze się ciągnie. Ta nastawa filtra sięga zbyt głęboko w przeszłość. Tak ustawiony człon różniczkujący będzie powodował przeregulowanie.

Podstawa filtra 200. Impulsy członu D szybciej wygasają, ale wciąż rozciągają się poza obserwowalną zmianę.

Podstawa filtra 150. Tutaj jest podobnie, chociaż widać, że amplituda sygnału się zmniejsza. Coraz bardziej zaczyna być widoczny szum procesu, czyli zaczynają być widoczne zmiany w różniczce w sytuacjach, gdy kąt wydaje się stabilny.

Podstawa filtra 100. Tutaj amplituda jeszcze się zmniejsza, ale szerokość impulsu różniczkującego odpowiada mniej więcej szerokości zmiany sygnału. Ta nastawa wydaje się bliska optymalnej. Dla tej nastawy należałoby sprawdzić, jak BSP zachowuje się w locie przy zmianie jej wartości w zakresie ±50%.

Podstawa filtra 50. Tutaj jeszcze jest w miarę OK, ale amplituda szumu procesu sięga już ok. 1/4 amplitudy sygnału.

Podstawa filtra 25. Tutaj odpowiedź członu D jest dosyć słaba, a stosunek sygnału do szumu coraz bardziej maleje.

Podstawa filtra 12. Przy tej nastawie prawie nie widać różniczkowania i szum coraz trudniej odróżnić od sygnału rzeczywistego. W takim locie zwiększanie wartości członu D będzie nieznacznie poprawiało dynamikę, a istotnie zwiększało poziom drgań.
Dodatkowy filtr danych wejściowych
Spostrzeżenie, że przy odpowiednio małych wartościach podstawy filtra różniczkowanie praktycznie jest przesłonięte szumem, natchnęło mnie, aby zaimplementować jeszcze jeden mały filtr, tym razem danych wejściowych. Jego zadaniem jest wstępna redukcja szumu tak, aby porównywać sygnał nie bezpośrednio z czujnika, ale taki, w którym szum został wstępnie obniżony. Wynik członu różniczkującego „D” regulatora powinien być znacznie gładszy, co przełoży się na mniejsze szarpanie silnikami, czyli mniej wibracji w locie i mniejsze straty energii. Trzeba będzie oczywiście w sposób eksperymentalny znaleźć balans między opóźnieniem regulacji a redukcją szumu, bo obecnie nie potrafię wyznaczyć go w sposób teoretyczny.
Podstawę czasu takiego filtra wstępnie ograniczę do 15, aby nie pozwolić niedoświadczonemu użytkownikowi na zepsucie regulacji. Przy takiej podstawie nie powinno być jeszcze tragedii. Warto byłoby uniknąć sytuacji, w której zmienna poprzednia, czyli ta z dużego filtra, będzie wcześniejsza niż bieżąca – bo np. ktoś ustawi na zero duży filtr różniczkowania, a filtr wejściowy ustawi na maksa. Wtedy różniczkowanie mogłoby mieć odwrotny znak i zupełnie popsuć regulację, więc filtry ustawię szeregowo: najpierw filtr danych wejściowych, a za nim filtr różniczkowania. W ten sposób będzie zagwarantowana poprawność działania różniczkowania z możliwością jej wyłączenia, poprzez zjechanie z podstawą obu filtrów do zera. Tak schematycznie wyglądałby powyższy człon różniczkujący:

Poniżej przedstawiono przykładowe wykresy, pokazujący działanie filtra. Telemetria pokazuje filtrowane wartości wejściowe i odpowiedź członu D dla regulatora kąta pochylenia oraz regulatora prędkości kątowej pochylenia. Jest ustawiona maksymalnie szybko, na 100 Hz, co przy procesie zachodzącym z częstotliwością 1800 Hz sprawia, że trzeba mieć na uwadze spory aliasing.
Prawa połowa wykresu przedstawia sytuację wyłączonego filtra danych wejściowych. Lewa to dane z maksymalnym filtrowaniem, czyli podstawa filtra wynosi 15. Warunki częściowo dynamiczne: Pentakopter jest zamocowany na stanowisku do strojenia w osi pochylenia, ma swobodę tylko w pochyleniu. Pracuje w trybie stabilizacji kąta, samodzielnie utrzymując zadany kąt 0,15 rad. Wyłączyłem człon całkujący, więc pewnie dlatego nie trzyma zadanego kąta, bo nie udało mi się zamocować go dokładnie w środku ciężkości, więc jest stały uchyb. Na górnym wykresie regulatora kąta pochylenia widać, że zmniejsza się szum odpowiedzi regulatora. Natomiast efekt użycia filtra jest znacznie lepiej widoczny na wykresie regulatora prędkości. Tam z dosyć chaotycznego szumu wyłania się wyraźna linia trendu.

Być może filtr powinien być większy ale to jest kwestia dalszych eksperymentów w warunkach lotu, bo stanowisko testowe wprowadza pewne opory i obiekt może zachowywać się trochę inaczej niż wisząc w powietrzu.
Jeszcze jeden test ze stanowiska pomiarowego. Tym razem płynna zmiana wartości podstaw obu filtrów wejściowych kaskady regulatorów pochylania. Warunki pomiaru: regulator kąta ma włączony tylko człon P na dosyć niskim wzmocnieniu wynoszącym 80, bezpiecznym pod względem możliwości wystąpienia oscylacji. Regulator prędkości kątowej ma nastawy obecnie uznawane za bliskie optymalnych: wzmocnienie KP ustawione na 250, KD = 0,05. KI i KW są wyłączone przez ustawienie zera. Wartości podstawy obu filtrów wejściowych podłączam do dwu kanałów z potencjometrami i zwiększam ząbek po ząbku od 0 do 31, co jest pokazane na środkowym wykresie. Na górnym wykresie o wspólnej skali są wygnały wejściowe z czujników i wartość zadana wychodząca z regulatora kąta. Na dolnym są składowe wyjściowe regulatora prędkości kątowej pochylenia.

Zmiana podstawy filtra na wejściu regulatora kąta jest tutaj praktycznie bezobjawowa. Troszkę widać po zmianie amplitudy szumy wartości zadanej prędkości kątowej, czyli przeskalowanej wartości wyjściowej regulatora kąta. To nie jest właściwa skala ani odpowiednie nastawy do oceny pracy tego filtra. Natomiast dobrze widać wpływ zmiany podstawy filtra wejściowego prędkości kątowej (niebieskie schodki na środkowym wykresie) na pracę tegoż regulatora (dolny wykres). Dla wyłączonego filtra jest spory szum na wyjściu regulatora, który szybko spada. Wystarczy podstawa ok. 4 aby osiągnąć minimum szumu i trwa tak od ok. 14. Od około 20 zaczynają się coraz silniejsze oscylacje. Prawdopodobnie to efekt opóźnienia danych wejściowych, wywołanych dużą podstawą filtra. Okazuje się że zwiększenie podstawy filtra z 15 do 31 nie miało sensu dla regulatora pochylenia. Za jakiś czas zobaczymy czy będzie to miało dla wolniejszych procesów regulacji wysokości i odchylenia.