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