lehrkraefte:snr:informatik:glf22:robotik:line-follower

Lichtsensor und Line Follower

In diesem Abschnitt geht es um Regelungstechnik. Typische Probleme sind:

  • im Haushalt: Temperatur von Heizung bzw. Kühlschrank bzw. Bügeleisen so regeln, dass die gewünschte Temperatur möglichst konstant bleibt.
  • Tempomat beim Auto: Halte die Geschwindigkeit konstant (auch bei Steigungen, Wind etc.).
  • Autopiloten in der Luftfahrt, Schiffahrt, Raumfahrt.
  • Wie muss ich den Abfluss eines Stausees regeln, damit die gewünschte Strommenge erzeugt wird.

Der Roboter soll der äusseren schwarzen Linie auf der Plane folgen!

Erstelle per “Create a new project” ein neues Projekt und kopiere ans Ende des Programms main.py den folgenden Code.

Ersetze die Nullen wie in den Kommmentaren im Programm beschrieben.

# Bitte sicherstellen, dass dein Computer im tech-lab-Netz ist und nicht in Schule SG o.ä..
 
###############
#  AUFGABE 1  #
###############
 
ev3.speaker.say(text="Hello, I'll follow the line.")
 
links = Motor(Port.A)
rechts = Motor(Port.B)
 
licht = ColorSensor(Port.S1)
 
# Sind die Motoren und Sensoren richtig verkabelt?
 
while True:
    r = licht.reflection()
    print(r)
    wait(100)    
 
# Ermittle mit Hilfe der obigen Schleife die Werte 
# für Weiss und Schwarz auf der Plane und trage sie
# unten ansstelle der Nullen ein.
schwarz = 0
weiss = 0
 
# Idealwert, wenn der Sensor mittig auf der Kante ist.
idealwert = (schwarz + weiss) / 2

Im bisher erstellten Programm: Lösche die while True-Schleife (oder kommentiere sie aus).

Dann kopiere den folgenden Code-Block ans Ende des Programms und lerne damit den drive-Befehl kennen.

###############
#  AUFGABE 2  #
###############
 
fahrwerk = DriveBase(links, rechts, wheel_diameter=55.5, axle_track=125)
# Raddurchmesser und Achsenabstand (in Millimeter) sind hier die beiden letzten Parameter.
 
# Lerne den "drive"-Befehl kennen:
# - erster Parameter: Robotergeschwindigkeit in mm/s
# - zweiter Parameter: Rotationsgeschwindigkeit der Roboters in Grad/s
# Die entsprechende Bewegung wird solange ausgeführt, bis ein anderer Befehl oder ein Stopp-Befehl kommt.
 
# Du darfst gerne die Parameter ändern!
 
fahrwerk.drive(100, 0)
wait(3000) # Wartezeit in Millisekunden
fahrwerk.drive(100, -20)
wait(3000)
fahrwerk.drive(100, 20)
wait(3000)
ev3.speaker.say(text="Now I stop.")
fahrwerk.stop()

Genaueres über die “Drivebase” steht hier: https://pybricks.com/ev3-micropython/robotics.html

Idee: Der Helligkeitssensor des Roboters soll sich immer genau über der Kante der schwarzen Linie befinden: Lass dazu den Roboter nach links bzw. rechts abbiegen, wenn der Grauwert zu klein bzw. zu gross ist.

Im bisher erstellten Programm: Lösche die letzten acht Zeilen mit den drive-Befehlen (oder kommentiere sie aus).

Dann kopiere den folgenden Code-Block ans Ende des Programms.

###############
#  AUFGABE 3  #
###############
 
geschwindigkeit = 50
 
while True:
    abweichung = licht.reflection() - idealwert
    if abweichung < 0: 
        fahrwerk.drive(geschwindigkeit, -20)
    elif abweichung > 0: 
        fahrwerk.drive(geschwindigkeit, 20)
    else:
        fahrwerk.drive(geschwindigkeit, 0)

Im bisher erstellten Programm: Ersetze den Inhalt der while True-Schleife durch die folgenden Zeilen.

Die Idee ist, dass die Abbiegedrehgeschwindigkeit proportional mit der Abweichung steigt.

    ###############
    #  AUFGABE 4  #
    ###############
    abweichung = licht.reflection() - idealwert
    # Ersetze ''??'' durch Ausprobieren durch eine geeignete Zahl (zwischen 0 und 2)!
    fahrwerk.drive(geschwindigkeit, ?? * abweichung)

Modifiziere das bisher erstellten Programm wie folgt; Ziel ist danach, die drei Konstanten gut zu wählen.

Idee dahinter: Die Abbiegedrehgeschwindigkeit soll nicht nur proportional zur Abweichung sein, sondern auch die Summe aller bisherigen Abweichungen berücksichtigen und auch die aktuelle Änderung. Dies nennt sich PID-Steuerung (wegen P=proportional, I=Integral (in etwa die Summe) und D=Differential).

Füge vor der while True-Schleife die folgende Definition von Konstanten ein:

###############
#  AUFGABE 5  #
###############
 
# Finde durch Ausprobieren (= Testfahrten) gute Werte!
# Am besten erst die letzten beiden Werte auf Null setzen und den ersten Wert gut wählen.
# Dann den zweiten Wert gut wählen.
# Dann den dritten.
proportional_faktor = ??   # zwischen 0 und 2
integral_faktor = ??       # kleiner als 0.1
differential_faktor = ??   # zwischen 0 und 4
 
letzte_abweichung = 0
integral = 0
 
zaehler = 0

Ersetze den Inhalt der while True-Schleife durch die folgenden Zeilen und finde dann gute Werte für die obigen Konstanten.

    abweichung = licht.reflection() - idealwert
    zaehler = zaehler + 1
    proportional_fix = proportional_faktor * abweichung
    integral += abweichung
    integral_fix = integral_faktor * integral
    veraenderung = abweichung - letzte_abweichung
    differential_fix = differential_faktor * veraenderung
    letzte_abweichung = abweichung
    if zaehler % 250 == 0:
        print(10 * '-' + str(zaehler) + 10 * '-')
        print('proportional_fix=' + str(proportional_fix))
        print('integral_fix=' + str(integral_fix))
        print('differential_fix=' + str(differential_fix))
    fahrwerk.drive(geschwindigkeit, proportional_fix + integral_fix + differential_fix)
 
    wait(5)

Bei mir klappten die folgenden Werte (auf der äusseren Rennstrecke der Plane) gut:

Bei mir klappten die folgenden Werte (auf der äusseren Rennstrecke der Plane) gut:

proportional_faktor = 1
integral_faktor = 0.01
differential_faktor = 1

In diesem Abschnitt ging es um Regelungstechnik, siehe etwa

Für nächstes Mal: Aktuelle Werte von abweichung, integral, veraenderung graphisch ausgeben!

  • lehrkraefte/snr/informatik/glf22/robotik/line-follower.txt
  • Last modified: 2023/06/27 10:00
  • by Olaf Schnürer