Stavíme kvadrokoptéru: bezpečnost, PID regulátor

29. 7. 2015
Doba čtení: 4 minuty

Sdílet

Článek je o bezpečnosti při stavbě kvadrokoptéry a navazuje na použité komponenty v minulém díle. Čtenáře by měl zdravě vystrašit, neboť kvadrokoptéra může být nebezpečná. Závěr článku je o stabilizaci kvadrokoptéry a PID regulátoru, kde si každý může povšimnout, že jeho implementace není moc složitá.

Minulý díl byl celý o komponentách pro kvadrokoptéru a nezmínil jsem důležitou věc: bezpečnost.

Kvadrokoptéra je potenciálně nebezpečné věc. To jsem si sám vyzkoušel, když mi vrtule rozsekla špičku palce i s nehtem. S trochou fantazie si možná dokážete představit, že by při nešťastné shodě událostí zvládla pořezat žíly na zápěstí, nebo tepnu na krku. Schválně si zkuste u krční tepny nahmatat, jak tenká vrstva kůže jí chrání. Myslete na to, prosím, a při testování mějte kvadrokoptéru přikurtovanou, popřípadě zajistěte, aby v jejím dosahu nebyli lidé, nedejbože malé děti. Buďte ve střehu!

Odstrašující (škaredý) obrázek hned na úvod. Pokud chcete víc, zkuste dát do Google: „quadcopter hurt“. Ale pozor, jsou tam podstatně ošklivější věci.

Je dobré si co nejdříve postavit stojan. Konstrukce není složitá, jen doporučuji, abyste kvadrokoptéru mezi stojan nenapínali mezi jakákoliv lanka – není na ně velký spoleh. Nejlepší zkušenost mám s umístěním kvadrokoptéry do stojanu za jednu z jejich os a poté její upevnění suchým zipem. Dimenzujte stojan tak, abyste měli naprostou jistotu, že kvadrokoptéru i při tom největším a zároveň škubavém tahu udrží.

Další zdroj nebezpečí plyne z použití LiPol baterií. Je třeba se opravdu držet bezpečnostních pokynů. Baterie by se neměla při nabíjení vůbec zahřívat. Pokud došlo i k malému poškození obalu jejího článku, už ji nepoužívejte. Baterie se může sama vznítit, vždy ji doma uchovávejte v nějakém kovovém hrnci v místě, kde nezpůsobí požár. Baterie jsou to vcelku drahé, pokud se vám je podaří i na okamžik zkratovat, můžete si je poškodit, čímž ztratí přinejmenším část své kapacity. V rámu mějte baterii dostatečně chráněnou proti poškození od pádů, obaly článků jsou tenké. Nepoužitelnou baterii můžete bezpečně zneškodnit tak, že ji nějaký čas necháte ponořenou ve slané vodě.

LiPol baterie vzplála přímo v modelu.

Myslete na to, že motory se chladí proudem vzduchu z vrtulí. S rostoucím odporem při jejich otáčení navíc roste odebíraný proud. Proto: pokud se vám motor nějakým způsobem zasekne o překážku, nejspíše brzy poté uvidíte, jak se z něj kouří. (Nemusel se však nutně zničit, prvotní bílý kouř pochází z pálící se izolace měděného vinutí uvnitř motoru.) Vyzkoušet si motor, jak se točí bez vrtule, není problém, neboť odebíraný proud je velmi malý.

Vinutí motoru napravo je lehce spálené.

Když jsem si psal svůj algoritmus pro řízení kvadrokoptéry, implementoval jsem si vypnutí všech motorů, pokud v posledních 0,5 s nedorazil žádný řídicí povel. Proto jsem mohl motory s jistotou zastavit vypnutím WiFi na mém notebooku.

Stabilizace kvadrokoptéry

Stabilizací je myšleno setrvání polohy kvadrokoptéry v náklonu, nejčastěji definované pilotem. K tomu je zapotřebí údaj náklonu kvadrokoptéry vzhledem k zemi (získaný z IMU) a regulační člen, který změní otáčky motorů. Jako regulační člen můžeme použít PID regulátor.

PID regulátor (dále jen PID) realizuje funkci:

Funkce PID regulátoru.

  • Kp je proporcionální konstanta
  • Ki je integrační konstanta
  • Kd je derivační konstanta
  • e(t) je chyba v čase t; e = žádaná hodnota (např. náklonu) – aktuální hodnota

Konstanty získáme jejich manuálním nastavením. Funkci je možné snadno implementovat programově (tedy diskrétně), neboť derivaci nahradíme rozdílem aktuální a předchozí chyby (vydělené Δt), integraci zase nahradíme sumací všech chyb od počátku měření (vynásobených Δt).

Kvadrokoptéra má celkem 3 osy: označíme-li motory sever, jih, východ a západ, potom motory sever-jih tvoří jednu osu (dále jen NS osa) a východ-západ druhou (dále jen EW osa); 3. osa (dále jen Z osa) je pak poněkud specifická.

Z IMU můžeme získat aktuální hodnotu náklonu pro osy NS a EW relativně k zemi. Chceme-li mít sklon NS osy 0° a aktuální je –5°, ubereme výkon na severním motoru a na jižním přidáme. Hodnotu manipulovaného výkonu získáme z PID a budeme tedy potřebovat jeden PID pro každou osu.

Zatímco osy NS a EW jasně určují sklon vůči zemi, svislá osa je vztažena k rotaci. Otočením páky na ovladači, např. joysticku, chceme nejčastěji docílit, aby kvadrokoptéra rotovala. PID svislé osy tedy musí mít na vstupu nejlépe hodnotu úhlové rychlosti okolo osy Z (získáme z IMU). Na motorech jedné osy tak dojde k přidání výkonu a jeho ubrání na druhé ose.

Popsaným způsobem pilot vychýlením ovládací páky určuje náklon kvadrokoptéry v NS a EW ose a jejím otočením (kolem osy Z) určuje rychlost její rotace, avšak rotace kolem její osy vždy kolmé k zemi, neboť při pokusu o rotaci v náklonu vlastně měníme sklon osy NS a EW, což jejich PID nechce dovolit a bude to dorovnávat. Můžeme tím tedy v náklonu zatáčet s kvadrokoptérou otáčením páky, což také vlastně intuitivně očekáváme.

Výše popsané by se dalo klasifikovat jako jeden z možných módů (neakrobatický) řízení. Použijeme-li joystick jako ovladač, budeme jeho naklápěním určovat absolutní naklopení kvadrokoptéry (např. v rozsahu od –40° do +40° pro osy NS a EW) a jeho otáčením budeme v podstatě zatáčet, resp. rotovat v případě, je-li kvadrokoptéra srovnána vodorovně.

Základní zjednodušený kód PID by mohl vypadat takto:

bitcoin_skoleni

class PID {
  float suma_err = 0;
  float predchozi_err = 0;
  public float P_const = 0;
  public float I_const = 0;
  public float D_const = 0;
  float err = 0;
  float ret = 0;

public float get_PID(float zadany_naklon, float aktualni_naklon, float diff_t) {
  err           =  zadany_naklon - aktualni_naklon;
  suma_err     +=  err;
  ret           =  P_const*err +
                   I_const*suma_err*diff_t +
                   D_const*(err - predchozi_err) / diff_t;
  predchozi_err =  err;
  return ret;
  }
}

Proměnná diff_t je vlastně čas, který uplynul od předchozího volání funkce get_PID. Budeme-li upravovat výkon motorů s frekvencí 200 Hz, potom diff_t = 1/200.

Příští díl bude o nastavení konstant PID regulátoru a úpravě výkonu motorů.

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.