Quicklinks
Programm-Download: | fuzzy-line-follwing-nxt-robot.rbt |
Diese Seite als PDF: | fuzzy-line-follwing-nxt-robot.pdf |
Video: | Video auf Youtube |
NXT Linienfolger programmiert in Fuzzy Logik
Eines der Tutorials der Lego Mindstorms NXT Software behandelt einen Roboter der in der Lage ist, dank einer Booleschen Logik, einer Linie zu folgen. Dieser Artikel beschreibt eine verbesserte, auf Fuzzylogik basierende, Version. Obwohl diese Variante etwas komplexer ist, kann das Programm immer noch in NXT-G Code umgesetzt werden.
Video
Ein Fuzzy-Logik Linienverfolger | Der original Linienverfolger (Davidin2) |
Ursprüngliche "Boolesche Logik"-Version von Lego
Die ursprüngliche Version von Lego benützt einen Lichtsensor um zwischen Dunkel (der Linie) und Hell (dem Boden) zu unterscheiden. Wenn sich der Sensor über der schwarzen Linie befindet, wird der linke Motor aktiviert. Dies führt dazu, dass der Roboter sich nach Rechts von der Linie weg dreht. Wenn sich der Sensor über der weissen Oberfläche (dem Boden) befindet, wird der rechte Motor aktiviert und der Roboter dreht Links auf die Linie zu. Auf diese Weise folgt der Roboter der Linie. - Genau genommen, folgt der Roboter nicht der Linie sondern der Grenze zwischen Schwarz und Weiss.
Der Ansatz ist sehr einfach und funktioniert. Da der Roboter allerdings nur zwischen Schwarz und Weiss unterscheidet, wirkt das resultierende Verhalten, als ob der Roboter etwas zu viel getrunken hätte.
Fuzzylogik Variante
Die Idee hinter der neuen Version ist, nicht nur zwischen Schwarz und Weiss zu unterscheiden, sondern auch die verschiedenen Grautöne in Betracht zu ziehen. Wenn sich der Sensor nicht genau auf der schwarzen Linie oder dem weissen Untergrund befindet, wird er Grau sehen. Je exakter der Sensor über der Linie ist, desto dunkler das Grau. Wenn sich der Sensor von der Linie weg bewegt wird das Grau heller. Das ist Fuzzylogik, da nicht mehr zwei exakte Zustände (Weiss oder Schwarz) vorherrschen, sondern diese beiden Zustände mehr oder weniger zutreffen (Heller, Dunkler).
Jetzt müssen wir uns nicht mehr darauf beschränken, nur nach Rechts oder Links zu drehen, sondern können mehr oder weniger stark drehen, je nachdem wie hell die Farbe ist. Sollte sich der Roboter genau auf der Grenze der Linie befinden, fahren wir natürlich geradeaus.
Dieses Verhalten kann auf verschiedene Weise umgesetzt werden. Die einfachste Lösung, ist folgende:
Umsetzung in NXT-G Code
In NXT-G Code sieht das so aus:
Das Programm besteht aus drei Schlaufen die gleichzeitig ausgeführt werden. Die erste Schlaufe wertet den Lichtsensor aus und speichert den Wert in der Variable "Number 1". Die beiden anderen Schlaufen steuern den Rechten und Linken Motor.
Der Lichtsensor gibt einen Wert zwischen 0 und 100 aus. Typischerweise liegt Wert für eine dunkle Oberfläche um die 20, und für eine weisse um die 60. Diese Zahlen hängen natürlich von den Lichtverhältnissen und der Distanz des Sensors zur Oberfläche ab. Die Motoren ihrerseits erwarten auch eine Zahl zwischen 0 und 100, proportional zur Geschwindigkeit mit der sie sich drehen sollen.
Um die Motoren wie im obigen Schema beschrieben zu steuern, müssen folgende Berechnungen gemacht werden:
- Geschwindigkeit_A=(Lichtsensor_Wert-Wert_fuer_Schwarz)*Geschwindigkeitsfaktor
- Geschwindigkeit_B=(Wert_fuer_Weiss-Lichtsensor_Wert)*Geschwindigkeitsfaktor
Mit Wert_fuer_Schwarz=20, Wert_fuer_Weiss=60 und Geschwindigkeitsfaktor=2.5 erhalten wir das folgende Resultat:
Lichtsensor_Wert | Geschwindigkeit_A | Geschwindigkeit_B |
20 | 0 | 100 |
30 | 25 | 75 |
40 | 50 | 50 |
50 | 75 | 25 |
60 | 100 | 0 |
Feinabstimmung
Falls Sie Ihren Roboter wie oben programmiert haben, aber er sich nicht wie erwartet verhält, überprüfen Sie folgendes:
- Sind die Motoren des Roboters an die Ports A und B angeschlossen?
- Kommst der Lichtsensor etwa 1cm über der Oberfläche zu liegen?
- Ist der Wert der vom Lichtsensor für Schwarz gelesen wird wie oben? Falls nicht, ersetzen Sie den Wert im Programm.
- Ist der Wert der vom Lichtsensor für Weiss gelesen wird wie oben? Falls nicht, ersetzen Sie den Wert im Programm.
- Beginnen Sie mit einem Geschwindigkeitsfaktor von 1 (2. und 3. Schleife) und erhöhen Sie den Wert langsam.