|
@@ -0,0 +1,177 @@
|
|
|
+import java.io.DataInputStream;
|
|
|
+import java.io.DataOutputStream;
|
|
|
+import java.io.IOException;
|
|
|
+
|
|
|
+import lejos.nxt.Motor;
|
|
|
+import lejos.nxt.NXTRegulatedMotor;
|
|
|
+import lejos.nxt.SensorPort;
|
|
|
+import lejos.nxt.Sound;
|
|
|
+import lejos.nxt.UltrasonicSensor;
|
|
|
+import lejos.nxt.comm.BTConnection;
|
|
|
+import lejos.nxt.comm.Bluetooth;
|
|
|
+import lejos.robotics.navigation.DifferentialPilot;
|
|
|
+import lejos.robotics.navigation.Pose;
|
|
|
+import lejos.robotics.localization.*;
|
|
|
+
|
|
|
+class Scanner extends Thread {
|
|
|
+ DataOutputStream output;
|
|
|
+ OdometryPoseProvider provider;
|
|
|
+ boolean run;
|
|
|
+ public boolean scann;
|
|
|
+ public int increment = 5;
|
|
|
+ int position = 0;
|
|
|
+
|
|
|
+ Scanner (DataOutputStream output, OdometryPoseProvider provider) {
|
|
|
+ super();
|
|
|
+ this.output = output;
|
|
|
+ this.provider = provider;
|
|
|
+ run = true;
|
|
|
+ scann = false;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void stop () {
|
|
|
+ run = false;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void run() {
|
|
|
+ NXTRegulatedMotor scannerm = Motor.C;
|
|
|
+ UltrasonicSensor sensor = new UltrasonicSensor(SensorPort.S1) ;
|
|
|
+
|
|
|
+ while (run) {
|
|
|
+ if (scann == false) {
|
|
|
+ position = 0;
|
|
|
+ scannerm.rotateTo(0);
|
|
|
+ scannerm.waitComplete();
|
|
|
+ Thread.yield();
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ scannerm.rotateTo(position*5);
|
|
|
+ System.out.println(position);
|
|
|
+
|
|
|
+ float distance = sensor.getDistance();
|
|
|
+ Pose pose = provider.getPose();
|
|
|
+
|
|
|
+
|
|
|
+ try {
|
|
|
+ output.write('@');
|
|
|
+ output.write(position);
|
|
|
+ output.writeFloat(distance);
|
|
|
+ output.flush();
|
|
|
+ } catch (IOException e) {
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ position += increment;
|
|
|
+ if (position == 90 || position == -90)
|
|
|
+ increment *= -1;
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ scannerm.rotateTo(0);
|
|
|
+ scannerm.waitComplete();
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+public class Sonar {
|
|
|
+
|
|
|
+ private static final byte FORWARD = 0;
|
|
|
+ private static final byte STOP = 1;
|
|
|
+ private static final byte EXIT = 2;
|
|
|
+ private static final byte LEFT = 3;
|
|
|
+ private static final byte RIGHT = 4;
|
|
|
+ private static final byte BACKWARD = 5;
|
|
|
+
|
|
|
+ public static final byte STOPSCANN = 6;
|
|
|
+ public static final byte STARTSCANN = 7;
|
|
|
+ public static final byte MOVE = 8;
|
|
|
+ public static final byte ROTATE = 9;
|
|
|
+ public static final byte SETPOSE = 10;
|
|
|
+ public static final byte SETSCANANGLE = 11;
|
|
|
+
|
|
|
+ public static void main(String[] args) throws Exception {
|
|
|
+
|
|
|
+ BTConnection btc = Bluetooth.waitForConnection();
|
|
|
+
|
|
|
+
|
|
|
+ DataInputStream input = btc.openDataInputStream();
|
|
|
+ DataOutputStream output = btc.openDataOutputStream();
|
|
|
+
|
|
|
+ DifferentialPilot pilot = new DifferentialPilot(5.6f, 11.2f, Motor.B, Motor.A, false);
|
|
|
+ OdometryPoseProvider provider = new OdometryPoseProvider(pilot);
|
|
|
+ pilot.setRotateSpeed(5);
|
|
|
+ pilot.setTravelSpeed(20);
|
|
|
+
|
|
|
+ Scanner scan = new Scanner(output, provider);
|
|
|
+ scan.start();
|
|
|
+ int input_byte;
|
|
|
+ boolean run = true;
|
|
|
+
|
|
|
+ Sound.twoBeeps();
|
|
|
+
|
|
|
+ while (run) {
|
|
|
+ if (input.available() <= 0) {
|
|
|
+ Thread.yield();
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ input_byte = input.readByte();
|
|
|
+
|
|
|
+ System.out.println(input_byte);
|
|
|
+
|
|
|
+ switch (input_byte) {
|
|
|
+ case FORWARD:
|
|
|
+ pilot.forward();
|
|
|
+ break;
|
|
|
+ case STOP:
|
|
|
+ pilot.stop();
|
|
|
+ break;
|
|
|
+ case EXIT:
|
|
|
+ run = false;
|
|
|
+ break;
|
|
|
+ case LEFT:
|
|
|
+ pilot.rotateLeft();
|
|
|
+ break;
|
|
|
+ case RIGHT:
|
|
|
+ pilot.rotateRight();
|
|
|
+ break;
|
|
|
+ case BACKWARD:
|
|
|
+ pilot.backward();
|
|
|
+ break;
|
|
|
+ case STOPSCANN:
|
|
|
+ scan.scann = false;
|
|
|
+ break;
|
|
|
+ case STARTSCANN:
|
|
|
+ scan.position = 90;
|
|
|
+ scan.increment = -Math.abs(scan.increment);
|
|
|
+ scan.scann = true;
|
|
|
+ break;
|
|
|
+ case MOVE:
|
|
|
+ float d = input.readFloat();
|
|
|
+ pilot.travel(d);
|
|
|
+ break;
|
|
|
+ case ROTATE:
|
|
|
+ float r = input.readFloat();
|
|
|
+ pilot.rotate(r);
|
|
|
+ break;
|
|
|
+ case SETPOSE:
|
|
|
+ float x = input.readFloat();
|
|
|
+ float y = input.readFloat();
|
|
|
+ float a = input.readFloat();
|
|
|
+ System.out.println("x: "+x);
|
|
|
+ System.out.println("y: "+y);
|
|
|
+ System.out.println("a: "+a);
|
|
|
+ provider.setPose(new Pose(x,y,a));
|
|
|
+ break;
|
|
|
+ case SETSCANANGLE:
|
|
|
+ int i = input.readByte();
|
|
|
+ System.out.println("ang: "+i);
|
|
|
+ scan.increment = i;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ Sound.beep();
|
|
|
+ scan.stop();
|
|
|
+ scan.join();
|
|
|
+ }
|
|
|
+}
|