Jython

1. Roboter bewegen


Die Programme für den EV3-Roboter und den NXT-Roboter unterscheiden sich nur in der Importzeile. Wenn Sie den NXT-Roboter haben, müssen Sie die erste Importzeile auskommentieren und die zweite aktivieren.
 
from ev3robot import *
#from nxtrobot import *

So wie ein realer Roboter aus verschiedenen Komponenten zusammengebaut ist, wird er in einem Programm softwaremässig modelliert. Ein Basismodel wird aus einem EV3- bzw. NXT-Brick (LegoRobot()) und aus einem Fahrwerk (Gear()) mit zwei Motoren zusammengebaut (robot.addPart(gear)).
 
robot = LegoRobot()
gear = Gear()
robot.addPart(gear)
Mit gear.forward() wird der Roboter in die Vorwärtsbewegung versetzt und bleibt mit 2000 Millisekunden in dieser Bewegung.
robot.exit() beendet das Programm.
Das Programm kann auch im Simulationsmodus ausgeführt werden.
 
gear.forward()
Tools.delay(2000) robot.exit()

Beispiel 1: Fahren und Richtung ändern

Der Roboter bewegt sich eine kurze Strecke vorwärts dreht 90° nach links und bewegt sich weiter eine kurze Strecke vorwärts.

# Ro1a.py

from ev3robot import *
#from simrobot import *
# from nxtrobot import *
  
robot = LegoRobot()
gear = Gear()
robot.addPart(gear)
gear.forward()
Tools.delay(2000)
gear.left()
Tools.delay(550)
gear.forward()
Tools.delay(2000)
robot.exit()
Programmcode markieren (Ctrl+C kopieren)
 


Erklärungen zum Programmcode:

from ev3robot import *: importiert das Modul ev3robot, welches die Befehle für den EV3-Roboter enthält

robot = LegoRobot: erzeugt ein Robot-Objekt
gear.forward(): das Fahrwerk wird in Vorwärtszustand versetzt. forward mit einer leeren Parameterklammer ist eine nicht blockierende Methode (der Roboter kann während der Vorwärtsbewegung auf weitere Befehle reagieren)
gear.left(): das Fahrwerk wird in den Zustand "links drehen" versetzt
Tools.delay(2000): der Roboter bleibt 2000 Millisekunden lang im vorgegebenen Zustand
robot.exit(): das Programm wird beendet

 

Beispiel 2: Fahren und Richtung ändern mit blockierenden Befehlen

Der sogenannt "blockierende" Befehl forward(2000) bewegt den Roboter während 2000 ms vorwärts. Während beim nichtblockierenden Befehl forward() der Roboter in den Vorwärtszustand versetzt wird und während dessen noch etwas anderes tun (z.B. Sensorwerte zurückgeben) kann, reagiert der Robotern bei forward(2000) erst nach 2000 ms auf weitere Befehle. Je nach Situaton werden mit Vorteil blockierende Befehle eingesetzt, da die Programmcodes dadurch einfacher sind. Die Programme im Beispiel 1 und 2 bewirken ganau das Gleiche.

# Ro1b.py

from ev3robot import *
# from simrobot import *
# from nxtrobot import *
  
robot = LegoRobot()
gear = Gear()
robot.addPart(gear)
gear.forward(2000)
gear.left(550)
gear.forward(2000)
robot.exit()
Programmcode markieren (Ctrl+C kopieren)
 

Erklärungen zum Programmcode:

gear.forward(2000): das Fahrwerk bewegt sich 2000 Millisekunden vorwärts - blockierende Methode. Während 2000 ms kann der Roboter nicht auf weitere Befehle reagieren.
gear.left(550): blockierende Methode. Das Fahrwerk dreht 550 Millisekunden (ca. 90°) nach links

 

Beispiel 3: Fahren und Richtung ändern mit TurtleRobot

Turtle-Robot ist ein Luxus-Modell für Programmieranfänger. Er ist bereits zusammengebaut und kann mit einfachen Befehlen forward(step), backward(step), left(angle) und right(angle) gesteuert werden, ähnlich wie Turtle in der Turtlegrafik. TurtleRobot eignet sich besonders gut für Aufgaben, bei welchen die Richtung rechtwinklig ändern muss, da mit left(90) bzw. right(90) exakt rechte Winkel gefahren werden.

# Ro1c.py

from ev3robot import *
# from simrobot import *
# from nxtrobot import *

robot = TurtleRobot()

robot.forward(100)
robot.left(90)
robot.forward(100)
robot.exit()
   
Programmcode markieren (Ctrl+C kopieren)
   

Erklärungen zum Programmcode:

robot = TurtleRobot(): erzeugt ein TurtleRobot-Objekt


Beispiel 4:
Einzelne Motoren Steuern

Die Befehle forward(), left() usw. steuern das ganze Fahrwerk, das aus zwei Motoren besteht. Man kann aber auch die einzelnen Motoren einschalten und ihre Geschwindigkeit regeln. Mit motA.forward(): wird der Motor am Motorport A in die Vorwärtsbewegung versetzt. Mit motB.setSpeed(20) kann man die Geschwindigkeit des Motors B ändern. Die Standardgeschwindigkeit ist 50. Wenn die Geschwindigkeiten der Beiden Motoren nicht gleich sind, bewegt sich der Roboter auf einem Kreisbogen.

# Ro1d.py

from ev3robot import *
#from simrobot import *

robot = LegoRobot()
motA = Motor(MotorPort.A)
motB = Motor(MotorPort.B)
robot.addPart(motA)
robot.addPart(motB)
motA.forward()
motB.setSpeed(20)
motB.forward()
Tools.delay(4000)
robot.exit()
   
Programmcode markieren (Ctrl+C kopieren)
   

Erklärungen zum Programmcode:

motA.forward(): bewegt den Motor am Port A vorwärts
motB.setSpeed(20): ändert die Geschwindigkeit des Motors am Port B

 

 


Aufgaben: Serie 1

1)

Der Roboter soll einen Gegenstand umfahren und dann die Fahrt in der ursprünglichen Richtung fortsetzen.


2)

Stelle mit mehreren Gegenständen ein Parcours auf und schreibe ein Programm, mit dem der Roboter vom Start zum Ziel fährt. Für die Simulation kannst du folgende Programmvorlage verwenden:

from simrobot import *

RobotContext.setStartPosition(320, 480)
RobotContext.useBackground("sprites/bg.gif")
  
robot = LegoRobot()
gear = Gear()
robot.addPart(gear)

Das Hintergrundbild bg.gif, welches im Programm als RobotContext verwendet wird, ist in der TigerJython-Distribution enthalten und kann direkt verwendet werden. Wenn du eigene Hintergrundbilder verwenden willst, muss du diese im Unterverzeichnis sprites des Verzeichnisses, in dem sich dein Programm befindet.