Python Online
Home     .
bewegen

2. ROBOTER BEWEGEN

 

 

DU LERNST HIER...

 

den Roboter mit Softwareobjekten zusammenzubauen und mit einigen Befehle zu bewegen

 

 

MUSTERBEISPIELE

 

So wie der Lego-Roboter in der Realität aus verschiedenen Komponenten zusammengebaut wird, bildest du ihn in einem Pythonprogramm mit verschiedenen Software-Objekten  ab. Du baust also sozusagen ein (abstraktes) Modell des RobotersDabei gehst du wie folgt vor:
robot = LegoRobot() erzeugt ein Roboter-Objekt (EV3 Brick)
gear = Gear() erzeugt ein Gear-Objekt (Fahrwerk mit 2 synchronisierten Motoren)
Mit robot.addPart(gear) wird das sozusagen Fahrwerk an den Brick angeschlossen, wie du es beim Zusammenbauen des realen Roboters auch machen musst.

In deinem Programm soll der Roboter kurz vorwärts fahren. dann etwa im rechten Winkel links abbiegen und dann wieder einen kurzen Weg vorwärtsfahren. Dazu verwendest du folgende Befehle: forward(2000) bewegt den Roboter 2000 Millisekunden vorwärts, left(600) dreht den Roboter während 600 Millisekunden links. Das vorangestellte "gear. " bedeutet, dass diese beiden Befehle vom Objekt gear ausgeführt werden.

robot.exit() beendet das Programm. Dieser Befehl gehört nicht zum Fahrwerk, sondern zum Roboter-Objekt.

 

Programm:

from ev3robot import *

robot = LegoRobot()
gear = Gear()
robot.addPart(gear)
gear.forward(2000)
gear.left(600)
gear.forward(2000)
robot.exit()
► In Zwischenablage kopieren
 
Im nächsten Beispiel soll der Roboter kurz vorwärts fahren und dann eine Ausweichbewegung auf einem Linksbogen machen. Dann korrigiert es diese mit einem Rechtsbogen und hält an. Das Bogenfahren führst du mit den Befehlen leftArc(radius, time) bzw. rightArc(radius, time) durch, wobei der Bogenradius ungefähr in m und die Zeit in Millisekunden angegeben wird. Mit setSpeed(speed) kannst du noch die Geschwindigkeit in willkürlichen Einheiten im Bereich 0..100 wählen (default 50).  

Programm:

from ev3robot import *

robot = LegoRobot()
gear = Gear()
robot.addPart(gear)
gear.setSpeed(30)
gear.forward(2000)
gear.leftArc(0.3, 5000)
gear.rightArc(0.3, 5000)
robot.exit()
► In Zwischenablage kopieren

 

 

MERKE DIR...

 

Um den Roboter zu bewegen, stehen dir bisher folgende Befehle zur Verfügung:
forward(time) left(time) leftArc(radius, time)
backward(time) right(time) rightArc(radius, time)


robot.exit() beendet die Programmausführung. Wenn du diese Zeile vergisst, bleibt das Programm "hängen" und du kannst kein neues Programm mehr starten. Um ein hängendes oder fehlerhaftes Programm abzubrechen, drückst du auf dem EV3 die zwei Tasten DOWN+ENTER. Damit wird aber auch der Brickgate-Server beendet und du musst ihnNachher neu starten. Versuche mal als Übung, die exit-Zeile wegzulassen und den EV3 wieder zum Laufen zu bringen.

 

 

ZUM SELBST LÖSEN

 

 

1.
Ergänze das erste Musterbeispiel so, dass sich der Roboter ungefähr auf einem Quadrat bewegt.

 

2.
Der Roboter soll sich so lange auf einen Linksbogen bewegen, bis er ungefähr einen ganzen Kreis zurückgelegt hat. Danach soll er sich gleich lange auf einem Rechtsbogen bewegen.

 


3.


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

 

 

4.

Du kannst mit den Befehlen forward(time) und backward(time) auch nur die einzelnen Motoren bewegen. Dazu schreibst du

motA = Motor(MotorPort.A)
robot.addPart (motA)
motA.forward(2000)
wobei A die Bezeichnung der Anschlussbuchse auf dem EV3-Brick ist.

Schreibe ein Programm mit einzelnen Motoren so, dass sich der Roboter am Ort im Uhrzeigersinn dreht (also um das Zentrum des Bricks).

 

 

 

ZUSATZINFORMATION

 

Sämtliche Bewegungsfunktionen können auch ohne Zeitangabe (z.B. forward()), als sogenannte nichtblockierende Funktionen verwendet werden. Mit forwar() der Roboter in Zusatnd "fahre vorwärts" versetzt und kann sofort auf weitere Befehle reagieren. Währen beim blockierenden forward(3000) der nächste Befehl playTone() erst nach 3000 Millisekunden ausgeführt wird, hörst du beim nichtblockierendem forward() den Ton sofort. Mit Tools.delay bleint der Roboter 3000 Millisekunden lang im vorgegebenen Zustand.

blockierend   nichblockierend

Programm:

from ev3robot import *

robot = LegoRobot()
gear = Gear();
robot.addPart(gear);

gear.forward(3000)
robot.playTone(264, 400)
robot.exit()
► In Zwischenablage kopieren
 

Programm:

from ev3robot import *

robot = LegoRobot()
gear = Gear()
robot.addPart(gear)
gear.forward()
robot.playTone(264, 300)
Tools.delay(3000)
robot.exit()
► In Zwischenablage kopieren

 

   

 

2-1
Didaktische Hinweise:

In den folgenden Kapiteln werden auch Sensoren als Objekte mit ihren spezifischen Funktionen aufgefasst. Lego-Robotik eignet sich deshalb hervoerragend für die Einführung in das Objektorientierte Programmieren (OOP).

Die Punktschreibweise gear.forward() kann hier sehr anschaulich erklärt werden, da die Funktion forward() nur das Fahrwerkobjekt betrifft.

2-2
Didaktische Hinweise:

Die Unterscheidung zwischen blockierenden und nicht-blockierenden Funktionen ist von grosser Wichtigkeit weit über die Robotik hinaus. Sie ist aber für Programmieranfänger keineswegs evident und führt sogar für Fortgeschrittene immer wieder zu Schwierigkeiten. Im Zusammenhang  mit Echtzeitanwendungen, zu denen auch die Robotikprogramme gehören, werden nicht-blockierende Funktionen oft für  einen Zustandswechsel bzw. das Setzen eines neuen Zustands verwendet.

Das Programmieren mit Zuständen muss besonders gepflegt werden, denn es ist ein wichtiges Grundkonzept der Informatik. Die Robotik ist ein hervorragend geeignetes Betätigungsfeld für "das Denken in Zuständen".