Lab 10


Dato: 26 - 04 - 2012
Varighed: 3,5 timer
Tilstedeværende: Jonas, Simon

Siden sidst
Der er blevet startet på en prototype af spillet til End Course Project.

Goals
Målet med denne laboratorieøvelse er at udforske Behaviors med dynamisk prioritet og disses måde at afgive kontrollen til andre Behaviors.



Plan
For at udforske Behaviors, tager vi udgangspunkt i en eksempelklasse fra LeJOS frameworket som hedder BumperCar.java. Vi vil udføre følgende eksperimenter.

  1. Køre programmet og holde Tuchsensoren inde.
  2. Implementere en tredje behavior, som hedder Exit. Denne skal have højest prioritet, hele tiden og skal sørge for at lukke programmet ned.
  3. Undersøge om takeControl() bliver kaldt på DriveForward.java klassen, når triggeren for DetectWall.java returnerer sand.
  4. Implementere en lokal tråd i DetectWall.java, som sørger for at hente værdien fra den ultrasoniske sensor ud løbende, så takeControl metoden kan returnere hurtigt.
  5. Implementere at DetectWall behavioren også inkluderer at bevæge sig baglæns i et sekund.
  6. Implementere at DetectWall behavioren kan blive interrupted midt i udførelsen.
  7. Køre programmet BumbperCar, hvor motivations er blevet implementeret i både Behaviors og Arbitrator.


Results


1: Når programmet kører og Tuchsensoren bliver holdt inde hele tiden, sker der det, at DetectWall behavioren kører hele tiden. Den når at køre sin action() metode igennem hver gang, så det bliver bare udført sekventielt.


2: En simpel Exit behavior er blevet implementeret. Når robotten er i DriveForward behavioren, som kan blive suppressed, reagerer den med det samme på tryk på escape knappen. Er man derimod i DetectWall behavioren, som ikke kan blive suppressed, skal man være heldig at ramme knappen lige i slutningen af udførelsen af denne, for at den kan nå at opdage trykket på knappen.


3: Nej, den bliver ikke kaldt, da Arbitratoren løber baglæns igennem listen af behaviors og stopper når den finder en behavior, som kan blive kørt.


4: En lokal tråd er blevet implementeret til at hente værdien ud fra den ultrasoniske sensor, så der er en værdi klar med det samme, når takeControl() bliver kaldt. Robotten er blevet testet med den nye implementation og opfører sig som den skal.


5: Følgende kode er blevet tilføjet i starten af action()
BumperCar.leftMotor.backward();
BumperCar.rightMotor.backward();
try {
     Thread.sleep(1000); } catch (InterruptedException e) {}
Hvilket gør at robotten nu bakker i et sekund inden den drejer.

6: Action metoden for DetectWall er blevet ændret til følgende kode:
_isSuppressed = false;
BumperCar.rightMotor.backward();
BumperCar.leftMotor.backward();
long now = System.currentTimeMillis();
while ((System.currentTimeMillis()-now)<1000 && !_isSuppressed){
     Thread.yield();
}
BumperCar.leftMotor.rotate(-180, true);
BumperCar.rightMotor.rotate(-360,true);
while(!_isSuppressed && BumperCar.rightMotor.isMoving()){
     Thread.yield();
}
Dette gør at DetectWall behavioren kan blive suppressed mens den er ved at dreje. 


7: Programmet er blevet kørt og koden kigget igennem. Vi har fået en forståelse af hvordan man kan implementere motivations, så adfærdene hele tiden har en dynamisk prioritet.