torsdag den 19. november 2009

Lesson 11: Opførsel

I denne uge vil vi benytte LeJOS subsumption API´en og specifikt Bahaviour interfacet og klassen Arbitrator som bestemmer udførselsrækkefølgen.

I første omgang lagde vi BumperCar.java programmet ind på NXT´en og observerede opførslen. Bilen kører autonomt fremad så længe ingen forhindringer ses eller mærkes. Hvis takeControl() metoden i DetectWall returnerer true kaldes suppress() metoden i DriveForward og _suppressed bliver sat til true hvilket medfører at begge motorer stopper. DriveForward overtager kontrollen igen så snart DetectWall's takeControl() metode igen returnerer false. Følgende videoer viser undertrykkelsen i aktion:




Med tryksensoren trykket ind konstant vil bilen udføre sin rotate manøvre igen og igen indtil modstanden fjernes. DriveForward er altså konstant undertrykt.

Vi implementerede nu klassen Exit som skal undertrykke de andre behaviours hvis ESCAPE knappen trykkes ned. Koden ser således ud:

import lejos.nxt.Button;
import lejos.robotics.subsumption.Behavior;

class Exit implements Behavior {

public Exit() {}

public boolean takeControl() {
return Button.ESCAPE.isPressed();
}

public void suppress() {
//Since this is highest priority behavior, suppress will never be called.
}

public void action() {
System.exit(0);
}
}


Det lader til at bilen stopper med det samme uanset om bilen er i DriveForward eller DetectWall opførsel. Men hvis vi ændrer Sound.pause(20) til Sound.pause(2000) får vi følgende opførsel når ESCAPE knappen trykkes ned:

Det vi ser er, at Sound.pause(2000) blokerer for sensormålingerne inde i takeControl() metoden i 2ooo ms. så der ikke omgående bliver registeret tryk på ESCAPE eller at robotten er ved at køre ind i noget.

Vi arbejdede med implementering af tråde inde i DetectWall klassen for at forhindre forsinkelse/blokering. Med følgende løsning er takeControl() metoden ikke længere langsom og robotten reagerer igen korrekt. Koden ses her:

import lejos.nxt.SensorPort;
import lejos.nxt.Sound;
import lejos.nxt.UltrasonicSensor;

public class SonarThread extends Thread {
private UltrasonicSensor sonar;
public int distance = 0;

public SonarThread() {
sonar = new UltrasonicSensor(SensorPort.S3);
}

public void run() {
while(true) {
sonar.ping();
Sound.pause(2000);
distance = sonar.getDistance();
}
}
}

----------------------------------------------------------------------------------

import lejos.nxt.Motor;
import lejos.nxt.SensorPort;
import lejos.nxt.Sound;
import lejos.nxt.TouchSensor;
import lejos.nxt.UltrasonicSensor;
import lejos.robotics.subsumption.Behavior;

public class DetectWall implements Behavior{

public DetectWall() throws InterruptedException
{
touch = new TouchSensor(SensorPort.S1);

t = new SonarThread();
t.start();
}

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

public void suppress()
{
Motor.A.stop();
Motor.C.stop();
}

public void action()
{
Motor.A.rotate(-90, true);// start Motor.A rotating backward
Motor.C.rotate(-360);// rotate C farther to make the turn
}
private TouchSensor touch;

private SonarThread t;
}


Tidsforbrug: 3 timer

Ingen kommentarer:

Send en kommentar