Thursday, November 11, 2010

Lab 11/11-2010

Dato: 11/11
Varighed: 3 timer
Deltagere: Philip, Lasse, Toke og Esben

Dagens mål
At arbejde med navigation for lego NXT robotten. Først vil vi teste lejos.robotics.navigation.TachoPilot og måle hvor præcis denne er. Herefter vil vi implementere to-lags opførsel på robotten så den undgår kollisioner.

TachoPilot
En vigtig ting når det kommer til navigering via tacho counters, er at minimere friktionen samt at maksimere grebet med underlaget. Robotten blev programmeret til at køre i en geometrisk figur 10 gange (et kvadrat med sidelængde 30 cm).

TachoPilot tachoPilot = new TachoPilot(8.16f, 11.2f, Motor.C, Motor.B);
tachoPilot.setSpeed(100);
tachoPilot.forward();
for (int i = 0; i <>
for (int j = 0; j <>
tachoPilot.travel(30);
tachoPilot.rotate(90);
}
}

Vi satte vores rotationshastighed til 100 grader i sekundet på et hjul med en diameter på 81,6mm. Dette fik vores robots hjul til at skride ud, hvilket fik robotten til at tabe sin kurs og ikke følge den ønskede figur. Ved at reducere hastigheden fik vi maksimeret vejgrebet, hvilket er med til at minimere robottens drift[1].
Med en rotationshastighed på 30 grader i sekundet, noterede vi en afvigelse fra nulpunktet på ca. 1,5 cm pr kørt figur.

Robotten blev efterfølgende sat til at rotere 360 grader på stedet, og herefter rotere tilbage til udgangspunktet. Med den korrekte rotations hastighed (vi benyttede 10 grader i sekundet) roterede robotten kun lige over 300 grader, men roterede dog tilbage til næsten samme udgangspunkt, her med en afvigelse på et par grader. Dette virker mere som et problem med konfigurationen af robottens forskellige størrelser, end et problem med tacho counterne, da robotten netop roterer tilbage til det originale udgangspunkt korrekt. Ved at sætte afstanden mellem vores hjul op med yderligere 0,1cm kørte robotten næsten en fuld cirkel og roterede tilbage til sit udgangspunkt. Da der ikke var påsat en tusch til at tegne stien. må vi estimere på afvigelsen - vores estimat er 355 grader.

For at kunne stole på tacho counterne er det altså vigtigt at robottens konfiguration af diverse fysiske afstande er så korrekt som muligt samt at grebet mellem hjulene og overfladen maksimeres.


Navigation mens der undgås kollision

Målet for vores robot er at køre til et givent punkt og køre rundt om eventuelle forhindringer. Til dette definerede vi to behaviours, navigation behaviour og evasion behaviour, der blev hvor evasion opførslen undertrykker navigationen vha. supress mekanismen fra [2]

Navigation behaviour benytter SimpleNavigator og kører til et givent koordinat via funktionen goTo(x,y). Et problem vi opdagede da vi testede opførslen for sig selv, er at et kald til GetX() eller GetY() på en anden tråd, får det synkrone kald til goTo(x,y) til at afbryde og de indre værdier for x og y bliver forkerte. Et kald til goTo(100,0), som får robotten til at køre 1 meter ligeud, fik robotten til at køre i en halvcirkel da vi samtidig på hovedtråden pollede efter dens position og udskrev dette.

Evasion laget søger efter en forhindring, og hvis der findes en, undertrykkes navigationen, der drejes 90 grader og køres 20 cm, hvorefter navigationen igen overtager. Der gemmes ingen state og reagerer direkte på input.

while (true) {
while (sonicSensor.getDistance() > tooCloseThreshold) { //threshhold is 20cm
}
suppress();
rotate(90);
travel(20);
release();
}

Vi har observeret at robotten kan finde på at dreje med kun et hjul, hvor (ifølge dokumentationen) at SimpleNavigator blot drejer på stedet (robotten benytter differential drive). Den observerede opførsel kan være et resultat af udefineret opførsel hvis den synkrone metode goTo(x,y) bliver afbrudt. En mulighed her er at benytte den asynkrone version af goTo eller programmere vores egen navigation.

Der er enkelte fejl som nævnt ovenfor, der kunne forbedres, men generelt virker robotten fint, og kører korrekt hen til sit mål. Den lider af samme problemer som TachoPilot robotten, nemlig at den skyder lidt ved siden af, hvilket forværres drastisk hvis grebet med overfladen ikke er god nok.

[1] Brian Bagnall, MAXIMUM: LEGO NXT, Building Robots with Java Brains
[2] Rodney Brooks, MIT AI Memo 864, September 1985

No comments:

Post a Comment