lehrkraefte:blc:informatik:glf25:robotik:distanzfahren

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
lehrkraefte:blc:informatik:glf25:robotik:distanzfahren [2025/11/21 07:59] – created Ivo Blöchligerlehrkraefte:blc:informatik:glf25:robotik:distanzfahren [2025/11/24 13:58] (current) – [Langsam anfahren und abbremsen] Ivo Blöchliger
Line 2: Line 2:
 ====== Geradeausfahren ====== ====== Geradeausfahren ======
 <WRAP todo> <WRAP todo>
-  * [[.:einrichten#neues_projekt_anlegen|Legen Sie in neues Projekt an]] z.B. mit dem Namen ''geradeausfahren''+  * [[.:einrichten#neues_projekt_anlegen|Legen Sie in neues EV3-Projekt an]] (in VS-Code) z.B. mit dem Namen ''geradeausfahren''
-  * Am Ende des Programms, kommentieren Sie das Piepsen aus und fügen Sie folgende zwei Zeilen hinzu:+  * Am Ende des Programms (in der Datei ''main.py''), kommentieren Sie das Piepsen aus und fügen Sie folgende zwei Zeilen hinzu:
 <code python> <code python>
 links = Motor(Port.A)   # Kontrollieren Sie, ob die Motoren auch an den richtigen Ports angeschlossen sind. links = Motor(Port.A)   # Kontrollieren Sie, ob die Motoren auch an den richtigen Ports angeschlossen sind.
Line 12: Line 12:
 </code> </code>
   * Stellen Sie den Roboter auf den Boden, bevor Sie den Code testen. Der Roboter sollte eine Radumdrehung nach vorne fahren.   * Stellen Sie den Roboter auf den Boden, bevor Sie den Code testen. Der Roboter sollte eine Radumdrehung nach vorne fahren.
-  * Am Anfang Ihres Programms, fügen Sie folgenden import hinzu (damit der Wert ''pi'' bekannt ist):+  * Am Anfang Ihres Programms, nach den anderen ''import'' Statements, fügen Sie folgenden import hinzu (damit der Wert ''pi'' bekannt ist):
 <code python> <code python>
 from math import pi  # Wert pi importieren from math import pi  # Wert pi importieren
Line 20: Line 20:
  
  
-====== Eine bestimmte Strecke fahren ======+====== Einen Meter fahren ======
 Ziel ist es, dass der Roboter möglichst genau einen Meter zurücklegt. Ziel ist es, dass der Roboter möglichst genau einen Meter zurücklegt.
  
   * Dazu soll nicht einfach gut geraten werden, sondern durch Messung und geschickte Korrektur soll folgende Konstante für Ihren Roboter und den Teppich-Untergrund möglichst genau bestimmt werden:   * Dazu soll nicht einfach gut geraten werden, sondern durch Messung und geschickte Korrektur soll folgende Konstante für Ihren Roboter und den Teppich-Untergrund möglichst genau bestimmt werden:
 +    * ''radDurchmesser'' in cm. Daraus berechnen Sie (Konstante ''pi'' wurde durch den import definiert):
     * ''gradProCM'' gibt an, um wie viele Grad sich das Rad für einen cm Vorwärtsfahrt drehen muss.     * ''gradProCM'' gibt an, um wie viele Grad sich das Rad für einen cm Vorwärtsfahrt drehen muss.
   * Der gewünschte Drehwinkel für 1 m ist dann ''100*gradProCM''.   * Der gewünschte Drehwinkel für 1 m ist dann ''100*gradProCM''.
  
 <WRAP todo> <WRAP todo>
-  * Bestimmen Sie durch Messung die Konstante ''gradProCM'' für Ihren Roboter. +  * Bestimmen Sie durch Messung die Konstante ''radDurchmesser'' und berechnen Sie daraus direkt im Code die Konstante ''gradProCM'' für Ihren Roboter. 
-  * Fahren Sie damit einen Meter und testen Sie.+  * Fahren Sie damit genau einen Meter und testen Sie.
   * Fahren Sie schneller. Welche Probleme tauchen auf?   * Fahren Sie schneller. Welche Probleme tauchen auf?
 </WRAP> </WRAP>
 +
 +<hidden Lösungsvorschlag>
 +<code python>
 +radDurchmesser = 6                             # Raddurchmesser in cm
 +gradProCM = 360/(radDurchmesser*pi)            # Ergibt um die 20 Grad/cm (Feinjustierung mit 1m fahren).
 +
 +distanz = 100     # 1m fahren
 +
 +links.run_angle(120, distanz*gradProCM, wait=False)   # 120 Grad/s Drehgeschwindigkeit, eine volle Rad-Umdrehung, nicht warten, sondern gleich den nächsten Befehl ausführen.
 +rechts.run_angle(120, distanz*gradProCM, wait=True)   # Dito, aber warten, bis fertig gedreht.
 +</code>
 +</hidden>
  
 ====== Langsam anfahren und abbremsen ====== ====== Langsam anfahren und abbremsen ======
Line 40: Line 53:
 Dazu soll folgende Funktion ergänzt werden (nach der Definition von ''links'', ''rechts'' und ''gradProCM'' zu platzieren): Dazu soll folgende Funktion ergänzt werden (nach der Definition von ''links'', ''rechts'' und ''gradProCM'' zu platzieren):
 <code python> <code python>
-def smoothRide(distanz, vmax):  # Fährt gegebene distanz in cm mit maximaler Geschwindigkeit vmax+def smoothRide(distanz, vmax):  # Fährt gegebene distanz in cm mit maximaler Geschwindigkeit vmax in cm/s
    # Winkel zurücksetzen:    # Winkel zurücksetzen:
    links.reset_angle(0)    links.reset_angle(0)
Line 48: Line 61:
       s = links.angle()/gradProCM     # Bereits zurückgelegte Strecke       s = links.angle()/gradProCM     # Bereits zurückgelegte Strecke
              
-      goodSpeed = 120                 # Hier aus der bereits zurückgelegten Distanz die Geschwindigkeit berechnen.+      = 120                 # Hier aus der bereits zurückgelegten Distanz die Geschwindigkeit berechnen.
              
-      links.run(goodSpeed+      links.run(v*gradProCM
-      recht.run(goodSpeed)+      recht.run(v*gradProCM)
    rechts.stop()    rechts.stop()
    links.stop()    links.stop()
Line 57: Line 70:
        
 # Funktion aufrufen # Funktion aufrufen
-smoothRide(100, 720)   # 1 m fahren, mit max 2 Umdrehungen pro Sekunde.+smoothRide(100, 20)   # 1 m fahren, mit max 2 Umdrehungen pro Sekunde. 
 +</code> 
 + 
 + 
 +Tipp: Die Geschwindigkeit kann als das Minimum von drei Geschwindigkeiten geschrieben werden: 
 +<code python> 
 +vstart = ...   # Formel aus s (Anstieg am Anfang) 
 +vend = ...     # Formel aus s (Abfall am Ende) 
 +v = min([vstart, vmax, vend])    # Kleinste der 3 Geschwindigkeiten 
 +</code> 
 + 
 +<hidden Lösungsvorschlag> 
 +Anfahren auf gegebener Strecke, Geschwindigkeit proportional zur Strecke (führt zu einem exponentiellen Geschwindigkeitszuwachs und Beschleunigung). 
 +<code python> 
 +vmin = 1        # Mindestgeschwindigkeit, dass man überhaupt einmal losfährt  
 +anfahren = 10   # 10cm Strecke zum Anfahren/Bremsen. 
 + 
 + 
 +vstart = vmin+(vmax-vmin)*s/anfahren 
 +vend = vmin+(vmax-vmin)*(distanz-s)/anfahren 
 +</code> 
 +Setzt man eine konstante Beschleunigung $a$ voraus, erhält man aus den Bewegungsgleichungen $v(s) = s\cdot\sqrt{2as}$. 
 +<code python> 
 +a = 2   # Beschleunigung in cm/s/s 
 + 
 + 
 +vstart = vmin + s*(2*a*s)**0.5 
 +vend = vmin + (distanz-s)*(2*a*(distanz-s))
 </code> </code>
  
 +</hidden>
 ===== Online-Dokumentation ===== ===== Online-Dokumentation =====
 Dokumentation der Motor-Klasse: https://pybricks.com/ev3-micropython/ev3devices.html#motors Dokumentation der Motor-Klasse: https://pybricks.com/ev3-micropython/ev3devices.html#motors
  • lehrkraefte/blc/informatik/glf25/robotik/distanzfahren.1763711946.txt.gz
  • Last modified: 2025/11/21 07:59
  • by Ivo Blöchliger