repeat

3. BEFEHLE WIEDERHOLEN, FUNKTIONEN

 

 

DU LERNST HIER...

 

wie ein Roboter bestimmte Befehlssequenzen wiederholen kann und wie du mit benannten Programmblöcken (Funktionen) deine Programme besser strukturieren kannst.

 

 

MUSTERBEISPIELE

 


Beispiel 1: Quadrat fahren
Um ein Quadrat zu fahren, muss der Roboter vier Mal eine Strecke vorwärts fahren und um 90° drehen. Für die sich wiederholende Bewegung verwendest du eine repeat-Schleife. Diese wird mit repeat eingeleitet gefolgt von Anzahl Wiederholungen und einem Doppelpunkt. Die Befehle, die wiederholt werden sollen, müssen eingerückt sein.

 

from grobot import *
            
repeat 4: 
    forward()
    delay(2000)
    left()
    delay(550)
stop()
► In Zwischenablage kopieren

Führe das Programm zuerst im Simulationsmodus aus. Im Realmodus musst du eventuell die Zeit beim Linksdrehen anpassen.

Im Unterschied zur Simulation, bei der der Roboter ein Quadrat ganz exakt abfahren kann, ist es beim realen Roboter schwierig, exakt geradeaus zu fahren und exakt in einem rechten Winkel abzubiegen. Dies entspricht der Wirklichkeit, denn kein Auto wird bei starrer Radstellung, d.h. blockierter Steuerung, je exakt geradeaus fahren, man muss immer wieder regulierend eingreifen. Deswegen sind Roboter mit Sensoren ausgerüstet, die ihnen helfen, diese Ungenauigkeiten zu korrigieren. Verwende also nicht zu viel Zeit, um dem Roboter ein exaktes Quadrat fahren beizubringen.


 

Beispiel 2: Befehle beliebig oft wiederholen
In vielen Situationen führt ein Roboter gewisse Tätigkeiten "endlos" aus, bzw. solange bis er abgeschaltet oder das Programm abgebrochen wird. Zum Beispiel, wenn er ständig Sensordaten zurückmelden muss. Dafür verwendet man eine repeat-Schleife ohne Anzahl Wiederholungen.

In deinem Beispiel besucht der Roboter endlos vier Orte, die auf Wegen liegen, die rechtwinklich zu einander stehen und fährt jeweils wieder rückwärts zum Ausgangspunkt.

 


from grobot import *
            
repeat: 
    forward()
    delay(2000)
    backward()
    delay(2000)
    left()
    delay(550)
► In Zwischenablage kopieren

Hier ist es nützlich zu wissen, wie man ein laufendes Programm abbrechen kann: Am einfachsten geht es mit Schliessen des Terminalfensters. Du kannst ein Programm auch durch gleichzeitiges Drücken von ENTER und DOWN auf dem EV3-Brick abbrechen. Dabei wird aber auch das Brickgate-Programm beendet und muss erneut mit dem ENTER-Button gestartet werden.


 

Beispiel 3: Programme mit eigenen Funktionen strukturieren
Mit benannten Programmblöcken, in Python Funktionen genannt, kannst du deine Programme besser strukturieren. Es ist eine wichtige Programmiertechnik, denn komplexere Programme können mit Hilfe von Funktionen in kleinere, leichtprogrammierbare Teilprogramme zerlegt werden. Mit Vorteil werden Funktionen auch eingesetzt, wenn ein Programmblock mehrmals verwendet wird.

Eine Funktionsdefinition beginnt immer mit dem Schlüsselwort def. Darauf folgen ein Funktionsname, eine Parameterklammer und ein Doppelpunkt. Die Anweisungen im Funktionskörper sind eingerückt. Im Hauptprogramm wird die Funktion aufgerufen.

In deinem Beispiel definierst du eine Funktion blink(), die das einmalige aufleuchten der roten LED bewirkt. Im Hauptprogramm macht der Roboter eine ähnlich Bewegung wie im vorhergehenden Beispiel. Bevor er rückwärtsfährt hält er an, Blinkt zweimal und fährt rückwärts zum Ausgangspunkt.
from grobot import *

def blink():
    setLED(2)
    delay(500)
    setLED(0)
    delay(500)

repeat 4:
    forward()
    delay(2000)
    stop()
    blink()
    blink()
    backward()
    delay(2000)
    left(550)
► In Zwischenablage kopieren
 





 

MERKE DIR...

 

Um ein Programmblock n mal zu wiederholen, verwendest du eine repeat-Schleife:
 repeat n:
     Anweisungen

Um ein Programmblock endlos zu wiederholen, verwendest du eine  Endlos-Schleife:
 repeat:
     Anweisungen
Die eingerückten Zeilen werden so lange wiederholt, bis man das Programm mit Schliessen des Terminalfensters abbricht.

Mit Funktionen kannst du deine Programme besser strukturieren und Code-Dupplikation vermeiden.

 

 

ZUM SELBST LÖSEN

 

 

1.
Der Roboter startet in der Mitte, fährt eine kurze Strecke vorwärts und dann rückwärts zurück zum Ausgangspunkt. Dann dreht er etwa um 120° nach rechts. Diese Befehlssequenz wiederholt er drei Mal.  


2.
Der Roboter bewegt sich zuerst auf einem Linksbogen bis er den ganzen Kreis zurückgelegt hat und dann auf einem Rechtsbogen bis er den ganzen Kreis zurückgelegt hat. Diese Bewegung wiederholt er "endlos" wobei, jedesmal, wenn die beiden Kreise zurückgelegt hat, bleibt er 1000 ms stehen und schaltet während dieser Zeit den Alarm ein.  


3.

Definiere eine Funktion step(), mit der dein Roboter ein Tritt abfährt. Rufe die Funktion dann dreimal auf, so dass der Roboter die nebenstehende Figur abfährt.
Löse die Aufgabe zuerst im Simulationsmodus.

 

4.
Der Roboter bewegt sich "endlos" auf einer Kreisbahn mit dem Radius 0.2 m. Jedesmal wenn er einen ganze Kreis zurückgelegt hat, hält er für 3 Sekunden an und schaltet während dieser Zeit den Alarm ein. Danach schaltet er den Alarm aus und bewegt sich weiter auf der Kreisbahn. Löse die Aufgabe zuerst im Simulationsmodus.

 
 

 

   

 

   

 

3-1
Didaktische Hinweise:

Der autonome Modus entspricht eher der üblichen Vorstellung eines Roboters, der nach seiner Programmierung keine Verbindung zu einem externen Computer mehr benötigt. Er ist auch der der bevorzugte Modus für Roboter-Wettbewerbe.

Für die Programmentwicklung und Demonstrationen ist der Remote Modus hingegen sehr praktisch, da die Programme nicht heruntergeladen werden und deswegen schneller starten. Zudem muss am Roboter selbst weniger manipuliert werden.

3-2
Fachliche Hinweise:

Der Brickgate-Server ist ein TCP-Socket-Server, der auf IP Port 1299 die vom PC gesendeten Befehle empfängt und die entsprechenden autonomen Funktionen aufruft. Falls diese einen Rückgabewert haben, wird dieser  an den PC zurück gesendet.

3-3
Fachliche Hinweise:

Man nennt eine solche Schleife auch Event-Loop, da getestet wird, welcher der Tastenevents seit dem letzten Durchlauf aufgetreten ist. Die Funktion isNNHit() prüft nämlich nicht, ob die Taste gerade im Augenblick des Aufrufs gedrückt ist, sondern ob seit dem letzten Aufruf der Funktion die Taste irgend einmal gedrückt wurde. Dieses Verfahren hat grosse Vorteile, denn es gehen kein Tastenevents "verloren", weil das Programm das Drücken der Taste verpasst.

1-1
Fachliche Hinweise:

Wenn ein Roboter bestimmte Befehle mehrmals wiederholen muss, kannst du die betreffenden Programmzeilen zu einem Programmblock zusammenfassen und diesen mit einer for-Schleife mehrmals durchlaufen. Die Zeilen im Programmblock müssen eingerückt sein und am Ende der for-Anweisung muss ein Doppelpunkt sein.

for i in range(n):
    Befehl 1
    Befehl 2
    ......  

Hier werden die eingerückten Zeilen n mal wiederholt, wobei n eine beliebige positive ganze Zahl ist. Mehr dazu findest du im Kapitel while&for im Teil Turtlegrafik.

Beachte, dass du bei der Robotik für die Wiederholung repeat nicht verwenden darfst.