Zum Hauptinhalt springen
26P

Linien Folger

Ein einfacher Ansatz für einen Linienfolger wäre, die Liniensensoren immer zu überprüfen und entsprechend die Motoren anzusteuern:

Sensor M = 1

Geradeaus fahren

Sensor L1 = 1 und M = 0

Linkskurve, da nun zu weit rechts

Sensor R1 = 1 und M = 0

Rechtskurve, da nun zu weit links

In Python würde das etwa so aussehen:

from microbit import *
from maqueen import *
while True:
if line_sensor(LineSensor.M) == 1:
motor_run(Motor.ALL, 40)
elif line_sensor(LineSensor.L1) == 1:
motor_run(Motor.LEFT, 0)
motor_run(Motor.RIGHT, 40)
elif line_sensor(LineSensor.R1) == 1:
motor_run(Motor.LEFT, 40)
motor_run(Motor.RIGHT, 0)
Beachte

Weil zuerst der mittlere Sensor M überprüft wird, ist bei den folgenden elif Bedingungen bereits sicher, dass M Null ist, da sonst die erste Bedingung zugetroffen hätte. Deshalb muss nicht noch ... and line_sensor(LineSensor.M)==0 überprüft werden.

Dieser Ansatz funktioniert allerdings nicht zuverlässig 😭.

Problem des einfachen Linienfolgers
Problem des einfachen Linienfolgers
Aufgabe

Erklären Sie kurz anhand der obigen Abbilgung, weshalb der einfache Linienfolger nicht zuverlässig funktioniert.

Zustandsdiagramm

Um den Linienfolger robuster und zuverlässiger zu machen, braucht es eine Zustandsmaschine. Der Roboter ist stets nur in einem Zustand. Abhängig von den Sensorwerten wird dann der Zustand gewechselt. In jedem Zustand ist zudem definiert, wie die Motoren angesteuert werden.

Im Unterricht haben wir folgendes Zustandsdiagramm erarbeitet:
In Python wurde dieses Zustandsdiagramm wie folgt umgesetzt:
from microbit import *
from maqueen import *

zustand = 'vorwärts'

# Zustandsmaschine umsetzen
while True:
if zustand == 'vorwärts':
'''
VORWÄRTSFAHREN
'''
# zuerst immer Motoren ansteuern
# hier: beide Motoren fahren vorwärts
motor_run(Motor.ALL, 40)
# dann die Sensoren einlesen
if line_sensor(LineSensor.M) == 1:
# alles beim Alten, weiterfahren
zustand = 'vorwärts'
elif line_sensor(LineSensor.L1) == 0:
zustand = 'rechtskurve'
elif line_sensor(LineSensor.R1) == 0:
zustand = 'linkskurve'
elif zustand == 'rechtskurve':
'''
RECHTSKURVE FAHREN
'''
motor_run(Motor.LEFT, 40)
motor_run(Motor.RIGHT, 0)
...
elif zustand == 'linkskurve':
'''
LINKSKURVE FAHREN
'''
motor_run(Motor.LEFT, 0)
motor_run(Motor.RIGHT, 40)
...
Beachte

Mit diesem Zustandsdiagramm ist es nicht möglich, von einer Rechtskurve direkt zu einer Linkskurve überzugehen.

Mit diesem Ansatz ist es nun auch möglich, den Roboter zuverlässig auf der Linie zu halten.

Zustandsübergänge

Zustandsübergänge werden nur durch die Sensoren ausgelöst. Somit spielt es keine Rolle, wenn im Zustand Linkskurve der Sensor L1 plötzlich wieder weiss sieht. Der Roboter wird weiterhin eine Linkskurve fahren, bis der Sensor M wieder schwarz sieht.

Ecken erkennen

Obiger Ansatz funktioniert gut, aber nicht perfekt.

Probleme

Geradeaus

Der Liniensensor nimmt gleichzeitig bei M, R1 und L1 weiss wahr. Da M bis zuletzt aber schwarz war, wird der Roboter weiterhin geradeaus fahren.

Rechtskurve

Der Roboter fährt etwas schief nach rechts.

Vor dem Verlassen der Linie haben sowohl M wie auch R1 schwarz gemessen.

Wegen der Schiefen Lage verlässt M zuerst die Linie, weshalb der Roboter eine Rechtskurve fährt.

Linkskurve

Der Roboter fährt etwas schief nach links.

Vor dem Verlassen der Linie haben sowohl M wie auch L1 schwarz gemessen.

Wegen der Schiefen Lage verlässt M zuerst die Linie, weshalb der Roboter eine Linkskurve fährt.

Anpassungen:

Aufgabe

Wann sollte der Roboter vom Zustand Rechtskurve in den Zustand Linkskurve wechseln?

Programmieren Sie die zusätzlichen Überprüfungen und testen Sie Ihr Roboter.