Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
| lehrkraefte:snr:informatik:glf22:robotik:einfache-bewegungen [2024/06/06 05:19] – [Aufgabe 3: Kreisbogen-Fahren] Olaf Schnürer | lehrkraefte:snr:informatik:glf22:robotik:einfache-bewegungen [2024/06/07 20:05] (current) – [Was man noch machen könnte...] Olaf Schnürer | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ~~NOTOC~~ | ||
| + | |||
| + | ====== Basisbewegungen: | ||
| + | |||
| + | 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 | ||
| + | |||
| + | <code python> | ||
| + | links.run_angle(120, | ||
| + | </ | ||
| + | eine Drehung des linken Rades um $10^\circ$ mit einer Drehgeschwindigkeit von $\frac{120^\circ}{\text{s}}$ | ||
| + | (falls die Variable '' | ||
| + | |||
| + | 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). | ||
| + | |||
| + | <WRAP center round important> | ||
| + | In den folgenden " | ||
| + | |||
| + | Dies hat den Vorteil, dass man eventuelle Messfehler oder unerwünschtes Verhalten des Roboters später durch Änderung eines einzigen Wertes korrigieren kann. | ||
| + | |||
| + | **Nicht erwünscht ist es, die gesuchten Werte per Taschenrechner auszurechnen und dann als Zahlen einzutragen.** | ||
| + | </ | ||
| + | |||
| + | ===== Aufgabe 1: Vorwärts-Fahren ===== | ||
| + | |||
| + | 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. | ||
| + | |||
| + | Bevor du diese Programmier-Aufgabe löst, solltest du die Aufgaben A1 und A2 im {{: | ||
| + | |||
| + | |||
| + | <WRAP center round todo> | ||
| + | Kopiere den folgenden Code-Block ans Ende des durch " | ||
| + | |||
| + | Lies das Programm Zeile für Zeile und versuche, es möglichst gut zu verstehen. Ersetze die fünf ''??'' | ||
| + | |||
| + | <code python> | ||
| + | # Bitte sicherstellen, | ||
| + | |||
| + | ############### | ||
| + | # AUFGABE 1 # | ||
| + | ############### | ||
| + | |||
| + | ev3.speaker.say(text=" | ||
| + | |||
| + | links = Motor(Port.A) | ||
| + | rechts = Motor(Port.B) | ||
| + | |||
| + | # Checke die Kabelverbinungen! | ||
| + | # Wenn du die obigen Einstellungen nutzen willst: | ||
| + | # - Der linke Motor muss mit Port A (am EV3-Brick) verbunden sein. | ||
| + | # - Der rechte Motor muss mit Port B verbunden sein. | ||
| + | |||
| + | from math import pi | ||
| + | # Damit ist pi = 3.14152... benutzbar. | ||
| + | |||
| + | raddurchmesser = ?? # Bitte abmessen (per Lineal oder App)! Alle Längen in cm. | ||
| + | radumfang = ?? # Formel in Abhängigkeit vom Raddurchmesser. KEINE ZAHL EINTRAGEN! | ||
| + | | ||
| + | # Rad: Drehwinkel und dabei zurückgelegte Strecke | ||
| + | # 360 Grad ≙ radumfang (in cm) | ||
| + | # ?? ≙ 1 cm | ||
| + | |||
| + | rad_drehwinkel_pro_cm = ?? # KEINE ZAHL EINTRAGEN, sondern eine Formel in Abhängigkeit von den obigen Variablen. | ||
| + | |||
| + | def vorwaerts(distanz): | ||
| + | # Der Roboter bewegt sich geradlinig vorwärts. | ||
| + | # Die Variable " | ||
| + | # um wie viele cm er sich bewegt. | ||
| + | |||
| + | alpha = ?? # Winkel, um den sich jedes der beiden Räder drehen muss. | ||
| + | links.run_angle(120, | ||
| + | # 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, | ||
| + | # Dito mit dem rechten Motor, aber nun wird gewartet, | ||
| + | # bis die Raddrehung beendet ist. | ||
| + | |||
| + | links.stop() | ||
| + | rechts.stop() | ||
| + | |||
| + | vorwaerts(100) | ||
| + | |||
| + | # Ersetze diesen Befehl etwa durch ' | ||
| + | |||
| + | # Passe die Mess-Variable " | ||
| + | # dass der Roboter möglichst genau 100 cm bzw. die gewünschte Distanz fährt. | ||
| + | |||
| + | # Wenn du zufrieden bist, kannst du den Aufruf der Funktion | ||
| + | # löschen und die nächste Aufgabe bearbeiten. | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ===== Challenge: Welcher Roboter fährt genau einen Meter? Nebeneinander starten lassen ... ===== | ||
| + | |||
| + | ===== Alternative, | ||
| + | |||
| + | Statt den Roboter zu vermessen, könnte man beide Roboterräder um denselben Winkel drehen lassen (etwa $980^\circ$) und dann die Strecke vermessen, die der Roboter gefahren ist. | ||
| + | Aus diesem Messwert kann man dann berechnen, welcher Drehwinkel einer Vorwärtsbewegung von einem Zentimeter entspricht. Vermutlich liefert dieser Ansatz sogar bessere Ergebnisse, denn die Messungenauigkeiten dürften weniger stark ins Gewicht fallen. (Ähnlich könnte man die folgenden Aufgaben angehen; das Kreisbogenfahren erscheint mir aber nicht so leicht experimentell lösbar.) | ||
| + | |||
| + | |||
| + | |||
| + | ===== Aufgabe 2: Auf-der-Stelle-Drehen ===== | ||
| + | |||
| + | 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 " | ||
| + | |||
| + | **Achtung: | ||
| + | * den Drehwinkel des Roboters (um die vertikale Achse durch den Radachsenmittelpunkt) | ||
| + | * den Drehwinkel der Räder. | ||
| + | |||
| + | Bevor du diese Programmier-Aufgabe löst, solltest du die Aufgabe A3 im {{: | ||
| + | |||
| + | <WRAP center round todo> | ||
| + | Kopiere den folgenden Code-Block ans Ende deines in Aufgabe 1 erstellten Programms (den dortigen Befehlsaufruf '' | ||
| + | |||
| + | Lies das Programm Zeile für Zeile und ersetze die sechs ''??'' | ||
| + | |||
| + | <code python> | ||
| + | ############################################################################# | ||
| + | |||
| + | ############### | ||
| + | # AUFGABE 2 # | ||
| + | ############### | ||
| + | |||
| + | radabstand = ?? # in cm; bitte abmessen; Abstand zwischen den Reifenmitten | ||
| + | |||
| + | def drehe(drehwinkel_roboter): | ||
| + | # Der Roboter dreht sich AUF DER STELLE um den 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: | ||
| + | strecke_bei_roboterdrehung_um_ein_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: | ||
| + | # Hinweis: Verwende die weiter oben definierte Variable " | ||
| + | drehwinkel_rad = ?? | ||
| + | |||
| + | # Nun sind die Räder so zu drehen, dass der Roboter sich **auf der Stelle** dreht. | ||
| + | rechts.run_angle(120, | ||
| + | links.run_angle(120, | ||
| + | |||
| + | links.stop() | ||
| + | rechts.stop() | ||
| + | |||
| + | vorwaerts(20) | ||
| + | drehe(360) | ||
| + | vorwaerts(20) | ||
| + | drehe(180) | ||
| + | vorwaerts(20) | ||
| + | |||
| + | # Ändere die Variable " | ||
| + | # dass der Roboter sich möglichst genau | ||
| + | # um den gewünschten Winkel dreht. | ||
| + | |||
| + | # Wenn du zufrieden bist, kannst du den obigen Befehlsblock " | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ===== Aufgabe 3: Kreisbogen-Fahren ===== | ||
| + | |||
| + | Der Roboter soll nun einen durch Kreisradius und Winkel festgelegten Kreisbogen abfahren. Dabei müssen sich die beiden Räder unterschiedlich schnell drehen. | ||
| + | |||
| + | Bevor du diese Programmier-Aufgabe löst, solltest du die Aufgabe A4 im {{: | ||
| + | |||
| + | <WRAP center round todo> | ||
| + | Kopiere den folgenden Code-Block ans Ende deines in Aufgabe 2 erstellten Programms. | ||
| + | |||
| + | Lies das Programm Zeile für Zeile und ersetze die elf ''??'' | ||
| + | |||
| + | <code python> | ||
| + | ############################################################################# | ||
| + | |||
| + | ############### | ||
| + | # AUFGABE 3 # | ||
| + | ############### | ||
| + | |||
| + | def biege_ab(kreisradius, | ||
| + | # Der Roboter fährt einen durch Radius " | ||
| + | # Der Drehsinn (Links- bzw. Rechtskurve) wird durch den String " | ||
| + | # " | ||
| + | |||
| + | # Bewegung eines fiktiven Rades in Robotermitte | ||
| + | # (bzw. genauer in der Mitte der Radachse): | ||
| + | |||
| + | # Fülle die folgende Tabelle aus: | ||
| + | # Zu dem jeweils angegebenen Winkel ist die zugehörige Länge des Kreisbogens | ||
| + | # einzutragen (es geht um den Kreis, auf dem der Roboter fährt). | ||
| + | # Winkel im Kreiszentrum | Länge des Kreisbogens | ||
| + | # 360 Grad ≙ ?? # verwende den Parameter " | ||
| + | # 1 Grad ≙ ?? | ||
| + | |||
| + | # Welche Strecke legt das fiktive Rad also zurück? | ||
| + | # Hinweis: Verwende die Variable " | ||
| + | robotermitte_strecke = ?? | ||
| + | |||
| + | # Um welchen Winkel dreht sich das fiktive Rad dabei? | ||
| + | # Hinweis: Verwende die weiter oben definierte Variable " | ||
| + | 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 = ?? | ||
| + | |||
| + | # Die beiden Räder sollen sich genauso lange bewegen wie das fiktive Rad, | ||
| + | # aber mit unterschiedlichen (Winkel-)Geschwindigkeiten, | ||
| + | # einen Kreisbogen fährt. | ||
| + | |||
| + | # Berechnung der Drehgeschwindigkeit des äusseren Rades. | ||
| + | # Welchen Radius hat der Kreis, auf dem sich das äussere Rad bewegt? | ||
| + | # Verwende die Variable " | ||
| + | aussen_strecke = ?? # Ähnlich wie " | ||
| + | aussenrad_drehwinkel = ?? # Ähnlich wie " | ||
| + | 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 == " | ||
| + | # Die folgende Zeile sagt dem LINKEN Motor, was er zu tun hat. | ||
| + | links.run_angle(innenrad_geschwindigkeit, | ||
| + | rechts.run_angle(aussenrad_geschwindigkeit, | ||
| + | else: | ||
| + | # In den beiden folgenden Zeilen stimmt noch nicht alles... | ||
| + | links.run_angle(innenrad_geschwindigkeit, | ||
| + | rechts.run_angle(aussenrad_geschwindigkeit, | ||
| + | links.stop() | ||
| + | rechts.stop() | ||
| + | |||
| + | vorwaerts(20) | ||
| + | biege_ab(50, | ||
| + | vorwaerts(20) | ||
| + | biege_ab(50, | ||
| + | |||
| + | # Hoffentlich fährt dein Roboter (in etwa) wie gewünscht. | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ===== Aufgabe 4: Challenge ===== | ||
| + | |||
| + | <WRAP center round todo> | ||
| + | Markiere etwa mit Klebeband einen Route auf dem Boden, die aus geraden Linien, Ecken und Kreisbögen besteht. | ||
| + | |||
| + | Programmiere dann deinen Roboter so, dass er möglichst genau der Klebeband-Route folgt. | ||
| + | Du darfst die Route mit deinem Lineal/ | ||
| + | <!--Lass den Roboter einen Meter entfernt von einem Drehstuhl starten. Der Roboter soll relativ nah an den Drehstuhl heranfahren, | ||
| + | --> | ||
| + | </ | ||
| + | |||
| + | ===== Was man noch machen könnte... ===== | ||
| + | |||
| + | * Beschleunigungs- und Abbremsphase | ||
| + | * evtl. Sachen von https:// | ||
| + | ===== Falls jemand aus Versehen das " | ||
| + | |||
| + | <hidden " | ||
| + | <code python main.py> | ||
| + | # | ||
| + | from pybricks.hubs import EV3Brick | ||
| + | from pybricks.ev3devices import (Motor, TouchSensor, | ||
| + | | ||
| + | from pybricks.parameters import Port, Stop, Direction, Button, Color | ||
| + | from pybricks.tools import wait, StopWatch, DataLog | ||
| + | from pybricks.robotics import DriveBase | ||
| + | from pybricks.media.ev3dev import SoundFile, ImageFile | ||
| + | |||
| + | |||
| + | # This program requires LEGO EV3 MicroPython v2.0 or higher. | ||
| + | # Click "Open user guide" on the EV3 extension tab for more information. | ||
| + | |||
| + | |||
| + | # Create your objects here. | ||
| + | ev3 = EV3Brick() | ||
| + | |||
| + | |||
| + | # Write your program here. | ||
| + | ev3.speaker.beep() | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ==== Lösungshinweise ==== | ||
| + | |||
| + | Bzw. was für die Fragezeichen einzutragen ist. | ||
| + | |||
| + | <hidden Vorwärts-Fahren> | ||
| + | <code python> | ||
| + | radumfang = pi * raddurchmesser | ||
| + | |||
| + | # Rad: Drehwinkel und dabei zurückgelegte Strecke | ||
| + | # 360 Grad ≙ radumfang (in cm) | ||
| + | # 360 / radumfang ≙ 1 cm | ||
| + | |||
| + | rad_drehwinkel_pro_cm = 360 / radumfang | ||
| + | # auch korrekt: rad_drehwinkel_pro_cm = 360 / (pi * raddurchmesser) | ||
| + | |||
| + | def vorwaerts(distanz): | ||
| + | alpha = distanz * rad_drehwinkel_pro_cm | ||
| + | </ | ||
| + | </ | ||
| + | |||