PidTuning

Uit RobotMC.be
Ga naar: navigatie, zoeken

De PID regelaar

De PID regelaar is ongetwijfeld de meest gebruikte manier om processen te regelen. Een regellus met een PID regelaar ziet er als volgt uit:

PID control loop.png

Het proces wat we willen regelen is groen gekleurd en in ons geval is dit bijvoorbeeld de snelheid van een motor. De output van dit proces, in ons voorbeeld snelheid, wordt gemeten (bijvoorbeeld met motor encoders) en teruggevoerd naar de ingang van PID controller.

De output van het proces (de daadwerkelijke snelheid) wordt vergeleken met de gewenste snelheid (het Setpoint) en het verschil daartussen is de fout (Error). Deze fout wordt aangeboden aan drie parallelle modules die de naam geven aan deze controller, de proportionele regeling, de integrator en de differentiator. Alle drie leveren ze een bijdrage aan het stuursignaal voor het proces. Deze bijdrages worden bij elkaar opgeteld en sturen het proces aan (in ons voorbeeld de PWM waarde van de motor).

Over PID regelaars is elders op deze wiki en op het internet veel informatie te vinden, waar we graag naar verwijzen als je meer over deze regelaars wilt weten. Een toegankelijk stuk wat verder gaat dan de meest basale werking van de PID controller is de blog van Brett Beauregard, waarin hij toelicht op welke punten zijn uitstekende Arduino PID library verschilt van de routines die door veel anderen gebruikt worden. Maar... een goede PID library is niet voldoende voor een goede regeling. Het is ook van groot belang dat de regelaar goed is ingesteld, goed getuned. En dat blijkt vaak geen sinecure.

Handmatige tuning

Tuning van de PID controller betekent dat de waarden van Kp, Ki en Kd zo worden gekozen dat het proces stabiel wordt geregeld op de manier zoals jij dat wilt, binnen de grenzen van wat mogelijk is. Daarbij moet je vaak een aantal zaken tegen elkaar afwegen:

  • Een snelle response geeft een groot stuursignaal (hoge pieken in de aansturing van de pwm), hogere gevoeligheid voor stoorsignalen (fouten in snelheidsmeting) en overschoot (tijdelijk hogere snelheid dan ingesteld).
  • Het gedrag van de controller bij kleine afwijkingen en bij grote afwijkingen.
  • Een P (of PD) regeling zal altijd een fout houden (we rijden nooit precies de ingestelde snelheid). Dit kan worden gecorrigeerd met de I-regeling, maar dit heeft een negatieve invloed op de regeling bij snelle veranderingen.

De academische benadering is om het 'proces' in formules te vatten en op basis van de control theorie te berekenen met welke waarden de regellus stabiel is. Deze waarden worden in de praktijk getoetst en verfijnd.

Een alternatieve methode is om Ki en Kd op 0 te zetten en vervolgens een waarde voor Kp te zoeken waarmee het systeem enigszins werkt, om de regeling vervolgens te verfijnen.

En voor beide methodes geldt dat een ervaren engineer hiermee uitstekende resultaten kan halen. Helaas missen velen van ons de theoretische bagage en ervaring om via deze methodes snel tot een goed resultaat te komen...

Ziegler–Nichols

Gelukkig voor ons hebben John Ziegler en Nathaniel Nichols bijna 75 jaar geleden een methode ontwikkeld om PID regelaars in te stellen. De aanpak komt er op neer dat van het proces 2 waarden worden bepaald - de Ultime versterking Ku en de periodetijd Tu - door de regelaar zo in te stellen dat de regeling net begint te oscilleren. Met deze twee waarden worden de optimale waardes van Kp, Ki en Kd uitgerekend.

Uiteraard zijn de meeste processen niet in 2 waarden uit te drukken, maar in de praktijk blijkt deze benadering in veel gevallen toch goed te voldoen. En de hiervoor genoemde afweging wordt gemaakt door de keuze van de parameters die bij de omrekening wordt gebruikt.

Relay tuning

Het bepalen van het punt waarop het proces gaat oscilleren is vaak een lastig en tijdrovend klusje. En oscillatie is niet zonder gevaar. Gelukkig hebben de heren Åström en Hägglund een handigere manier bedacht om Ku en Tu te bepalen en waarbij de oscillatie wordt beperkt. Bij deze methode, 'relay tuning', wordt de PID controller vervangen door een soort aan/uit regeling:

PID Relay tuning.png

De regeling in bovenstaand voorbeeld start met een input waarde van 65 en een output van 0. Voor het ingangssignaal wordt een 'noise band' van 9 genomen, voor de uitgang een stap van 400. Direct bij de start van de tuning gaat de uitgang daarom naar 400 en houdt deze waarde tot de ingang boven (65+9=) 74 komt. De uitgang gaat dan naar -400 totdat het ingangssignaal onder 56 komt. Deze cyclus wordt een aantal keer herhaald, totdat zowel de periodetijd als de amplitude (nagenoeg) constant zijn. De periodetijd is de waarde Tu, de waarde Ku wordt berekend met:

Ku =  4/PI * amplitude_gain

Op basis van deze twee waarden en het gewenste gedrag (snelle reactie, kleine fout, storingsongevoeligheid) kunnen de PID parameters Kp, Ki en Kd worden berekend.

Tuning in onze praktijk

Voorbeelden over PID regelingen en autotuning op het internet gaan vaak uit van relatief langzame processen die continue lopen. Bij de aansturing van robots is dit vaak anders: signalen zijn relatief snel en - misschien nog wel vervelender - het is vaak niet mogelijk om de controller langere tijd in een stabiele toestand te houden. Dit betekent immers dat dat robot (bijvoorbeeld) rechtuit rijdt en dat wordt beperkt door de beschikbare ruimte. Rondjes rijden of wielen van de vloer is geen alternatief, want dat is niet de situatie die je wilt tunen.

De ideale oplossing? Ik heb hem (nog) niet. Maar op basis van mijn ervaringen tot nu toe wel een paar tips.

  • Gebruik een autotuner die zelf detecteert als hij gereed is. Bijvoorbeeld deze of de hierop gebaseerde autotuner van RobotLib.
  • Maak een hulp-programma dat de robot naar de stabiele toestand brengt en start dan pas de autotuner.
  • Als de autotuner gereed is, stopt het hulpprogramma de robot of - beter nog - laat deze terug rijden naar de start positie.
  • Het hulp-programma houdt de afgelegde weg bij en breekt de autotuner af voorbij een bepaald punt. Dit voorkomt een hoop botsingen ;)
  • De auto-tuner heeft een stabiel startpunt nodig. Dit (b)lijkt makkelijker te bereiken als Ki en (zeker) Kd op 0 staan.
  • Log de input en output van de PID controller, zowel voor als tijdens het tunen.


Als de autotuner wordt afgebroken (door de maximale afstand), heeft hij geen goede metingen kunnen doen. De eerste vraag is dan of de relay-tuner stapjes heeft gemaakt. Dit kun je eenvoudig zien als de de gelogde input en output in een grafiek zet. Geen stappen betekent dat de beide grenzen niet bereikt worden:

  • Is de input-waarde bij start correct? Als de controller nog niet stabiel was, is de waarde vaak te laag.
  • Ook kan het zijn dat de input-waarde voorafgaand aan het tunen niet stabiel is maar sterk varieert. Pas de tuning van de PID controller aan (loggen!) totdat het signaal redelijk stabiel is en probeer het opnieuw. Kd op 0 zetten!
  • Is de noiseband niet te groot? De noiseband dient iets groter te zijn dan de ruis op het input signaal. De waarde van +/- 9 in bovenstaande voorbeeld is al wat aan de hoge kant...
  • Is de output-step groot genoeg? De output-step moet duidelijk invloed hebben op het ingangssignaal (met vertraging uiteraard).


Het is ook mogelijk dat de robot 'uit de bocht vliegt' als gevolg van de stapjes van de relay-tuner. Dit komt mogelijk door ruis op de input (te kleine noiseband), maar meest waarschijnlijk is een te grote output-step.


Als de relay-tuner stapjes maakt maar niet tot een geldig resultaat komt, zijn er geen 3 opvolgende metingen die dicht genoeg bij elkaar liggen. Opties:

  • Geef de robot ruimte zodat de relay-tuner tijd heeft om 10 periodes te maken. De eerste periodes zijn vaak minder stabiel dan de daaropvolgende periodes.
  • Breng de snelheid omlaag. Niet ideaal, want je tuned op een ander punt dan je van plan was. Maar het geeft de autotuner wel wat meer tijd.
  • Varieer de output-step: zo groot dat de robot vlot reageert, maar voorkom teveel overshoot is.
  • Varieer de noise-band zodat de relay-controller (net) niet reageert op ruis op het inputsignaal.


Het mag duidelijk zijn dat het loggen van de PID controller cruciaal is als de autotuner niet werkt. En een grafiek geeft snel inzicht in de gelogde data!