Cum să vă scrieți propriul software de control al zborului – Partea 3

Bucla PID

În partea 1 a seriei noastre am vorbit despre controlerul de zbor PID Loop. Merită revistat că nu există w (vezi Figura 1). În părțile anterioare am vorbit despre modul în care decodăm intrarea telecomenzii, r (t) și despre modul în care generăm controlul PWM pentru ESC, u (t). În partea 3, vom analiza intrările de rulare, înălțime și gălăgie de la IMU și combinând-o cu r (t) pentru a obține semnalul nostru de eroare, e (t), care este alimentat în bucla noastră PID. Vom transmite valoarea de referință dorită și ieșirea buclei PID către Nexgen Configurator pentru a ajuta la reglare.

Proiectarea buclei controlerului de zbor va determina cât de bine zboară drona noastră și cât de agresiv sunt transformate intrările de control în ieșiri cu motor. Modificând parametrii buclei noastre PID vom putea produce un model de zbor care este lent și impunător sau rapid și agil. Ceea ce este adecvat depinde de scopul misiunii dronelor. Dacă faceți cinematografie, nu doriți multe schimbări bruște, dar dacă zburați acrobații, faceți acest lucru.

Pe lângă modificarea constantelor de câștig în controlerul nostru PID, putem ajusta răspunsul modelului nostru de zbor, având diferite moduri. De exemplu:

Câteva teorii

Obiectivul este un sistem de control care ajustează ieșirea pentru a îndeplini starea dorită, numită deseori punctul de referință. Controlerul PID este un sistem cu buclă închisă. Asta înseamnă că folosește feedback de la senzorul său pentru a rezolva dacă ieșirea este aceeași cu valoarea de referință. Spre deosebire de algoritmii de control simpli, controlerul PID este capabil să manipuleze intrările procesului pe baza istoricului și a ratei de schimbare a semnalului. Aceasta oferă o metodă de control mai precisă și mai stabilă.

Așa cum se arată în Figura 1, controlerul nostru de zbor determină starea dronei noastre utilizând IMU. De exemplu, giroscopul ne va spune cantitatea de rulare. Acest lucru este comparat cu intrarea de la telecomandă, în acest exemplu, cantitatea de presiune de pe mâna dreaptă (presupunând o configurare în modul 2 pe transmițătorul nostru). Diferența dintre aceste două intrări este semnalul de eroare e (t). Eroarea va fi gestionată în trei moduri; să gestionăm prezentul prin termenul proporțional, să ne recuperăm din trecut folosind termenul integral și să anticipăm viitorul prin termenul derivat.

Cantitatea fiecărei componente (P, I și D) folosită este determinată de câștigul sau ponderarea fiecărui element. Aceasta este desemnată ca Kp, Ki și Kd.

Cu setarea corectă a ponderii într-un circuit PID, puteți obține un răspuns relativ rapid cu depășire minimă (trecerea valorii punctului setat) și sunet (oscilație în jurul valorii punctului setat).

Termenul proporțional

După cum sugerează și numele, termenul proporțional (P) oferă o intrare de control al sistemului proporțională cu eroarea (Figura 2). Rezultatele mai mari ale câștigului proporțional sunt schimbări mai mari ca răspuns la eroare și, prin urmare, afectează viteza cu care controlerul poate răspunde la modificările din sistem.

În timp ce un câștig proporțional ridicat poate face ca un circuit să răspundă rapid, o valoare prea mare poate provoca oscilații în jurul valorii punctului setat. Un câștig prea mic și circuitul nu poate răspunde eficient la schimbările din sistem. Dacă ponderarea P este prea mare, veți obține un sistem instabil.

Așa cum este ilustrat în Figura 2, utilizarea unui control proporțional va lăsa un offset constant față de punctul setat. Prin urmare, trebuie să adăugăm un nou termen pentru a corecta acest lucru.

Termenul integral

Termenul integral (I) adaugă suma erorilor anterioare la intrarea de control. Sumarea erorilor va continua până când ieșirea sistemului este egală cu punctul de setare și acest lucru nu are ca rezultat nicio eroare de compensare atunci când referința este stabilă (Figura 2 – pi). Cu toate acestea, datorită răspunsului rapid al controlului integral, valorile mari ale câștigului pot provoca depășiri semnificative ale setului și pot duce la oscilație și instabilitate. Câștig prea mic, iar circuitul va fi semnificativ mai lent în a răspunde la schimbările din sistem.

Termenul derivat

Controlul derivat încearcă să reducă depășirea și ieșirea de apel din controlul proporțional și integral. Determină cât de repede se schimbă circuitul în timp (analizând derivata semnalului de eroare) și îl înmulțește cu Kd pentru a produce răspunsul derivat. O schimbare rapidă a erorii va aduce un plus la intrarea de control. Acest lucru îmbunătățește răspunsul la o schimbare bruscă a punctului stabilit, iar termenul derivat este în esență un filtru de trecere înaltă.

Spre deosebire de controlul proporțional și integral, controlul derivat va încetini răspunsul circuitului. Procedând astfel, este capabil să compenseze parțial atât depășirea, cât și amortizarea oscilațiilor cauzate de controlul integral și proporțional. Valorile mari ale câștigului de Kd pot face ca circuitul să răspundă foarte încet și să îl lase susceptibil la zgomot și la oscilația de înaltă frecvență (deoarece circuitul devine prea lent pentru a răspunde rapid). Kd prea mic și circuitul este predispus la depășirea punctului de setare. Cu toate acestea, în unele cazuri, depășirea punctului de referință cu orice cantitate semnificativă trebuie evitată și, prin urmare, poate fi utilizat un câștig derivat mai mare (împreună cu un câștig proporțional mai mic).

Figura 3 arată efectul creșterii în mod independent a câștigului oricăruia dintre parametri.

Combinarea termenilor ca controler PID oferă de obicei cele mai bune performanțe. Figura 2 rezumă ieșirea controlerelor P, PI și PID. PI este mai bun decât P, deoarece nu există nicio eroare de compensare, iar PID este mai bun decât PI datorită unui răspuns mai rapid și a unei depășiri.

Implementarea buclei PID

Având în vedere atracția universală a controlerului PID, nu este surprinzător faptul că există deja biblioteci Arduino care implementează strategiile prezentate mai sus. Acest lucru ne permite să ne concentrăm pe reglarea buclei PID pentru designul nostru specific quadcopter. Vom folosi Configuratorul Nexgen, care este scris în Procesare / Java, pentru a ne ajuta să vizualizăm intrările, ieșirile și eroarea controlerului nostru PID.

Generarea intrării de eroare

Figura 1 ilustrează modul în care semnalul de eroare, e (t), este intrarea în bucla noastră PID. Cum generăm acest semnal de eroare, având în vedere că IMU-ul nostru oferă feedback pitch, roll și yaw în degres, iar intrarea noastră de la distanță este un număr întreg proporțional cu mișcarea stick-ului de pe transmițător? Pentru a compara aceste două intrări trebuie să le avem pe ambele folosind aceleași unități. Cu alte cuvinte, trebuie să mapăm intrările telecomenzii SBUS la grade.

Dacă vă uitați la biblioteca SBUS care face parte din firmware-ul Flight Controller rulat pe Arduino Nano 33, veți vedea următorul cod în fișierul antet.

Acesta este numărul minim și maxim care va fi returnat ca rezultat al unei intrări de control de la transmițătorul nostru Taranis (de exemplu, dacă clapeta de accelerație = 0, emițătorul va trimite 172 și dacă clapeta de accelerație este 100% va trimite 1811). Numerele trimise între ele depind de curba de răspuns programată în transmițător pentru fiecare canal.

Figura 4 ilustrează curba de răspuns a clapetei pe care am programat-o în telecomanda noastră. Fiecare canal are unul dintre acestea. Puteți vedea că în acest caz curba este liniară de la -100 la 100, cu 0 produs când stick-ul este centrat. Acest lucru este convertit în 172–1811 prin protocolul SBUS, care sunt valorile implicite FrSKY. În partea 2 a acestei serii am văzut că sarcina utilă SBUS este un număr binar de 11 biți. Punctul important este că există o mapare liniară între intrarea stick și valoarea SBUS.

Putem verifica acest lucru folosind Nexgen Configurator (Figura 5) și analizând valorile SBUS de pe fiecare canal pentru intrările de control. Aceasta se găsește pe ecranul Radio Control.

În modul stabil, vom aplica un unghi maxim de înclinare și înclinare de 60 de grade, pentru a face ca aeronava să fie mai greu de accidentat. Pentru a stabili dacă malul stâng sau drept și pasul din față sau din spate sunt pozitive sau negative, vom folosi configuratorul Nexgen pentru a afla ce sistem utilizează IMU. Vom folosi același sistem pentru intrările autorității de control.

După cum este ilustrat în Figura 6, IMU are:

Când drona este paralelă cu solul, rola și pasul sunt zero grade. Astfel, trebuie să mapăm intrările de control SBUS de la 172–1811 la -60 ° la + 60 °. Dacă IMU depășește 90 °, se confundă, deci chiar și în modul acrobatic vom limita intrarea de control la 80 °.

Acum că am normalizat intrările IMU și de control, calcularea semnalului de eroare este pur și simplu o chestiune de a scădea una din cealaltă. De exemplu, eroarea de rulare ar fi calculată folosind:

În partea 4, vom vizualiza semnalul de eroare folosind Nexgen Configurator, îl vom introduce în bucla noastră PID și vom converti ieșirea într-un ciclu de funcționare PWM.