Differences
This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| lehrkraefte:blc:informatik:glf22:linefollower [2023/02/24 08:16] – created Ivo Blöchliger | lehrkraefte:blc:informatik:glf22:linefollower [2023/02/28 08:55] (current) – [Variante 1] Ivo Blöchliger | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ====== Line Follower ====== | ||
| + | Ziel ist es, den Roboter so zu programmieren, | ||
| + | |||
| + | ===== Grundideen ===== | ||
| + | * Der Sensor sieht nur, wie hell der Untergrund ist, aber nicht auf welche Seite der Untergrund heller oder dunkler wird. | ||
| + | * Es ist also nicht möglich, einem schwarzen Strich zu folgen. Wenn dieser verlassen wird, weiss man nicht, auf welcher Seite man diesen verlassen hat. | ||
| + | * Man könnte dann zwar den Roboter nach links und rechts bewegen und das so herausfinden. Es geht aber einfacher. | ||
| + | * Man folgt stattdessen dem Rand einer Linie (**Abmachung**: | ||
| + | |||
| + | ===== Variante 1 ===== | ||
| + | <WRAP center round info 100%> | ||
| + | **Pseudo-Code** | ||
| + | * Wiederhole: | ||
| + | * Meldet der Sensor zu hell, fahre eine Linkskurve | ||
| + | * Meldet der Sensor zu dunkel, fahre eine Rechtskurve | ||
| + | |||
| + | </ | ||
| + | |||
| + | <WRAP todo> | ||
| + | * Legen Sie ein neues EV3-Projekt an, | ||
| + | * [[lehrkraefte: | ||
| + | * initialisieren die [[lehrkraefte: | ||
| + | |||
| + | Übersetzen Sie dann obigen Pseudocode in Python und Testen Sie den Roboter. Eine Endlosschleife kann wie folgt programmier werden: | ||
| + | <code python> | ||
| + | while True: | ||
| + | hell = licht.reflection() | ||
| + | # fahrwerk.drive(Geschwindigkeit vorwärts in mm/s, Drehgeschwindigkeit in Grad/s) | ||
| + | if hell< | ||
| + | fahrwerk.drive(100, | ||
| + | elif hell> | ||
| + | fahrwerk.drive(100, | ||
| + | else: | ||
| + | fahrwerk.drive(100, | ||
| + | |||
| + | |||
| + | </ | ||
| + | Das Programm kann dann entweder über den Computer oder durch Drücken der Escape-Taste auf dem Roboter (Taste oben links) gestoppt werden. | ||
| + | |||
| + | * Experimentieren Sie mit verschiedenen Fahr- und Drehgeschwindigkeiten. Stellen Sie die so ein, dass der Roboter den Parcours fahren kann (links herum, Aussenkurve). | ||
| + | </ | ||
| + | |||
| + | ===== Variante 2: Fahren statt wackeln ===== | ||
| + | |||
| + | Mit der Variante 1 wackelt der Roboter, weil immer entweder eine Links- oder Rechtskurve gefahren wird. | ||
| + | * Die Idee ist, dass die Drehgeschwindigkeit von der Helligkeitsdifferenz abhängen soll. | ||
| + | * D.h. wenn der Roboter genau auf der Kante fährt, ist die Helligkeitsdifferenz Null und der Roboter soll geradeaus fahren. | ||
| + | * Und wenn der Roboter sich weit von der Kante entfernt, ist die Helligkeitsdifferenz gross, und entsprechend eng soll die Kurve sein. | ||
| + | <WRAP todo> | ||
| + | * Programmieren Sie die Variante 2. | ||
| + | * Bestimmen Sie eine geeignete Funktion, die aus der Helligkeitsdifferenz die Drehgeschwindigkeit berechnet (und evtl. eine Funktion für die Fahrgeschwindigkeit) | ||
| + | </ | ||
| + | |||
| + | ===== Variante 3: Kurve ermitteln ===== | ||
| + | Mit der Variante 2 fährt der Roboter in einer Kurve immer neben der Kante zwischen weiss und schwarz (sonst würde er ja keine Kurve fahren). Idealerweise sollte der Roboter auch in Kurven genau auf der Kante fahren. Das kann mit folgender Idee realisiert werden: | ||
| + | * Man summiert bei jeder Messung die Helligkeitsdifferenzen auf. Nennen wir diese Summe $I$ (Integral). | ||
| + | * Beim Geradeausfahren ist die Summe $I$ ungefähr gleich Null. | ||
| + | * Beim Kurvenfahren wird die Summe $I$ immer grösser (bzw. kleiner, je nachdem ob man eine Links- oder Rechtskurve fährt). | ||
| + | * Die Idee ist nun, dass man ein geeignetes (kleines) Vielfaches $c_i \cdot I$ zur Helligkeitsdifferenz hinzuzählt, | ||
| + | |||
| + | <WRAP todo> | ||
| + | Programmieren Sie die Variante 3. | ||
| + | * Dazu initialisieren Sie **vor** der while-Schleife eine Variable '' | ||
| + | * In der while-Schleife | ||
| + | * zählen Sie die aktuelle Hellikeitsdifferenz zu '' | ||
| + | * zählen Sie '' | ||
| + | |||
| + | </ | ||
| + | |||
| + | ===== Variante 4 ===== | ||
| + | Die letzte Idee ist folgende: | ||
| + | * Wenn die Helligkeit zunimmt (bzw. abnimmt), dann muss bereits Gegensteuer gegeben werden (weil der Roboter dann schräg über die Kante fährt). | ||
| + | <WRAP todo> | ||
| + | * Initialisieren Sie **vor** der while-Schleife eine Variable '' | ||
| + | * In der while Schleife | ||
| + | * Bestimmen Sie die Differenz '' | ||
| + | * Addieren Sie '' | ||
| + | </ | ||