Stavíme kvadrokoptéru: PID regulátor

6. 8. 2015
Doba čtení: 4 minuty

Sdílet

PID regulátor je používán v mnoha odvětvích průmyslu, dá se také použít ke stabilizaci kvadrokoptéry a nejen to: můžeme ho použít k regulaci teploty v místnosti, stabilizaci segwayů, zkrátka všude tam, kde je potřeba něco regulovat. V tomto článku pokračuji v jeho implementaci v rámci kvadrokoptéry.

V minulém díle jsem začal PID regulátor a v tomto díle jej dokončím. Nejprve se odkážu na kód PID regulátoru z minulého dílu a ukážu, jakým způsobem upravuji výkon motorů:

float supp = 0;
supp =                    get_pid( // Funkce PID regulátoru.
                          &pid_ns, // Reference na strukturu s daty PID regulátoru pro North-South osu.
       command.x + command.trim_x, // Požadovaný náklon (z joysticku) + korekční hodnota (trimr).
                           ypr[1], // Náklon kvadrokoptéry v NS-ose získaný z IMU.
                        1/LOOP_HZ  // časová perioda, s jakou probíhá update motorů.
                                );
     power_n = command.pwr - supp; // command.pwr je hodnota výkonu definovaná na joysticku, kde
     power_s = command.pwr + supp; // na jedné straně k výkonu připočtu supp, na druhé ho zase odečtu.

supp = get_pid(&pid_ew, command.y + command.trim_y, ypr[2], 1/LOOP_HZ); //to samé pro EW osu
    power_e = command.pwr + supp;
    power_w = command.pwr - supp;

supp = get_pid(&pid_z, command.z, gyroZ, 1/LOOP_HZ); // PID pro korekci rotace. Vstupem je úhlové zrychlení okolo osy Z.
    power_n += supp; // Korekce pro rotaci probíhá na všech
    power_s += supp; // motorech. Cílem je dosáhnout rozdílu
    power_e -= supp; // výkonu na obou osách, čímž je vyvíjena
    power_w -= supp; // rotace. 

V kódu je v tento moment nejdůležitější si povšimnout, jak vlastně vypadá korekce výkonu pro jednotlivé osy. Z funkce get_PID je vrácena hodnota, která bude rozdílem (dvojnásobným) výkonu motorů na ose, ke které je PID vztažen. V případě osy Z, jak jsem pojmenoval osu pro rotaci kvadrokoptéry, je korekční hodnota výkonu rozdílem výkonu obou os. Pokud se zaměříme na NS-osu, rozdíl výkonu na jejich motorech tedy vyvíjí klopení.

Schéma PID regulátoru

Schéma PID regulátoru

PID regulátor je složen ze součtu tří složek: P-proporcionální, I-integrační, D-derivační. Každá z těchto složek má svou vlastní konstantu, kterou ručně nastavujeme. Představme si, že kvadrokoptéru umístíme do stojanu za EW-osu a budeme si hrát s PID regulátorem NS-osy. Na jednu stranu kvadrokoptéry přiděláme olůvko, takže se kvadrokoptéra překlopí. V tuto chvíli jsou všechny tří konstanty PID nastaveny na hodnotu 0 a joystick je ve výchozí poloze, takže požadovaný náklon je 0°.

Čím více budeme zvětšovat proporcionální konstantu, tím víc se bude projevovat rozdíl mezi požadovaným náklonem a aktuálním náklonem, což je tzv. chybový signál, a kvadrokoptéra se bude víc a víc srovnávat. V určitém momentě hodnoty proporcionální složky začne kvadrokoptéra lehce oscilovat – jednou se překlopí lehce na jednu stranu, potom zase na druhou. Pokud budeme pokračovat ve zvyšování konstanty, v určitý moment oscilace naberou rostoucí charakter, budou se samovolně víc a víc zvětšovat. Důležité zde je, že za pomocí proporcionální složky nelze kvadrokoptéry stabilizovat – buďto by nebyl dosažen požadovaný náklon (vždy by něco chybělo), nebo by došlo k oscilacím.

Integrační složka oproti proporcionální nezačne působit okamžitě. Integrace je v našem případě vlastně sumace všech chybových signálů. Nyní budou všechny konstanty na opět nule, naše kvadrokoptéra bude s olůvkem převrácená, a my o něco zvýšíme integrační konstantu. Kvadrokoptéra nejprve nic neudělá. Postupně ale uvidíme (spíše uslyšíme), že rostou otáčky na jednom z motorů. Postupně začne víc a víc narůstat integrační složka a kvadrokoptéra se začne srovnávat. Nakonec se srovná do polohy oscilací okolo požadovaného náklonu. Pokud integrační složku zvýšíme za určitou mez, i v tomto případě naberou oscilace zvětšující se charakter.

Nakonec derivační složka. Derivační složka je v podstatě rozdíl aktuálního chybového signálu a předchozího chybového signálu. Působí PROTI jakékoliv ZMĚNĚ náklonu. Pokud zvednete hodnotu této konstanty, uvidíte, že kvadrokokoptéra převrácená ve stojanu opravdu nic neudělá a ani po čase se nic nestane. Přijďte k ní a zkuste ji obrátit ručně: uvidíte, že kvadrokoptéra vám bude v tomto pohybu bránit. Čím výš nastavíte derivační konstantu, tím tužší bude jakýkoliv pokus o rotaci kvadrokoptéry. Pokud to s derivační konstantou přeženete, motory začnou škaredě vibrovat, protože derivační složka začne přehnaně reagovat na šumový signál a zesílí jej.

Všechny tři složky PID regulátoru se krásně doplňují, ale je třeba dobře nastavit jejich konstanty. K tomu s dá použít následující metoda.

Ziegler-Nicholsova metoda

Je to jednoduché, takže to zkrátím. Jak už jsem řekl, když zvyšujeme proporcionální konstantu (zbývající konstanty musí být na nule), tak v určitý moment začne kvadrokoptéra lehce oscilovat. Tato hodnota, pojmenujme ji Ku, a následující tabulka, je vše, co potřebujete k základnímu nastavení konstant:

Ziegler-Nicholsova metoda pro nastavení PID regulátoru

Ziegler-Nicholsova metoda pro nastavení PID regulátoru

Osobně používám variantu „no overshoot“. Proporcionální konstantu Kp nastavíme jako 0.2*Ku, integrační konstantu pak nastavíme jako 2*Kp, derivační konstantu jako Kp/3. Proměnná Tu je oscilační perioda a upřímně, nikdy jsem se jí nezabýval, protože jednotlivé konstanty si pak stejně dodatečně doladím podle potřeby ručně.

Důležitý je zde tedy poměr konstant P:I:D 3:6:1, který vám dá dobrý základ. Z mé zkušenosti nicméně plyne, že je nutné všechny konstanty, které vzešly z této metodiky, proporcionálně zvětšit o nějaký jejich společný násobek, neboť toto základní nastavení je moc slabé – kvadrokoptéra nereaguje na ovládání dostatečně ostře. Proto jsem si do GUI na notebooku kromě číselníku k nastavení konstant PID regulátorů ještě přidal jeden, který je násobí. S PID regulátorem je zkrátka třeba si trochu vyhrát.

Závěr

PID regulátor je velice důležitá a užitečná věc nejen pro použití v kvadrokoptéře, ale všude tam, kde je potřeba regulace, od balancujících robotů na dvou kolečkách po regulaci teploty v místnosti. Má řadu obměn pro použití v různých systémech, které můžete najít v publikacích pana prof. Ing. Miloše Schlegela, CSC.

Následující videa ukazují využití PID regulátoru v různých aplikacích:

bitcoin školení listopad 24

Autor článku

Jiří Kačírek je studentem informatiky při VŠB FEI, ve svých projektech nejraději používá C++ a knihovnu Qt. Je fanouškem Linuxu a open-source, který rád používá především jako programátorskou základnu.