LBotics.at

Hier wird gezeigt, wie zeitgesteuerte Bewegungsabläufe in die im Abschnitt Ereignisbehandlung vorgestellte Codestrukturierung integriert werden können. Der Roboter, der hier zum Einsatz kommen soll verfügt über zwei Motoren für den Antrieb und einen Abstandssensor an der Vorderseite um vor dem Berühren eines Hindernisses rechtzeitig stehen bleiben zu können.

Wichtigstes Ziel bei der Umsetzung ist, dass der Programmcode innerhalb der while-Schleife so schnell wie möglich durchlaufen wird und dieser an keiner Stelle durch die Verwendung der Funktion time.sleep() oder eine weitere Schleife, die auf das Eintreten eines Ereignisses wartet, angehalten wird.

So ist gewährleistet, dass die if-Abfragen im Bereich Ereignisbehandlung ununterbrochen und in möglichst kurzen Zeitabständen hintereinander ausgeführt werden und somit umgehend auf Sensor-Informationen reagiert werden kann.

Mit diesem Skript soll der Roboter durch einen Druck auf den dreieckigen Button am Cyberpi Controller einen vorgegebenen, zeitgesteuerten Pfad abfahren und vor einer möglichen Kollision jederzeit rechtzeitig anhalten. Auch soll es möglich sein, den Roboter jederzeit durch Drücken des quadratichen Tasters am Cyberpi Controller anzuhalten.

Dazu wird diese Aufgabenstellung in drei Status-Bereiche unterteilt:

Status 0 - Start des Skripts, keine Aktionen

Wird das Skript gestartet, so ist der Roboter im Status 0 und führt keine Aktionen aus.

Status 1 - zeitgesteuerter Pfad

Durch einen Druck auf den dreieckigen Button (Button "B") am Controller wird der Status auf 1 gesetzt und der Timer auf 0 gesetzt. In der Folge wird der Code ausgeführt, der Status 1 zugeordnet ist und den Roboter folgenden Pfad abfahren lässt: 2 Sekunden vorwärts, 1 Sekunde Drehung, 1 Sekunde vorwärts

Status 2 - Kollision

Wird die Distanz des Abstandsensors und einem möglichen Hindernis kleiner als 10 cm, wird die Variable Status auf 2 gesetzt. In dem dazugehörenden Code werden beide Motoren angehalten und der Roboter bleibt vor dem Hindernis stehen.

Auch durch ein Druck auf den quadratischen Button (Button "A") wird die Variable Status auf 2 gesetzt, wodurch der Roboter auch stehen bleibt.

Das Abfahren des vorgegebenen Pfades kann jederzeit durch Drücken des dreieckigen Buttons (Button "B")  wieder gestartet werden.

Beispiel - Zeitgesteuerter Bewegungsablauf mit Kollisionsabfrage
import cyberpi, mbot2, mbuild

Status = 0

while True:

# Ereignisbehandlung
if cyberpi.controller.is_press("B"):
cyberpi.timer.reset()
Status = 1
if mbuild.ultrasonic2.get()<10:
Status = 2
if cyberpi.controller.is_press("A"):
Status = 2

# Aktionen
if Status==1:
if cyberpi.timer.get()>=0 and cyberpi.timer.get()<2:
mbot2.EM_set_speed(50,1)
mbot2.EM_set_speed(-50,2)
if cyberpi.timer.get()>=2 and cyberpi.timer.get()<3:
mbot2.EM_set_speed(0,1)
mbot2.EM_set_speed(-30,2)
if cyberpi.timer.get()>=3 and cyberpi.timer.get()<4:
mbot2.EM_set_speed(50,1)
mbot2.EM_set_speed(-50,2)
if cyberpi.timer.get()>=4:
mbot2.EM_set_speed(0,1)
mbot2.EM_set_speed(0,2)

if Status==2:
mbot2.EM_set_speed(0,1)
mbot2.EM_set_speed(0,2)
Erklärungen zu diesem Programmbeispiel
Zeile 3: Status = 0

Festlegen des Werts der Variable Status zu Beginn des Skripts.

Zeile 8-10: if cyberpi.controller.is_press("B")==True:

Wurde der dreieckige Taster am Controller gedrückt, so wird der Timer zurückgesetzt, beginnt also bei 0 zu zählen und die Variable Status bekommt den Wert 1.

Zeile 11-12: if mbuild.ultrasonic2.get()<10:

Misst der Ultraschallsensor eine Distanz kleiner 10 cm, so wird der Wert der Variable Status auf den Wert 2 gesetzt.

Zeile 13-14: if cyberpi.controller.is_press("A")==True:

Wurde der quadratische Taster am Controller gedrückt bekommt die Variable Status auch den Wert 2.

Zeile 17-29: if Status==1:

Befindet sich der Roboter in diesem Status, so fährt dieser den vorgegebenen Pfad ab. Basierend auf der Zeit, die seit dem Zurücksetzen des Timers vergangen ist, werden bei den Motoren in unterschiedlichen Zeitinterfallen die jeweiligen Umdrehungsgeschwindigkeiten gesetzt.

Zeile 31-33: if Status==2:

Hat die Variable Status den Wert 2, so werden beide Motoren angehalten.