Hochschule Wismar Fakultät für Wirtschaftswissenschaften University of Technology, Business and Design Studiengang: Wirtschaftsinformatik (Bachelor) Wahlpflichtmodul Wintersemester 2011/2012: Programmiertechniken Mobile Agenten Prof. Dr. Uwe Lämmel Eingereicht am: 12.01.2012 Eingereicht von: Kristin Lasner und Carsten Frömming 1
Inhaltsverzeichnis 1. Projektbeschreibung... 4 1.1 Einführung... 4 1.2 Aufgaben... 4 2. Wesen des NXT... 5 2.1 Aufbau NXT... 5 2.2 Eingesetzte Software... 7 3. Projektaufgaben... 8 3.1 Einer schwarzen Linie folgen... 8 3.2 Fangen und Weglaufen... 10 3.2.1 Spielfeld... 10 3.2.2 Ermittlung eines Gewinners... 10 3.2.3 Eingesetzte Hard- und Software... 10 3.2.4 Ausarbeitung Fangen... 11 4. Fazit... 13 5. Quellen... 14 2
Abbildungsverzeichnis Abbildung 1: Bausatz NXT... 4 Abbildung 2: NXT Roboter Dahl... 5 Abbildung 3: NXT (Bild: http://lejos.sourceforge.net/)... 6 Abbildung 4: Parcours Einer schwarzen Linie folgen... 8 Abbildung 5 BattleCam-Software Oberfläche... 11 3
1. Projektbeschreibung 1.1 Einführung Im Rahmen des Wahlpflichtmodules Programmierkonzepte an der Hochschule Wismar galt es im Wintersemester 2011/2012 die zuvor erlernten Programmierkenntnisse der Sprache JAVA zu vertiefen. Hierfür bildeten sich unter der Leitung von Prof. Dr. Uwe Lämmel 4 Teams, welche jeweils mit einem Bausatz eines NXT Roboters ausgestattet wurden. Abbildung 1: Bausatz NXT Gemäß Bauanleitung setzten die Teams ihren Roboter zusammen und begannen in den darauffolgenden Wochen mit der eigenständigen Arbeit und der Bewältigung der Aufgaben. 1.2 Aufgaben Die Projektarbeit unterteilt sich in 2 Teilaufgaben. In der ersten Teilaufgabe, Einer schwarzen Linie folgen, gilt es sich vertraut zu machen im Umgang mit dem NXT und den zur Verfügung stehenden vordefinierten Klassen. In einer zweiten Teilaufgabe steht dann das übersichtliche Programmieren an vorderster Stelle. Unter dem Einsatz von Behavior, Arbitrator sowie Threads soll ein Programm entwickelt werden, welches einen anderen NXT auf einem festgelegten Spielfeld fängt (siehe Punkt 3.2). Die zuvor erworbenen Kenntnisse aus der Teilaufgabe Einer schwarzen Linie folgen sollen bei dieser Aufgabe vertieft werden. 4
2. Wesen des NXT Bei dem NXT handelt es sich um ein Produkt aus der Serie MINDSTORMS des Spielwarenherstellers Lego. Ein NXT kann mit Hilfe vieler verschiedener Programmiersprachen programmiert werden und ermöglicht so einen greifbaren Lernansatz für den Umgang mit Programmiersprachen. Aus diesem Grund findet der NXT häufig Anwendung in Lehreinrichtungen wie Schulen und Universitäten. Der NXT in seiner derzeitigen Form ist seit dem Jahr 2006 in Deutschland erhältlich. Zu seinen Vorgängern zählt unter anderem der RCX. Bei dem NXT handelt es sich folglich um eine Weiterentwicklung des RCX. 1 Abbildung 2: NXT Roboter Dahl 2.1 Aufbau NXT Das Innere des NXT bilden die hier aufgeführten Bestandteile: 32-Bit-ARM-Prozessor 256 KB Flash-Speicher 64 KB RAM 8-Bit-AVR-Koprozessor 4KB Flash-Speicher 512 Byte RAM 1 http://de.wikipedia.org/wiki/nxt 5
Der physische Aufbau des NXT beinhaltet nur wenige Punkte. Der NXT verfügt an der Oberseite über drei Motoreneingänge und eine USB-Schnittstelle. Diese Schnittstelle dient der Übertragung von Inhalten von einem externen Gerät auf den NXT. Des Weiteren sind an der Unterseite vier Sensoreneingänge vorhanden, an denen die verschiedenartigen Sensoren des NXT angeschlossen werden können. Auf der Vorderseite sind neben einem 4 Zeilen LCD-Display noch vier Knöpfe zur Bedienung des Gerätes zu finden. Diese unterteilen sich in zwei Pfeiltasten sowie zwei Tasten zum Bestätigen und Abbrechen von Anwendungen und Programmen des NXT. Abbildung 3: NXT (Bild: http://lejos.sourceforge.net/) Der NXT kann mit einem Akku oder aber sechs sogenannten A6-Batterien betrieben werden. Das hierfür vorgesehene Fach befindet sich auf der Rückseite des NXT. Die Kommunikation mit externen Geräten kann entweder via USB (Schnittstelle an der Oberseite) oder aber der eingebauten Bluetooth-Schnittstelle geschehen. Ein eingebauter Lautsprecher ermöglicht es zusätzlich monotone Töne abspielen zu lassen. 6
2.2 Eingesetzte Software Zum Arbeiten mit dem NXT werden verschiedene Softwareprodukte benötigt. Jeder NXT benötigt zum verarbeiten der aufgespielten Programme eine Firmware. Diese Firmware ist kostenfrei unter http://lejos.sourceforge.net/ erhältlich. Hier wird die Version 0.9 der Firmware verwendet. Die Erstellung der Quelltexte erfolgt mit dem Programm Eclipse Version 3.7.1. Die Kompilierung der Quelltexte erfordert, dass auf dem Rechner mit dem die Quelltexte erstellt werden, der Java SE Development Kit (hier in der Version 1.7) sowie die Lejos (LEGO Java Operating System) NXJ Software installiert ist. Für die zweite Teilaufgabe Fangen und Weglaufen sind für den Austausch der Koordinaten der Roboter eine BattleCam-Software sowie eine Webcam zusätzlich notwendig. Diese sind auf einem Arbeitsplatz-Rechner installiert und werden durch den Projektleiter, Prof. Dr. Uwe Lämmel, zur Verfügung gestellt. 7
3. Projektaufgaben Wie bereits unter Punkt 1.2 beschrieben, teilt sich die Projektarbeit in zwei Teilaufgaben auf. In einer ersten Aufgabe Einer schwarzen Linie folgen geht es hauptsächlich darum erste Eindrücke und Erfahrungen im Umgang mit dem NXT zu gewinnen (siehe Punkt 3.1). Im zweiten Abschnitt steht dann die Programmierung eines umfangreicheren Quellcode zur Vertiefung dieser Kenntnisse im Mittelpunkt (siehe Punkt 3.2). 3.1 Einer schwarzen Linie folgen In der ersten Teilaufgabe soll der Roboter einer schwarzen Linie folgen. Diese Linie beinhaltet diverse kritisch Stellen, wo sich herausstellen soll, ob der programmierte Quellcode flexibel genug ist diese zu bewältigen. Mit Hilfe eines Lichtsensors, welcher an der Front des NXT befestigt ist, verfolgt der NXT die schwarze Linie und absolviert somit den Parcours. Der Lichtsensor reagiert dabei auf farbliche Veränderungen des Untergrundes. Es wird dabei die Strategie verfolgt, dass der Roboter seine Fahrt stoppen soll, wenn der angebrachte Lichtsensor keine schwarze Linie finden kann. Dies geschieht bei Kurven und Krümmungen der Strecke. An dieser Stelle soll der Roboter sich zunächst eine gewisse Gradzahl nach links drehen und sich dann, wenn der Lichtsensor an dieser neuen Position ebenfalls keinen schwarzen Untergrund gefunden hat, sich doppelt so weit in die entgegengesetzte Richtung, sprich rechts, drehen. Dieser Vorgang wird so oft wie notwendig wiederholt. Findet der NXT an einer Stelle einen Farbwert, den er der Farbe schwarz zuordnen kann, setzt er sein Fahrt fort. Abbildung 4: Parcours Einer schwarzen Linie folgen 8
Hier ein kurzer Auszug aus dem Quelltext unseres Programms LinieFolgen: wert = licht.getlightvalue(); LCD.drawInt(wert, 0, 1); if(wert > schwarz) //Den aktuellen Farbwert einlesen //und auf der Variable 'wert' //speichern //Ausgabe des Wertes von 'wert' //auf dem Display //Wenn 'wert' größer als schwarz, //dann... { /*Hier beginnt die Methode wo der Roboter die verloren gegangene schwarze Linie durch drehen sucht*/ pilot.stop(); //Halte Roboter an while(!button.escape.ispressed() && licht.getlightvalue()> schwarz && //Solange der Sensor kein schwarz //erkennt und (winkel*dir*anz)<160) //der Rotatationswinkel < 160 { LCD.drawString("while", 3, 4); pilot.rotate(winkel*dir*anz); //drehe Roboter um 1. 15, 2. um //-30, 3. um 60, 4. //-120, //5. um 150 LCD.drawInt((winkel*dir*anz), 1, 2); dir = dir*(-1); //verändere die Richtung anz = anz+2; //Verdopple Rotationsradius }//while }//if Es handelt sich hier lediglich um die Methode zum finden der verloren gegangenen schwarzen Linie. 9
3.2 Fangen und Weglaufen Diese Aufgabe benötigt zwei Roboter gleichzeitig und lässt sie einen Wettkampf bestreiten. Bei der Aufgabe Fangen und Weglaufen handelt es sich um ein Spiel, bei welchem ein Roboter den Jäger und der zweite Roboter den Gejagten symbolisiert. Aus diesen Teilaufgaben soll eine ausgewählt und ein entsprechendes Programm zur Erfüllung entworfen werden. Unser Team entscheidet sich für die Programmierung des Jäger. 3.2.1 Spielfeld Der Wettkampf wird auf einer weißen Fläche bestritten. Diese weiße Fläche wird von einem konstant sieben Zentimeter breiten schwarzen Streifen umrahmt. Es befinden sich keinerlei sichtbare Muster auf dieser weißen Fläche. Die Fläche ist zudem einheitlich und verfügt über keine Anhebungen oder Hindernisse (siehe Abbildung 4). 3.2.2 Ermittlung eines Gewinners Das Ziel eines Wettkampfes ist es einen Gewinner zu ermitteln. In Vorgesprächen wurde unter den Projektgruppen und dem Projektleiter, Prof. Dr. Uwe Lämmel, festgelegt dass ein Fänger dann gewonnen hat, wenn er den Gejagten bewusst berührt oder in diesen hineinfährt. Auf der anderen Seite kann der Gejagte einen Sieg verbuchen, wenn er es schafft in einer vorher festgelegten Zeit von ein oder zwei Minuten dem Jäger aus dem Weg zu gehen und keine Berührung zwischen den beiden stattfindet. Ein Roboter disqualifiziert sich zudem automatisch, wenn er das Spielfeld verlässt oder aber seine Farbmarkierung verliert. Sein Gegner ist somit der Sieger. 3.2.3 Eingesetzte Hard- und Software Zur Bewältigung dieser Aufgabe steht zusätzlich eine Webcam zur Verfügung. Mit Hilfe dieser Webcam und eines Arbeitsplatzrechners wird die BattleCam-Software, erstellt durch Andreas Hauschild, ausgeführt. Auf diesem Wege werden die Koordinaten der beteiligten Roboter ermittelt und anschließend via Bluetooth ausgetauscht. 10
Abbildung 5 BattleCam-Software Oberfläche 3.2.4 Ausarbeitung Fangen Die Vorgabe lautete einen Quelltext zu entwickeln, welcher auf den Klassen Arbitrator und Behavior und deren Methoden und Eigenschaften zurückgreift. Mit Hilfe dieser Klassen lassen sich übersichtliche Programme erstellen. In einer Arbitrator-Klasse werden Objekte von anderen Klassen erzeugt. Es entstehen Behaviors. Der Arbitrator ist für die Verwaltung der Behaviors zuständig. public class Arbitrator { Behavior b1 = new Exit(); Behavior b2 = new Ausrichten(); Behavior b3 = new Vorwaerts(); Behavior b4 = new SchwarzeLinie(); Behavior [] array = {b2, b4, b1, b0}; Arbitrator arby = new Arbitrator(array); arby.start(); }//Arbitrator //erzeugen neuer Objekte // und die Ablage dieser // Objekte in einem Array Hier werden die einzelnen Verhaltensmuster generiert, welche der Roboter im Verlauf eines Spieles annehmen kann und anschließend in einem Array abgelegt. Am Ende wird der Arbitrator durch die Methode start() gestartet. Die Indexzahlen und die Reihenfolge bei der Ablage in einem Array sind dabei nicht unwesentlich. Je höher der index, desto höher ist auch die Priorität des Behaviors. Die Behavior-Klassen haben den folgenden Aufbau. 11
Beispiel Vorwaerts: public class Ausrichten implements Behavior { public static Roboter roboterausrichten; public Ausrichten(Roboter ausrichten){ roboterausrichten = ausrichten; }//public public boolean takecontrol() { //Lies die Koordinaten beider Roboter ein roboterausrichten.xkoordahl = roboterausrichten.rt.getx1(); roboterausrichten.ykoordahl = roboterausrichten.rt.gety1(); roboterausrichten.xkoorgegner = roboterausrichten.rt.getx2(); roboterausrichten.ykoorgegner = roboterausrichten.rt.gety2(); //Wenn die Methode ausrichtennotwendig()true() liefert oder der //Zustand des roboters = 1, dann führ action() aus return (roboterausrichten.ausrichtennotwendig() roboterausrichten.getzustand() == 1); }//takecontrol public void suppress() { //BESCHREIBUNG }//suppress public void action() { LCD.drawString("action ausrichten", 0, 2); roboterausrichten.ausrichten(); //Führe Methode ausrichten() //aus roboterausrichten.setzustand(2); //Setze den Zustand auf 2 }//action }//class Ausrichten Frei übersetzt handelt es sich bei einem Behavior um ein Verhalten. An dieser Stelle also ein Verhaltensmuster, wie sich der Roboter in einer bestimmten Situation verhält. Diese Situation wird in der takecontrol() Anweisung ermittelt. Diese Methode liefert einen Wahrheitswert zurück, der konsequenterweise nur zwei mögliche Rückgabewerte haben kann: true oder false. Ergibt die Prüfung in der oben genannten takecontrol() Anweisung true, so wird der Programmteil ausgeführt, welcher in der action() Anweisung steht. Die Strategie, welche hier zur Anwendung kommt, beschränkt sich darauf, dass der Jäger eine gewisse Zeit geradeaus fährt und nach dieser Zeit kurz hält, um sich gegebenenfalls neu auszurichten. Hier sieht die Gruppe noch starkes Optimierungspotential. 12
4. Fazit Die Aufgaben fordern von Studenten, die lediglich über Grundwissen in der Programmiersprache Java verfügen, ein intensives Selbststudium. Die erste Teilaufgabe Einer schwarzen Linie folgen bildet eine ideale Aufgabe zum Kennenlernen des NXT sowie der durch Lejos bereitgestellten Klassen. Nach erfolgreicher Installation und Einrichtung von Eclipse bzw. Lejos ist die Einarbeitungszeit gering und die Aufgabe kann zügig bearbeitet werden. Die Schwierigkeit besteht darin den geeigneten Algorithmus zum Finden der schwarzen Linie zu entwickeln. Die in der zweiten Teilaufgabe zu verwendeten Klassen Behavior, Arbitrator sowie Threads stellen allerdings höhere Ansprüche an die Programmierkenntnisse der Studenten. Die Recherche der zu verwendenden Klassen und ihre korrekte Umsetzung nehmen hier einen großen Zeitraum in Anspruch. Ebenfalls wird auf die Entwicklung eines Algorithmus zum Fangen des Gegners besonderes Augenmerk gelegt. Zurückblickend können, durch die praktische Anwendung der erstellten Programme am NXT und die selbstständige Bewältigung auftretender Probleme, die Kenntnisse hinsichtlich der Programmierung mit Java vertieft und ein praktischer Bezug hergestellt werden. 13
5. Quellen http://mindstorms.lego.com/en-us/default.aspx http://de.wikipedia.org/wiki/nxt http://www.roberta-home.de/de/was-bietet-roberta/roberta-reihe/roberta-thema-hardware-deslego-mindstorms-nxt-systems http://lejos.sourceforge.net/ http://www.wi.hs-wismar.de/~laemmel/lehre/lego/lego.html http://www.nxt-in-der-schule.de 14