Programmierung der Lego Mindstorms NXT- Roboter mit leJOS! I NSTITUT FÜR A NTHROPOMATIK L EHRSTUHL P ROF. D R .-I NG . R. D ILLMANN Julian Schill [email protected] Boris Stach [email protected] KIT – Universität des Landes Baden-Württemberg und nationales Forschungszentrum in der Helmholtz-Gemeinschaft www.kit.edu Übersicht 1 Infrastruktur NXT-Hardware leJOS 2 Entwicklungsumgebung Vorbereitungen und IDE 3 Java an sich Java Kurzeinführung 4 leJOS API Ein Java Programm Infrastruktur Boris Stach Entwicklungsumgebung Java an sich leJOS API 2/37 Weitere Infos Software, Dokumentationen, Büchertipps, Links, ... auf der Praktikumshomepage: http://wwwiaim.ira.uka.de/legowiki Infrastruktur Boris Stach Entwicklungsumgebung Java an sich leJOS API 3/37 NXT-Baustein und Peripherie Infrastruktur Boris Stach Entwicklungsumgebung Java an sich leJOS API 4/37 Leistung 32-Bit ARM7 Mikroprozessor 256Kb FLASH, 64 Kb RAM 100x64 Pixel Dot Matrix LCD 4 Ein- und 3 Ausgänge (I2 C) Kommunikation PC mit Lego Mindstorms NXT Anschluß über USB-Schnittstelle oder Bluetooth(BT) (drahtlos): Übertragung der leJOS Firmware Übertragung eigener Java-Programme BT: Datenaustausch mit PC oder anderen Robotern Stromversorgung Li-Ion-Akku, mit Ladegerät Alternativ: Standard-Akkus (AAA) Infrastruktur Boris Stach Entwicklungsumgebung Java an sich leJOS API 5/37 Menü Programme auswählen, ausführen, löschen Konfigurieren:Töne, Bluetooth Ein/Aus ... Infrastruktur Boris Stach Entwicklungsumgebung Java an sich leJOS API 6/37 Java und leJOS leJOS Merkmale seit 2006 für Lego NXT Java Compiler ist standard-konform Normales Java-Tutorial genügt zum Erlernen Enthält Erweiterungen zum Ansteuern des Roboters Gute Dokumentation Infrastruktur Boris Stach Entwicklungsumgebung Java an sich leJOS API 7/37 Installation der Entwicklungsumgebung Java Standard Edition JSE von Oracle downloaden & installieren. Lego USB Treiber downloaden & installieren leJOS downloaden & installieren libUSB downloaden & installieren leJOS mit neuer Firmware flashen, wenn Version zu alt! Eclipse IDE downloaden & installieren Weitere Details in Wiki Infrastruktur Boris Stach Entwicklungsumgebung Java an sich leJOS API 8/37 Programmierumgebung I – Eclipse für Java Infrastruktur Boris Stach Entwicklungsumgebung Java an sich leJOS API 9/37 Eclipse: Open Source Entwicklungsumgebung (IDE) für verschiedene Programmiersprachen Programmerstellung, Ablauf: Java Quelltext schreiben (Text!) Compilieren erzeugt Bytecode für Zielhardware (hier: leJOS) ggf. Syntaxfehler korrigieren , dann Schritt wiederholen Downloaden auf Zielhardware leJOS/NXT Programm starten und testen Infrastruktur Boris Stach Entwicklungsumgebung Java an sich leJOS API 10/37 Java an sich Klassen und Objekte Attribute und Methoden Kontrollstrukturen Beispiele Infrastruktur Boris Stach Entwicklungsumgebung Java an sich leJOS API 11/37 Aufbau einer Java-Klasse Wichtig! Java-Dateien: <klassenname>.java Dateiname = Klassenname ! Grundsätzliches zur Syntax Kommentar: Block: /* · · · */ Zeile: // · · · Anweisungsblock zwischen { · · · } Hinter jede Anweisung gehört ein Semikolon ; Leerzeichen beliebig erlaubt Infrastruktur Boris Stach Entwicklungsumgebung Java an sich leJOS API 12/37 public class Box { // Attribute ( Objekte oder Variablen einer Klasse ) private float len ; private float width ; // Methoden ( Funktionen einer Klasse ) public void set_size ( float l , float w) { len = l; width = w; } public float calculateArea (){ { float A = len * width ; return A ; } } public class Example { public static void main ( String [] args ) { Box myBox = new Box (); mxBox . set_size (3 ,4); } } System . out . println ( " Area : " + box . calculateArea () ); Infrastruktur Boris Stach Entwicklungsumgebung Java an sich leJOS API 13/37 Variablen und Basis-Datentypen Variablen sind „Speicherschubladen“ Berechnen, Auswerten und Manipulieren von Ausdrücken Jeweils verschiedene Operationen möglich: +,-,/,*,. . . Verschiedene Datentypen Infrastruktur Boris Stach Entwicklungsumgebung Java an sich leJOS API 14/37 Methoden Methoden sind Sammlungen von Anweisungen Modularisierung des Programmes Ein oder mehr Übergabe-Parameter public void set_size ( float l , float w) Genau ein Rückgabe-Wert - Rückgabe mit return-Befehl public float calculateArea (){ { float A = len * width ; return A; } Methoden sind immer Teil einer Klasse! Infrastruktur Boris Stach Entwicklungsumgebung Java an sich leJOS API 15/37 Objektorientierte Programmierung Java ist eine objektorientierte Programmiersprache. Klassen - Beschreibung von gleichartigen realen oder abstrakten Objekte - Schablone für solche Objekte Objekte - Instanz einer Klasse. - Nur aus einer Klassenbeschreibung erzeugt (instanziiert) Box myBox = new Box (); Box myBox2 = new Box (); Infrastruktur Boris Stach Entwicklungsumgebung Java an sich leJOS API 16/37 Verwendung von Klassen – Instantiierung von Objekten Objekt der Box-Klasse wird mit new instanziiert. Zugriff auf public-Attribute und Methoden durch: <Objektname>.<Member-Name> public class Example { public static void main ( String [] args ) { Box myBox = new Box (); mxBox . set_size (3 ,4); } Infrastruktur Boris Stach } System . out . println ( " Area : " + box . calculateArea () ); Entwicklungsumgebung Java an sich leJOS API 17/37 Sichtbarkeit Sichtbarkeits-Spezifizierer für Klassen, Attribute und Methoden: public: für alle sichtbar (aufrufbar, zugreifbar) private: nur innerhalb der gleichen Klasse sichtbar protected: nur innerhalb der gleichen oder in einer Kinder-Klasse sichtbar Vorgabe/Standard: protected Sicheres Programmieren Vermeidung von Spaghetti-Code Infrastruktur Boris Stach Entwicklungsumgebung Java an sich leJOS API 18/37 Statische Attribute und Methoden Spezifizierer static vor Attribut oder Methode Alle Instanzen einer Klasse teilen sich das Attribut bzw. die Methode. Statische Methoden können ohne Instantiierung der Klasse aufgerufen werden Ein statisches Attribut wird von allen Instanzen einer Klasse gemeinsam benutzt Besonderheit: Ausführbare Java-Klasse muss statische main-Methode besitzen, bsp.: public static void main ( String [] args ) { System . out . println ( "I am the main method \n" ); } Infrastruktur Boris Stach Entwicklungsumgebung Java an sich leJOS API 19/37 Vererbung von Klassen Beschreibung von Klassenhierarchien Modularisierung/ Wiederverwendbarkeit ! public class Box { // Attribute protected float len ; protected float width ; Bsp.: Die Klasse Quadrat erbt alle Eigenschaften von Box Schlüsselwort: extends Die Methode set_size ( . . . ) wird in quadrat überladen Zugriff auf len und width deshalb protected statt } // Methoden public void set_size ( float l , float w) { len = l; width = w; } . . public class Quadrat extends Box { public void set_size ( float l) { len = l; width = l; } } private Infrastruktur Boris Stach Entwicklungsumgebung Java an sich leJOS API 20/37 Kontrollstrukturen – Verzweigung / Bedingte Ausführung if (condition) ... else ... Beispiel: public float limiter ( float a , float lower , float upper ) { if (a > upper ){ a = upper ; } else { if (a < lower ){ a = lower ; } } } Infrastruktur Boris Stach return a; Entwicklungsumgebung Java an sich leJOS API 21/37 Kontrollstrukturen – Schleifen For-Schleife (zum Zählen mit Variablen) for (startausdruck, Endausdruck, Schrittweite) { ... } Beispiel: public static void main ( String [] args ) { for ( int i = 0; i < 10; i ++){ System . out . println ( " count \ n" + i ); } } Infrastruktur Boris Stach Entwicklungsumgebung Java an sich leJOS API 22/37 Kontrollstrukturen – Schleifen While-Schleife (Vergleich) while (Bedingung) { ... } public static void main ( String [] args ) { int i = 0; } while ( i < 10) { System . out . println ( " count \n " + i ); i = i + 1; } Bedingung wird zuerst geprüft ! Do-While-Schleife do { ... } while (Bedingung) Anweisungsblock wird mind. einmal ausgeführt ! Infrastruktur Boris Stach Entwicklungsumgebung public static void main ( String [] args ) { int i = 0; } do { System . out . println ( " count \n " + i ); i = i + 1; } while (i < 10) Java an sich leJOS API 23/37 Zusammenfassung Klassen und Objekte Variablen und Attribute Methoden Sichtbarkeit Instanziierung Statische Attribute/Methoden Vererbung Bedingte Ausführung Schleifen Infrastruktur Boris Stach Entwicklungsumgebung Java an sich leJOS API 24/37 Weitere Infos zu Java, Auswahl Einfaches Java-Tutorial, englisch: http://www.freejavaguide.com/corejava.htm Java ist auch eine Insel: Umfangreiche Anleitung für Anfänger, deutsch, Online-Version: https://www-rz.uni-hohenheim.de/anw/programme/prg/ java/tutorials/javainsel4/index.htm Links auf unserer Praktikumshomepage: http://wwwiaim.ira.uka.de/legowiki Infrastruktur Boris Stach Entwicklungsumgebung Java an sich leJOS API 25/37 leJOS API - Was ist eine API? Bisher: Java allgemein. Jetzt: Spezielle leJOS Java-Erweiterungen für Lego-Roboter Application Programming Interface (API) Einbinden mit import lejos.nxt.*; Klassenbibliothek Sammlung von Klassen zur Programmierung, u.a.: - Ausgabe von Text auf LCD - Motorsteuerung - Sensordaten lesen - Kommunikation über Bluetooth Infrastruktur Boris Stach Entwicklungsumgebung Java an sich leJOS API 26/37 Textausgabe auf LCD Einfache, zeilenweise Textausgabe (Standard-Java): System.out.println(String text); Text positioniert ausgeben LCD.drawString(String text, int x, int y); Zeichenkette (String) zusammensetzen mit + Bsp.: public static void main ( String [] args ) { float a = 0.8; for ( int i = 0; i < 10; i ++) { System . out . println ( " count \ n" + i + ': ' + (a* i) + " done ." ); } } Infrastruktur Boris Stach Entwicklungsumgebung Java an sich leJOS API 27/37 Tastenfeld Implementiert in Klasse Button Zugriff auf alle Tasten: - Button.LEFT - Button.RIGHT - Button.ENTER - Button.ESCAPE Wesentlich Methode boolean isPressed() Beispiel if ( Button . ENTER . isPressed ()){ System . out . println ( " enter ! " ); } Infrastruktur Boris Stach Entwicklungsumgebung Java an sich leJOS API 28/37 Motorsteuerung Implementiert in Klasse Motor Drei Motoren an NXT-Ausgängen A,B,C: Motor.A, Motor.B, Motor.C Infrastruktur Boris Stach Methoden Beschreibung forward() backward() stop() setSpeed(int s) int getTachoCount() rotateTo(int a) schaltet Motor ein, vorwärts schaltet Motor ein, rückwärts schaltet Motor aus setzt Geschw., Grad/Sekunde Position (Winkel) abfragen auf Winkel rotieren Entwicklungsumgebung Java an sich leJOS API 29/37 Berührungssensor Implementiert in Klasse TouchSensor Instantiierung mit: TouchSensor(sensorport) Wesentlich Methode boolean isPressed() Beispiel TouchSensor touch = new TouchSensor ( SensorPort . S2 ); if ( touch . isPressed ()) System . out . println ( " Sensor pressed !" ); Infrastruktur Boris Stach Entwicklungsumgebung Java an sich leJOS API 30/37 Lichtsensor Implementiert in Klasse LightSensor Instanziierung mit: LightSensor(sensorport) Infrastruktur Boris Stach Methoden Beschreibung int readNormalizedValue() int readValue() setFloodLight(boolean fl) lese Helligkeitswert (0..1023) lese Helligkeitswert (0..100) schalte Licht ein/aus Entwicklungsumgebung Java an sich leJOS API 31/37 Lichtsensor - Werte Infrastruktur Boris Stach Entwicklungsumgebung Java an sich leJOS API 32/37 Ultraschall Distanzsensor Implementiert in Klasse UltrasonicSensor Instantiierung mit: UltrasonicSensor(sensorport) Wesentliche Methode int getDistance() lese Entfernung zu Hindernis, 255 für undendlich. Infrastruktur Boris Stach Entwicklungsumgebung Java an sich leJOS API 33/37 Checkup Was macht diese Klasse ? import lejos . nxt .*; public class Example { public static void main ( String [] args ) { TouchSensor touch = new TouchSensor ( SensorPort . S1 ); Motor m = Motor . A; } } while (! Button . ESCAPE . isPressed ()){ m. forward (); while (! touch . isPressed ()){} m. backward (); while (! touch . isPressed ()){} } m. stop (); Infrastruktur Boris Stach Entwicklungsumgebung Java an sich leJOS API 34/37 Linienfolger Infrastruktur Boris Stach Entwicklungsumgebung Java an sich leJOS API 35/37 Weitere Klassen Kommunikation über Bluetooth Musik Timer und Threads Buttons Random usw, usw., usw. Infrastruktur Boris Stach Entwicklungsumgebung Java an sich leJOS API 36/37 Viel Erfolg! Infrastruktur Boris Stach Entwicklungsumgebung Java an sich leJOS API 37/37