EINFÜHRUNG |
|
Fremdgesteuerter, autonomer, selbstlernender Roboter, Teach-Mode, Execution-Mode, Ereignisschleife |
DER ROBOTER KENNT DEN WEG |
|
MEMO |
VOM MENSCH GESTEUERTER ROBOTER |
Die konstante Länge der Kanalelemente kennt der Roboter selbst, aber für die Kurvenbewegung wird er durch einen Menschen gesteuert. Der Roboter ist aber nicht lernfähig, er kann sich den Pfad nicht merken, er bleibt "dumm". Für die Steuerung des Roboters verwendest du im Simulations- und fremdgesteuerten Modus die Cursor-Links- und Cursor-Rechts-Tasten der Tastatur und im autonomen Modus die entsprechenden LEFT- und RIGHT-Buttons. Mit den Methoden isLeftHit() und isRightHit() kannst du abfragen, ob die Tasten bzw. die Buttons gedrückt und wieder losgelassen wurden. Um das Programm zu beenden, verwendest du die Escape-Taste bzw. den ESCAPE-Button.
|
MEMO |
Der autonome Modus macht hier weniger Sinn, da man ja den Roboter eigentlich fernsteueren möchte. Du kannst für den EV3 dazu statt der Tastatur auch die Infrarot-Fernsteuerung verwenden (siehe Anhang). |
DER ROBOTER LERNT IM TEACH-MODE |
Computergestützte Systeme, deren Verhalten nicht fest einprogrammiert ist, die also später ihr Verhalten an eine Umgebung anpassen können, nennt man adaptive Systeme. Diese sind daher in einem gewissen Sinn lernfähig. Industrierobotern werden in einem "Teach Mode" durch einen Spezialisten "angelernt", beispielsweise welche Armbewegungen durchzuführen sind. Der Operator verwendet dabei meist ein Eingabesystem ähnlich einer Fernsteuerung. Dabei wird der Roboter nacheinander in die gewünschten Positionen gefahren und der jeweilige Zustand abgespeichert. Im "Execution Mode" fährt dann der Roboter die gespeicherten Zustände selbständig (und mit hoher Geschwindigkeit) ab.
|
MEMO |
Die Bearbeitung der Zustände erfolgt in einer while-Schleife im Hauptteil des Programms, also nicht in den Callback-Funktionen. Eine solche Schleife nennt man in der Informatik üblicherweise eine Ereignisschleife (event loop). Im Callback wird lediglich der entsprechende Zustand ausgewählt (state switch). Mit dieser Programmiertechnik erhält man eine übersichtliche zeitliche Synchronisation zwischen den länger dauernden Aktionen und dem ereignisgesteuerten Callback-Aufruf, der zu jeder beliebigen Zeit auftreten kann. Das "Gedächtnis" besteht aus einer Liste, in der du die Zahlen 0 oder 1 abspeicherst, je nachdem ob der Weg nach links oder rechts abzweigt. |
DER SELBSTLERNENDE ROBOTER |
Bei bestimmten Anwendungen ist es nicht möglich, dass der Roboter durch einen Operator angelernt wird. Der Roboter kann sich beispielsweise in einem Gebiet aufhalten, dass sich ausserhalb unmittelbarer Kommunikation befindet (z.B. auf dem Mars). Um den Weg zu finden, muss der Roboter nun mittels eingebauten Sensoren die Umgebung erfassen und entsprechend "handeln" können. Der Mensch erkennt die Umgebung meist mit seinen Augen. Für Roboter ist zwar die Bilderfassung mit einer Kamera einfach, die Analyse des Bildes aber äusserst kompliziert [mehr... Die Auswertung von Bildern gehört zur Wissenschaft der Mustererkennung]. Um sich im Kanal zu orientieren, verwendet dein Roboter lediglich einen Berührungssensor (Touchsensor), der ein Ereignis auslöst, wenn er gedrückt wird. Der Kanal soll immer noch aus gleich langen Kanalelementen bestehen. Wenn der Roboter nach dem Durchfahren eines Kanalelements einen Touchevent erhält, so weiss er, dass er sich an einer Weggabelung befindet. Er fährt dann etwas zurück und versucht ein Vorankommen mit einer Linkskurve. Stösst er innerhalb kurzer Zeit wieder auf eine Wand, so weiss er, dass der eingeschlagene Weg falsch war. Er kehrt zurück und fährt nach rechts. Dabei merkt er sich, ob er für den richtigen Weg nach links oder rechts abbiegen muss und kann später den Kanal beliebig oft selbständig und ohne anzustossen durchlaufen. Du lässt den Roboter im Teach-Mode durch den Kanal laufen und drückst nachher die Enter-Taste bzw. den ENTER-Button, um ihn vom Teach-Mode in den Execute-Mode zu versetzen.
|
MEMO |
Der Touchsensor wird am Port S3 angeschlossen (im Simulationsmodus entspricht dies einer Montageposition vorne in der Mitte). Der Sensor meldet die Touchevents über den Callback onPressed(), der mit dem benannten Parameter pressed registriert wird. Der Touchsensor ist ein Roboter-Bauteil, der wie üblich mit addPart() zum Roboter hinzugefügt wird. Um herauszufinden, ob sich der Roboter in einem Kanalelement oder in einer Sackgasse bewegt hat, bestimmst du mit der in Python eingebauten Clock die Zeit seit dem letzten Touchevent. Ist sie grösser als 2 Sekunden, bewegt er sich im Kanalelement, sonst war es eine Sackgasse. Da der Roboter immer zuerst nach links dreht und dabei eine 0 in sein Gehirn schreibt, muss er im Fall der Sackgasse die fehlerhafte 0 durch 1 ersetzen. |
DIE UMGEBUNG WIRD KOMPLEXER |
Du hast sicher gemerkt, dass der Roboter durchaus in der Lage ist, selbst zu merken, wie weit er vorwärts fahren muss, bis er an die nächste Abzweigung kommt, da er ja die Zeit messen kann, die er benötigt, bis er am Ende des Kanalelements anstösst. Dadurch ist er in der Lage, sich auch in einem Kanal mit verschieden langen Kanalelementen richtig zu bewegen. Allerdings muss er jetzt nicht nur die Links-Rechts-Information, sondern auch die Laufzeit im Kopf behalten. Du packst am besten beide zusammen gehörenden Informationen in eine Liste node = [moveTime, k], wo moveTime die Laufzeit (in ms) und k = 0 für eine Links-, k = 1 für eine Rechtskurve stehen. Die Laufzeit moveTime kriegst du nach dem Durchlaufen des Kanalelements, musst sie aber noch um die Zeit korrigieren, um die der Roboter zu weit gefahren ist. Du speicherst sie in einer globalen Variable, da du sie nochmals verwenden musst, falls der Roboter in die Sackgasse gefahren bist.
|
MEMO |
Im ersten Anlauf erscheint dir die Datenstruktur von memory als eine Liste von node-Listen kompliziert. Zusammengehörende Daten (hier die Laufzeit für die nächste Strecke und die darauf folgende Links-Rechts-Info) sollten aber immer in einer gemeinsamen Datenstruktur abgelegt werden. Erfreue dich daran, dass der Roboter sich auch mit dem gleichen Programm in einem ganz anderen Kanal (z.B. bg3.gif) zurecht findet. |
AUFGABEN |
|
ZUSATZSTOFF |
TEACH-MODE MIT DER INFRAROT-FERSTEUERUNG |
(nur EV3 autonomer Modus) Du hast bereits im letzen Kapitel gelernt, wie man mit der EV3 Infrarot-Fernsteuerung umgeht. Hier setzt du sie dazu ein, den Roboter im Teach-Mode durch den Kanal zu führen. Sowohl im Teach- wie im Execute-Mode läuft das Programm autonom auf dem EV3, du benötigst also nach dem Download keinen externen Computer mehr. Dieses Vorgehen kommt der Realität sehr nahe, da es bei Industrierobotern üblich ist, sie mit einer Fernsteuerung "anzulernen" und dann das "gelernte" Programm abzuspielen. Du verwendest im Teach-Mode die beiden oberen Buttons der Fernsteuerung, um den Roboter nach links oder rechts fahren zu lassen. Drückst du den linken unteren Button, so startet der Execute-Mode. Auch hier ist es elegant, mit Zuständen zu arbeiten.
|