fredag den 23. november 2007

ESEA - Labnotes

NXT programming - Lesson 10
Varighed: 4.5 timer - kl. 09.00-13.30
Gruppemedlemmer: Aslak, Ruben og Lars

Gruppens mål for dagens lesson:
  • At undersøge hvorledes en behaviour-baseret arkitektur er implementeret i subsumption API'en.
  • At følge dagens lektion og først implementere og observere "BumperCar" robotten
  • At udvide "BumperCar" robotten med en ny behaviour
  • At forsøge med en ny "Arbitrator", som er den kode som styrer hvilke behaviours som skal "køres"

Det første der blev gjort, var at montere en tryksensor på køretøjet. Dernæst hentes klassen 'BumperCar.java' og downloades til NXT'en. Programmet startes og køretøjets opførsel o
bserveres. Da vores design af køretøj fra sidste gang ikke svarer helt overens med, det der var tiltænkt i dag, er der "byttet rundt på" forward og backward. Derfor ændrede vi dette i koden, for at rette op på dette. Programmet downloades igen og bilens opførsel observeres. Det ses at bilen kører fremad. Når tryksensoren bliver aktiveret, bakker bilen
lidt og korrigerer herefter en anelse til højre.

Køretøjets tryksensor bliver til tider ikke trykket ordentligt ind, som ønsket,
hvilket resulterede i at køretøjet fortsatte ind i "væggen". For at afhjælpe dette, påmonterede vi endnu en tryksensor og anordninger, der hjælper med bedre at trykke sensorerne ordentligt ind. Denne sensor tilføjes også i "HitWall.java", således at et tryk på en af tryksensorerne returnerer TRUE fra takeControl().
Den omtalte kodeændring kan ses i følgende uddrag:


public class HitWall implements Behavior{
TouchSensor touch1 = new TouchSensor(SensorPort.S2);
TouchSensor touch2 = new TouchSensor(SensorPort.S3);
public boolean takeControl() {
boolean t1 = touch1.isPressed();
boolean t2 = touch2.isPressed();

return (t1 t2);
}
.
.
.
}


Køretøjet kan ses på følgende billede.


Ovenstående billede viser robottens "stødtænder" som opfanger , når robotten kører ind i noget.


Ovenstående billede viser robottens opbygning, set fra siden.


Ovenstående billede viser robotten tæt på en væg, dvs. tæt på at få aktiveret den venstre tryksensor.


Dette billede viser et "close-up" af tryk-sensor systemet. Selve tryksensoren har den indbyggede svaghed, at kontakten skal trykkes ind vinkelret, for at sensoren virker. Derfor skal der bygges tilbygning på, foran tryk-sensoren, for at robotten registrere at den kører ind i ting fra forskellige vinkler.

Det undersøges herefter hvad der sker, hvis en af tryksensorerne trykkes ind og holdes inde.
Når sensoren trykkes ind, bakker køretøjet et stykke tid og korrigerer herefter til højre (pga HitWall.java). Herefter holder køretøjet helt stille. Dette fortsætter indtil sensoren slippes igen. Denne opførsel sker fordi takeControl() holdes til TRUE fra den tidligere behaviour. Dette resulterer i at action() ikke køres igen. En behaviour kan ikke køre flere gange i træk. Der skal ske noget andet inden den samme behaviour kan køre igen. I afsnittet "Coding Solid action() and suppress() Methods" fra " The leJOS Tutorial" under afsnittet "Behaviour" af Brian Bagnall, er netop denne problemstilling beskrevet.
Denne tutorial kan findes via følgende link:

http://lejos.sourceforge.net/p_technologies/rcx/tutorial/behavior/index.html


Der implementeres endnu en behaviour, 'TuneBehave.java', der spiller en meget kort melodi.
Klassen så ud, som følger, ved timens afslutning:
(det skal nævnes at vi har eksperimenteret en del, bl.a. med at bruge tryk-sensorene også, hvilket koden bærer en del præg af)

public class TuneBehave implements Behavior{
private static final short [] note = {
2349,115, 0,5, };
TouchSensor touch1 = new TouchSensor(SensorPort.S2);
TouchSensor touch2 = new TouchSensor(SensorPort.S3);
public boolean takeControl() {
boolean i = true;
while(i) {
i = false;
try{Thread.sleep(3000);}catch(Exception e){}
return false;
}
return true;
}
public void suppress() {
}
public void action() {
for(int i=0;i


Denne tredje behaviour kom aldrig til at virke, som vi gerne ville have den til, så vi kom aldrig til at se at HitWall styrede motorerne, selvom den er undertrykt. Dette gør det meget svært for os at svare på, hvorfor dette er tilfældet. I den ovennævnte tutorial "Behaviour" nævner Brian Bagnall, at der specielt mht. tråde kan opstå problemer med at undertrykke dem med "suppress" funktionaliteten. Om det kan være her at svaret skal findes kan vi ved lektionens afslutning ikke svare på. Vi må spørge en "Teaching Assistant"', eller Ole C. ved nærmeste lejlighed.

Den nye behaviour tilføjes i klassen 'BumperCarAb2.java', med højeste prioritet:

public class BumperCarAb2 {
public static void main(String[] args) {
Behavior b1 = new DriveForwardAb2();
Behavior b2 = new HitWallAb2();
Behavior b3 = new TuneBehave();
Behavior [] bArray = {b1, b2, b3};
Arbitrator2 arby = new Arbitrator2(bArray);
Motor.A.setSpeed(400);
Motor.C.setSpeed(400);
arby.start();
}
}

Det blev forsøgt at køre med den nye Arbitrator (vi kaldte den Arbitrator2). Når denne blev benyttet, kunne det observeres, at en behaviour godt kunne køres flere gange i træk. Bilen kunne bakke og korrigere
flere gange i træk, når sensoren holdes inde.

Her er en lille film, hvor robottens opførsel kan ses:


Ingen kommentarer: