lehrkraefte:blc:informatik:glf22:linefollower

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 ;-)

  • 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.

Pseudo-Code

  • Wiederhole:
    • Meldet der Sensor zu hell, fahre eine Linkskurve
    • Meldet der Sensor zu dunkel, fahre eine Rechtskurve

Ü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).

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)

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.

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.
  • lehrkraefte/blc/informatik/glf22/linefollower.txt
  • Last modified: 2023/02/28 09:55
  • by Ivo Blöchliger