Coinurl2

Thursday, 3 May 2012

NXT Programmering Lesson 10


NXT Programmering, Lesson 10

Tid: 3 timer, Deltagere: Kenneth, Rawad.

Siden sidst:
Har været nede på det grønnehjørne med vennerne og nyde sejrens sødme, efter forige uges robotrace.

Formål:
Formålet med denne lab session er at undersøge et behavior-based arkitektur der er konstrueret med lejos subsumption API.

Plan

  1. Konstruktion af Robot
  2. Test af BumperCar kode
  3. Motivation functions
  4. Konklusion

1. Konstruktion af robot
VI har konstrueret robotten som det kan ses på Mindstorms Education 9797 fra 8-22. Derudover har vi udvidet robotten med ultralydssensor og touchsensor. Ultralyd sensoren er sat fast på robotten som beskrevet på siderne 28-29 af Mindstorms Education 9797. Touch sensoren er sat på så den peger fremaf.

2. Test af BumperCar kode
Vi har i dette afsnit testet BumperCar for at undersøge en behavior-based subsumption arkitektur. BumperCar er skrevet af Brian Bagnall, Lawrie Griffiths og modificeret af Roger Glassey.

BumperCar indeholder to behaviors hhv. detectwall og driveforward.

Første test: hold touchsensor inde.

I denne test observede vi at robotten fulgte detectwall behavior og forsøgte at bakke ud og dreje væk fra en væg. Så længe touchsensoren var aktiveret blev ingen andre behaviors end detectwall eksekveret. Dette skyldes at detectwall har højere prioritet i subsumption arkitekturen, og kan “suppress” driveforward, så længe sensorene kan detektere en forhindring/væg.

Anden test: Implementer 3. behavior

I denne test implementerede vi en tredie behavior kaldet Exit, hvis formål er at lukke programmet ned ved tryk på exit knappen. Denne behavior skal have højest prioritet og supress andre behaviors ved exit knap tryk.

Vi har implementeret Exit, i samme stil som de andre behaviors, og prioritet besluttes i rækkefølgen i behaviorlisten der gives til arbitratoren.

class Exit implements Behavior

{

 private boolean _suppressed = false;

 public Exit()
 {
 }
 public boolean takeControl()
 {
   return Button.ESCAPE.isPressed();
 }
 public void suppress()
 {
 _suppressed = true;// standard practice for suppress methods
 }
 public void action()
 {
 System.exit(1);
 }
}

Vi har afprøvet ovenstående kode og har med success kunne lukke programmet ned under både detectwall og driveforward behaviors.

Tredie test: undersøgelse af arbitrator klassen.
Kun behaviors med højere priotet end den kørende bliver kaldt. Dette har vi testet ved at kalde Sound.beep funktionen i takecontrol og her vi høre at lyden stoppede så længe DetectWall var igang.

fjerde test: Fjern detectwall behaviors takeControl delay
Vi har gjort dette som det forslåes i øvelsen, ved at tilføje en tråd i detectwall classen der kontinuerligt måler afstanden og gemmer dette i en variable. Denne variable aflæses så direkte når takeControl funktionen kaldes og derved forsvinder delayet.

 public DetectWall()
 {
   touch = new TouchSensor(SensorPort.S1);
   sonar = new UltrasonicSensor(SensorPort.S3);
   
   Thread distanceMeasure = new Thread(){
    public void run()
       {
           while (true)
           {
            sonar.ping();
            distance = sonar.getDistance();
           }
        }
   };
   distanceMeasure.setDaemon(true);
   distanceMeasure.start();
 }

 public boolean takeControl()
 {
   return touch.isPressed() || distance < 25;
 }



public void action()
 {
 Motor.A.backward();
 Motor.C.backward();
 
 long time = System.currentTimeMillis() + 1000;
 while(time < System.currentTimeMillis())
 {
 if(_suppressed == false)
 Thread.yield();
 }
 Motor.A.rotate(-180, true);// start Motor.A rotating backward
 Motor.C.rotate(-360);  // rotate C farther to make the turn
 }

femte test: implementer 1 sekunds baglæns kørsel inden drej

Vi har implementeret 1 sekunds baglæns kørsel inden drej, i detectwall behavior ved at anvende getCurrentTime. Denne funktion bruger vi i en whileløkke efter motorene er sat til at køre baglæns. I Whileløkken tjekkes der om getCurrentTime har ændret sig med 1000. Hvis der er gået 1000 millisekunder, kommer vi ud af whileloop og går igang med at dreje.

sjette test: implementer genstart af DetectWall
Ved at tilføje variablen active kan vi tjekke på om action sidst er blevet forladt pga. touch sensoren var trykket eller om det var pga. suppressed eller “Naturligt” ved at køre færdig. Dermed ved vi om der igen skal tages kontrol. Vi har valgt også at tilføje dette på selve drejet så DetectWall nu kan interruptes igennem hele forløbet.
public boolean takeControl()
 {
   return touch.isPressed() || distance < 25 || active;
 }

public void action()
 {
 _suppressed = false;
 active = true;
 
 Motor.A.backward();
 Motor.C.backward();
 
 long time = System.currentTimeMillis() + 1000;
 while(time > System.currentTimeMillis())
 {
 if(_suppressed == true)
 {
 active = false;
 return;
 }
 if(touch.isPressed())
 {
 return;
 }
 }
 
 Motor.A.rotate(-180, true);// start Motor.A rotating backward
 Motor.C.rotate(-360, true);  // rotate C farther to make the turn
 
 while(Motor.C.isMoving())
 {
 if(_suppressed == true)
 {
 active = false;
 return;
 }
 if(touch.isPressed())
 {
 return;
 }
 }
 
 active = false;
 }


3. Motivation function
I forbindelse med motivation functions, har vi fulgt de tre vejlednende skridt og er kommet frem til en løsning der er baseret på [1],[2]. Herunder kan ses hvordan vi implementerede takeControl funktionen i DetectWall. 



if(touch.isPressed() || distance < 25)
    return 100;
    if(active)
    return 50;
    return 0;








4. Konklusion
Vi har undersøgt BumperCar der er implementeret med Lejos subsumtion api og fundet at der mangler explicit prioritering. Vi har derfor modificeret dette og anvendt Oles arbitrator og behavior[1][2]. Dette har givet os mulighed for at interrupt og genstarte en behavior.

[1]http://dl.dropbox.com/u/2779683/Arbitrator.java
[2]http://dl.dropbox.com/u/2779683/Behavior.java
http://dl.dropbox.com/u/2779683/BumperCarV1.java
http://dl.dropbox.com/u/2779683/BumperCarV2.java
http://dl.dropbox.com/u/4447110/RawadsBumperCar.txt

No comments:

Post a Comment