Regular - Robot basebil

Lasse Deleuran og Ole Caprani
Institut for Datalogi, Aarhus Universitet,
ocaprani@cs.au.dk

Sidst opdateret 13.6.13.

Java programmering af robot basebil

Nu kan det afprøves, om den nybyggede robot basebil kan kører rundt omkring Komodo Island langs den hvide væg. Der er lavet et Java program, kaldet AroundIsland, som kan få robotbilen til at følge først den gule pil, så den røde og sidst den blå pil, så bilen kommer rundt omkring Komodo Island som vist (klik på billedet for at se en video af en kørsel):

Start med at få Java programmet AroundIsland til at styre den nybyggede robot:
  1. Tilslut robottens NXT til computeren ved hjælp af et USB kabel.
  2. Tænd for NXT ved at trykke på den orange knap.
  3. Hent BlueJ projektet WRO2013.zip og pak det ud til en mappe WRO2013.
  4. Start programmeringsværktøj BlueJ.
  5. Åben BlueJ projektet WRO2013 i BlueJ, se eventuelt Kør det første Java program HelloWorld på NXT:

  6. Overfør programmet AroundIsland til robotbilen ved at åbne en menu ved klik på kassen AroundIsland (ctrl-klik på Mac, højre klik på Windows) og vælg NXT -> NXJ-RunUSB, se eventuelt Kør det første Java program HelloWorld på NXT
  7. Fjern kablet og anbring robotbilen i basen som vist på videoen.
  8. Start robotbilen ved at trykke på den orange knap.
Det kan være, at robotbilen kører rundt om Komodo Island som planlagt, men det vil nok være lidt heldigt. Det mest sandsynlige vil være, at robotbilen laver en eller flere fejl. Der skal derfor foretages justeringer i programmet og det er derfor nødvendigt at kende til programmets struktur og detaljer.

Metoden go i AroundIsland

Når kassen AroundIsland åbnes ved hjælp af Open Editor ser det sådan ud:

Linierne inde i metoden med navnet go er den del af teksten i vinduet, som får robotbilen til at køre rund om Komodo Island:

Linierne udføres efter hinanden startende med den første linie baseRobot.forwardTowardsWall();.

De to første linier får bilen til at følge den gule pil på ruten:

I den første linie aktiveres en metode forwardTowardsWall() som får bilen til at køre fremad og holde lidt til venstre. I den næste linie aktiveres metoden forwardUntilCorner() som får programmet til at vente på, at bilen i sin bevægelse langs væggen er ud for kanten, altså for enden af den gule pil.

Prøv at indsætte baseRobot.stop(); Button.ENTER.waitForPressAndRelease(); efter de to linier. Det vil få bilen til at standse for enden af den gule pil og vente på, at den orange knap, kaldet ENTER, bliver trykket ned. Hvis ikke det sker, skal der nok foretages ændring af Tærskelværdier for lyssensor værdier.

De tre næste linier styrer bilen langs den røde pil:

Prøv igen at indsætte baseRobot.stop(); Button.ENTER.waitForPressAndRelease(); efter de tre linier, så bilen standser for enden af den røde pil.

De sidste fem linier får bilen til at følge den blå pil og stoppe med en beep lyd:

Tærskelværdier for lyssensor værdier

Robotbilen har monteret en lyssensor foran til venstre:
Det er lyssensoren programmet AroundIsland bruger til at holde øje med, om bilen er tæt på den hvide væg eller om bilen er nået hen forbi enden af en væk. De to linier som gerne skal få robotten til at følge den gule pil, er jo som vist ovenfor:
De to metoder, som aktiveres i de to linier, kan findes ved at bruge Open Editor på kassen BaseRobot. Metoderne ser sådan ud:
I begge de to metoder er det første linie robot.steer(10); som får robotbilen til at køre fremad og holde lidt til venstre. Det er tallet 10 som bestemmer, hvor meget der holdes til venstre: Den venstre motor kører med 10 % mindre fart end den højre motor. Den næste linie i begge metoder er såkaldte venteløkker, som får programmet til at vente sålænge (while) den betingelse er opfyldt, som står inde i parenteserne.

I venteløkken while ( lightWall.readValue() < white ); er betingelsen, som undersøges igen og igen, om lyssensoren's værdi, lightWall.readValue(), er mindre end værdien af konstanten white. Så længe det er tilfældet, bliver programmet altså i venteløkken. Det er først, når lysprocenten er lig konstanten white eller større, at programmet fortsætter. I kassen AroundIsland ses, hvilke værdi konstanten white har:

Det betyder, at programmet bliver i venteløkken, indtil bilen i sin kørsel fremad mod venstre kommer så tæt på væggen, at lyssensoren registrerer en lysprocent på 58 % eller derover. Hvis lyssensoren under kørslen aldrig kommer i nærheden af en hvid væg, eller værdien i nærheden af den hvide væg er mindre end 58 %, bliver bilen altså ved med at køre fremad og lidt til venstre, fordi programmet så at sige "hænger" i venteløkken.

I den anden venteløkke while ( lightWall.readValue() > corner ); er betingelsen, som får programmet til at vente, at lyssensoren's værdi er større end værdien af konstanten corner, som jo ovenfor kan ses at være sat til 50 %. Der ventes altså indtil lyssensoren under kørslen har registreret en lysprocent på 50 % eller derunder. Hvis lysprocenten bliver ved med at være over 50 %, selvom bilen når til enden af den hvide væg, vil bilen altså fortsætte sin kørsel, fordi programmet "hænger" i den anden venteløkke.

De to værdier white = 58 og corner = 50 kaldes tærskelværdier, fordi de bruges til at afgøre om de registrerede værdier fra lyssensoren er over eller under en af de valgte tærskler. På den måde afgør programmet, hvilke situation robotbilen er i: Tæt på hvid væg eller for enden af væg. Om så det passer med robotbilens virkelige situation afhænger af tærskelværdierne og lysforhold på banen.

Bestemmelse af tærskelværdier for lyssensoren

Værdierne 58 for konstanten white og 50 for konstanten corner er fundet ved at måle, hvilke lysprocenter lyssensoren registrerer, når bilen er tæt på den hvide væg, ved en kant for enden af en hvid væg og ved stop ud for trappen.

Til at måle lysprocenterne er programmet View blevet brugt på NXT. Programmet overføres og køres på NXT ved at åbne kassen View's menu. Når View kører på NXT, ser skærmen sådan ud til at starte med:

Tegnet > ud for Port 1 på skærmen viser, at Port 1 er valgt. De to lysegrå knapper og på NXT kan bruges til at flytte >, så tegnet står ud for en af de andre porte. Når porten er valgt, trykkes på den orange knap, kaldet ENTER. Dernæst vises lysværdien for den lyssensor, som sidder på den valgte port:

For at bestemme de to tærskelværdier startes med, at robotbilen sættes med lyssensoren tæt på en hvid væg:

Nu måles lysprocenten ud for hvid, f.eks. 62 %. Da lysprocenten kan variere rundt langs væggene, sættes konstanten white noget lavere end 62 nemlig white = 58. Når lyssensoren registrerer en værdi lig værdien for white eller derover, antages det i programmet, at bilen altså er tæt på den hvide væg.

Dernæst sættes robotbilen for enden af en væg og ved stop punktet ud for trappen:

Lysprocenten for enden af væggen er f.eks. 40 % og lysprocenten ved stop er måske noget højere f.eks. 46 %. Ud fra de to målinger sættes værdien af corner lidt højere end den største af de to målte værdier, nemlig f.eks. corner = 50, så der er plads til lidt variation i de målte lysprocenter. Når lyssensoren registrerer en værdi lig værdien for corner eller derunder, antages det i programmet, at bilen er for enden af en hvid væg eller ved stop punktet ud for trappen. Om det er den ene eller den anden situation afhænger af, hvor i programmet registreringen sker.