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.
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);
}
}
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);
}
}