Een snelle lijnvolger

Uit RoboWiki
Ga naar: navigatie, zoeken
Printbot II 1.jpg

Inleiding

Het is 2008. Twee jaar geleden zijn we gestart met roborama en hiervoor hebben we een mooie baan gemaakt. De ondergrond is zwarte vijverfolie. Egaal van kleur en makkelijk op te rollen en op te bergen. Maar... de ondergrond is niet vlak en dat maakt het voor kleinere robots lastig om snel de lijn te volgen. De HCC Robotica, die dezelfde wedstrijd organiseert op dezelfde baan, komt met een oplossing: een ondergrond van witte platen. Een mooie, gladde ondergrond waarop ook kleinere robots met grotere snelheid de lijn kunnen volgen. Misschien wel net zo snel als de grotere robots, die zo'n 20 tot 30 cm/seconde rijden. En zou het denkbaar zijn dat een robot de magische grens van 1 meter / seconde haalt met lijnvolgen? De HCC robotica schrijft hierover in robotbits 45:

Het bestuur looft een aanmoedigingsprijsje uit van 10 euro ( te 
besteden bij VOTI) voor degene die als eerste met een robot (die 
voldoet aan de ROBORAMA regels) het meanderende parcour aflegt 
met een snelheid groter of gelijk aan 1 m/sec.

Printbot

Printbot 1.jpg

Deze uitdaging is aanleiding voor de bouw van Printbot. Geinspireerd op de 3pi robot van Pololu wordt dit een kleine, lichte robot waarvan de printplaat het frame vormt. Twee Pololu Micro Metal 1:50 Gearmotors, met een nominaal toerental van 625 omwentelingen per minuut bij 6V, zorgen voor de aandrijving. In combinatie met wielen van 42 mm diameter moet de snelheid van ruim 1 meter per seconde ruim haalbaar zijn. Met twee kleine 3-cell NiCd accus als voeding blijft de robot zo licht mogelijk. Een step-up convertor, een ander idee wat is overgenomen van de 3Pi robot, maakt de vereiste 11V spanning voor de H-brug. Met deze spanning blijft, na het 4V verlies over de H-brug, nog ruim 7V over voor de motor.

Helaas vallen de prestaties van deze robot tegen. Lijnvolgen op lage snelheid gaat goed, maar als de snelheid wat hoger wordt, vliegt de robot uit de bocht. Verder heeft de lijnsensor last van storing van de ‘step up’ convertor. Printbot belandt achterin de kast en blijft daar 6 jaar liggen.

Printbot II

Het is 2014 en de recordtijd voor lijnvolgen staat met 10.22 seconden op naam van de robot reCycle van Coen. Dit is ruim 3x zo snel als het record van 2008, maar met 55 cm/s nog een stuk verwijderd de magische 1 meter per seconde. Zou 1 meter per seconde wel haalbaar zijn?

Met 6 jaar extra ervaring en nieuwe technieken besluit ik opnieuw een poging te wagen.

Het frame

Printbot II 2.jpg

Het frame wordt deze keer gemaakt op een 3D printer. Het ontwerp van dit dunne, lichte frame wordt gemaakt in OpenSCAD. De afmetingen van de eerste versie van het frame kloppen aardig, maar de gebruikte stripjes van 3mm blijken te zwak waardoor de batterij de vloer raakt. Ook blijken de motorsteunen niet erg stijf te zijn.

Korte tijd later ligt versie 2 van het frame op de printer. De 8 mm strips blijken sterk genoeg en twee extra diagonalen geven voldoende stijfheid voor de motorsteun. Het batterijcompartiment is meteen een paar mm kleiner gemaakt, zodat de batterij minder kan verschuiven. Een prima frame om de robot op te bouwen, terwijl de printer aan het werk wordt gezet voor het kapje van de lijnsensor. Bij montage van het kapje blijkt de steun voor de lijnsensor niet stijf genoeg, wat leidt tot versie 3 van het frame (zie foto rechts). Later wordt ook van het kapje een tweede versie van gemaakt, om de afstand tussen de sensor en de vloer wat te vergroten.

De electronica

Printbot II 3.jpg

Er is in 6 jaar ook op het gebied van elektronica het nodige veranderd. Via ebay kun je allerlei modules kopen, die goedkoper zijn dan destijds de losse chips. Het voordeel van modules is dat ze compact zijn. Voor de nieuwe lijnvolger gebruik ik een Arduino Mini Pro en een motordriver gebaseerd op de TB6612FNG FET hbrug. Samen passen ze gemakkelijk met de overige onderdelen op stukje experimenteerprint van 4,5 bij 10 cm, nog geen derde van printbot.

De NiCd accu’s uit 2008 maken plaats voor LiIon batterijen. Deze zijn lichter en hebben een grotere capaciteit. En… ze leveren 3-4V per cel, zodat twee cellen al voldoende spanning geven voor de Arduino. En omdat de spanningsval over de FET H-brug te verwaarlozen is, is dit ook voldoende spanning voor de motoren!

Software

Arduino is een mooie omgeving om snel (kleinere) programma’s in te ontwikkelen. Met een paar libraries en code van de HCC Robotica workshop ‘C, Arduino en Robots’ zit het programma om een lijn te volgen in een avond in elkaar. Hierbij wordt gebruik gemaakt van ‘harde aansturing’ van de motoren (in tegenstelling tot pwm op enable). Vanzelfsprekend wordt een statemachine gebruikt om de robot te besturen in een strakke kadans van 10 miliseconden.

Op de september 2014 bijeenkomst van de HCC Robotica wordt de robot getest op de roborama baan. De versterking van regellus van de lijnvolger wordt aangepast en de snelheid opgevoerd. 60% pwm blijkt voor vandaag teveel, maar op 40% van de snelheid wordt de lijn goed gevolgd, in een tijd van zo'n 10 seconden. Een bemoedigend resultaat omdat de regellus nog niet optimaal getuned is.

Van goed naar beter

Door gebruik van nieuwe technieken (3D printing, LiPo accu's en FET h-brug) en (voor mij) nieuwe inzichten (harde aansturing van de motoren) blijkt het resultaat deze keer beter dan de vorige keer. Maar de snelheid van de robot moet verdubbelen om de magische grens van 1 meter per seconde te halen. Werk aan de winkel dus.

Tunen regellus

De eerste stap is het tunen van de regellus. Voor het testen wordt een groot wit vel papier voorzien van een lijn van 3,5 meter. De lijn is gesneden uit zwart plakplastic. De snelheid van de robot wordt steeds een stapje opgevoerd, totdat deze uit de bocht vliegt. Dan de versterkingsfactor (P) aanpassen totdat de robot de lijn weer volgt. Vervolgens de snelheid weer omhoog. Met als resultaat dat de robot 75 cm/seconde rijdt.

Optimalisatie lijnsensor

De lijnsensor is een QTR-8A, door gebrek aan ADC ingangen ingekort tot 6 elementen. Van ieder van deze elementen wordt bepaald of ze zwart of wit 'zien'. Dit geeft 6 stapjes en samen met 5 tussenstapjes geeft dit 11 verschillende waarden. Dat lijkt wat grof, dus de methode van Jan gebruikt om een hogere resolutie te krijgen. Het resultaat is prima en de robot rijdt een stuk vloeiender over de lijn.

Na het opnieuw tunen van de regellus blijkt de maximale snelheid een stuk lager te liggen dan bij de 'digitale' benadering. Waarom? Bij hoge snelheid ligt de sensor niet altijd vlak op de grond. Mijn theorie is dat deze variaties in afstand de meting teveel beinvloeden. Maar... wellicht is er ook iets anders aan de hand, ook al heb ik daar geen aanwijzing voor gevonden.

Terug dus naar de oorspronkelijke lijnsensor code en opnieuw meten wat er gebeurt. Het blijkt dat de robot bij een te grote versterking gaat slingeren (oscilleren). Maar als de versterking lager staat, compenseert de regeling niet genoeg om de lijnsensor boven de lijn te houden. En zodra de sensor niet meer boven de lijn is, rijdt de robot rechtdoor... Dat kan dus beter! Als de lijn zojuist helemaal links zat en we nu geen lijn meer zien, kunnen we ervan uitgaan dat we rechts van de lijn zitten. De aanpassing, zodat de robot (als hij alleen wit ziet) nog enkele tienden van seconden richting de lijn rijdt, geeft veel verbetering en brengt de snelheid rond de 1 meter per seconde. De motoren draaien daarbij op het rechte stuk op 98% van het maximum en in de bochten gaat de buitenste motor naar 100% en de binnenste motor remt extra af. De robot zit duidelijk tegen het maximaal haalbare van deze hardware!

De grote vraag is of de robot deze snelheid ook haalt op een roborama baan en of met een echte tijdmeting die 1 meter per seconde gehaald wordt. Deze vraag wordt op 4 oktober, op de bijeenkomst van de HCC Robotica, beantwoord.

Resultaten

Op de bijeenkomst van de HCC Robotica op 4 oktober 2014 zijn de verbeteringen getest. Bij de eerste poging vloog Printbot II direct uit de bocht, omdat de bochten in de lijn net wat scherper waren dan op mijn testbaan. Met een lagere snelheid (82% op het rechte stuk) komt de robot wel over de finish. De gemiddelde snelheid is 98,5 cm/s, een fractie onder de magische grens van 1 meter per seconde. De liefhebbers kunnen de arduino sourcode downloaden via Bestand:Lijnvolger mini.zip.

Nog een stapje sneller

De resultaten zijn goed, maar nog onder de magische grens van 1 meter / seconde.

Dus de volgende wijzigingen aangebracht:

  • De robot remt noodgedwongen af in de bochten, simpelweg omdat de buitenste motor niet sneller kan. De oplossing is een 3e lipo cel, waardoor de motorspanning omhoog gaat en daarmee het maximale toerental van de motor. Het meeste werk is het aanpassen van het frame zodat het batterijcompartiment groot genoeg is voor een batterijhouder met 3 cellen.
  • De lijnsensor geeft de positie van de lijn weer in 11 stapjes. En als de lijn 'uit beeld' gaat, rijdt de robot nog even door (40 * 10ms) en geeft dan de laatste lijn-positie terug die we gezien hebben. Dit kan worden beschouwd als twee extra waarden, dus met 13 stapjes een groter sensorbereik.

Daarnaast is blijf ik tunen, omdat het gedrag van de robot verandert als de batterijspanning terugloopt van 12.3V (vol) naar 10.5V (ver leeg). Met een kleine aanpassing in de code wordt de PWM waarde verhoogd als de batterijspanning lager wordt. Wellicht neemt dit niet alle invloed van de spanningsvariaties weg, maar het effect is in ieder geval veel minder.

Tot slot worden de tuning parameters opgeslagen in eepprom en zijn ze instelbaar via de serieele poort. Hierdoor is het aanpassen van de parameters veel sneller en makkelijker.

Op 14 oktober worden de verbeteringen getest bij RobotMC met een prima resultaat: een gemiddelde snelheid van 117,1 cm/s!

Verdere optimalisatie

De doelstelling van 6 jaar gelden is gehaald. Maar is dit het hoogst haalbare? Of zou 150 cm/s ook haalbaar zijn? En 200 cm/s?

Ik heb nog wat ideeen om uit te proberen:

  • De robot rijdt nu een vaste snelheid en die wordt bepaald door de bochten. Op het rechte stuk zou de robot nog kunnen versnellen en in de bochten vertragen.
  • De versterking is nu constant. Mogelijk geeft een progressieve versterking betere resultaten.
  • De regellus is nu een pure P-regelaar. Hieraan een D-component toevoegen kan het gedrag verbeteren. Maar... omdat de resolutie van de lijnsensor laag is en de takt (meetsnelheid) hoog, is het naar verwachting nodig om de bijdrage van de D-component wat langer dan 10ms actief te houden.
  • Net als auto-coureurs kan de robot de baan vooraf 'verkennen' om te bepalen waar de bochten zitten, hoe scherp deze zijn en hoe snel hij daar doorheen kan.

Opmerking: 'Verkennen' betekent dat de robot de baan in z'n geheugen zet en hij kan daarna de baan rijden zonder naar de lijn te kijken. Dat is niet mijn bedoeling. Maar het is volgens mij (o.a. door wielslip) een uitdaging op zich om op hoge snelheid te doen alsof de robot de lijn volgt...