TigerJython4Kids
HomeTurtlegrafikRobotikDatenbanken
bewegen

2. ROBOTER BEWEGEN

 

 

DU LERNST HIER...

 

einige weitere Befehle kennen, um den Roboter zu bewegen und was blockierende und nicht-blockierende Funktionen sind.

 

 

MUSTERBEISPIEL

 

Der Roboter soll 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 machst du mit den Befehlen leftArc(radius, time) bzw. rightArc(radius, time), wobei der Bogenradius in Metern und die Zeit in Millisekunden angegeben wird. Mit setSpeed(speed) kannst du noch die Geschwindigkeit im Bereich 0..100 wählen.

 


from raspisim import *
#from raspibrick import *

robot = Robot()
gear = Gear()
gear.setSpeed(40)
gear.forward(2000)
gear.leftArc(0.3, 5000)
gear.rightArc(0.3, 5000)
robot.exit()
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)

Der Aufruf gear.forward(2000) setzt den Roboter während 2 Sekunden in den Vorwärtszustand. Am Ende dieser Zeit stoppt der Roboter und erst jetzt fährt das Programm mit der nächsten Anweisung weiter. Das Programm blockiert also während 2 Sekunden.

 

 

In vielen Anwendungen muss der Roboter auch während seinen Bewegungen in der Lage sein, Programmanweisungen auszuführen. Dazu sind die blockierenden Funktionen wie forward(2000) nicht geeignet. Mit nicht-blockierenden Funktionen schreibst du das Musterprogramm wie folgt:

  • Du versetzt den Roboter mit forward() (ohne Zeitparameter)  in den Vorwärts-Zustand. Er bewegt sich jetzt vorwärts und das Programm fährt sofort mit der nächsten Anweisung weiter
  • Das Programm wartet während 2 Sekunden (es könnte während dieser Zeit aber auch etwas anderes tun)
  • Du versetzt den Roboter mit leftArc() in den Linksbogen-Zustand. Er bewegt sich jetzt auf einem Linksbogen und das Programm fährt mit nächsten Anweisung weiter
  • Du wartest im Programm 5 Sekunden
  • Du versetzt den Roboter mit rightArc() in den Rechtsbogen-Zustand. Er bewegt sich jetzt auf einem Rechtsbogen und das Programm fährt mit nächsten Anweisung weiter
  • Du wartest im Programm um 5 Sekunden
  • Du stoppst mit  robot.exit() den Roboter (du könntest auch stop() verwenden).

Das Musterbeispiel mit nicht-blockierenden Funktionen sieht dann so aus:

from raspisim import *
#from raspibrick import *

robot = Robot()
gear = Gear()
gear.setSpeed(40)
gear.forward()
Tools.delay(2000)
gear.leftArc(0.3)
Tools.delay(5000)
gear.rightArc(0.3)
Tools.delay(2000)
robot.exit()
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)

 

 

MERKE DIR...

 

Du kannst ein Programm mit blockierenden oder nicht-blockierenden Funktionen schreiben. Wenn dein Programm aber während der Bewegung andere Aufgaben erledigen muss, so musst du nicht-blockierende Funktionen verwenden.

 

 

ZUM SELBST LÖSEN

 

 

1a)
Der Roboter soll sich so lange auf einen Linksbogen bewegen, bis er einen ganzen Kreis zurückgelegt hat. Danach soll er sich gleich lange auf einem rechtsbogen bewegen. Verwende blockierende Funktionen.  
1b)

Schreibe dasselbe Programm mit den nicht-blockierenden Funktionen leftArc(radius) und rightArc(radius).


2a)


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("sprites/bg.gif") 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, x-Achse nach rechts, y-Achse nach unten). Das Programm beginnt also mit

from simrobot import *
RobotContext.useBackground("sprites/bg.gif")
RobotContext.setStartPosition(310, 480)

2b)

Erstelle ein eigenes Bild, das deinem realen Parcours entspricht (Grösse 501x501 Pixels) und kopiere es in das Verzeichnis, in dem sich dein Programm befindet. In deinem Programm rufst du das Bild im RobotContext wie folgt auf:

RobotContext.useBackground("mybackground.gif")

Schreibe ein dazu gehörendes Programm im Real- und Simulationsmodus.

Anmerkung: Du kannst im Realmodus die Zeilen mit RobotContext stehen lassen, da sie keinen Einfluss auf die Programmausführung haben.

 

   

 

2-1
Fachliche Hinweise:

Für Echtzeitsysteme sind blockierende Funktionen gefährlich, da sie leicht ein Programm vollständig blockieren können (man sagt auch, das Programm "hängt"). Dies kann vermieden werden, wenn die Funktion nach einer bestimmten Zeit (timeout genannt) zurückkehrt, auch wenn sie ihre Aufgabe noch nicht erledigt hat. Dieser Ausnahmefall muss dann speziell behandelt werden.

2-1
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. Es sind typische Funktionen mit einem Seiteneffekt, denn nach der Rückkehr hat sich ja der Zustand verändert.

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".