LBotics.at

Soll ein Roboter oder ein autonomes System unterschiedliche Aufgaben erledigen, so können entsprechende Codesegmente zusammengefasst und diesen ein Status zugewiesen werden. Dieser Status wird in einer Integer-Variable Status festgelegt, deren Wert für die Steuerung des Programmablaufs ausschlaggebend ist.

Die Informationen der Sensoren werden dazu herangezogen um darüber zu entscheiden, welches Codesegment ausgeführt werden soll. Zur besseren Übersichtlichkeit bietet es sich an, den Programmcode innerhalb der while-Schleife in zwei Bereiche zu unterteilen: Ereignisbehandlung und Aktionen

Ereignisbehandlung

Im Bereich Ereignisbehandlung werden die Sensordaten ausgewertet und aufgrund der jeweiligen Situation der Variable Status ein Wert zugewiesen. Erreicht die Ausführung des Programmcodes den Bereich Aktionen, so wird nur das Codesegment ausgeführt, das dem aktuellen Wert der Variable Status entspricht.

Ergänzend bietet es sich an, den jeweiligen Status in dem sich der Roboter gerade befindet, am Display anzuzeigen, um während der Ausführung des Programms gut nachvollziehen zu können, welches Codesegment gerade ausgeführt wird.

Bei dieser Strukturierung des Programmcodes ist gewährleistet, dass bereits beim nächsten Durchlauf der while-Schleife auf eine Veränderung der Umgebungssituation bzw. der Sensorinformationen reagiert werden kann. Voraussetzung ist natürlich, dass sich innerhalb der while-Schleife keine Codeteile (z. B. time.sleep(), oder weitere Schleifen, deren Ausführung eine bestimmte Zeit benötigen) befinden, welche die Ausführung des Programmcodes anhalten!

Mit dem folgenden Skript kann ein Roboter unterschiedliche Bewegungsabläufe (gerade aus, Kurve nach rechts, ...) fahren. Zunächst wird im Bereich Ereignisbehandlung abgefragt, ob der Joystick am CyberPi Controller in eine Richtung bewegt wurde. Davon ausgehend wird der Variable Status ein Wert zwischen 1 und 5 zugewiesen.

Aktionen

Im Bereich Aktionen wird dann die Variable Status auf ihren Wert hin überprüft und der, dem jeweiligen Status zugeordnete Programmcode ausgeführt.

Da die Variable Status zu Beginn den Wert 0 zugewiesen bekommt und es für diesen Status kein Codesegment im Bereich Aktionen gibt, steht der Roboter beim Start des Skripts und beginnt erst zu fahren, wenn der Joystick in eine der vier Richtungen gedrückt wird.

Durch Drücken des Joysticks in der Mitte soll der Roboter stehen bleiben.

Beispiel - Ablaufsteuerung mit Buttons
import cyberpi, mbot2

Status = 0

while True:

# Ereignisbehandlung
if cyberpi.controller.is_press("middle")==True:
Status = 1 # stehen bleiben
if cyberpi.controller.is_press("up")==True:
Status = 2 # vorwärts fahren
if cyberpi.controller.is_press("down")==True:
Status = 3 # rückwärts fahren
if cyberpi.controller.is_press("right")==True:
Status = 4 # nach rechts drehen
if cyberpi.controller.is_press("left")==True:
Status = 5 # nach links drehen

# Aktionen
if Status==1: # stehen bleiben
mbot2.EM_set_speed(0,1)
mbot2.EM_set_speed(0,2)
if Status==2: # vorwärts fahren
mbot2.EM_set_speed(50,1)
mbot2.EM_set_speed(-50,2)
if Status==3: # rückwärts fahren
mbot2.EM_set_speed(-20,1)
mbot2.EM_set_speed(20,2)
if Status==4: # nach rechts drehen
mbot2.EM_set_speed(30,1)
mbot2.EM_set_speed(0,2)
if Status==5: # nach links drehen
mbot2.EM_set_speed(0,1)
mbot2.EM_set_speed(-30,2)
Erklärungen zu diesem Programmbeispiel
Zeile 3: Status = 0

Festlegen des Werts der Variable Status zu Beginn des Skripts.

Zeile 8-17: if cyberpi.controller.is_press("middle")==True:

Im Bereich Ereignisbehandlung wird mit den entsprechenden Funktionen ermittelt, ob einer der Joystick gedrückt wurde. Abhängig von der entsprechenden Richtung wird der Variable Status einer der Werte zwischen 1 und 5 zugewiesen.

Zeile 20-34 if Status==1:

In den if-Abfragen im Bereich Aktionen wird überprüft, welchen Wert die Variable Status hat. Innerhalb der if-Abfragen befindet sich der Code, der bei einem bestimmten
Status ausgeführt werden soll.