Programmierung von LEGO Mindstorms Robotern mit dem Java-Betriebssystem leJOS
LEGO ermöglicht mit dem Baukastensystem LEGO Mindstorms die einfache Konstruktion
von Robotern. Es handelt sich hierbei um Roboter, die über einen eigenen Computer
(RCX-Einheit) verfügen. Dieser kann frei programmiert werden, sodass die Roboter
autonom in der Umwelt agieren und reagieren können. Anstelle des von LEGO original
vorgefertigten Frameworks wurde ein auf Java basierendes Framework namens leJOS
eingesetzt. Die nachstehende Arbeit beschreibt verschiedene Versuche mit diesen
Robotern.
Für etwaige Kritik wäre ich dem Leser sehr dankbar.
Diese Webseite gehört zu www.uni-magdeburg.de/harbich
Abbildung 1: Roboter mit einem Lichtsensor
Abbildung 2: Eine Kette des Raupenantriebs
Der Roboter in Abbildung 1 soll einer schwarzen Linie
mit nur einem Lichtsensor folgen. Hierzu wurde der Roboter so konstruiert, dass
sich der Lichtsensor am vorderen Bereich befindet. Weiterhin ermöglicht der Raupenantrieb
vollständige Rotationen dadurch, dass jede Kette (Abbildung
2) von einem separaten Motor gesteuert wird. Im Nachstehenden zeigen wir
nun, wie ein Folgen der Linie prinzipiell realisierbar ist.
Wir gehen zu Beginn davon aus, dass sich der Lichtsensor am Roboter direkt über
einer schwarzen Linie befindet (Abbildung 3a). Solange
sich dies nicht ändert, fährt der Roboter einfach gerade aus. Trifft er nun auf
eine Kurve, so befindet sich der Lichtsensor nicht mehr länger über der schwarzen
Linie und der Roboter hält (Abbildung 3b). Anschließend
dreht er sich solange um die eigene Achse, bis er die Linie wieder gefunden hat
oder eine vorgegeben Zeitspanne T abgelaufen ist (Abbildung
3c). Diese Zeitspanne soll verhindern, dass der Roboter sich um 180° dreht
und damit die fahrt in falscher Richtung fortsetzt. Hat er nun die Linie wieder
gefunden, so fährt er weiter gerade aus. Ist dies nicht der Fall, so rotiert er
in entgegengesetzter Richtung, bis er die Linie wieder entdeckt (Abbildung
3d). An dieser Stelle kann es durchaus vorkommen, dass der Roboter sich
um 180° dreht. Und dies ist genau dann der Fall, wenn das Ende der schwarzen Linie
erreicht worden ist und der Roboter die Strecke zurück fahren soll (Abbildung
3e). Nachdem nun die Linie wieder ausfindig gemacht worden ist, fährt der
Roboter weiter gerade aus und verhält sich beim Abweichen von der Linie nach oben
beschriebener Methode. Damit der Roboter möglichst wenig Kurskorrekturen vornehmen
muss, merkt er sich die Drehrichtung bei der die Linie wieder entdeckt wurde und
beginnt bei nächsten Kurskorrekturen eine Rotation mit derselben Richtung.
Java-Implementierung:
MyRobot
Video:
Roboter mit einem Lichtsensor (XviD 1.1.0)
Abbildung 3a: Roboter auf schwarzer Linie
|
Abbildung 3b: Roboter weicht von Linie ab
|
Abbildung 3c: Roboter dreht sich
|
Abbildung 3d: Roboter dreht sich in entgegengesetze Richtung
|
Abbildung 3e: Roboter fährt Strecke zurück
|
Abbildung 4: Roboter mit zwei Lichtsensoren
Der Roboter in Abbildung 4 ist der gleiche wie aus
dem letzten Abschnitt, nur dass jetzt anstelle des einen zwei Lichtsensoren montiert
wurden (Abbildung 5). Auch verhält er sich ähnlich
wie der erste Roboter, nur dass mit den zwei Lichtsensoren sofort klar ist, in welche
Richtung rotiert werden muss, um die Strecke wieder zu finden. Weicht nämlich genau
ein Lichtsensor von der schwarzen Linie ab, so muss der Roboter in Richtung des
anderen Lichtsensors drehen.
Java-Implementierung:
MyRobotS2
Video:
Roboter mit zwei Lichtsensoren (XviD 1.1.0)
Abbildung 5: Roboter mit zwei Lichtsensoren auf schwarzer Linie
|
Abbildung 6: Zeichnender Roboter (Empfänger)
Der Roboter in Abbildung 4 soll einer schwarzen Linie
folgen und der Roboter in Abbildung 6 soll diese Linie
an einem anderen Ort auf Papier aufzeichnen. Der die Linie folgende Roboter kann
so wie der Roboter im vorherigen Abschnitt realisiert werden. Dieser teilt beim
Fahren dem aufzeichnenden Roboter seine aktuellen Bewegungen (gerade aus fahren
oder drehen) über die Infrarotschnittstelle der RCX-Einheiten mit (Abbildung
7a). Somit ahmt der malende Roboter einfach den anderen nach und zeichnet
dabei mittels einem integrierten Stift die schwarze Linie auf das Papier (Abbildung
7b).
Java-Implementierung:
CopyRobots
Video:
Zwei kommunizierende Roboter (XviD 1.1.0)
Abbildung 7a: Roboter (Sender) fährt Linie ab
|
Abbildung 7b: Roboter (Empfänger) zeichnet Linie auf Papier
|
Abbildung 8: Roboter mit Räder
Der Roboter in Abbildung 8 wurde diesmal mit Rädern
konstruiert. Allerdings verhalten sie sich prinzipiell so, wie die Kette der vorherigen
Roboter. Das heißt, jeweils zwei Räder auf einer Seite werden durch einen gemeinsamen
Motor gesteuert (Abbildung 9). Die beiden Lichtsensoren
des Roboters sind im Gegensatz zu den anderen Robotern nicht dicht zusammen sondern
mit einem größeren Abstand angeordnet (Abbildung 11a).
Dies ist nötig, da die Lichtsensoren nicht mehr direkt über sondern neben der Linie
bleiben sollen. Und dies wiederum ist erforderlich, um unterbrochene Linien wieder
zu finden. Der Roboter verhält sich in etwa so, wie der Roboter aus dem zweiten
Abschnitt, nur das jetzt Kurskorrekturen vorgenommen werden, wenn sich einer der
beiden Lichtsensoren direkt über der schwarzen Linie befindet (Abbildung
11b und Abbildung 11c). Der Roboter soll
beim Abfahren der Strecke auch eine Steigung überwinden können. Hierzu wurde eine
Art Waage angefertigt, die Anzeigt wann der Roboter eine geneigte Ebene hochfährt.
Die Waage besteht wie in Abbildung 10 und
Abbildung 11d erkennbar aus einer Wippe, welche bei Neigung auf einen der
Tastsensoren drückt. Im Wesentlichen verlangsamt der Roboter bei einer Steigung
nur die fahrt, um bei kurvigen Linien nicht weg zu rutschen. Das Erkennen der Enden
einer Stecke ist mit dieser Methodik leider nicht Möglich.
Java-Implementierung:
CircuitRobot
Video:
Roboter mit zwei auseinander stehenden Lichtsensoren (XviD 1.1.0)
Abbildung 9: Antrieb des Roboters
|
Abbildung 10: Waage für Steigung
|
Abbildung 11a: Roboter mit zwei Lichtsensoren
|
Abbildung 11b: Roboter weicht von Linie ab
|
Abbildung 11c: Roboter dreht sich zur Linie hin
|
Abbildung 11d: Waage des Roboters
|
Abbildung 12: Arena
Ein Roboter (Produzent) soll Waren von seinem Lager zu einem Umschlagplatz transportieren.
Ein weiterer Roboter (Konsument) soll diese Waren am Umschlagplatz abholen und zu
seinem eigenen Lager bringen. Dabei dürfen sich Produzent und Konsument nicht gleichzeitig
am Umschlagplatz befinden. Wie muss der beschriebene Prozess realisiert werden,
damit der Umschlag der Waren möglichst schnell stattfindet? Die folgende Präsentation
verdeutlicht ein prinzipielles Vorgehen zur Lösung des Problems.
Präsentation:
Produzenten-Konsumenten-Problem
Java-Implementierung:
ProducerConsumer