Added victory behavior. Refactored some names.

This commit is contained in:
Miguel Angel Astor Romero
2016-05-23 12:39:23 -04:30
parent 283baef6b7
commit f65f24b6c5
6 changed files with 60 additions and 14 deletions

View File

@@ -18,11 +18,12 @@ import ve.ucv.ciens.cicore.icaro.ryabi.behaviors.WanderBehavior;
import ve.ucv.ciens.cicore.icaro.ryabi.sensors.FeatureDetectionListener;
import ve.ucv.ciens.cicore.icaro.ryabi.sensors.LightFeatureDetector;
import ve.ucv.ciens.cicore.icaro.ryabi.behaviors.SensorCalibrationBehavior;
import ve.ucv.ciens.cicore.icaro.ryabi.behaviors.VictoryBehavior;
import ve.ucv.ciens.cicore.icaro.ryabi.utils.QuitButtonListener;
@SuppressWarnings("deprecation")
public class RyABI {
private static final float WHEEL_RADIUS = 56.0f;
private static final float WHEEL_DIAMETER = 56.0f;
private static final float TRACK_WIDTH = 155.0f;
private static ArcRotateMoveController pilot;
@@ -45,7 +46,7 @@ public class RyABI {
light = new LightSensor(SensorPort.S4);
/* Create the pilot. */
pilot = new CompassPilot(compass, WHEEL_RADIUS, TRACK_WIDTH, Motor.A, Motor.C);
pilot = new CompassPilot(compass, WHEEL_DIAMETER, TRACK_WIDTH, Motor.A, Motor.C);
/* Create the feature detectors and their listener. */
rangeDetector = new RangeFeatureDetector(sonar, 20, 200);
@@ -65,10 +66,11 @@ public class RyABI {
Button.ESCAPE.addButtonListener(new QuitButtonListener());
/* Create the behaviors. */
behaviors = new Behavior[3];
behaviors[0] = new WanderBehavior(pilot, sonar, touch, light, compass, WHEEL_RADIUS, TRACK_WIDTH);
behaviors[1] = new SensorCalibrationBehavior(sonar, touch, light, compass, WHEEL_RADIUS, TRACK_WIDTH);
behaviors[2] = new AvoidObstaclesBehavior(pilot, sonar, touch, light, compass, WHEEL_RADIUS, TRACK_WIDTH);
behaviors = new Behavior[4];
behaviors[0] = new WanderBehavior(pilot, sonar, touch, light, compass, WHEEL_DIAMETER, TRACK_WIDTH);
behaviors[1] = new SensorCalibrationBehavior(sonar, touch, light, compass, WHEEL_DIAMETER, TRACK_WIDTH);
behaviors[2] = new AvoidObstaclesBehavior(pilot, sonar, touch, light, compass, WHEEL_DIAMETER, TRACK_WIDTH);
behaviors[3] = new VictoryBehavior(pilot, sonar, touch, light, compass, WHEEL_DIAMETER, TRACK_WIDTH);
/* Start the program. */
arbitrator = new Arbitrator(behaviors, true);

View File

@@ -13,16 +13,16 @@ public abstract class BaseBehavior implements Behavior {
protected TouchSensor touch;
protected CompassHTSensor compass;
protected LightSensor light;
protected float wheelRadius;
protected float wheelDiameter;
protected float trackWidth;
public BaseBehavior(ArcRotateMoveController pilot, UltrasonicSensor sonar, TouchSensor touch, LightSensor light, CompassHTSensor compass, float wheelRadius, float trackWidth) {
public BaseBehavior(ArcRotateMoveController pilot, UltrasonicSensor sonar, TouchSensor touch, LightSensor light, CompassHTSensor compass, float wheelDiameter, float trackWidth) {
this.pilot = pilot;
this.sonar = sonar;
this.touch = touch;
this.compass = compass;
this.light = light;
this.wheelRadius = wheelRadius;
this.wheelDiameter = wheelDiameter;
this.trackWidth = trackWidth;
}

View File

@@ -24,7 +24,7 @@ public class SensorCalibrationBehavior extends BaseBehavior {
@Override
public void action() {
System.out.println("Calib. compass");
DifferentialPilot p = new DifferentialPilot(wheelRadius, trackWidth, Motor.A, Motor.C);
DifferentialPilot p = new DifferentialPilot(wheelDiameter, trackWidth, Motor.A, Motor.C);
p.setRotateSpeed(25);
compass.startCalibration();
p.rotate(720, false);

View File

@@ -0,0 +1,44 @@
package ve.ucv.ciens.cicore.icaro.ryabi.behaviors;
import java.io.File;
import lejos.nxt.LightSensor;
import lejos.nxt.Sound;
import lejos.nxt.TouchSensor;
import lejos.nxt.UltrasonicSensor;
import lejos.nxt.addon.CompassHTSensor;
import lejos.robotics.navigation.ArcRotateMoveController;
import ve.ucv.ciens.cicore.icaro.ryabi.utils.RobotStateSingleton;
public class VictoryBehavior extends BaseBehavior {
private RobotStateSingleton state;
private File musicSample;
public VictoryBehavior(ArcRotateMoveController pilot, UltrasonicSensor sonar, TouchSensor touch, LightSensor light,
CompassHTSensor compass, float wheelDiameter, float trackWidth) {
super(pilot, sonar, touch, light, compass, wheelDiameter, trackWidth);
state = RobotStateSingleton.getInstance();
musicSample = new File("victory.wav");
if(!musicSample.exists())
musicSample = null;
}
@Override
public boolean takeControl() {
return state.getState() == RobotStateSingleton.States.VICTORY;
}
@Override
public void action() {
if(musicSample != null) {
int milis = Sound.playSample(musicSample);
try { Thread.sleep(milis); } catch(InterruptedException ie) { }
}
state.setState(RobotStateSingleton.States.DONE);
}
@Override
public void suppress() { }
}

View File

@@ -13,8 +13,8 @@ import ve.ucv.ciens.cicore.icaro.ryabi.utils.RobotStateSingleton;
public class WanderBehavior extends BaseBehavior {
private RobotStateSingleton state;
public WanderBehavior(ArcRotateMoveController pilot, UltrasonicSensor sonar, TouchSensor touch, LightSensor light, CompassHTSensor compass, float wheelRadius, float trackWidth) {
super(pilot, sonar, touch, light, compass, wheelRadius, trackWidth);
public WanderBehavior(ArcRotateMoveController pilot, UltrasonicSensor sonar, TouchSensor touch, LightSensor light, CompassHTSensor compass, float wheelDiameter, float trackWidth) {
super(pilot, sonar, touch, light, compass, wheelDiameter, trackWidth);
state = RobotStateSingleton.getInstance();

View File

@@ -15,7 +15,7 @@ public final class RobotStateSingleton {
return SingletonHolder.INSTANCE;
}
public void setState(States state) {
public synchronized void setState(States state) {
this.state = state;
}
@@ -24,6 +24,6 @@ public final class RobotStateSingleton {
}
public enum States {
WANDER, SEARCH_BALL, BALL_FOUND, VICTORY;
WANDER, SEARCH_BALL, BALL_FOUND, VICTORY, DONE;
}
}