====== Line Follower ====== Ziel ist es, den Roboter so zu programmieren, dass er der äusseren, dicken Linie auf der Plane einmal links herum auf der Aussenkurve folgen kann (ohne Abkürzungen). Fastest wins ;-) ===== 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**: dunkel ist links, hell ist rechts). Sobald man dunkler oder heller misst, weiss man auch schon, wie zu korrigieren ist. ===== Variante 1 ===== **Pseudo-Code** * Wiederhole: * Meldet der Sensor zu hell, fahre eine Linkskurve * Meldet der Sensor zu dunkel, fahre eine Rechtskurve * Legen Sie ein neues EV3-Projekt an, * [[lehrkraefte:blc:informatik:glf22:robotik-mit-svcode:programm-struktur#motoren|initialisieren Sie Motoren und Lichtsensor]] und * initialisieren die [[lehrkraefte:blc:informatik:glf22:robotik-mit-svcode:drivebase|DriveBase]]. Übersetzen Sie dann obigen Pseudocode in Python und Testen Sie den Roboter. Eine Endlosschleife kann wie folgt programmier werden: while True: hell = licht.reflection() # fahrwerk.drive(Geschwindigkeit vorwärts in mm/s, Drehgeschwindigkeit in Grad/s) if hell<40: # Wert anpassen fahrwerk.drive(100,20) elif hell>60: # Wert anpassen! fahrwerk.drive(100,-20) else: fahrwerk.drive(100,0) 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. * 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, und dann damit die Drehgeschwindigkeit bestimmt. Programmieren Sie die Variante 3. * Dazu initialisieren Sie **vor** der while-Schleife eine Variable ''i=0'' und eine Variable ''ci=0.1'' (Wert durch Experimentieren bestimmen). * In der while-Schleife * zählen Sie die aktuelle Hellikeitsdifferenz zu ''i'' hinzu und * zählen Sie ''ci*i'' der aktuellen Helligkeitsdifferenz dazu, bevor Sie damit die Geschwindigkeiten berechnen. ===== 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). * Initialisieren Sie **vor** der while-Schleife eine Variable ''letzer = 50'' (oder welcher Wert auch immer der Kante entspricht) und eine Variable ''cd=0.1'' (Vorzeichen und geeigneter Wert durch überlegen und Experimentieren bestimmen). * In der while Schleife * Bestimmen Sie die Differenz ''d'' zwischen aktuellem und dem letzten Wert ''letzter''. * Addieren Sie ''cd * d'' zur aktuellen Helligkeitsdifferenz hinzu, bevor Sie damit die Geschwindigkeiten berechnen.