Programmierung der Lego Mindstorms NXT- Roboter mit

Werbung
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
Herunterladen