lehrkraefte:snr:informatik:glf22:robotik:einfache-bewegungen

Alternative:

  • Vorwärtsfahren: Beide Räder um denselben Winkel drehen und Abmessen, wie weit der Roboter gefahren ist. Dann entsprechend umrechnen (alles bei fester Geschwindigkeit; eventuell mehrere Geschwindigkeiten).
  • Ähnlich beim Kreisbogenfahren?

Basisbewegungen: Vorwärts, Drehen, Abbiegen

Du kannst dem Roboter befehlen, dass er das linke bzw. rechte Rad um einen gewissen Winkel mit einer gewissen Geschwindigkeit drehen soll.

Der Winkel wird dabei in Grad, die Drehgeschwindigkeit in $\frac{\text{Grad}}{\text{Sekunde}}= \frac{\phantom{x}^\circ}{\text{s}}$ angegeben.

Beispielsweise bewirkt der Befehl

links.run_angle(120, 10)   

eine Drehung des linken Rades um $10^\circ$ mit einer Drehgeschwindigkeit von $\frac{120^\circ}{\text{s}}$.

In den folgenden Aufgaben wirst du dies nutzen, um dem Roboter einfache Bewegungen beizubringen (so dass du ihn ähnlich wie die Turtle bei der Turtle-Grafik steuern kannst).

Der Roboter soll eine gewisse Distanz (in Zentimeter) vorwärts fahren. Durch Abmessen des Raddurchmessers berechnest du, um welchen Winkel sich jedes der beiden Räder drehen muss.

Kopiere den folgenden Code-Block ans Ende des durch “Create a new project” erstellten Programms.

Lies das Programm Zeile für Zeile und ersetze die fünf ?? sinnvoll. Nur für das erste ?? ist eine konkrete Zahl einzutragen, der Rest ergibt sich daraus.

# Bitte sicherstellen, dass dein Computer im tech-lab-Netz ist und nicht in Schule SG o.ä..
 
###############
#  AUFGABE 1  #
###############
 
ev3.speaker.say(text="Hello I am Robby the robot")
 
links = Motor(Port.A)
rechts = Motor(Port.B)
 
# Checke die Kabelverbinungen!
 
from math import pi
# Damit ist pi = 3.14152... benutzbar.
 
raddurchmesser = ??   # Bitte abmessen! Alle Längen in cm.
radumfang = ??        # Formel in Abhängigkeit vom Raddurchmesser
 
# Rad: Drehwinkel und dabei zurückgelegte Strecke  
# 360 Grad        ≙ radumfang (in cm)
# ??              ≙ 1 cm
 
rad_drehwinkel_pro_cm = ??
 
def vorwaerts(distanz):    
    # Der Roboter bewegt sich geradlinig vorwärts.
    # Die Variable "distanz" gibt an, 
    # um wie viele cm er sich bewegt.
 
    alpha = ??   # Winkel, um den sich jedes der beiden Räder drehen muss.
    links.run_angle(120, alpha, wait=False)   
    # Bewegt den linken Motor, also das linke Rad, mit 
    # (1) 120 Grad/s Drehgeschwindigkeit
    # (2) alpha als Drehwinkel.
    # (3) Wartet nicht, bis die Drehung vollständig ausgeführt ist; 
    #     der Roboter kann sofort einen weiteren Befehl verarbeiten.
 
    rechts.run_angle(120, alpha, wait=True)   
    # Dito mit dem rechten Motor, aber nun wird gewartet, 
    # bis die Raddrehung beendet ist.
 
    links.stop()
    rechts.stop()
 
vorwaerts(100)
 
# Ändere die Variable "raddurchmesser" so, 
# dass der Roboter möglichst genau 100 cm fährt.
 
# Wenn du zufrieden bist, kannst du den Befehl "vorwaerts(100)" 
# löschen und die nächste Aufgabe bearbeiten.

Der Roboter soll sich auf der Stelle um einen gewissen Winkel drehen (in mathematisch positivem Drehsinn, also dem Gegenuhrzeigersinn).

Genauer soll der Mittelpunkt der Roboterdrehung genau in der Mitte der Radachse liegen, so dass sich die beiden Räder in entgegengesetzten Richtungen drehen müssen. Der Drehwinkel der beiden Räder ist auszurechnen. Zusätzlich zum bereits gemessenen Raddurchmesser benötigst du den Radabstand (= Abstand der “Mittelpunkte der Reifen”).

Achtung: Es gibt zwei “Drehwinkel”:

  • den Drehwinkel des Roboters (um die vertikale Achse durch den Achsenmittelpunkt)
  • den Drehwinkel der Räder.

Kopiere den folgenden Code-Block ans Ende deines in Aufgabe 1 erstellten Programms.

Lies das Programm Zeile für Zeile und ersetze die sechs ?? sinnvoll. Nur für das erste ?? ist eine konkrete Zahl einzutragen, der Rest ergibt sich daraus (etwa per Dreisatz).

#############################################################################
 
###############
#  AUFGABE 2  #
###############
 
radabstand = ??  # in cm; bitte abmessen; Abstand zwischen den Reifenmitten
 
def drehe(drehwinkel_roboter):
    # Der Roboter dreht sich AUF DER STELLE um den angegebenen Winkel.
    # Drehzentrum ist die Mitte zwischen den Rädern.
 
    # Strecke eines Rades bei Roboterdrehung um 360 Grad:  2 * pi * (radabstand / 2) 
    # Strecke eines Rades bei Roboterdrehung um 1 Grad:    ??  
 
    # Die folgenden Variable soll die Strecke eines Rades
    # bei der gewünschten Roboterdrehung speichern:
    strecke = ??
 
    # Dies muss nun umgerechnet werden in den Winkel,
    # um den sich jedes Rad drehen muss:
    drehwinkel_rad = ??
 
    rechts.run_angle(120, ??, wait=False)   
    links.run_angle(120, ??, wait=True)   
 
    links.stop()
    rechts.stop()    
 
vorwaerts(20)
drehe(360)
vorwaerts(20)
drehe(180)
vorwaerts(20)
 
# Ändere die Variable "radabstand" so, 
# dass der Roboter sich möglichst genau
# um den gewünschten Winkel dreht.
 
# Wenn du zufrieden bist, kannst du den obigen Befehlsblock "vorwaerts(20); drehe(360); ... " löschen und die nächste Aufgabe bearbeiten.

Der Roboter soll nun einen durch Kreisradius und Winkel festgelegten Kreisbogen abfahren. Dabei müssen sich die beiden Räder unterschiedlich schnell drehen.

Kopiere den folgenden Code-Block ans Ende deines in Aufgabe 2 erstellten Programms.

Lies das Programm Zeile für Zeile und ersetze die elf ?? sinnvoll (etwa per Dreisatz).

#############################################################################
 
###############()
#  AUFGABE 3  #
###############
 
def biege_ab(kreisradius, winkel_kreiszentrum, drehsinn):
    # Der Roboter fährt einen durch Radius und Innenwinkel gegebenen Kreisbogen.
    # Der Drehsinn (Links- bzw. Rechtskurve) wird durch den String 
    # "links" oder "rechts" festgelegt.
 
    # Bewegung eines fiktiven Rades in Robotermitte 
    # (bzw. genauer in der Mitte der Radachse):
 
    # Winkel im Kreiszentrum ≙ Länge des Kreisbogens       
    # 360 Grad               ≙ ??        # verwende die Variable "kreisradius" 
    # 1 Grad                 ≙ ??
 
    # Welche Strecke legt also das fiktive Rad zurück?
    robotermitte_strecke = ??
 
    # Um welchen Winkel dreht sich das fiktive Rad dabei?
    robotermitte_rad_drehwinkel = 
 
    # Das fiktive Rad in Robotermitte soll sich mit 120 Grad/s drehen.
    # 120 Grad ≙ 1 s  
    #   1 Grad ≙ ??
 
    # Wie lange dreht sich das fiktive Rad?
    zeit =  ??
 
    # Berechnung der Drehgeschwindigkeit des äusseren Rades.
    aussen_strecke =            ?? # Ähnlich wie "robotermitte_strecke" oben
    aussenrad_drehwinkel =      ?? # Ähnlich wie "robotermitte_rad_drehwinkel" oben
    aussenrad_geschwindigkeit = ?? bitte in Grad pro Sekunde angeben
 
    # Berechnung der Drehgeschwindigkeit des inneren Rades.
    # Das geht nun fast genauso wie beim äusseren Rad.
    innen_strecke =            ??
    innenrad_drehwinkel =      ??
    innenrad_geschwindigkeit = ??
 
    if drehsinn == "links":
        links.run_angle(innenrad_geschwindigkeit, innenrad_drehwinkel, wait=False)   
        rechts.run_angle(aussenrad_geschwindigkeit, aussenrad_drehwinkel, wait=True)   
    else:
        rechts.run_angle(innenrad_geschwindigkeit, innenrad_drehwinkel, wait=False)   
        links.run_angle(aussenrad_geschwindigkeit, aussenrad_drehwinkel, wait=True)   
    links.stop()
    rechts.stop()    
 
vorwaerts(20)
biege_ab(50, 90, "links")
vorwaerts(20)
biege_ab(50, 90, "rechts")
 
# Hoffentlich fährt dein Roboter (in etwa) wie gewünscht.

Lass den Roboter einen Meter entfernt von einem Drehstuhl starten. Der Roboter soll relativ nah an den Drehstuhl heranfahren, ihn einmal umrunden und dann wieder an den Ausgangspunkt zurückkehren. Am Ende soll der Roboter genauso ausgerichtet sein wie am Anfang.

  • lehrkraefte/snr/informatik/glf22/robotik/einfache-bewegungen.txt
  • Last modified: 2023/06/27 16:29
  • by Olaf Schnürer