Vorlagen für Roboterklassen

Im Jabotics-Installationspfad findet man die beiden für die Entwicklungsumgebung BlueJ mitgelieferten Roboter-Programmvorlagen templates/de/Roboter.tmpl und templates/de/Roboter2.tmpl (englische Vorlagen entsprechend). Während die erste Vorlage für Programmieranfänger gedacht ist, richtet sich die zweite Vorlage an Fortgeschrittene. In beiden Fällen wird ein Roboterprogramm durch eine einzelne, von org.jabotics.robot.de.XRoboter abgeleitete Klasse repräsentiert. Durch das Ableiten erhält die eigene Roboterklasse Zugriff auf eine Objektfabrik für die Roboter-Steuerungsobjekte und eine Reihe von Konstanten, mit denen sich Methodenrufe mit Enumerationsparametern abkürzen lassen. Anhand von Auszügen aus den Vorlagen sollen wesentliche Punkte erläutert werden. Die Vorlagen können natürlich ohne Probleme den eigenen Erfordernissen angepasst werden.

Programmvorlage für Anfänger

In dieser Vorlage soll die Grundstruktur der Klasse möglichst einfach gehalten werden. Alle Steuerungsobjekte für Motoren, Sensoren usw. werden durch die Vorlage bereits vollständig als statische Elemente angelegt, so dass der Programmieranfänger sich allein auf die Programmierung der main-Methode mit den eigentlichen Steuerungsbefehlen konzentrieren kann. Kenntnisse über objektorientierte Programmierung sind nicht wirklich erforderlich. Die Methoden der Steuerungsschnittstellen können einfach als zur Verfügung stehende Roboterbefehle eingeführt werden. Die Steuerungsobjekte selbst können zunächst als "Befehlsempfänger" mit unterschiedlichen Zuständigkeiten verstanden werden. An dieser Stelle muss der Programmieranfänger verstehen, dass damit unterschiedliche "Typen" verbunden sind, damit er erfolgreich mit der HTML-Dokumentation arbeiten kann. Wenn diese Grundstruktur für den Einstieg immer noch zu komplex erscheint, kann man vor der Arbeit mit Robotern noch einfachere Konsolenprogramme behandeln, wie sie auf der Folgeseite beschrieben werden.

Die Vorlage für die Roboterprogramme sieht im Detail folgendermaßen aus: Zunächst werden durch die entsprechende Importanweisung alle Elemente aus org.jabotics.robot.de verfügbar gemacht und die eigene Klasse (Platzhalter in der Vorlage: $CLASSNAME) von XRoboter abgeleitet:

import org.jabotics.robot.de.*;
public class $CLASSNAME extends XRoboter

Die Bereitstellung der Steuerungsobjekte zu Beginn des Klassenblocks geht von einem Standardaufbau des Roboters aus:

static final IMotor linkerMotor = objektfabrik.erzeugeMotor(EMotoranschluss.C);
static final IMotor rechterMotor = objektfabrik.erzeugeMotor(EMotoranschluss.B);
static final IPilot pilot = objektfabrik.erzeugePiloten(EMotoranschluss.C, EMotoranschluss.B);
static final ITastsensor eingabetaste = objektfabrik.erzeugeTastsensor(ETaster.EINGABE);
static final ITastsensor endetaste = objektfabrik.erzeugeTastsensor(ETaster.ENDE);
static final ITastsensor linkstaste = objektfabrik.erzeugeTastsensor(ETaster.LINKS);
static final ITastsensor rechtstaste = objektfabrik.erzeugeTastsensor(ETaster.RECHTS);
static final ITastsensor tastsensor = objektfabrik.erzeugeTastsensor(ESensoranschluss.S1);
static final ISensor schallsensor = objektfabrik.erzeugeSchallsensor(ESensoranschluss.S2);
static final ILichtsensor lichtsensor = objektfabrik.erzeugeLichtsensor(ESensoranschluss.S3);
static final ISensor ultraschallsensor = objektfabrik.erzeugeUltraschallsensor(ESensoranschluss.S4);
static final IUhr uhr = objektfabrik.erzeugeUhr();
static final IMonitor monitor = objektfabrik.erzeugeMonitor();
static final ILautsprecher lautsprecher = objektfabrik.erzeugeLautsprecher();

Der Programmieranfänger muss diesen Abschnitt zwar nicht vollständig verstehen, aber Objektnamen sowie Objekttypen für die Dokumentation ablesen können. Es folgt der main-Block als einzige Klassenmethode. Die Programmvorlage füllt den Methodenblock bereits mit einer kleinen Beispielimplementierung, die durch eigene Steuerungsbefehle ersetzt werden muss:

////////////////////////////////////////////////////////////////////////////////////////
// Ersetze den folgenden Beispiel-Programmcode durch deine eigene Robotersteuerung:
////////////////////////////////////////////////////////////////////////////////////////
uhr.warteZeit(2000); // Zeit, um die Hand nach dem Programmstart aus dem Weg zu nehmen
pilot.setzeZaehlerstaendeZurueck();
pilot.setzeSollgeschwindigkeit(10);
pilot.fahreGerade(VORWAERTS);
ultraschallsensor.warteBisGrenzwertUnterschritten(50);
pilot.halteAn(ABWARTEN);
float strecke = pilot.holeTachostand(); // Hier wird der Tachostand ausgelesen und in der
// neuen Fließkomma-Variablen strecke gespeichert.
lautsprecher.spieleBeepfolge();
monitor.loescheAlles();
monitor.schreibe("Strecke in cm:", 0, 0);
monitor.schreibe(strecke, 0, 1);
monitor.schreibe("Endetaste", 0, 3);
monitor.schreibe("druecken!", 3, 4);
endetaste.warteBisEreignisLosgelassen();

Dieser Auszug gibt einen ersten Eindruck von der Verwendung der Steuerungsobjekte. In dem Beispielcode wird Gebrauch von den durch die Klasse XRoboter bereitgestellten Enumerationskonstanten wie VORWAERTS und ABWARTEN gemacht. Ohne diese Konstanten müsste der Methodenaufruf zum Starten der Vorwärtsfahrt z.B. so lauten:

pilot.fahreGerade(ERichtung.VORWAERTS);

Programmvorlage für Fortgeschrittene

Die Verwendung der Vorlage Roboter2.tmpl setzt echte Kenntnisse in der objektorientierten Programmierung voraus. Im Hauptprogramm wird eine Instanz der eigenen Klasse erzeugt und deren run-Methode aufgerufen, in der der eigentliche Programmablauf implementiert wird:

public static void main(String[] args)
{
$CLASSNAME roboter = new $CLASSNAME();
roboter.run();
}

Auch diese Vorlage enthält eine Beispielimplementierung, die die weitergehenden Möglichkeiten dieses Ansatzes demonstriert. So leitet sich die Roboterklasse nicht nur von XRoboter ab, sondern implementiert zusätzlich die Schnittstelle ISensorbeobachter, so dass die Roboterinstanz in der Callback-Methode registriereEreignis Ereignismeldungen der Sensoren verarbeiten kann:

public class $CLASSNAME extends XRoboter implements ISensorbeobachter

Weitere Details zu diesem Vorgehen können in den ausführlichen Programmkommentaren der Vorlage sowie der HTML-Dokumentation nachgelesen werden. Es sei hier nur darauf hingewiesen, dass der Einsatz von Callback-Methoden gewisse Kenntnisse über Multithreading-Programmierung erfordert.