Upp och upp - Robot balansera Revisited (5 / 6 steg)
Steg 5: Balans optimering
Och nu får vi till intressanta – hur man kan förbättra roboten balansera prestanda. Jag hade några idéer om var man kan börja leta, men som med alla system, det är svårt att veta vad variablerna cross beroenden är. Så snarare än att få för analytiska, hoppade jag bara i.
Kontroll loop tidsintervall
Jag började med varierande tidsintervall som balanserande PID utvärderades. Jag mätte Arduino 101 PWM standardperioden på 2mS, och mina tidigare projekt hade använt ett värde på 20mS så jag började på 5mS och fördubblades intervall tills roboten inte kunde balansera. Roboten var kunna balansera på 5mS, men det verkade vara alltför aktiva och pendlade med en period på ungefär 120 MS. Det var igen kunna balansera på 10 MS, men svängningarna saktade ner till 280mS. På 20mS, den oscillerande period plockade tillbaka upp till ungefär 180mS, men i stället för aktiv, svaret verkade trög. På 40mS svaret blev ännu trögare, balanseringen oberäkneligt och roboten var inte alltid kunna hålla balansen. Min slutsats var att medan PID utvärdering intervallet kan säkert påverka beteendet robot, och faktiskt var tvungen att stå över några minimal ränta för att kunna balansera, det var inte magic bullet. För resten av mitt test använde jag en 5mS kontroll loop intervall.
Sensor fusion filter
Därefter flyttade jag till sensor fusion filtret. Varför behöver vi en fusion filter ändå? För att besvara denna fråga måste vi undersöka hjärtat av en balanserande system, IMU (Inertial måttenhet). En IMU består av två typer av sensorer – ett gyroskop och en accelerometer. Gyroskopet mäter kantiga graden av förändring eller vinkelformig hastighet. Teoretiskt kan en god uppskattning av kantiga ställning skapas genom att integrera produktionen av gyroskopet. Tyvärr, gyroskop sensorer har en effekt som kallas drift – som är de registrerar vissa små vinkelformig hastighet även när döda stillasittande. Så om du skapar din uppskattade vinkel bara genom att integrera gyroskop utdata, du skulle ha ett fel som skulle fortsätta att växa över tid-ett problem som gör ett gyroskop enda lösningen ohållbar för att balansera. Ange accelerometern. Det värde som rapporterats av accelerometern kommer att omfatta verkan av tyngdkraften, som är konstant, liksom alla andra acceleration, som kommer att variera baserat på enheten rörelse. IMU är det allvar vektorn vi är intresserade. Idén om en fusion filter är att generera en uppskattade vinkel genom att kombinera dessa två sensorer. Det gynnar gyroskopet utgång omedelbart (passerade genom ett högpassfilter) men den accelerometer output på lång sikt genom att mäta jordens gravitationsfält riktning (passerade genom ett lågpassfilter) för att ta bort eventuella drift.
OK, så vi behöver en fusion filter, men som en? Finns mycket kompletta och komplexa lösningar. Kalmanfilter är en av de mer framträdande fusion filter, men även en ingenjörsexamen får inte fullt utrusta dig att förstå vad som finns i den svarta lådan. För detta projekt använde jag en liknande, men mindre computationally krävande lösning, Madgwick filtret. Jag använde detta filter för en huvudsaklig anledning – det levererades med Arduino 101! Men konfigurationen av IMU i balanserande fallet – endast en grad av frihet, skapar begränsningar som tillåter oss att använda en enklare lösning, kompletterande filtret. Kompletterande filtret fått sitt namn eftersom de multiplicerande faktorerna för varje mandatperiod lägga upp till 1. Blockdiagram för en kompletterande filter visas i figur 1.
Det finns några mycket bra behandlingar på webben för detaljer bakom kompletterande filtret, så framför jag har bara ge resulterande filterekvationen. I ekvationen är A en konstant som fastställer egenskaperna som filter. Det bör dessutom noteras att i beräkningen av accelerometer vinkel, vi tar fördel av litet metar tillnärmning – en insikt som för vinklar mindre än ~ 30̊, sin(θ) ≈ θ i radianer. För vår robot, om vinkeln att närma sig 30̊, kommer det att falla över, så att antagandet verkar giltiga. Som ett resultat kan vi hoppa över sin(θ) i denna beräkning med liten inverkan. Slutligen visas även tidskonstanten för kompletterande filtret ovanför.
Jag har testat både Madgwick och kompletterande filter för att se hur det påverkat balanseringen av roboten. Beståndet Madgwick filter som installerade hade Beta in till 0,1, med ett #define uttalande i huvudfilen MadgwickAHRS.h. Roboten inte skulle balansera med inställningen-svaret var lite för trög. Efter att ha spelat, hittade jag en 0,01 aktiverad bästa balanseringen, att det fanns någon kompromiss i absoluta vinkel noggrannhet med den inställningen. Om du höll roboten i en vinkel för ett ögonblick, säger 20̊, och återvände sedan till upprätt, var det en eftersläpning i den uppskattade vinkel återvänder till 0̊.
För kompletterande filtret, jag använde A = 0,98, vilket ger en tidskonstant på ca 0,25 sekunder, med dt inställd på 5 millisekunder. Jag hittade resultaten vara jämförbara med Madgwick filtret, och bättre än min första projektet, men fortfarande inte rock solid balansering. Så sökandet fortsatte.
Användning av positionella feedback (givare)
Inriktade DC-motorer jag valt för denna robot med pulsgivare att ge feedback om rörlighet för armaturen av motorn. Kodare är på motoraxeln innan skuldsättningsgraden inträffar, så de ger en ganska hög upplösning på rörelse - med utväxlingen och diameter hjul används, beslöt jag att varje kodare övergång översatt till ~0.04cm. Avstånd och hastighet då var ganska enkelt att härleda, genom att räkna encoder övergångar över en regelbundna tidsintervall, och sedan multiplicera resultatet med 0,04 att få distans och att dela denna sträcka av tidsintervallet (20mS i mitt fall) att få fart.
Jag planerar mitt nästa projekt för att ta itu med mer fullständigt navigationen anlagen av robot, så jag tänker inte gå in i detalj här, men två metoder har använts för att kontrollera hastigheten på roboten – fastställande av mål vinkel och direkt tillägg till motor PWM värden. Att lägga till varvtalsreglering tog bort robot "vandrande" men betydligt bättre inte balansera. På den kontrollerar kretsar.
Kontroll loop variabler och struktur
Den huvudsakliga kontrollerar kretsar för balanserande robot bygger på två delar – fusion filtret ska bestämma uppskattade vinkeln av roboten och en PID-regulator att använda den uppskattade vinkeln för att generera motor styrsignalen. Tanken bakom en PID-regulator är att beräkna felet av en signal mot ett börvärde, och sedan summera de proportionella, integrerad och härledda formerna av felet efter att de har vart multiplicerats med separat konstanter. PID-regulator mycket mångsidig som ett kontrollelement, med tillgång till där felet har varit (I), där det är nu (P) och när det leds (D). Men var förvarnad - det kan vara en mycket utmanande uppgift att optimera multiplikatorer för P, jag och D termer. Figur 2 är ett blockdiagram visar den grundläggande struktur och kontroll anslutningen, och återspeglar den inledande konfigurationen av denna robot.
Vid närmare inspektion, kanske du märker att PID controller D termen tar derivatan av den uppskattade vinkel, vilket resulterar i en beräknad kantiga förändringstakten. Om du minns, var gyroskopet ge bara att en vinkelformig hastighet för förändring, men en som är mycket mer exakt. Detta leder en att undra hur de kontrollerar kretsar skulle bete sig om gyroskop utdata användes direkt, i stället för att omberäkna angular rate från den uppskattade vinkeln.
Efter utfodring gyroskopet direkt i D benämna av PID, var förändringen i balansera prestanda dramatisk. Figur 3 ger en glimt på varför – det visar gyroskop utgången tillsammans med D benämna av PID. Kantiga förändringstakten som härrör från den uppskattade vinkeln släpar gyroskop produktionen av över 150mS, en försening som hjälper till att förklara några av vingla i balanseringen av den ursprungliga konfigurationen, och gör du undrar hur det balanserade alls.
Figur 4 visar den slutliga konfigurationen med gyroskopet matas direkt i D benämna av PID-regulator. Medan alla områden utforskas hade viss inverkan på att balansera prestanda, som som tillhandahåller en basåret och högre trohet indikation på vinkelformig hastighet från gyroskopet förändringen i robot prestanda jag var ute efter.