Quellcode der Endaufgabe

Der Quellcode ist für beide Roboter fast identisch und unterscheidet sich nur in Bezug auf Kleinigkeiten und dem Erkennen und Verarbeitung der grünen Streifen und Flächen.

Roboter für unteren Parkour

import josx.robotics.*;
import josx.platform.rcx.*;

//Dies ist der Robot, der die Fotodosen auf der untere Seite des Parkours holt.

public class Robo_Down {
	private static int white, black, greenmax , greenmin;
	private static boolean Richtung=true, bringe=false;
	private static int actGreen=0,box=0;
	private static byte[] buffer = new byte[2];
	
	public static void main(String[] args) throws InterruptedException {
		
		Serial.setRangeLong();
		Sensor.S1.setTypeAndMode(3,0x80); // linker Sensor
		Sensor.S1.activate();
		
		//Motorpower festlegen
		Motor.A.setPower(7);
		Motor.B.setPower(7);
		
		//Kalibrierung der Farbwerte
		white=Sensor.S1.readValue();
		Sound.beep();
		while(!Button.VIEW.isPressed()){LCD.showNumber(Sensor.S1.readValue());}
		black=Sensor.S1.readValue();
		Sound.beep();
		try{Thread.sleep(1000);}catch(Exception E){}
		while(!Button.VIEW.isPressed()){LCD.showNumber(Sensor.S1.readValue());}
		greenmin=Sensor.S1.readValue();
		greenmax=greenmin;
		
		//Toleranzbereich berechnen
		int dummy=(int)((float)0.33*(float)(greenmin-black));
		greenmin--;
		black+=dummy;
		dummy=(int)((float)0.33*(float)(white-greenmax));
		greenmax++;
		white-=dummy;
		Sound.beep();
		try{Thread.sleep(1000);}catch(Exception E){}
		while(!Button.VIEW.isPressed()){LCD.showNumber(Sensor.S1.readValue());}
		Sound.beep();
		try{Thread.sleep(1000);}catch(Exception E){}
		while(!Button.RUN.isPressed()){
			routine();
		}
	}

	public static void routine(){
		int S=Sensor.S1.readValue();
		if (isBlack(S)){forward();}
		if (isWhite(S)){whiteDetected();}
		if (isGreen(S)){greenDetected();}
	}
	
	public static void whiteDetected(){
		//white wird nur in Kurven erkannt...
		int i=0;
		driveDirection(Richtung);
		while(i<1000){
			if(isBlack(Sensor.S1.readValue()))return;
			i++;
		}
		Richtung=!Richtung;
		driveDirection(Richtung);
		while(isWhite(Sensor.S1.readValue())){
		}
	}
	public static void greenDetected(){
		int i=0;
		forward();
		
		//Zähler um nicht sofort grün zu erkennen
		while(i<250){i++;if(!isGreen(Sensor.S1.readValue()))return;}
		
		//Wenn grün gefunden, prüfen ob wirklich grün!
		driveDirection(true);
		int i=0;
		while(i<100){i++;if(isBlack(Sensor.S1.readValue()))return;}
		driveDirection(false);
		int i=0;
		while(i<300){i++;if(isBlack(Sensor.S1.readValue()))return;}
		driveDirection(true);
		int i=0;
		while(i<100){i++;if(isBlack(Sensor.S1.readValue()));}
		forward();
		if(bringe)setBoxx();
		else getBoxx();
	}
	public static void setBoxx(){
		if(actGreen>0){
			while(isGreen(Sensor.S1.readValue())){}
			actGreen--;
			//LCD.showNumber(actGreen);
			Sound.beep();
			return;
		}
		forward(1200);
		Motor.A.backward();
		Motor.B.backward();
		while(isGreen(Sensor.S1.readValue())){}
		backward(1200);
		Motor.A.stop();
		Motor.B.stop();
		
		//solange keine Dose verfügbar ist
		while(true){
			if (Request()){
				josx.platform.rcx.Serial.readPacket(buffer);
				if (buffer[1]==(byte)5){
					Sound.beep();
					break;
				}
			}
			//Sende request
			sendRequest();
			try{Thread.sleep(1000);	}catch(Exception E){}
		}
		
		//sobald der andere Robo seine Arbeit beginnt, drehe und weiter
		turn();
		actGreen=0;
		bringe=false;
		box++;
		//LCD.showNumber(box);
	}
	public static void getBoxx(){
		//grünen Streifen überfahren		
		while(isGreen(Sensor.S1.readValue())){}
		actGreen++;
		if (actGreen<=box)return;
		
		//bei weiß - Versuche zuerst zur Linie zurückzufinden und starte dann Hole-Prozess
		if(isWhite(Sensor.S1.readValue())){whiteDetected();}
		
		//Jetzt ist der Robo auf der Linie
		//Fahre nun kurz geradeaus
		forward();
		int i=0;
		while(i<600){Sensor.S1.readValue();i++;}
		turn();
		actGreen--;
		//LCD.showNumber(actGreen);
		bringe=true;
		Sound.beep();
	}
	public static void forward(){f
		Motor.A.forward();
		Motor.B.forward();
	}
	}
	public static void backward(int maxTime){
		int i=0;
		Motor.A.backward();
		Motor.B.backward();
		while(i0&&i<=black);
	}

	public static boolean isGreen(int i){
		return (i>=greenmin&&i<=greenmax);
	}
	public static boolean isWhite(int i){
		return (i>=white);
	}
}

Roboter für die Rampe und den oberen Parkour

import josx.robotics.*;
import josx.platform.rcx.*;

//Dies ist der Robot, der die Rampe hochfährt und die Fotodosen oben abliefert.

public class Robo_Up {
	private static int white, black, greenmax , greenmin;
	private static boolean Richtung=true, bringe=false;
	private static int actGreen=0,box=0;
	private static byte[] buffer = new byte[2];
	public static void main(String[] args) throws InterruptedException {
		
		Serial.setRangeLong();
		Sensor.S1.setTypeAndMode(3,0x80); // linker Sensor
		Sensor.S1.activate();
		
		//Motorpower festlegen
		Motor.A.setPower(7);
		Motor.B.setPower(7);
		
		//Kalibrierung
		white=Sensor.S1.readValue();
		Sound.beep();
		while(!Button.VIEW.isPressed()){LCD.showNumber(Sensor.S1.readValue());}
		black=Sensor.S1.readValue();
		Sound.beep();
		try{Thread.sleep(1000);}catch(Exception E){}
		while(!Button.VIEW.isPressed()){LCD.showNumber(Sensor.S1.readValue());}
		greenmin=Sensor.S1.readValue();
		greenmax=greenmin;
		
		//Toleranzbereich berechnen
		int dummy=(int)((float)0.33*(float)(greenmin-black));
		greenmin--;
		black+=dummy;
		dummy=(int)((float)0.33*(float)(white-greenmax));
		greenmax++;
		white-=dummy;
		Sound.beep();
		try{Thread.sleep(1000);}catch(Exception E){}
		while(!Button.VIEW.isPressed()){LCD.showNumber(Sensor.S1.readValue());}
		Sound.beep();
		try{Thread.sleep(1000);}catch(Exception E){}
		while(!Button.RUN.isPressed()){
			routine();
		}
	}

	public static void routine(){
		int S=Sensor.S1.readValue();
		if (isBlack(S)){forward();}
		if (isWhite(S)){whiteDetected();}
		if (isGreen(S)){greenDetected();}
	}
	
	public static void whiteDetected(){
		if (!bringe) {
			whiteDetected_down(); 
			return;
		}
		int i=0;
		int z=0;
		if (bringe)z=600;else z=600;
		
		driveDirection(Richtung);
		while(i0&&i<=black);
	}

	public static boolean isGreen(int i){
		return (i>=greenmin&&i<=greenmax);
	}
	public static boolean isWhite(int i){
		return (i>=white);
	}
}