Rad efterföljare Robot - PID Control - Android Setup (8 / 12 steg)
Steg 8: PID Control (valfritt)
Om du vill hoppa denna del, är det OK. Du kan bo med proportionell kontroll förklaras på det sista steget, eller bränna vissa hjärnor för att genomföra ett mer komplext system på din Robot, det är ditt val. Kom så går vi.
PID (proportionell, derivata och integral) är en av de vanligaste kontroll system runt. De flesta industriella reglerkretsar använda några smak av PID kontroll. Det finns många sätt att ställa in en PID loop, inklusive den manuella teknik som används i detta exempel.
Tänk på PID som en enkel fjäder. En fjäder har en ursprungliga längd, som när störd, av expansion eller kontraktion, tenderar att återta sin ursprungliga längd under kortast möjliga tid. Likaså en PID algoritm i ett system har ett set-värde av en viss fysisk kvantitet som skall regleras, kallas en "set point", som när ändras på grund av någon anledning, systemet styr de andra funktionerna som behövs i det, att komma tillbaka till den ursprungliga uppsättningen pekar på kortast tid möjligt. PID-styrenheter används överallt där det finns ett behov av att styra en fysisk kvantitet och att göra det lika med ett angivet värde. Exempel, kryssning controller i bilar, robotar, Temperaturregulatorer, spänningsregulatorer, etc.
Hur fungerar PID?
Systemet beräknar den "fel", eller "avvikelse" av den fysiska kvantiteten från börvärdet, genom att mäta det aktuella värdet av den fysiska kvantiteten med en givare. För att komma tillbaka till börvärdet, detta "fel" bör minimeras, och helst bör göras lika med noll. Också bör denna process ske så snabbt som möjligt. Helst bör man noll fördröjning i svaret av systemet till förändringen i dess börvärde.
Mer information finns i många böcker och webbplats även här:
http://en.wikipedia.org/wiki/PID_controller
Genomföra PID
i) fel Term (e):
Detta är lika med skillnaden mellan börvärdet och det aktuella värdet för den kvantitet som kontrolleras.
fel = set_point – current_value (i vårt fall är fel variabel get från positionen där Robot över linjen
II) proportionell Term (P):
Denna term är proportionell mot felet.
P = fel
Detta värde är ansvarig för omfattningen av förändring krävs i den fysiska kvantiteten för att uppnå börvärdet. Andel är vad avgör stigtiden kontroll loop eller hur snabbt det kommer att nå börvärdet.
III) integrerad Term (I):
Denna term är summan av alla tidigare felvärden.
Jag = jag + fel
Detta värde är ansvarig för snabbhet svar av systemet till förändringen från börvärdet. Integrerad termen används eliminera distansträning felet krävs av proportionell termen. Vanligtvis använder små robotar inte integrerad termen eftersom vi är inte oroliga distansträning fel och det kan försvåra loop tuning.
IV) differentiell eller härledda sikt (D):
Denna term är skillnaden mellan den momentana fel från börvärdet, och felet från tidigare instant.
D = fel - previousError
Detta värde är ansvarig att bromsa graden av förändring av den fysiska kvantiteten när det gäller nära börvärdet. Härledda termen används minska överskridandet eller hur mycket systemet över korrigerar.
Ekvation:
PIDvalue = (Kp * P) + (Ki * jag) + (Kd * D)
Var:
KP är konstant, som används för att variera storleken på den förändring som krävs för att uppnå börvärdet.
KI är det konstant, som används för att variera andelen som ändringen bör föras i den fysiska kvantiteten att uppnå börvärdet.
KD är konstant, som används för att variera stabiliteten i systemet.
Ett sätt är att variabeln Kd 0 och tune Kp termen ensam först. KP 25 är ett bra ställe att börja i vårt fall här. På sista steget använde vi en Kp 50 som fungerar mycket bra med min Robot. Om roboten reagerar för långsamt, öka värdet. Om roboten verkar reagera snabbt och blir instabil, minska värdet. När roboten Svaren ratta rimligen, härledda portion av den kontrollerar kretsar. Först sätta den Kp och Kd värden till 1/2 Kp värde. Till exempel om robot Svaren rimligt med en Kp = 50, då sätta Kp = 25 och Kd = 25 att starta. Öka vinsten Kd (derivat) att minska överskridandet, minska det om roboten blir instabila.
En annan komponent av slingan att överväga är den faktiska prov/loop hastigheten. Påskynda detta eller bromsa detta kan göra en betydande skillnad i robotens prestanda. Detta ställs av dröjsmål uttalanden som du har i din kod. Det är en trevande försök-fel metod att få optimala resultat
Baserat på ovan beskrivna tillvägagångssätt, genomfördes funktionen nedan:
void calculatePID()
{
P = fel;
Jag = I + fel;
D = fel-previousError;
PIDvalue = (Kp * P) + (Ki * jag) + (Kd * D);
previousError = fel;
}
Den enkla Kp konstant används på det sista steget kommer att ersättas för detta mer komplett PIDvalue:
void motorPIDcontrol()
{
int leftMotorSpeed = 1500 - iniMotorPower - PIDvalue;
int rightMotorSpeed = 1500 + iniMotorPower - PIDvalue;
leftServo.writeMicroseconds(leftMotorSpeed);
rightServo.writeMicroseconds(rightMotorSpeed);
}
Men observera att om du har Kd och Ki = 0, PIDvalue är endast Kp * fel som det sista steget