import diewald_PS3.PS3; import diewald_PS3.constants.*; import diewald_PS3.logger.PS3Logger; import oscP5.*; import netP5.*; import java.awt.Color; OscP5 oscP5; Fernsteuerung fernsteuerer; Bildanalysator farbPunktFinder; Umgebungswertschaetzer wertschaetzer; Routenplaner routenplaner; Navigator navigator; NetAddress myRemoteLocation; PS3 ps3; PImage img; //deklarierung einiger Variablen int toleranz=15; //Größe des auf dem Monitor erscheinenden Bildes int size_x = 640; int size_y = 480; //Damit wird das Farbsystem nach dem die Punkte gesucht werden festgelegt. (1 für HSV sonst rgb) int auswahl=2; //Gibt an der wie vielte Punkt der Route angefahren wird int zaehler = 0; //Das Aufzeichnen der Route fängt erst an wenn diese Variable auf false gesetzt wird boolean stop = true; // die fernsteuerung kann gestarted werden, indem diese Variable auf true gesetzt wird boolean fernsteuerung = false; boolean kalibrierung = false; int stift = 1; // "class" definiert einen neuen typen (sowas wie int oder float) public void setup() { //die Geschwindigkeit mit der die Bilder neu geladen werden wird festgelegt frameRate(20); //die Objekte werden definiert farbPunktFinder = new Bildanalysator(); fernsteuerer= new Fernsteuerung(); routenplaner = new Routenplaner(); navigator = new Navigator(); wertschaetzer = new Umgebungswertschaetzer(); oscP5 = new OscP5(this, 12000); // die IP-adresse des Arduinos muss ausgewählt werden myRemoteLocation = new NetAddress("192.168.0.102", 8000); PS3Logger.TYPE.DEBUG .active(true); PS3Logger.TYPE.ERROR .active(true); PS3Logger.TYPE.INFO .active(true); PS3Logger.TYPE.WARNING.active(true); size(size_x, size_y); println("PS3.getCameraCount() = " + PS3.getCameraCount()); ps3 = PS3.create( 0 ); ps3.init(VIDEO_MODE.VGA, COLOR_MODE.COLOR_PROCESSED, 60); ps3.start(); ps3.setLed(true); img = createImage(ps3.getWidth(), ps3.getHeight(), ARGB); // die Kameraeinstellungen werden festgelegt ps3.setParameter(PS3_PARAM.EXPOSURE, 20); delay(10); ps3.setParameter(PS3_PARAM.GAIN, 5); delay(10); ps3.setParameter(PS3_PARAM.WHITEBALANCE_BLUE, 80); delay(10); ps3.setParameter(PS3_PARAM.WHITEBALANCE_RED, 150); delay(10); ps3.setParameter(PS3_PARAM.WHITEBALANCE_GREEN, 150); delay(10); // die automatische Korrektur wird ausgeschaltet ps3.setParameter(PS3_PARAM.AUTO_WHITEBALANCE, 0); delay(10); ps3.setParameter(PS3_PARAM.AUTO_EXPOSURE, 0); delay(10); ps3.setParameter(PS3_PARAM.AUTO_GAIN, 0); delay(10); } public void draw() { //holt das aktuelle Bild von der Kamera und speichert es in img ab assignPixels(ps3, img); //malt das Bild image(img, 0, 0); img.loadPixels(); wertschaetzer.schaetzeUmgebungswert(img); if (kalibrierung == false) { farbPunktFinder.kalibriereFarben(img); } else if (fernsteuerung == true) { fernsteuerer.steuere(); } else { //Wenn eine Taste gedrückt wird, wird geprüft ob es if (keyPressed==true) { if (key =='k') { //wenn die Taste k gedrückt wurde, kommt man wieder in die Kalibrierungsschleife kalibrierung=false; } if (key =='n') { //wenn die Taste n gedrückt wurde, werden die bisher gespeicherten Punkte gelöscht routenplaner.loescheRoute (true); //Das Abfahren der Route beginnt wieder am ersten Punkt zaehler = 0; stift=1; } if (key =='b') { routenplaner.loescheRoute (false); } if (key == 'u') { farbPunktFinder.erhoeheToleranz(); } if (key == 'd') { farbPunktFinder.senkeToleranz(); } if (key == 's') { stop = true; println("Bild gestoppt"); } if (key == 'w') { stop = false; println("Das Bild kann jetzt erweitert werden"); } if (key == 'l') { routenplaner.loeschePunkte(); } if (key == 'h') { routenplaner.fuegePunkteHinzu(); } if (key == 'm') { fernsteuerung= true; } } //die drei LEDs werden gesucht und falls sie existieren auf dem Bildschirm dargestellt farbPunktFinder.findePunkte(img); farbPunktFinder.zeichnePunkte(); //die Route wird, falls möglich erweitert und auf dem Bildschirm dargestellt routenplaner.erweitereRoute(); routenplaner.zeichneRoute(); //println(sqrt(sq(farbPunktFinder.gruenposition.x-farbPunktFinder.blauposition.x)+sq(farbPunktFinder.gruenposition.y-farbPunktFinder.blauposition.y))); if (zaehler < routenplaner.punktfolge.size()) { if (navigator.messeEntfernung(zaehler)==true) { if (zaehler < routenplaner.punktfolge.size()-1) { zaehler++; //Wenn der Abstand zwischen zwei Punkten der Route kleiner ist, als ein bestimmter Wert, soll zwischen diesen Punkten gemalt werden if (sqrt(sq(routenplaner.punktfolge.get(zaehler-1).x-routenplaner.punktfolge.get(zaehler).x)+sq(routenplaner.punktfolge.get(zaehler-1).y-routenplaner.punktfolge.get(zaehler).y))<100) { stift = 0; } else { stift = 1; } } } //Die Winkel und Abstand werden berechnet und an den Arduino geschickt navigator.sendeDaten(zaehler); } } } public void assignPixels(PS3 ps3, PImage img) { img.loadPixels(); ps3.getFrame(img.pixels); img.updatePixels(); } public void dispose() { PS3.shutDown(); }