5.1 REAL- UND SIMULATIONSMODUS

 

 

EINFÜHRUNG

 

Unter einem Roboter versteht man meist eine computergesteuerte Maschine, die  eine Tätigkeit ausführen kann, welche früher durch Menschen verrichtet wurde. Wenn die Maschine sogar mit Hilfe von Kameras und Sensoren die Umgebung erfassen und entsprechend mit Aktoren (Motoren, Ventile, Sprachausgaben, usw.) reagieren kann,  spricht man von einem intelligenten System  oder bei menschenähnlichem Verhalten von einem Androiden.
Ein typisches Beispiel ist der  Film-Roboter WALL·E, der ein eigenes Bewusstsein besitzt, das so weit geht, dass er Ersatzteile für sich selbst sucht und besondere Gegenstände, die sein Interesse erwecken, in einer Sammlung aufbewahrt. Er ist auch in der Lage, den Rubik-Würfel zusammen zu setzen, was du sicher als ein Zeichen von Intelligenz ansiehst.  

Die Künstliche Intelligenz (KI) befasst sich mit der interessanten Frage, inwiefern ein Computersystem überhaupt als "intelligent" bezeichnet werden kann. Zur Beantwortung dieser Frage muss zuerst definiert werden, was man unter einer intelligenten Maschine versteht. Ein möglicher Lösungsansatz zur Definition von Intelligenz ist der Turing-Test.

Hier befasst du dich mit einfacheren Fragen und du lernst mit einem einfachen Roboter umzugehen, der mit Berührungs-, Licht-, Sound-, Infrarot- und Ultraschallsensoren ausgerüstet ist und mit zwei Rädern, die mit Elektromotoren angetrieben sind, vorwärts und rückwärts fahren und sich drehen kann.

Die Steuerung von Motoren und Sensoren übernimmt ein eingebauter Computer, darum nennt man einen Roboter auch ein Eingebettetes System (embedded system). Wenn es sich oft um einen einfachen Rechnerchip handelt, spricht man von einem Mikroprozessor (oder Mikrocontroller). Eingebettete Systeme spielen heutzutage eine ausserordentlich wichtige Rolle, denn du findest sie in vielen Geräten des täglichen Lebens, etwas in allen Smartphones. Aber auch Kaffeemaschinen, Waschmaschinen, TV-Geräte, Photoapparate, usw. sind meist eingebettete Systeme. In einem modernen Auto befinden sich bis zu hundert Mikrocontroller als eingebettete Systeme von der Motorsteuerung bis zum Antiblockierungssystem. Du solltest dir deshalb bewusst sein, dass du im Umgang mit Robotern auch viele allgemeingültige Prinzipien für eingebettete Systeme kennenlernst.

Führt der eingebaute Prozessor ein eigenständiges Programm zur Steuerung des Roboters aus, so spricht man von einem autonomen Roboter. Der eingebaute Prozessor kann aber auch lediglich über einen Datenübertragungskanal die von den Sensoren erfassten Daten an einen äusseren Computer senden und von diesem Steuerungsbefehle erhalten. In diesem Fall handelt es sich um einen fremdgesteuerten Roboter. Schliesslich kann ein Roboter auch simuliert werden. Dabei werden Sensoren, Motoren usw. meist als Softwareobjekte abgebildet. Dem realen Zusammenbau der Komponenten entspricht dann softwaremässig eine Klassenkonstruktion. In der Praxis werden Roboter meist zuerst auf dem Computer simuliert, da damit das Verhalten mit kleinem Aufwand und ohne Gefahren für die Umgebung studiert werden kann.

Mit den weltweit bekannten Robotik-Baukästen von Lego Mindstorms kannst du wichtige Aspekte der Robotik spielerisch erlernen. Das System besteht aus einem mikroprozessorgesteuerten Baustein (Brick) und einer Vielzahl von Bauteilen, mit denen unterschiedliche Robotermodelle konstruiert werden können. Der Brick hat mehrere Entwicklungsstadien durchlaufen: Früher hiess er RCX, dann NXT und neuerdings EV3.

Der EV3-Brick mit den Motoren und Sensoren ist ein eingebettetes System, das durch einen modernen ARM-Prozessor gesteuert wird. Öffnet man ihn, so werden seine elektronischen Bauteile sichtbar.


 
PC-Port
4 Motor-Ports
USB-Port
Lautsprecher
SD-Karte
32 bit ARM9 Prozessor
Texas Instrument AM1808
mit 64 MB RAM und
16 MB Flash Speicher
4 Sensor-Ports
       

Beim Einschalten des Bricks startet auf dem Mikroprozessor eine Firmware oder beim EV3 das Linux-Betriebssystem, und auf dem Display erscheint ein einfaches Menü. Damit kannst du im autonomen Modus bereits auf dem Brick gespeicherte Programme ausführen. Auf dem EV3 musst du für den fremdgesteuerten Modus ein Hilfsprogramm (BrickGate) starten,  das Befehle interpretiert, die über eine Bluetooth-Verbindung von aussen empfangen werden, beispielsweise den Befehl, einen Motor  in einer bestimmten Drehrichtung einzuschalten oder den Messwert eines Sensors zurück zu melden. Beim NXT ist dieses Programm Teil der Firmware.

Wie bei allen eingebetteten Systemen benötigst du für die Robotik einen externen Computer, auf dem du die Roboterprogramme entwickelst. Im autonomen Modus wird das Programm auf den Brick heruntergeladen, im fremdgesteuerten Modus läuft es auf dem PC.

Autonomer Modus

  Fremdgesteuerter Modus

1. Programm editieren

 

 

2. Download und
    Verbindung
    beenden
3. Ausführung auf EV3

1. Programm editieren

 

 

2. Ausführung auf PC.
    Kommunikation
    mit EV3

 

  PROGRAMMIERKONZEPTE:
Roboter,  Android, Künstliche Intelligenz, Eingebettetes System,
Mikroprozessor, Mikrocontroller, Blockierende/Nichtblockierende Methode

 

 

VORARBEITEN

 

Mit TigerJython kannst du den Roboter simulieren (Simulationsmodus) und autonom oder fremdgesteuert verwenden (Realmodus). Du verwendest dabei verschiedene Klassenbibliotheken, die aber das gleiche Programmierinterface (Application Programming Interface, API) haben, so  dass die Programme für alle Modi praktisch identisch sind. Es müssen lediglich der import  und eventuell gewisse im Programm verwendete Timings angepasst werden.

Simulationsmodus:
Steht dir kein NXT oder EV3 zur Verfügung, kannst du das Thema trotzdem im Simulationsmodus durcharbeiten. Die für die Simulation benötigten Bilder sind in der Distribution von TigerJython enthalten.

Realmodus:
Die meisten Beispiele verwenden das Lego EV3 Basismodell bzw. das Lego NXT-Basismodell, die sich mit zwei Motoren bewegen und mit diversen Sensoren ausgestattet werden können. Solange du die grundsätzliche Funktionalität nicht veränderst, kannst du auch ein eigenes, davon abweichendes Modell verwenden. Da die Kommunikation mit dem Roboter über Bluetooth erfolgt, muss dein PC Bluetooth-fähig sein und du musst den Brick mit dem PC "paaren".  

Vorgehen mit dem Lego-NXT:
Auf dem Lego-NXT sollte die die Java-Firmware leJOS installiert sein. Eine Anleitung, wie du vorgehen musst, findest du hier.

Für das Paaren gehst du so vor, wie du es mit anderen externen Bluetooth-Geräten wie Smartphones, Bluetooth-Handsets, Druckern, usw. gewohnt bist. Beachte, dass du als Bluetooth-Pincode standardmässig die Zahl 1234 verwenden musst.

Den NXT kannst du mit Python nur im fremdgesteuerten Modus verwenden. Du schreibst dazu in TigerJython ein ganz normales Python-Programm unter Verwendung des Moduls ch.aplu.nxt und drückst zum Starten den grünen Run-Button. Zuerst wirst du nach dem Bluetooth-Namen gefragt und danach wird die Verbindung zum Brick aufgebaut. Während der Programmausführung bleibt ein Fenster mit Verbindungsinformationen offen. Schliesst du dieses Fenster, so wird die Verbindung zum NXT unterbrochen.

 

Befinden sich im Raum mehrere Lego-NXT, so müssen ihre Bluetooth-Namen verschieden sein, damit es keine Konflikte gibt. Ein Tool zum Ändern des Namens findest du hier. Du kannst auch anstelle des Bluetooth-Namens die Bluetooth-Adresse verwenden, die du mit verschiedenen Tools herausfinden kannst (beispielsweise wird sie bei jedem Verbindungaufbau im Connection-Dialog ausgeschrieben).

Für die Bluetooth-Kommunikation ist die Bluecove-Bibliothek notwendig. Du lädst die Dateien von hier herunter und packst sie im Unterverzeichnis Lib des Verzeichnisses, in dem sich tigerjython2.jar befindet, aus.

Vorgehen mit dem Lego-EV3:
Auf  dem EV3 läuft ein Linux-Betriebssystem, das zusammen  mit der leJOS-Software gestartet wird, die sich auf einer SD-Karte befindet. Eine genaue Anleitung, wie du die SD-Karte erstellen musst, findest du hier. Entfernst du die SD-Karte, so kannst du den EV3 wieder wie im Originalzustand verwenden. Ist der EV3 unter leJOS gestartet, so kommunizierst du über eine Bluetooth-PAN-Verbindung mit ihm. Dazu musst du den PC mit dem Brick paaren und als Netzwerk-Zugriffspunkt angeben. Eine Anleitung findest du hier.

Nach dem Booten des EV3 mit leJOS und der erfolgreichen Anbindung über Bluetooth-PAN musst du auf dem Brick den BrickGate Server starten,  den du im Menu "Programme" findest.

Um den EV3 im autonomen Modus zu verwenden, solltest du in TigerJython in den Einstellungen im Register Bibliotheken die Markierungsfelder EV3-Download aktivieren und Nach Download ausführen ankreuzen. Du erkennst dann in der Werkzeugleiste ein zusätzliches EV3-Symbol.


Für den fremdgesteuerten Modus klickst du wie üblich auf den grünen Run-Button. Wie mit dem NXT wirst du zuerst nach dem Bluetooth-Namen gefragt und es öffnet sich dann ein Fenster mit Verbindungsinformationen. Willst du das gleiche Programm autonom ausführen, so klickst du einfach auf den EV3-Button. Das Python-Skript wird dann auf den EV3 heruntergeladen und dort ausgeführt. Sein Name erscheint auch auf dem Display des EV3 und es kann jederzeit ohne Verbindung zum PC mit dem ENTER-Button wieder ausgeführt werden.

In den Programmen wird davon ausgegangen, dass du für den EV3 die neuen Motoren und Sensoren aus dem EV3-Sortiment verwendest. Als Lichtsensor dient der EV3 Colorsensor. Die alten NXT-Motoren und Sensoren werden aber auch für den EV3  immer noch unterstützt. Du musst einfach überall vor den Klassennamen "Nxt" setzen, also NxtMotor, NxtGear, NxtTouchSensor, usw.

 

 

VORWÄRTS- UND RÜCKWÄRTS-FAHREN, DREHEN

 

In deinem ersten Roboterprogramm soll sich der Roboter während bestimmten, im Programm fest codierten Zeiten bewegen. Die Roboterbibliothek ist objektorientiert aufgebaut und bildet die Wirklichkeit modellmässig ab. So wie du bei der Konstruktion des Roboters den Lego-Brick in die Hand nimmst, erstellst du softwaremässig mit robot = LegoRobot()  eine Instanz der Klasse LegoRobot(). Als nächstes  nimmst  du zwei Motoren und setzt diese zu einem Fahrwerk zusammen, was du softwaremässig mit gear = Gear() ausdrücken wirst. Dann schliesst du die Fahrwerkmotoren an die Motor-Ports A und B an, was du softwaremässig mit addPart() formulierst.

Mit dem Befehl gear.forward() schaltest du beide Motoren gleichzeitig mit gleicher Rotationsgeschwindigkeit ein und der Roboter fährt geradeaus. Dieser Bewegungszustand bleibt erhalten, bis du etwas anderes unternimmst. Der Aufruf kehrt aber sofort zurück und dein Programm fährt bei der folgenden Anweisung weiter (man nennt diese eine nicht-blockierende Methode). Dein Programm muss also dafür sorgen, dass der Roboter nach einer gewissen Zeit etwas anderes macht. Dazu kannst du das Programm mit Tools.delay() warten lassen und dann mit einem anderen Befehl die Bewegung verändern oder stoppen.  

Sobald du einen Bewegungsbefehl an den Roboter sendest, wird der bestehende Zustand beendet und der neue Zustand übernommen. Am Schluss des Programms solltest du immer die Methode exit() aufrufen. Dabei werden alle Motoren gestoppt und im Realmodus auch die Bluetooth-Verbindung unterbrochen, was nötig ist, damit ein nächster Programmstart erfolgreich ist. (Wird das Programm nicht korrekt endet, so kann es nötig sein, dass du den Brick aus- und wieder einschalten musst.)


from simrobot import *
#from nxtrobot import *
#from ev3robot import *
  
robot = LegoRobot()
gear = Gear()
robot.addPart(gear)

gear.forward()
Tools.delay(2000)
gear.left()
Tools.delay(545)
gear.forward();
Tools.delay(2000)
robot.exit()
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)

 

 

 

MEMO

 

Ein Gear ist ein Fahrwerk mit zwei Motoren. Statt die Motoren einzeln zu steuern, kannst du damit Befehle verwenden, die beide Motoren gleichzeitig beeinflussen.

Die Klassenbibliotheken für den Simulations- und den Realmodus sind so konzipiert, dass die Programme praktisch identisch sind. Du kannst dein Programm zuerst im Simulationsmodus entwickeln und danach mit wenig Anpassungen mit dem realen Roboter ausführen.

Den EV3 kannst du autonom oder fremdgesteuert verwenden. In beiden Fällen muss auf dem EV3 das BrickGate-Programm gestartet sein, das die von Python gesendeten Befehle empfängt und entsprechend interpretiert.

Da bei der Ausführung im autonomen Modus keine Fehler angezeigt werden, solltest du das Programm immer zuerst im fremdgesteuerten Modus ausprobieren (grüner Knopf) und erst dann mit dem EV3-Button auf den Brick herunterladen und dort ausführen.

 

 

BEWEGEN MIT BLOCKIERENDEN METHODEN

 

Statt wie vorhin mit dem Befehl forward()  den  Roboter in Vorwärtsbewegung zu setzen und dann mit delay(2000) das Programm 2000 ms warten lassen, kannst du auch die blockierende Methode forward(2000) verwenden, die  den Roboter ebenfalls in Vorwärtsbewegung versetzt, aber erst nach 2000 ms zurückkehrt. Auch für left() und right() gibt es blockierende Varianten.

Du kannst damit das vorhergehende Programm mit blockierenden Methoden etwas vereinfachen.

from simrobot import *
#from nxtrobot import *
#from ev3robot import *
  
robot = LegoRobot()
gear = Gear()
robot.addPart(gear)
gear.forward(2000)
gear.left(545)
gear.forward(2000)
robot.exit()
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)

 

 

MEMO

 

Du musst zwischen blockierenden und nicht blockierenden Methoden unterscheiden. Nicht blockierende Befehle bewirken eine Zustandsänderung des Roboters und kehren sofort zurück. Blockierenden Bewegungsbefehlen übergibst du ein bestimmtes Zeitintervall, während dem das Programm blockert d.h. die nächste Anweisung wird erst ausgeführt, wenn das Zeitintervall abgelaufen ist.

Auf den ersten Blick scheint es einfacher zu sein, immer blockierende Methoden zu verwenden. Du handelst dir aber damit einen wesentlichen Nachteil ein. Da dein Programm nun blockiert ist,  kannst du während dieser Zeit keine anderen Aktionen ausführen, also beispielsweise keine Sensorwerte lesen!

Hängt sich das Programm während der Programmausführung auf, so kannst du es im fremdgesteuerten Modus durch Schliessen des Verbindungsinfo-Fensters abbrechen. Im autonomen Modus drückst du im Notfall die beiden Tasten DOWN+ENTER.

 

 

AUFGABEN

 

1.

Schreibe ein Programm mit blockierenden Methoden, um ein Quadrat abzufahren.

 

2.

Schreibe ein Programm mit nicht-blockierenden Methoden, damit sich der Roboter auf der Halbkreiskurve bewegt.

 

 
3.

Erstelle mit einigen Gegenständen einen Parcours und schreibe ein dazugehörendes Programm so, dass der Roboter vom Start zum Ziel fährt.

Für die Simulation wird mit RobotContext.useBackground() das Hintergrundbild bg.gif angezeigt, das sich im Unterverzeichnis sprites befindet.
Mit RobotContext.setStartPosition() kannst du den Roboter bei Programmstart an eine bestimmte Stelle setzen. (Bildschirmkoordinaten 0..500, Nullpunkt oben links).

 
RobotContext.setStartPosition(200, 480)
RobotContext.useBackground("sprites/bg.gif")

Du kannst aber auch ein eigenes Bild (Bildgrösse 501x501) erstellen.

 

 

   

ZUSATZSTOFF


 

INFRAROT-FERNBEDIENUNG

 

Für den EV3-Roboter gibt es einen EV3 Infrarot-Sensor, der sich sehr vielseitig einsetzen lässt. Er ist  im Lego Heim-Bausatz (inklusive der Fernsteuerbox) bereits enthalten, muss aber für den Lego Education-Bausatz zusätzlich beschafft werden. Den IRSensor kannst du auf drei Arten verwenden.

Klasse Messgrössen
IRSeekSensor Distanz und Richtung zur IR-Quelle der Fernsteuerung
IRRemoteSensor Gedrückte Buttons der Fernsteuerung
IRDistanceSensor Distanz zu einem reflektierenden Ziel (Target)

 

Für erste "Gehversuche" mit dem Roboter ist die Verwendung der Fernbedienung lustig und motivierend. Gegenüber einem vorgegebenen Fernsteuerungsprogramm kannst du mit einfacher Python-Programmierung die Aktionen,  die beim Drücken der Fernsteuerung ausgelöst werden, selbst festlegen.

 

 


In deinem Programm entscheidest du dich für folgende Funktionen:

Fernsteuerungsbutton Aktion
Links-Oben auf Linksbogen vorwärts fahren
Rechts-Oben auf Rechtsbogen vorwärts fahren
Links-Unten+Rechts-Oben Geradeaus vorwärts fahren
Links-Unten Stoppen
Rechts-Unten Programm beenden

 

from ev3robot import *

robot = LegoRobot()
gear = Gear()
robot.addPart(gear)
irs = IRRemoteSensor(SensorPort.S1)
robot.addPart(irs)
isRunning = True

while not robot.isEscapeHit() and isRunning:
    command = irs.getCommand()    
    if command == 1:
        gear.leftArc(0.2)
    if command == 3:
        gear.rightArc(0.2)
    if command == 5:
        gear.forward()
    if command == 2:
        gear.stop()
    if command == 4:
        isRunning = False       
robot.exit()
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)

 

 

MEMO

 

Die Methoden isEscapeHit(), isEnterHit(), isDownHit(), isUpHit(), isLeftHit(), isRightHit() liefern True, falls du im autonomen Modus die entsprechenden Buttons auf dem EV3 klickst. Im fremdgesteuerten Modus betreffen sie aber die Tastaturtasten ESCAPE, ENTER, CURSOR-DOWN, CURSOR-UP, CURSOR-LEFT, CURSOR-RIGHT. Dabei muss aber das Verbindungsinfo-Fenster aktiv sein (mit Maus hineinklicken).