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)
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 😭.
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.
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)
...
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 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.
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:
Wann sollte der Roboter vom Zustand Rechtskurve in den Zustand Linkskurve wechseln?
Programmieren Sie die zusätzlichen Überprüfungen und testen Sie Ihr Roboter.
Linien Folger