Regular - indsamling af æg

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

Sidst opdateret 13.6.13.

Java programmering af WRO Starter Bot 2013

Til højre for banen er vist et billede af WRO Starter Bot 2013. Klik på billedet og se en video, som viser, hvordan WRO Starter Bot 2013 kører langs kanten af Komodo Island og samler de 4 røde kugler, som ligger yders ved kanten. Kuglerne bringes tilbage til basen og robotten standser i feltet 4, svarende til det antal, som er opsamlet.

Java programmet som samler de 4 røde kugler på videoen hedder Regular. Java programmet Regular får robotten til at følge den samme rute som i programmet AroundIsland (se Java program navigerer robot basebilen rundt om Komodo Island) indtil robotten er ved enden af den blå pil, som vist på billedet til højre:

Når robotten er ved enden af den blå pil sørger programmet for, at robotten kører ind i et af felterne mærket 2,3 eller 4 afhængig af det antal kugler, som er opsamlet.

Start med at få Java programmet Regular til at styre WRO Starter Bot 2013:

  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 Regular til robotbilen ved at åbne en menu ved klik på kassen Regular (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 og samler røde bolde, men det vil nok være lidt heldigt. Det mest sandsynlige vil være, at robotbilen laver en eller flere fejl. Der skal altså nok foretages justeringer i programmet og det er derfor nødvendigt at kende til programmets struktur og detaljer.

Metoden go i Regular

Når kassen Regular å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 og samle røde bolde:

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

De to første i go:

får robotten til at køre langs den hvide væg og samle røde bolde op undervejs. Hvis ikke der samles røde bolde, skal der nok foretages ændring af Tærskelværdi for lyssensor værdier.

De næste 5 linier får robotten til at navigere rundt om hjørnet for enden af øen:

Metoderne i linierne er de samme, som bragte robot basebilen rundt omkring enden af øen i programmet AroundIsland.

Den næste linie starterBot.sampleEggs(); får robotten til at køre langs den anden hvide væg og samle røde bolde op undervejs. Den sidste linie starterBot.driveIntoBase(); sørger for, at robotten kører ind i et af felterne mærket 2,3 eller 4 afhængig af det antal kugler, som er opsamlet.

Tærskelværdi for lyssensor værdier

Lyssensoren, som er tilsluttet port 3, bruges i programmet til at registrere om robotten er ud for en rød kugle:
Lyssensoren bruges under opsamlingen af røde bolde på de to sider af øen, svarende til de to linier starterBot.sampleEggs(); i metoden go. Metoden sampleEggs(), som aktiveres i de to linier, kan findes ved at bruge Open Editor på kassen WROstarterBot. Metoden ser sådan ud:
Den første linie robot.steer(10); får robotbilen til at køre fremad og holde lidt til venstre. Efter den første linie ses en lilla kasse med tekst i. Det er en såkaldte løkke. I første linie i den lilla kasse while ( lightWall.readValue() > corner ) angives, at programmet skal gøre det som står imellem { og } yderst til venstre i den lilla kasse, sålænge (while) betingelsen i parenteserne er opfyldt. Betingelsen lightWall.readValue() > corner er den samme, som blev brugt i en af venteløkkerne i programmet AroundIsland, nemlig betingelsen om, at den lyssensor, der peger mod den hvide væg registrerer en lysværdi (lightWall.readValue()), som er større end værdien af konstanten corner. Det betyder, at løkken gentages sålænge robotten kører langs den hvide væg.

I kassen Regular ses, hvilke værdi konstanten corner har:

Da corner ses at være sat til 50 % gentages løkken i den lilla kasse 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 løkken.

Inde i løkken i den lilla kasse ses endnu en kasse:

I første linie if ( lightEgg.readValue() > red ) spørger programmet om betingelsen i parenteser er opfyldt. Det undersøges altså, om lysværdien af lyssensoren på port 3 (lightEgg.readValue()), der peger ind mod øen i en sådan højde, at lyssensoren passerer de røde og blå kugler, er større end værdien af konstanten red. Hvis (if) det er tilfældet, antager programmet, at robotten er ud for en rød kugle og kuglen skal derfor skubbes ned fra øen og over i robotten's kurv. Det sker i de linier, som står imellem { og } efter if ( lightEgg.readValue() > red ):
Første linie får robotten til at køre 5 cm frem og standse, så svingarmen er ud for den røde kugle. Næste linie drejer armen en omgang, så kuglen forhåbentlig havner i kurven. Dernæst registreres, at der er samlet endnu en rød kugle, endnu et komodovaran æg. Det sker i linien eggs = eggs + 1;, hvor værdien af en såkaldt variabel eggs øges med 1. I starten af teksten i kassen WROstarterBot er eggs defineret til at være et heltal (int) og værdien er sat til 0 eggs = 0;:
I sidste linie i kassen efter if ( lightEgg.readValue() > red ), altså robot.steer(10);, sættes robotten igen til at køre frem langs væggen, efter at den har stået stille og skubbet den røde bold i kurven..

Værdien af red = 50 er en tærskelværdi, fordi den bruges til at afgøre om de registrerede værdier fra lyssensoren ud for kuglerne er over eller under den valgte tærskel. På den måde afgør programmet, hvilke situation robotbilen er i: Ud for en rød kugle eller ikke ud for en rød kugle. Om så det passer med robotbilens virkelige situation afhænger af tærskelværdien og lysforhold på banen.

Bestemmelse af tærskelværdi for lyssensoren

Den største udfordring ved opsamlingen af kugler er nok at registrere alle de røde kugler med lyssensoren og kun de røde kugler. I programmet Regular sker det ved at afgøre, om lyssensoren registrerer en lysprocent, som er større end konstanten red. Det afgørende for om dette netop finder de røde kugler er, at konstanten skal have den rigtige værdi efter lysforholdene, og at lyssensoren er justeret til at pege på kuglerne under kørslen.

For at finde en rigtig værdi for konstanten red bruges programmet View til at måle de lysprocenter, som lyssensoren på port 3 registrerer i forskellige positioner på banen. Se hvordan programmet View aktiveres i AroundIsland. Når View er aktiveret, måles lysprocenten f.eks. ud for en rød kugle og ud for et mellemrum imellem kuglerne:

Resultatet var 60 % og 47 %. Ud fra disse målinger valgtes værdien 50 for rød. Måske lidt tæt på de 47 %, men så kunne det være at også røde bolde på det lave plateau kunne findes.

Kør ind i basen og stop ved 2, 3 eller 4

Når robotten er nået til enden af den blå pil og forhåbentlig har opsamlet de røde kugler, bruges værdien af variablen eggs til at afgøre, hvor langt robotten skal køre for at stoppe i et af felterne mærket 2,3 eller 4. Det sker i metoden driveIntoBase() som befinder sig i kassen WROstarterBot:
Der er tre muligheder svarende til de forskellige værdier 2,3 eller 4. I alle tre valg skal robotten kører frem, men med forskellige strækninger, nemlig henholdsvis 25, 40 og 55 cm. Længden af de tre strækninger svarer til opmålte afstande fra positionen ved enden af den blå pil og så til de tre forskellige grønne felter. Hvis (if) eggs == 2 styres robotten frem til positionen mærket 2 af robot.travel(25), osv.