Differences
This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
lehrkraefte:blc:informatik:glf20:robotik:linefollower [2021/05/12 11:21] Ivo Blöchliger created |
lehrkraefte:blc:informatik:glf20:robotik:linefollower [2021/05/21 11:37] (current) Ivo Blöchliger |
||
---|---|---|---|
Line 7: | Line 7: | ||
Am einfachsten ist es, der Grenze zwischen Weiss und Schwarz zu folgen (so dass der Helligkeitssensor effektiv grau sieht). So weiss der Roboter sofort, auf welche Seite er korrigieren muss. | Am einfachsten ist es, der Grenze zwischen Weiss und Schwarz zu folgen (so dass der Helligkeitssensor effektiv grau sieht). So weiss der Roboter sofort, auf welche Seite er korrigieren muss. | ||
- | Die einfachste Umsetzung dieser Idee sieht (als Pseudocode) wie folgt aus: | + | <WRAP info> |
+ | Damit alle Roboter in die gleiche Richtung und den gleichen Parcours fahren, machen wir ab, dass | ||
+ | * **Weiss ist links, Schwarz ist rechts** | ||
+ | </ | ||
+ | |||
+ | Die einfachste Umsetzung dieser Idee sieht (als noch ungetesteten Code) wie folgt aus: | ||
<code python> | <code python> | ||
+ | # Initialisierung fehlt hier! | ||
+ | |||
grau = 500 # Diesen Wert eventuell anpassen | grau = 500 # Diesen Wert eventuell anpassen | ||
radiusLinks = 0.1 # Radius anpassen, so dass die engsten Kurven gefahren werden können | radiusLinks = 0.1 # Radius anpassen, so dass die engsten Kurven gefahren werden können | ||
- | rediusRechts | + | radiusRechts |
gear.setSpeed(20) | gear.setSpeed(20) | ||
Line 18: | Line 25: | ||
if hell==0: | if hell==0: | ||
break | break | ||
- | if hell>grau: # Bedingung umkehren, wenn in die andere Richtung gefahren werden soll | + | if hell<grau: # Bedingung umkehren, wenn in die andere Richtung gefahren werden soll |
gear.leftArc(radiusLinks) | gear.leftArc(radiusLinks) | ||
else: | else: | ||
Line 26: | Line 33: | ||
robot.exit() | robot.exit() | ||
</ | </ | ||
+ | |||
+ | ===== Weniger wackeln ===== | ||
+ | Anstatt immer Kurven zu fahren, soll der Kurvenradius davon abhängen, wie weit man vom «optimalen» grau-Wert entfernt ist. Die Idee ist, dass wenn man schön auf grau fährt, dass der Roboter dann gerade aus fährt. | ||
+ | |||
+ | Benutzen dazu z.B. die Funktion " | ||
+ | |||
+ | Wenn die Geschwindigkeit klein genug ist (z.B. '' | ||
+ | |||
+ | <code python> | ||
+ | ########################################### | ||
+ | ## B E G I N D E S P R O G R A M M S ## | ||
+ | ########################################### | ||
+ | |||
+ | |||
+ | grau = 500 # Diesen Wert eventuell anpassen | ||
+ | radiusLinks = 0.1 # Radius anpassen, so dass die engsten Kurven gefahren werden können | ||
+ | radiusRechts = 0.2 # Radius anpassen, so dass die engsten Kurven gefahren werden können | ||
+ | |||
+ | # Das Interval [a,b] linear auf das Intervall [c,d] umrechnen, an der Stelle x | ||
+ | |||
+ | def linear(a, | ||
+ | return (x-a)/ | ||
+ | |||
+ | def guterRadius(hell): | ||
+ | if (hell> | ||
+ | gear.forward() | ||
+ | return | ||
+ | if (hell< | ||
+ | r = linear(?, grau-50, ?, ?, hell); | ||
+ | gear.leftArc(r) | ||
+ | else: | ||
+ | r = linear(grau+50, | ||
+ | gear.rightArc(r) | ||
+ | |||
+ | gear.setSpeed(20) | ||
+ | while True: | ||
+ | hell = ls.getValue() | ||
+ | if hell==0: | ||
+ | break | ||
+ | guterRadius(hell) | ||
+ | |||
+ | gear.stop() | ||
+ | robot.exit() | ||
+ | </ | ||
+ | ===== Weitere mögliche Verbesserungen ===== | ||
+ | * Auf geraden Stücken könnte die Geschwindigkeit erhöht werden und die Kurvenradien entsprechend reduziert werden. Sobald aber eine Kurve festgestellt wird, muss die Geschwindigkeit wieder reduziert werden. | ||
+ | * Man betrachtet nicht nur die aktuelle Helligkeit, sondern auch die Veränderung der Helligkeit. Wenn diese schnell heller wird, kann man so bereits Gegensteuer geben. | ||
+ | * Man summiert die " | ||
+ | * Anstatt mit dem Kurvenradius könnten auch die Motoren individuell gesteuert werden. Anstatt eines '' | ||
+ | * Mathematisches Modell des Roboters und der Kurve (habe ich selbst noch nie programmiert). | ||
+ | * In jedem Schritt werden die Positionen der Räder ausgelesen, eine Schätzung des aktuellen Kurvenradius (der Kurve) und der Position und Rotation des Roboters erstellt. Mit dieser Schätzung werden die Motoren gesteuert und die Schätzung im nächsten Schritt überprüft | ||
+ | |||