PID-regeling met TurtleSim
Samenvatting
Move Turtle is een eenvoudig ROS-python-script dat de turtle in ROS’s TurtleSim naar opgegeven coördinaten (punten) verplaatst. Dit project begon als een klasproject voor CSCI473 aan de Colorado School of Mines (CSOM) en ontwikkelde zich later tot een project dat ik gebruikte om te leren hoe closed-loop-systemen kunnen worden gemaakt, waarvan de kennis werd gebruikt om mij te helpen bij mijn werk in het Human Center Robotics (HCR)-lab van CSOM.
Context
Ter achtergrond: ROS staat voor Robot Operating Systems. ROS is een open-source middleware voor robotica, meestal gekoppeld aan het besturingssysteem Ubuntu, dat wordt gebruikt om de softwarecomponenten/-clusters van een robotsysteem beter te beheren. Je kunt meer leren over hoe je ROS gebruikt via de officiële wiki van ROS. De code die je in ROS schrijft is in C++ of Python.
TurtleSim is een eenvoudige 2D-robotsimulator die wordt gebruikt als introductie tot ROS en ROS-pakketten voor nieuwe gebruikers van ROS. Alles wat TurtleSim doet, is een eenvoudige 2D-weergave openen met een turtle. Die turtle fungeert als de “robot” en je kunt berichten naar die “robot” sturen om te bewegen en/of te draaien. Wel genereert TurtleSim tijdens het bewegen enige willekeurige fout om de fysica uit de echte wereld op een eenvoudige manier te simuleren.
Nu we weten wat ROS en TurtleSim zijn, waarom gebruikte ik ze? Wel, in het voorjaar van 2020 volgde ik een vak genaamd “Human Centered Robotics” aan de Colorado School of Mines als onderdeel van mijn bachelorpakket informatica. De cursus werd gegeven door Dr. Hao Zhang. De cursus bestond uit drie projecten en het eerste project bestond uit het opzetten van ROS, leren hoe ROS te gebruiken, en het implementeren van een open-loop- of closed-loop-algoritme dat de turtle in TurtleSim een M liet tekenen. De originele projectbeschrijving kan HIER worden bekeken.
Toen ik het vak volgde, voltooide ik dit project door een open-loop-algoritme te implementeren. Deze oplossing werkte, maar was echt slecht en tekende een A die “goed genoeg” was, maar nog lang niet “geweldig”. Nadat ik het project rond halverwege februari 2020 had ingeleverd, vergat ik het totdat ik een jaar later, rond februari 2021, eraan terugdacht.
Uitdaging
In februari 2021 werd ik aangenomen als Research Assistant bij het Human Centered Robotics (HCR)-lab aan de Colorado School of Mines, waar ik onder Dr. Hao Zhang werkte. Het doel van het lab is onderzoek te doen naar “levenslange collaboratieve autonomie, met als doel robots in staat te stellen over lange tijdsperioden te opereren en zich aan te passen”. Per 1-9-2022 (1 september 2022) is het lab verhuisd van de Colorado School of Mines naar de University of Massachusetts Amherst. Maar toen ik er werkte, waren ze nog steeds in Colorado gevestigd.
Bij het HCR-lab kreeg ik de opdracht om aan het Triton-project te werken. Het Triton-project bestond uit meerdere, tientallen, robots genaamd Tritons. Tritons waren driehoekige grondrobots met omni-wheel die er zo uitzagen:
Samen met de Tritons waren er acht IR-camera’s van OptiTrack, opgesteld in een “octagonale volgorde”, enkele meters boven de grond. Met die camera’s, de Motive software van OptiTrack, een pc met Windows 10 en ROS; wordt een ruimte van 2 meter bij 2 meter bij 2 meter (x, y, z) gecreëerd waarin de exacte positie in de echte wereld van objecten met motion-capturemarkers kan worden bepaald.
Mijn eerste taak binnen het Triton-project was scripts maken die de Triton-robot naar een specifieke positie in de echte wereld lieten bewegen. Op dat moment wist ik niet zeker hoe ik dit moest bereiken, maar ik herinnerde me wel het eerste project uit CSCI473, waar het idee van een closed-loop-systeem aan mij werd geïntroduceerd, dus begon ik echt onderzoek te doen naar closed-loop-systemen en daarmee ook naar feedbacksystemen.
Onderzoek
Tijdens mijn onderzoek ontdekte ik deze geweldige video van AerospaceControlsLab:
In deze video werd het idee van een PID-systeem aan mij getoond en uitgelegd. Een PID-systeem is een closed-loop-, regelkring-systeem dat specifieke uitvoer(en) produceert op basis van gegevens uit de echte wereld. In eenvoudige termen is het een feedbacksysteem dat zijn uitvoer aanpast op basis van het verschil tussen de gewenste waarde en de gemeten waarde. Dit is de formule voor een PID-regelaar:
$$ u(t) = K_p e(t) + K_i \int e(t) dt + K_d \frac{de(t)}{dt} $$
- $u(t)$ is het stuursignaal.
- $K_p$, $K_i$, $K_d$ zijn respectievelijk de proportionele, integrale en afgeleide versterkingen.
- $e(t)$ is het foutsignaal (het verschil tussen de gewenste en de werkelijke uitvoer).
- $\int e(t) dt$ is de integraal van de fout over de tijd.
- $\frac{de(t)}{dt}$ is de afgeleide van de fout.
Om er meer over te leren, bekijk de video van AerospaceControlsLab of dit geweldige Wikipedia-artikel, waar de formule vandaan komt.
Na mijn onderzoek, en nadat ik wat hulp had gekregen van mijn slimme vrienden en professoren, bepaalde ik dat het gebruik van een proportionele regelaar, een P-regelaar, het beste zou zijn om de Triton een specifieke coördinaat te laten bereiken.
Omdat de Triton een grondrobot is, hoef ik me alleen zorgen te maken over de X- en Y-coördinaten. Met dat in gedachten moest ik vervolgens bepalen welke gewenste waarden en gemeten waarden ik moest meten en verwerken binnen de P-regelaar(s). In mijn onderzoek vond ik deze geweldige post op de ROS-wiki genaamd Go to Goal, waarin werd gefocust op de volgende fouten:
- Afstandsafwijking: Het verschil in afstand tussen de gewenste locatie (X, Y) en de huidige locatie (X, Y).
- Theta-afwijking: Het verschil tussen de gewenste oriëntatie en de huidige oriëntatie.
Voorgestelde oplossing
Met al deze kennis is de oplossing om de Triton naar een specifieke coördinaat in de echte wereld te laten bewegen, het gebruik van een proportionele regelaar voor de afstandsfout en theta-fout van de Triton met betrekking tot de doelcoördinaat en de huidige coördinaat van de Triton. Maar voordat ik dit op een fysiek systeem implementeerde, wilde ik het idee testen in een simulatie en destijds vond ik het gebruik van TurtleSim als simulatie de beste keuze.
Testen in simulatie
Met de theoretische oplossing uiteengezet, koos ik ervoor om deze aanvankelijk te valideren via simulatie, in plaats van in een echte wereldscenario. De echte wereld is vaak rommelig met ruis die de effectiviteit van de oplossing kan vertroebelen en kan leiden tot het omgaan met irrelevante problemen. Dit erkennend, pakte ik mijn project uit CSCI473 opnieuw op en paste het aan als testomgeving voor deze theoretische oplossing.
Na het bijwerken van de oude code van ROS Melodic naar ROS Noetic en met wat iteratieve verfijning, kreeg ik de voorgestelde oplossing werkend in TurtleSim. Demonstraties van de functionaliteit, met enkele coole paden naar doelcoördinaten, zijn te vinden aan het einde van deze blogpost. De code voor dit alles kan HIER worden bekeken.
Conclusie
Samenvattend navigeert de turtle in TurtleSim dankzij dit project effectief naar ingestelde coördinaten met behulp van het closed-loop-systeem, en presteert daarmee aanzienlijk beter dan mijn eerste open-loop-systeem uit 2020. Na succesvolle tests implementeerde ik deze oplossing met de Triton-robots. Maar ruis uit de echte wereld introduceerde onverwachte problemen waarvoor weken aan debuggen en testen in de echte wereld nodig waren. Na die weken kreeg ik de Triton uiteindelijk zover om specifieke coördinaten in de echte wereld te bereiken door uiteindelijk de oplossing te gebruiken die ik in TurtleSim had getest. Hier is een demo van de Triton die naar specifieke coördinaten in de echte wereld beweegt met behulp van de methode die in TurtleSim is getest:
Terugkijkend had ik liever een simulatie gebruikt die de fysica van de echte wereld beter simuleerde. TurtleSim is geweldig om te leren, maar niet geweldig om ideeën voor echte robotica te testen. Destijds dacht ik dat het goed genoeg zou zijn voor mijn eenvoudige gebruiksscenario, maar later bleek dat niet het geval te zijn.
Het primaire doel van deze blogpost was het schetsen van de creatie van een closed-loop-systeem dat de turtle in TurtleSim, en vervolgens de Triton-robots, in staat stelde om nauwkeurig naar opgegeven doelposities (X, Y) te navigeren. Ik geloof dat dit doel is bereikt, maar het kan mogelijk enige interesse hebben gewekt in mijn werk bij het HCR-lab. Met dat in gedachten ben ik van plan om meer blogposts te maken over mijn werkervaring bij het HCR-lab…
Demonstroaties van Moving Turtle (TurtleSim)
Deze video bevat de volgende demo’s:
- Cayley Nodal: Een eenvoudig ontwerp van Cayley’s nodale kubische oppervlak
- Cirkels: Een spinnenwebachtig ontwerp
- Binnenste cirkels: Een ontwerp van “cirkels binnen cirkels”
- M: Een zeer eenvoudig M-ontwerp