Dato: 18/11 - 2010
Varighed: 3 timer
Deltagere: Lasse, Esben og Toke
Dagens mål
I dag fokuserer vi lab sessionen på at undersøge leJOS NXJ behaviour-based kontrol program. Måden vi vil gøre det på er ved at kigge på den inkluderede testklasse BumberCar der ligger i samlples/BumberCar.
Til at gøre dette bruger vi vores NXJ robot hugo der til dagens session er bygget sådan her.
Dagens plan
- Testkørsel af BumberCar.java klassen samt analyse af Arbitrator.java klassen
- Udvidelse af BumberCar klassen med en ny behaviour Exit
- BESKRIV SIDSTE PUNKTER
Testkørsel af BumberCar.java klassen samt analyse af Arbitrator.java klassen
For at kunne arbejde med BumberCar klassen startede vi med at køre klassen i standard form på vores NXJ robot. Ud fra dette kunne vi observere at vores robot altid forsøger at køre ligefrem, indtil der skulle komme noget ind foran vores robot. Hvis robotten registrerer noget foran sig vil den forsøge at undgå dette ved at dreje væk fra den.
Ved at kigge på BumberCar koden kan vi udlede at den har en behaviour DetectWall, som er en subklasse af Behaviour, der står for denne undvigelse.
Uden at genfortælle hele strukturen som de bruger i deres behaviour kontrol så fungerer den ved at have implementeret en funktion takeControl() der returnerer true hvis har opdaget noget og gerne vil have kontrollen.
[CODESNIPPET]{
public boolean takeControl() {
return touch.isPressed() || sonar.getDistance();
}
Her vises implementation af takeControl(). touch og sonar er henholdsvis en TouchSensor og en UltrasonicSensor fra det leJOS NXJ API.
Ved at holde touch knappen nede vil takeControl returnere true hver gang Arbitrator.java tjekker for hvilken behaviour der skal være aktiv.
Mens vi kigger på Arbitrator.java så kan vi med det samme udlede at man starter fra den behaviour med højest prioritet og derfra arbejder sig nedad indtil man har fundet en behaviour der gerne vil have kontrol over robotten. Dette betyder altså at behvaiourer ikke vil få kaldt deres takeControl() funktion hvis der er en behaviour med højerer prioritet der returnerer true i takeControl().
[CODESNIPPET]{
_highestPriority = NONE;
for (int i = maxPriority; i >= 0; i--) {
if (_behavior[i].takeControl()) {
_highestPriority = i;
break;
}
}
int active = _active;// local copy: avoid out of bounds error in 134
if (active != NONE && _highestPriority > active) {
_behavior[active].suppress();
}
Ovenstående er et uddrag fra Arbitrator.java i metoden run(). Det viser hvordan man går igennem alle behaviours (behaviour er et array med alle behaviours) og spørger hver af dem om de gerne vil tage kontrol. Hvis metoden finder en behaviour der vil så breaker den og suppresser den behaviour der er aktiv.
Udvidelse af BumberCar klassen med en ny behaviour Escape
For at lære yderligere omkring Behaviours og hvordan de fungerer, prøvede vi som næste skridt at lave vores egen simple Behaviour og tilføje den til BumberCar.java. Vi kaldte denne behaviour for Escape
[CODESNIPPET]
class Escape implements Behavior{
public boolean takeControl() { return Button.ESCAPE.isPressed(); }
public void action() { System.exit(0); }
public void suppress() {}
}
Her ses vores simple behaviour der implementerer Behaviour og de metoder der følger med.
Denne behaviour blev tilføjet til vores behaviour liste som den sidste behaviour og dermed den behaviour med højest prioritet (Se inkluderede BumberCar.java fil for at se inkluderingen).
Ved testkørslen af dette opdagede vi noget uventet. Robotten slukkede ikke ned med det samme hvis man trykkede på NXJ robottens escape knap samtidig med at robotten var i gang med at udføre action funktionen i DetectWall behaviouren så blev man nødt til at holde knappen inde til dens action var færdig.
Hvis man kigger inde i DetectWall.action() så finder man følgende kode:
public void action() {
_suppress = false;
Motor.A.rotate(-180);// start Motor.A rotating backward
Motor.C.rotate(-360); // rotate C farther to make the turn
} Denne kode kører to metode kald til motorerne med rotate. Ved at kigge leJOS NXJ API så kan man ved denne metode se de er blokkerende metoder hvilket forklarer hvorfor vi skal holde knappen inde.
Litteraturliste
BumberCar.java : STI TIL KLASSE
Arbitrator.java STI TIL KLASSE
Behaviour.java STI TIL KLASSE