torsdag den 11. november 2010

NXT Programming, lesson 9

Dato: 11. nov. 2010
Varighed: 3
Deltagere: Nick & Allan

Formål med øvelsen

Denne lab. session handler om at udforske hvordan det er muligt at få en robot til at navigere på en intelligent måde. Det betyder at robotten skal vide hvor den er (localization), samt den skal kunne vide hvor den vil hen (navigation). Metoderne til at undersøge ovenstående omfatter alle brug af tachometret som Lego motorerne er udstyret med.

Planen for øvelsen
* Ombygge Lego Car 9797 så den kan skrive på kørselsunderlaget med en boardmarker.
* Uploade et program som bruger leJOSs TachoPilot for at udforske hvordan localization og navigation virker.
* Uploade et program som bruger leJOSs SimpleNavigator for at udforske hvordan localization og navigation virker.
*Sammenligning af TachoPilot og SimpleNavigator
* Diskussion af hvordan navigationen kan forbedres i henhold til forskelligt teori.

Forventede resultater
Det forventes at robotten kan bringes til at navigere tilnærmelsesvist korrekt af sig selv. Det skal dog bemærkes at der spiller mange faktorer ind, og at det er bliver nødvendigt at approximere dels konkrete locations, og dels navigationsruter, således kan det derfor ikke forventes at robotten følger perfekte ruter.

Robotten med boardmarker
Til at udføre eksperimentet brugte vi en robot med whiteboard tusch påsat. Billede kan ses nedenfor.

TachoPilot

TachoPilot blev sat til at køre 60 cm. frem, rotere 180 grader for derefter at køre 60 cm. og igen rotere 180 grader, hvilket gentages 11 gange.

Resultatet af dette kan ses på nedenfor viste billede som tydeligt illustrere hvordan fejlen vokser med tiden/antal sving, som beskrevet i [Bagnall] på side 297-298.

Dette kan yderligere ses på følgende video:

Koden bag dette simple eksperiment ser ud som følger:

Pilot pilot = new TachoPilot(5.6f, 11.2f, Motor.B, Motor.C, false);

pilot.setMoveSpeed(10);

for(int i=0; i<3;>

pilot.travel(60);

pilot.rotate(-180);

pilot.travel(60);

pilot.rotate(-180);

}

try{Thread.sleep(1000);}

catch(InterruptedException e){}

pilot.stop();

Her bemærkes det at afstanden mellem hjulene på vores robot er målt til 11.2 cm, og hjul størrelsen er aflæst fra lego hjulet til 5.6 cm.

I det at det umiddelbart ser ud til fejlen kommer i forbindelse med sving kan vi prøve at reducere denne fejl ved at mindske den angivne afstand mellem hjulene. Vi reducerede denne med en millimeter og fik følgende resultat:

Det ses tydeligt at den ene millimeter gør en kæmpe forskel i forhold til forrige resultat. Der kan være mange årsager til at resultatet bliver så radikalt anderledes, f.eks. kan det skyldes ren og skær tilfældighed, hvilket vi dog ikke tror da vi senere hen så samme forskel ved brug af SimpleNavigator. Det tyder altså på at upræcise målinger påvirker Lejos navigations algoritmerne rigtig meget. Det er vigtigt at bemærke at på billedet ovenfor har robotten ikke kørt 11 gange frem og tilbage men kun 3, dog er afstanden mellem en streg og dens nabo streg mindre end på forrige billede.

SimpleNavigator

SimpleNavigator blev sat til at gennemføre samme rute som beskrevet i TachoPilot, med den forskel at koden selvfølgelig er lidt anderledes:

SimpleNavigator nav = new SimpleNavigator(5.6f, 11.2f, Motor.B, Motor.C);

for(int i=0; i<3;>

nav.goTo(60, 0);

nav.goTo(0, 0);

}

SimpleNavigator har dermed mere global viden omkring sin verden end TachoPilot, da man kan bede den om at vende tilbage til udgangspunktet uden selv at foretage nogen beregninger.

Med hensyn til præcisionen var SimpleNavigator ikke rigtigt bedre end TachoCounter, hvilket kan ses på følgende billede:

Dette illustreres yderligere af følgende video:

Som før forsøgte vi at reducere den angivne afstand mellem hjulene med en millimeter til 11.1 cm., hvilket igen forbedrede resultatet væsentligt:

Igen er viser billedet kun 3 ture frem og tilbage.

Sammenligning

TachoPilot og SimpleNavigator er stort set lige dårlige, og det har ikke været muligt for os at observere en radikal forbedring fra den ene til den anden.

Forskellen ligger dermed i at SimpleNavigator giver mindre kontrol end TachoPilot til fordel for en mere simpel form for navigation hvor den ved hvad dens udgangspunkt var da den startede ud. Dette kan også opnås med TachoPilot, dog vil det kræve væsentligt mere arbejde.


Forbedret navigation
Grundlæggende bygger RidgeSoft-tutorial [RS1] (svarende til leJOSs SimplePilot) på samme principper som "Forward Kinematics" [FK]. Dvs. at begge udnytter diameteren af hjulet og længde af akslen til at beregne den nye position (som et punkt i et koordinatsystem). Forskellen består i at [FK] tager højde for forskellig fart på højre og venstre hjul, således at omdrejningspunktet (kaldet "ICC" i [FK]) kan variere. Dette giver teoretisk et mere præcist resultat end RidgeSoft som altid anvender midten af hjulakslen på de drivende hjul som omdrejningspunkt.
I de forsøg som vi har gennemgået idag, vil beregningsmetoden i [FK] dog ikke have nogen effekt, da kun drejer "på stedet", altså at robotten drejer om hjulasklen. Blev robotten programmeret til at køre i buer, vil metoden [FK] teoretisk give et mere præcist resultat. Grunden til der lægges stor vægt på teoretiske resultater er, at der er mange faktorer som den robot vi anvender dag ikke lægger mærke til, og derfor giver anledning til fejlkørsler. Disse er:
- modstand i boardmarkertuschen som bevirker at robotten tvinges ud af kurs
- modstand i baghjulet som har samme effekt som ovenstående fejlkilde (vi så også tidligere at forsøg måtte afbrydes pga. baghjulet så tydeligt påvirkede kørselsretningen)
- underlaget kan have indflydelse på kørslen, fx. kan robotten lave hjulspind eller krænge pga. af forskelle i underlaget. Derudover gælder for begge metoder at underlaget skal være plant - ellers regnes positionerne forkert.
- fejlmålinger i størrelser af hjul, aksellængder - [Bagnall, side 297] antyder også at målingen af aksellængden kan være svær at måle præcist.



Ingen kommentarer:

Send en kommentar