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:line-follower [2024/06/13 11:50] – Olaf Schnürer | lehrkraefte:snr:informatik:glf22:robotik:line-follower [2025/01/23 10:27] (current) – [Aufgabe 2: Drivebase kennenlernen] Olaf Schnürer | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ~~NOTOC~~ | ||
| + | |||
| + | ====== Lichtsensor und Line Follower ====== | ||
| + | |||
| + | <WRAP center round info> | ||
| + | In diesem Abschnitt geht es um Regelungstechnik. Typische Probleme sind: | ||
| + | * im Haushalt: Temperatur von Heizung bzw. Kühlschrank bzw. Bügeleisen so regeln, dass die gewünschte Temperatur möglichst konstant bleibt. | ||
| + | * Tempomat beim Auto: Halte die Geschwindigkeit konstant (auch bei Steigungen, Wind etc.). | ||
| + | * Autopiloten in der Luftfahrt, Schiffahrt, Raumfahrt. | ||
| + | * Regelung des Abflusses eines Stausees, damit die gewünschte Strommenge erzeugt wird. | ||
| + | * Autonomes Fahren. | ||
| + | </ | ||
| + | |||
| + | Der Roboter soll z. B. der äusseren schwarzen Linie auf der Plane folgen! | ||
| + | ===== Aufgabe 1: Licht-Sensor kalibrieren ===== | ||
| + | |||
| + | <WRAP center round todo> | ||
| + | Erstelle per " | ||
| + | |||
| + | Kopiere ans Ende des Programms '' | ||
| + | |||
| + | Ersetze die Nullen wie in den Kommmentaren im Programm beschrieben. | ||
| + | |||
| + | <code python> | ||
| + | # Bitte sicherstellen, | ||
| + | |||
| + | ############### | ||
| + | # AUFGABE 1 # | ||
| + | ############### | ||
| + | |||
| + | ev3.speaker.say(text=" | ||
| + | |||
| + | links = Motor(Port.A) | ||
| + | rechts = Motor(Port.B) | ||
| + | |||
| + | licht = ColorSensor(Port.S1) | ||
| + | |||
| + | # Sind die Motoren und Sensoren richtig verkabelt? | ||
| + | |||
| + | while True: | ||
| + | r = licht.reflection() | ||
| + | print(r) | ||
| + | wait(100) | ||
| + | |||
| + | # Ermittle mit Hilfe der obigen Schleife die Werte | ||
| + | # für Weiss und Schwarz auf der Plane und trage sie | ||
| + | # unten ansstelle der Nullen ein. | ||
| + | schwarz = 0 | ||
| + | weiss = 0 | ||
| + | |||
| + | # Idealwert, wenn der Sensor mittig auf der Kante ist. | ||
| + | idealwert = (schwarz + weiss) / 2 | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ===== Aufgabe 2: Drivebase kennenlernen ===== | ||
| + | |||
| + | <WRAP center round todo> | ||
| + | Im bisher erstellten Programm: Lösche die '' | ||
| + | |||
| + | Dann kopiere den folgenden Code-Block ans Ende des Programms und lerne damit den '' | ||
| + | |||
| + | <code python> | ||
| + | ############### | ||
| + | # AUFGABE 2 # | ||
| + | ############### | ||
| + | |||
| + | fahrwerk = DriveBase(links, | ||
| + | # Raddurchmesser und Achsenabstand/ | ||
| + | |||
| + | # Lerne den " | ||
| + | # - erster Parameter: Robotergeschwindigkeit in mm/s | ||
| + | # - zweiter Parameter: Rotationsgeschwindigkeit des Roboters in Grad/s | ||
| + | # Die entsprechende Bewegung wird solange ausgeführt, | ||
| + | |||
| + | # Ersetze die Fragezeichen durch (motorschonende) Werte deiner Wahl. | ||
| + | # Erster Parameter z. B. 100 (oder auch -100), zweiter 0 oder +20 oder -20. | ||
| + | # | ||
| + | # Spiele dann etwas mit den Parametern. | ||
| + | # | ||
| + | fahrwerk.drive(??, | ||
| + | wait(??) # Wartezeit in Millisekunden | ||
| + | fahrwerk.drive(??, | ||
| + | wait(??) | ||
| + | fahrwerk.drive(??, | ||
| + | wait(??) | ||
| + | ev3.speaker.say(text=" | ||
| + | fahrwerk.stop() | ||
| + | |||
| + | # | ||
| + | # Mögliche Fragen: | ||
| + | # (1) Überlege zuerst theoretisch: | ||
| + | # (2) Welche Parameter sorgen dafür, dass der Roboter in 10 Sekunden einen Viertelkreis mit Radius 50 cm abfährt? | ||
| + | </ | ||
| + | < | ||
| + | # (3) Schaffst du es, den Roboter auf einem Linienzug (aus Klebeband am Boden) fahren zu lassen? | ||
| + | --> | ||
| + | |||
| + | Genaueres über die " | ||
| + | Dort wird z. B. auch erklärt (Abschnitt " | ||
| + | </ | ||
| + | |||
| + | ===== Aufgabe 2b (neu) ===== | ||
| + | |||
| + | <WRAP center round todo 60%> | ||
| + | Lass den Roboter geradeaus fahren, bis er auf eine weisse Linie trifft. Dort soll er stoppen und irgendetwas sagen, dann Programmende. | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | ===== Aufgabe 3: Einfacher Line Follower ===== | ||
| + | |||
| + | <WRAP center round todo> | ||
| + | Idee: Der Helligkeitssensor des Roboters soll sich immer genau über der Kante der schwarzen Linie befinden: | ||
| + | Lass dazu den Roboter nach links bzw. rechts abbiegen, wenn der Grauwert zu klein bzw. zu gross ist. | ||
| + | |||
| + | Im bisher erstellten Programm: Lösche die letzten acht Zeilen mit den '' | ||
| + | |||
| + | Dann übersetze den folgenden Pseudo-Code nach Python und schreibe dies ans Ende deines Programms. | ||
| + | |||
| + | <code python> | ||
| + | |||
| + | ############### | ||
| + | # AUFGABE 3 # | ||
| + | ############### | ||
| + | |||
| + | Vereinbare ein Variable namens " | ||
| + | |||
| + | Wiederhole unendlich oft: | ||
| + | Berechne die Abweichung der aktuellen " | ||
| + | Wenn die Abweichung < 0 ist: | ||
| + | ändere den Zustand des Roboters auf " | ||
| + | sonst, wenn die Abweichung > 0 ist: | ||
| + | ändere den Zustand des Roboters auf " | ||
| + | sonst: | ||
| + | ändere den Zustand des Roboters auf " | ||
| + | warte ein bisschen, etwa 10 Millisekunden | ||
| + | </ | ||
| + | |||
| + | Statt zwischen $<0$ und $>0$ und $=0$ zu unterscheiden, | ||
| + | |||
| + | <hidden Lösungshilfen>< | ||
| + | |||
| + | geschwindigkeit = 50 | ||
| + | |||
| + | while True: | ||
| + | ... | ||
| + | if ...: | ||
| + | ... | ||
| + | elif ...: | ||
| + | ... | ||
| + | else: | ||
| + | ... | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ===== Aufgabe 4: Proportionaler Line Follower ===== | ||
| + | |||
| + | <WRAP center round todo> | ||
| + | Im bisher erstellten Programm: Ersetze den Inhalt der '' | ||
| + | |||
| + | Die Idee ist, dass die Drehgeschwindigkeit proportional (= linear mit $y$-Achsenabschnitt 0) mit der Abweichung steigt, d. h. je grösser die Abweichung, desto grösser die Drehgeschwindigkeit. | ||
| + | <code python> | ||
| + | |||
| + | ############### | ||
| + | # AUFGABE 4 # | ||
| + | ############### | ||
| + | abweichung = licht.reflection() - idealwert | ||
| + | # Ersetze ''??'' | ||
| + | fahrwerk.drive(geschwindigkeit, | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ===== Aufgabe 5: PID Line Follower ===== | ||
| + | |||
| + | <WRAP center round todo> | ||
| + | Modifiziere das bisher erstellten Programm wie folgt; Ziel ist danach, die drei Konstanten gut zu wählen. | ||
| + | |||
| + | Idee dahinter: Die Abbiegedrehgeschwindigkeit soll nicht nur proportional zur Abweichung sein, sondern auch die Summe aller bisherigen Abweichungen berücksichtigen und auch die aktuelle Änderung. Dies nennt sich PID-Steuerung (wegen P=proportional, | ||
| + | |||
| + | Füge vor der '' | ||
| + | |||
| + | <code python> | ||
| + | ############### | ||
| + | # AUFGABE 5 # | ||
| + | ############### | ||
| + | |||
| + | # Finde durch Ausprobieren (= Testfahrten) gute Werte für die gleich folgenden Konstanten! | ||
| + | # Dabei am besten erst die letzten beiden Konstanten auf Null setzen und den ersten Wert '' | ||
| + | # Dann den zweiten Wert gut wählen. | ||
| + | # Dann den dritten. | ||
| + | proportional_faktor = ?? # zwischen 0 und 2 | ||
| + | integral_faktor = ?? # kleiner als 0.1 | ||
| + | differential_faktor = ?? # zwischen 0 und 4 | ||
| + | |||
| + | letzte_abweichung = 0 | ||
| + | integral = 0 | ||
| + | |||
| + | zaehler = 0 | ||
| + | </ | ||
| + | |||
| + | Ersetze den Inhalt der '' | ||
| + | |||
| + | <code python> | ||
| + | abweichung = licht.reflection() - idealwert | ||
| + | zaehler = zaehler + 1 | ||
| + | proportional_fix = proportional_faktor * abweichung | ||
| + | integral = integral + abweichung | ||
| + | integral_fix = integral_faktor * integral | ||
| + | veraenderung = abweichung - letzte_abweichung | ||
| + | differential_fix = differential_faktor * veraenderung | ||
| + | letzte_abweichung = abweichung | ||
| + | if zaehler % 250 == 0: | ||
| + | print(10 * ' | ||
| + | print(' | ||
| + | print(' | ||
| + | print(' | ||
| + | fahrwerk.drive(geschwindigkeit, | ||
| + | |||
| + | wait(5) | ||
| + | </ | ||
| + | |||
| + | <hidden Bei mir klappten die folgenden Werte (auf der äusseren Rennstrecke der Plane) gut:> | ||
| + | <code python> | ||
| + | proportional_faktor = 1 | ||
| + | integral_faktor = 0.01 | ||
| + | differential_faktor = 1 | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP center round info> | ||
| + | In diesem Abschnitt ging es um Regelungstechnik, | ||
| + | * https:// | ||
| + | * https:// | ||
| + | |||
| + | Für nächstes Mal: Aktuelle Werte von '' | ||
| + | </ | ||
| + | |||
| + | <hidden Mögliche Lösung>< | ||
| + | |||
| + | ############### | ||
| + | # AUFGABE 3 # | ||
| + | ############### | ||
| + | |||
| + | geschwindigkeit = 50 | ||
| + | |||
| + | while True: | ||
| + | abweichung = licht.reflection() - idealwert | ||
| + | if abweichung < 0: | ||
| + | fahrwerk.drive(geschwindigkeit, | ||
| + | elif abweichung > 0: | ||
| + | fahrwerk.drive(geschwindigkeit, | ||
| + | else: | ||
| + | fahrwerk.drive(geschwindigkeit, | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | |||