Care este rolul si cum functioneaza un PID control?
#31
Postat 25 January 2015 - 04:22 PM
asteapta mai bine sa vine jucariile si apoi experimentezi si ne tii la curent :).
eu lucrez la un pendul invers rotativ, dar nu imi vine sa investesc bani intr-un servo mega rapid. gen vreo 80 euro.
/------------------------\ |~~\_____/~~\__ | | Hash84 |______________ \______====== )-+ | | ~~~|/~~ | \------------------------/ ()
#32
Postat 14 February 2015 - 02:51 PM
Pana una alta m-am pus sa asamblez cat de cat drona, am fost asa nerabdator sa-i dau in gura la un motor cu elice (10x4.5) incat uitasem sa strang piulita si mi-a zburat elicea n`freza :D
http://s4.postimg.org/mn2v0subt/10960390_930051323695971_8938670821176946920_o.jpg
momentan lucrez la un frame de lemn pt joaca cu PID-urile, insa am cateva intrebari legate de throttle la motoare.
am atasat mai jos niste poze cu diferite moduri de control la motoare, sunt ok turatiile gandite?
throttle motor1 = throttle_primar + pitch_offset - roll_offset - yaw_offset
throttle motor2 = throttle_primar + pitch_offset + roll_offset + yaw_offset
throttle motor3 = throttle_primar - pitch_offset + roll_offset - yaw_offset
throttle motor4 = throttle_primar - pitch_offset - roll_offset + yaw_offset
throttle primar - vine din telecomanda
roll,pitch si yaw ofsets sunt iesirile unor pid-uri in care imi intra semnalele (Setpoints) din telecomanda si feedback vine din IMU, roll/pitch/yaw angles
Esc-urile sunt cu firmware simonk
Este gandit corect pana aici?
In imagini turatiile mai mari sunt cu rosu notate
http://s15.postimg.org/hy1ndz1dj/turn_left.jpg
http://s10.postimg.org/j1d6mbwit/turn_right.jpg
http://s30.postimg.org/8xdznidvh/yaw_left.jpg
http://s4.postimg.org/vl1tmr7ux/yaw_right.jpg
http://s29.postimg.org/c88ymsvzn/pitch_down.jpg
http://s4.postimg.org/vaub3et8p/pitch_up.jpg
Aceasta postare a fost editata de moro696: 14 February 2015 - 02:53 PM
#33
Postat 14 February 2015 - 04:03 PM
Termenul corect pentru turn este roll, platforma nu va face un viraj, ci se va inclina (si deplasa lateral)
#34
Postat 14 February 2015 - 08:42 PM
da am observat ca sensul ales, nu este unul comun, am refacut desenul si am atasat mai jos ( rosu arata o crestere in turatie/throtlle).
http://s1.postimg.org/98am6g56n/drone_thrusts.png
Intre timp am aruncat un ochiu pe ceva firmware scris pt Arduiono care imi confirma ecuatiile acelea
https://github.com/b.../FlightCtrl.ino
int m0_val=throttle+PIDroll_val+PIDpitch_val+PIDyaw_val; int m1_val=throttle-PIDroll_val+PIDpitch_val-PIDyaw_val; int m2_val=throttle+PIDroll_val-PIDpitch_val-PIDyaw_val; int m3_val=throttle-PIDroll_val-PIDpitch_val+PIDyaw_val; analogWrite(MOTOR0,m0_val); analogWrite(MOTOR1,m1_val); analogWrite(MOTOR2,m2_val); analogWrite(MOTOR3,m3_val);
Mai ramane sa fac o`tzârã matematica si sa construiesc o rama de lemn sau ceva tije prin casa, sa pot ancora pe x si y drona sa vad cum lucreaza pid-ul, mai tre sa construiesc si un convertor ac-dc de 100A la 12V... pt teste
Saptamana asta sper sa iasa ceva
Aceasta postare a fost editata de moro696: 14 February 2015 - 08:43 PM
#35
Postat 14 February 2015 - 10:28 PM
Uite, am pus o filmare cam cum procedez eu intotdeauna cu o bestie nous, e adevarat, cu un soft verificat de altii inainte :)
http://youtu.be/lMxY0vnMasw
Daca are tendinta de rasurnare, adica cel putin unul din motoare nu se ridica, te opresti si cauti cauza, nu este din PID-uri.
Daca are tendinte de oscilatie, cobori p-urile.
Daca a parasit pamantul cu toate 4 motoarele, dar are tendinta usoara de drift, trimezi din statie.
Daca pare stabil pe toate axele incerci sa ii cobori fortat fiecare brat pe rand si urmaresti daca giro lucreaza bine compensand prin cresterea turatiei.
Daca ai trecut de toate astea... iesi la zbor, lasa matematica :)
#36
Postat 08 March 2015 - 07:46 PM
am revenit dupa cateva experimente esuate, in sensul ca nu pot stabiliza axa.
Am incercat deocamdata cu cadrul legat pe o tija prinsa la capeti, si m-am jucat cu o axa (2 motoare)
Motoarele + elicile se rotesc in sensul care trebuie.
Insa din experienta voastra, cam ce procentaj din throttle compenseaza pid-ul? Stiu ca asta variaza in functie de gain.
Semnalul pt motoare este compus asa
throttle vine din telecomanda
xEulerAngles are valori intre 1.5(pitch 90grade), 0(centrat) si -1.5 (pitch -90 grade)
throtPitch=updatePID(0.0, xEulerAngles.m_fPitch, deltaTime200Hz); - am setat referinta ca fiind 0 grade
pwm1=throtlle-throtPitch;
pwm2=throtlle+throtPitch;
motor1PWM(pwm1); // 1000min - 2000 max
motor2PWM(pwm2); // 1000min - 2000 max
Aceasta postare a fost editata de moro696: 08 March 2015 - 07:49 PM
#37
Postat 08 March 2015 - 07:58 PM
Pai P-ul exact asta stabileste, cat de tare sa fie contracarata eroarea ... nu e chiar procent, dar un factor de proportionalitate cu thr este.
#38
Postat 08 March 2015 - 09:15 PM
moro696, la 08 March 2015 - 07:46 PM, a spus:
experienta nu avem, dar putem gandi impreuna :)
in primul rand in ce fel incerci sa stabilizezi axa ?
giro (axa trebuie sa mentina un unghi fix pe care il comanzi tu cu telecomanda)
sau level (axa revine la orizontala cand stickul e lasat pe pozitia de mijloc) ?
teoretic, din throtPitch=updatePID(0.0, xEulerAngles.m_fPitch, deltaTime200Hz);
deduc ca folosesti level mode, pt ca ai dat o referinta 0.0
xEulerAngles.m_fPitch ar trebui sa fie inclinarea jucariei nu ?
deltaTime200Hz = perioada esantionare ?
baga codul intreg de la updatePID()
ce face mai exact axa ? cum se comporta ?
/------------------------\ |~~\_____/~~\__ | | Hash84 |______________ \______====== )-+ | | ~~~|/~~ | \------------------------/ ()
#39
Postat 08 March 2015 - 10:37 PM
float iTerm;
float windupGuard;
float lastState;
float dTerm1;
float dTerm2;
uint8_t mtype;
float constrain(float input, float minValue, float maxValue)
{
if ( input < minValue ) return minValue;
else if ( input > maxValue ) return maxValue;
else return input;
}
float updatePID(float command, float state, float deltaT)
{
float error;
float dTerm;
float dSum;
float iterm;
error = command - state;
if (mtype == 1)
error = standardRadianFormat(error);
iTerm += error * deltaT;
iTerm = constrain(iTerm, -windupGuard, windupGuard);
dTerm = (state - lastState) / deltaT;
lastState = state;
dSum = dTerm + dTerm1 + dTerm2;
dTerm2 = dTerm1;
dTerm1 = dTerm;
return(KP * error) + (KI * iTerm) - (KD * dSum);
}
si astea doua imi sunt buclele din main loop
if(frame_100Hz==1){ // loop de 100hz in care citesc doar senzorii...
frame_100Hz=0;
GPIO_ToggleBits(GPIOD, GPIO_Pin_14);
Lsm303dlhcMagReadMag(fMagXYZ);
L3gd20ReadAngRate(fGyroXYZ);
Lsm303dlhcAccReadAcc(fAccXYZ);
}
if(frame_200Hz==1){ frame_200Hz=0; // loop de 200hz
currentTime = micros();
deltaTime200Hz = currentTime - previous200HzTime;
previous200HzTime = currentTime;
fpitch = sprintf(tpitch,"%0.1f",xEulerAngles.m_fPitch* 180.0f/3.141592f);
froll = sprintf(troll,"%0.1f",xEulerAngles.m_fRoll * 180.0f/3.141592f);
fyaw = sprintf(tyaw,"%0.1f",xEulerAngles.m_fYaw * 180.0f/3.141592f);
if (TM_NRF24L01_DataReady()) { TM_NRF24L01_GetData(dataIn);}
myremote(dataIn, remoteCh); // procesarea stringului de pe wireless
throtlle=(remoteCh[1]); // semnalu de trothle de pe wireless
throtPitch=updatePID(0.0, xEulerAngles.m_fPitch, deltaTime200Hz);
pwm1=throtlle-throtPitch;
pwm2=throtlle+throtPitch;
motor1PWM(pwm1); // 1000 - 2000 range
motor2PWM(pwm2); // 1000 - 2000 range
lcd_char(1,1,"Throttle:");
sprintf(ch1,"%0.1f",throtlle); // Throttle
lcd_char(1,12,ch1);
lcd_char(2,1,"PWM1:");
lcd_char(3,1,"PWM2:");
sprintf(ch4,"%u",pwm2); // PWM Motor nr 2
lcd_char(3,6,ch4);
sprintf(ch4,"%u",pwm1);// PWM Motor nr 1
lcd_char(2,6,ch4);
sprintf(ch4,"%0.1f",throtPitch);
lcd_char(2,12,ch4);
}
asta este rutina de pid
Jucaria intradevar cand o inclin, simt ca creste turatia la un motor, si scade la celaltalt. Dar nu compenseaza cat ar trebui
I-am dat la un momnet dat Kp 100, dar mai tre sa experimentez.. sper maine seara sa reusesc ceva
#40
Postat 08 March 2015 - 10:51 PM
Daca tu ai kp=100 atunci corectia maxima aplicata unui motor cand axa este la verticala va fi de 1500+ un pic throtlle.
Dexi iti trebuie kp un pic mai mare
Nu ar strica sa adaugi si un pic de componenta integrativa. Ia pune si un ki=10
/------------------------\ |~~\_____/~~\__ | | Hash84 |______________ \______====== )-+ | | ~~~|/~~ | \------------------------/ ()
#41
Postat 09 March 2015 - 08:22 AM
hash84, la 08 March 2015 - 10:51 PM, a spus:
matematica asta bate-o vina, si orele tarzii.
deci sa zicem ca ai o eroare de 0.2;
outputul va fi KP * 0.2; daca ai KP=100 atunci outputul va fi throttle + 20. nu prea o sa simti mare branza. deci ar trebui un KP de 7-800 ca sa simti ceva si sa nu fie prea violent cand o sa ai inclinari mari.
acum e doar de teste. fa cumva astfel incat sa poti schimba valoarea KP online, din pc sau altceva, si daca ai putea sa ai un fel de slider ar fi cel mai indicat sa vezi live evolutia sistemului.
succes si sa nu iti prinzi mainile in elici ;)
/------------------------\ |~~\_____/~~\__ | | Hash84 |______________ \______====== )-+ | | ~~~|/~~ | \------------------------/ ()
#42
Postat 10 March 2015 - 07:43 AM
Parca incerc sa-l imblanzesc pe dracu... asa tare se agita.
Am incercat cu KP 50 si I, D pe 0, nu statea in echilibru si simteam zvacniri violente in turatie.
Apoi am incercat cu gain de 400 , i si d pe 0, zvacnirile erau mai violente, daca luam mana de pe cadru, incepea sa oscileze violent, la fel si pe kp de 800
Acum stau si ma gandesc daca buba e in alta parte... Elicile nu le-am probat sa vad daca is balansate, motoarele momentan is niste emax-uri de 1200kv, iar elicile`s de 10x45.
Ma gandesc ca ea tre sa stea in echilibru cu un throttle fix din telecomanda, am incercat sa-i dau throttle undeva la 1400 cat de cat fix.
Senzorul vad ca este destul de sensibil la vibratii.
Am incercat si cu I de 1 si la fel face..
Incepe sa devina interesant
#43
Postat 10 March 2015 - 09:38 PM
Incep sa cred ca motoarele mele sunt miezul problemei, cand dau turatie mai mare, acestea vibreaza destul de tare...
Am incercat sa-mi setez Output-ul senzorilor gyro/acc chiar si la 10 hz si tot am vibratii mari, ba chiar o refiltrare cu filtru 4th order HPF
Poate ca am deschis cutia pandorei odata cu ambitia mea, insa planuiesc sa schimb motoarele sa nu mai fie tip clopot , adica cu axul fixat doar la un capat (corectati-ma daca gresesc), si sa folosesc un motor cu rotor intern prins in doua puncte .
Am incercat pana si prinderea motorului intr-o bucata mare de MDF cu suruburi, si deja de la 1600 in sus vad axul cum vibreaza destul de serios
De curiozitate, ati avut probleme de genul la motoare tip clopot?
#44
Postat 10 March 2015 - 09:56 PM
moro696, la 10 March 2015 - 09:38 PM, a spus:
cand ti-am zis ca ai mult de citit....
motoarele toate se echilibreaza. si elicile la fel.
eu fac echilibrare dinamica a lucrurilor in felul urmator.
iei o bucata de banza izoliera si o pui pe una din palele elicii cam pe la mijloc. pornesti motorul, si vezi cum vibreaza. mai tare sau mai incet ca inainte.
daca vibreaza mai tare, muti band pe pala cealalta. o sa vibreze mai incet. muti banda mai sus sau mai aproape de axul elicii, tot facand incercari, pana obtii vibratii minime.
in felul asta echilibrezi ansamblul elice motor. daca desfaci elicea, si o sa o pui in alta pozitie fata de motor, trebuie sa reiei procedeul :).
placa se prinde de cadru prin scoci dublu adeziv din ala mai gros. eu cu asta am obtinut rezultate mai bune. a atenuat cel mai bine vibratiile
/------------------------\ |~~\_____/~~\__ | | Hash84 |______________ \______====== )-+ | | ~~~|/~~ | \------------------------/ ()
#46
Postat 10 March 2015 - 10:26 PM
Unul din secrete este sa montezi elicea chiar pe clopot, nu in aer. este suficient 5-10mm de ax liber golas, intre clopot si montura elicii, ca va vibra si daca este superechilibrat totul... e un fenomen de rezonanta mai curand, nu vibratie.
Iar elicile de 10 la 1200kv sunt prea mari, trebuia de 8-9"
#47
Postat 11 March 2015 - 06:09 AM
Asa arata piulitele pt elici http://thumbs4.ebays...Np6DetOmb9Q.jpg
Legat de elici, trebuie sa merg la vama dupa elicile 9443 de la HK, iar motoare ma gandeam sa trec pe ceva gen sunnysky a2212 de 980kv, sau ce motor imi recomandati pt elici 10-9 " ? Ma gandesc ca un kv mai mic ofera vibratii ceva mai mici
#48
Postat 11 March 2015 - 10:07 AM
Daca ai luat 9443, atunci zic ca cel mai bun match sunt clonele de DJI E300 de la rctimer, SL2212 920kv
In Bucuresti le are EBA, le poti vedea la lucru la el.
Aceasta postare a fost editata de renatoa: 11 March 2015 - 10:08 AM
#49
Postat 11 March 2015 - 07:48 PM
Dar axul motorul are un "shtift" facut in circumferinta axului, specific la unele elici Dji.
Acum eu am elici cu gaura rotunda (universal hole).
Sa-mi fac griji in privinta fixarii elicei datorita acelui shtift la motoare?
#51
Postat 11 March 2015 - 08:03 PM
#52
Postat 11 March 2015 - 08:08 PM
De motoare nu stiu ce sa zic, ieftine rau, nu prea cumpar de pe Ali, acolo este floarea noname-ului, plus ca nu accepta paypal.
#54
Postat 17 March 2015 - 03:45 PM
Chiar daca stii si ai inteles teoria PID, mai e destul trial & error pana faci ceva functional, asa ca o platforma buna de inceput si "iertatoare" este un line-follower, dupa care poti trece la un robotel gen segway si abia apoi la chestii zburatoare.
La zburatoare mai e nevoie si de o filtrare robusta pe IMU datorita vibratiilor de la elice. Bineinteles acestea pot fi mult reduse cu o echilibrare buna insa este imposibil sa fie reduse in totalitate chiar si cu o echilibrare perfecta.
De ce? Raspunsul sta in principiul conservarii momentului de intertie. Matematica este destul de complicata dar efectul poate fi usor observat: Orice schimbare a inclinatiei axei de rotatie unei elice va produce vibratii.
Efectul este extrem de pronuntat pentru 2 pale (elicea clasica) si mult mai putin pronuntat pentru 3 sau mai multe pale. Daca avem un disc uniform nu mai avem vibratii ci doar simpla rezistenta continua la schimbarea axei.
Cum schimbarea axei de rotatie a elicei vine odata cu schimbarea inclinatiei unui multicopter, este evident inevitabila.
Cateva explicatii intuitive despre sistemul PID:
Sa consideram pentru inceput doar un sistem PD, acesta este perfect analogic cu un resort pus in paralel cu un amortizor (adica exact un arc cu telescop de la suspensia unui automobil).
Resortul este componenta P iar lungimea lui naturala este target-ul sistemului. Orice alungire sau comprimare a lui va determina o forta proportionala in sensul opus (F = k*x, x fiind termenul eroare). Sistemele care nu au inertie (mecanica, termica, etc.) pot folosi doar un sistem P. Dar stim ca daca atasam o masa la resort, acesta va oscila la nesfarsit dupa cu prima perturbatie, deci sistemele care au inertie au nevoie de ceva in plus.
Aici intervine amortizorul, componenta D care vrem sa amortizeze oscilatia in timp cat mai scurt. Acesta functioneaza exercitand o forta de rezistenta proportionala cu viteza de miscare (F = -b* dx/dt, se demonstreaza afland solutia ecuatiei diferentiale care rezulta ca oscilatia va fi amortizata).
Deci daca avem constantele k si b reglate potrivit pentru inertia sistemului (echivalenta cu m - masa) atunci avem un sistem corectat si stabil.
Insa in mai multe cazuri doar PD nu e suficient, cand deviatii mici dar persistente sunt de nedorit.
De exemplu intr-un automobil, resortul din suspensie nu sta la lungimea lui naturala ci comprimat la o anumita deviatie dependenta de incarcare.
Daca este nevoie sa minimizam aceasta deviatie absoluta, am putea folosi resorturi mai tari (coeficient P mai mare, insa metoda asta este limitata de materiale si introduce probleme mai mari de oscilatie)
sau am putea adauga un sistem activ de reglare a suspensiei pentru a o mentine pe termen lung la nivelul dorit (garda la sol).
Acest subsistem activ, componenta I, nu are un echivalent mecanic simplist insa nu este greu de inteles matematic. El integreaza eroarea in timp (o aduna in permanenta) astfel incat deviatiile pe termen scurt de care se ocupa PD-ul nu au vreo influenta,
insa deviatiile mici care treg "nevazute" de componenta P sunt detectate de componenta I care isi adauga contributia corespunzatoare. Aceasta corectie vine insa cu intarziere si deci are tendinta de a determina o oscilatie lenta care este mai greu de amortizat,
deci coeficientul nu trebuie sa fie prea mare desigur.
moro696, la 25 January 2015 - 03:12 PM, a spus:
http://s15.postimg.org/d15mpzthj/lol.jpg
E de apreciat pcb-ul homemade dar cand e vorba de RF de ordinul GHz... n-o sa-ti iasa in veci la nivelul asteptarilor (range). Mai bine cumperi un modul cu chip-ul respectiv pe care sa-l integrezi in pcb-ul tau.
Aceasta postare a fost editata de Zen: 17 March 2015 - 03:50 PM
#57
Postat 09 May 2015 - 05:56 PM
Fata de ultimul setup de acum 2 luni, nu mai am vibratii asa mari.
Totusi am ceva overshoot la senzori, momentan trimit tot in matlab, am pus pe iesirile accelerometrului un filtru de ordin 4 inainte de fuziune cu gyro. Pe monitor arata mult mai bine ( cu drona nemiscata)
Mai jos este o comparatie cu unghiul de pe pitch :db:
Imaginea din dreapta este fara filtru
Acum am prins destul de sanatos placuta cu gyro,acc si mag de cadru. Iar motoarele le-am asezat cauciuc intre cadru si acestea.
Astept sa se incarce bateria si reincep testele (incepe sa-mi placa in cutia pandorei)
#59
Postat 11 May 2015 - 07:09 PM
Inca am vibratii mari pe senzori, elicile sunt echilibrate, m-am uitat la motoare sa vad daca vibreaza ( "ochiometric"), par ok.
Mi-am comandat un "damping platform" cu "bile" de cauciuc sa tina placuta cu senzori, numa dureaza pana ajung...
Si vreau sa pun ceva cauciuc intre motoare si cadru cu suruburi putin mai lungi..
Sper eu vara asta s-o fac sa zboare, se face aproape 1 an de cand am inceput softul
#60
Postat 11 May 2015 - 07:58 PM
1. Se echilibreaza ansamblul elice motor. Nu separat! Aplici metoda cu banda Izoliera. Elicea trebuie sa fie cat mai aproape de clopotul motorului. O poti prinde cu soricei. Ia pune o poza cu partea de sus a motorului.
2. Du-te in hornbach ia niste bare patrate de aluminiu si fa un cadru cum am facut eu. Cauta in sectiunea de aeromodelism, multicoptere. totul trebuie sa fie foarte rigid ! Daca ai ceva moale in sistem va intra in oscilatii. Ce ti se intampla tie acum.
3. Motoarele se prind de cadru cu suruburi cat mai scurte si le stragi foarte bine. Fara cauciuc sau alte improvizatii.
4. Placa se prinde cu doua straturi de dubluadeziv de centrul cadrlui. Nu fa alte minuni ca nu o sa mearga! Nu incerca sa reinventezi apa calda !
5. Am doua posturi pe forum cu cadre de multicoptere. Vezi acolo ce am facut eu. A functionat !
/------------------------\ |~~\_____/~~\__ | | Hash84 |______________ \______====== )-+ | | ~~~|/~~ | \------------------------/ ()