TigerJython xx
für Gymnasien
Deutsch   English 

20. LIDAR, PID und Lichtsensor (nur mbrobot plusV3)


Das neueste Maqueen-Modell Plus V3 verfügt über folgende Erweiterungen:

  • LIDAR : Matrix Laser Entfernungssensor
  • PID Control: Motorencoder und PID-Regelung
  • Light Intensity Sensor (Messung der Umgebungshelligkeit)
  • Integrierte Kreuzung Erkennung und Linienverfolgunh

 

LIDAR

Lidar ist eine Technologie, die Laserlicht nutzt, um die Entfernung zu messen. Lidar funktioniert ähnlich wie ein Ultraschallsensor. Anstelle der Ultraschallwellen sendet er Laserimpulse aus, die von Objekten reflektiert werden. Gemessen wird die Zeit, die das Licht für den Hin- und Rückweg benötigt. Mit Hilfe dieser Zeit und der Lichtgeschwindigkeit wird die Distanz berechnet.

Maqueen Plus V3 ist mit einem Matrix-Lidar-Sensor ausgestattet. Innerhalb eines 60-Grad-Erfassungsbereichs liefert er eine Matrix mit 64 Messwerten.

 

 


Für die Distanz-Messung können folgende Funktionen verwendet werden:

getDistance() liefert den "direkten" Abstand zum Objekt
getDistanceList() liefert eine Liste mit 64 Distanz-Werten
getDistanceGrid() liefert 8 Listen mit je 8 Distanz-Werten
getDistanceRow(i) liefert Distanz-Werte der i-ten Zeile
getDistanceColumn(i) liefert Distanz-Werte der i-ten Spalte
getDistanceAt(x, y) liefert den Abstand zum Punkt (x, y) der Matrix


Beispiel 1: Objekte erkennen

Der Lidarsensor wird an der ersten oder zweiten I2C-Schnittstelle angeschlossen. Der Roboter fährt vorwärts und misst mit dem LIDAR die Distanz zu den Objekten, die vor ihm liegen. Man verwendet den Befehl getDistance(). Wenn ein Objekt näher als 20 cm ist, hält der Roboter an. Wenn die Distanz wieder grösser wird, fährt er wieder los. Die Messwerte werden mit print() angezeigt. delay(100) gibt die Messperiode an.

 
from mbrobot_plusV3 import *

setSpeed(30)
repeat:
    d = getDistance()
    print(d)
    if d < 20:
        stop()
    else:
        forward()    
    delay(100)
► In Zwischenablage kopieren
 

Erklärungen zum Programmcode:

getDistance(): gibt den Abstand zum mittleren Bereich der Distanzmatrix. Entspreicht dem Befehl getDistance() für den Ultraschallsensor bei den anderen Maqueen Modellen

 

Beispiel 2: Lidar-Messwerte links und rechts vergleichen

Der Befehl getDistanceRow(4) liefert eine Liste mit 8 Messwerten (die vierte Reihe der Matrix). Man kann die Messewerte links und rechts vergleichen. Wenn die Distanz rechts kleiner ist, leuchtet die rechte LED rot, wenn die Distanz links kleiner ist, leuchtet die linke LED grün.
Mit print() werden jeweils alle 8 Messwerte angezeigt. Man kann das Objekt an verschiedene Positionen stellen und die Messwerte beobachten.

from mbrobot_plusV3 import *

repeat:
    row = getDistanceRow(4) #8 Values left to right
    print(row)
    if row[0] < row[7]:
        setLEDLeft(1)
        setLEDRight(0)    
    else:
        setLEDLeft(0)
        setLEDRight(2)      
    delay(100)
► In Zwischenablage kopieren
 

Erklärungen zum Programmcode:

getDistanceRow(4) : lifert eine Liste mit 8 Messwerten (von lins nach rechts)
if row[1] < row[7] : falls der Abstand rechts

 

Beispiel 3: Was "sieht" der LIDAR-Sensor?
Der LIDAR Sensor liefert typischerweise 8×8 = 64 Messpunkte. Diese kannst du mit dem Befehl
getDistanceList() auslesen und in 8 Zeilen à 8 Zeichen visualisieren. Je näher ein Punkt liegt, umso grösser wählst du das Zeichen.

Damit du die Matrix besser anschauen kannst, wählst du eine längere Messperiode (delay(3000)).

from mbrobot_plusV3 import *

def readData():
    data = getDistanceList()
    matrix = []
    for row in range(8):
        rowData = [data[row * 8 + col] for col in range(8)]
        matrix.append(rowData)
    return matrix

def showMap(matrix):
    for row in matrix:
        line = ""
        for val in row:
            if val < 30:
                line += " X "
            elif val < 60:
                line += " x "
            elif val < 100:
                line += " - "
            elif val < 150:
                line += " . "
            else:
                line += " "
        print(line)
    print("")    
    print("------------------------------")
    print("")
	
while True:
    matrix = readData()
    showMap(matrix)
    delay(3000)	
► In Zwischenablage kopieren
 

Erklärungen zum Programmcode:

getDistanceList() liefert eine Liste mit 64 Messwerten
readData bereitet die Messwerte so, dass sie reihenweise gelesen werden können

 

PID Control

Maqueen Plus V3 verfügt über einen Motorencoder, mit dem man die Vorwärtsbewegung und den Lenkwinkel des Roboters präzise steuern kann.
Mit dem Befehl pidControlDistance(dir, dist) kann man eine in cm angegebene Strecke dist ziemlich genau vorwärts (dir = 1) oder rückwärts (dir = 2) abfahren.
Mit dem Befehl pidControlAngle(angle) dreht der Roboter nach links (angle > 0) oder rechts (angle < 0).


Beispiel
: Fahren und Drehen mit PID-Control
Der Roboter fährt zuerst 20 cm vorwärts, dann 20 cm Rückwärts, dreht 90° nach links und anschliessend 90° nach rechts.

from mbrobot_plusV3 import *

pidControlDistance(1, 20)
pidControlDistance(2, 20)
pidControlAngle(90)
pidControlAngle(-90)
► In Zwischenablage kopieren
 

Erklärungen zum Programmcode:

pidControlDistance(1, 20): der Roboter bewegt sich 20 cm vorwärts
pidControlDistance(2, 20):der Roboter bewegt sich 20 cm rückwärts
pidControlAngle(90):der Roboter dreht 90° nach links
pidControlAngel(-90):der Roboter dreht 90° nach rechts

Lichtsensoren

Mit den zwei integrierte Lichtsensoren kannst du die Intensität des Umgebungslichts messen. Es sind im Prinzip Photodioden (LDRs), deren elektrischer Widerstand sich ändert, wenn Licht darauf fällt.

Die Änderungen des Widerstands werden vom micro:bit erfasst und in einen digitalen Wert im Bereich von 0 bis 1023 umgewandelt.

 

0 bedeutet sehr dunkel und 1023 sehr hell. Die Sensoren befinden sich vorne links und rechts am Chassis.

Beispiel: Roboter mit einer Taschenlampe steuern

Mit einer Taschenlampe beleuchtet man die rechte oder die linke Seite des Roboters. Wenn der rechte Lichtsensor einen Wert grösser als 250 misst, fährt der Roboter auf einem Rechtsbogen, bei Beleuchtung des linken Sensors fährt er auf einem Linksbogen, sonst gerade aus.

readLightIntensity(0) gibt den Lichtwert des rechten Sensors
readLightInternsity(1) gibt den Lichtwert des linken Sensors

 

from mbrobot_plusV3 import *

setSpeed(30)
repeat:
    vR = readLightIntensity(0) #right
    vL = readLightIntensity(1) #left
    print(vR, vL)
    if vR > 250:
        rightArc(0.2)
    elif vL > 250:
        leftArc(0.2)
    else:
        forward()        
    delay(100)
► In Zwischenablage kopieren
 

Erklärungen zum Programmcode:

Den Grenzwert von 250 muss man je nach Umgebungshelligkeit und Helligkeit der Lichtquelle noch anpassen.

 

Kreuzung Erkennung

Maqueen Plus V3 erkennt die Kreuzungen, T-Kreuzungen, Links-, Rechts-abbiege und Geradekreuzungen.
Die Funktion intersectionDetecting() gibt 1 zurück, falls der Roboter eine Kreuzung detektiert, sonst 0.

Beispiel:Roboter mit einer Taschenlampe steuern

In diesen einfachen Beispiel kannst du testen, wie der Roboter die verschiedenen Kreuzungen erkennt. Du lässt ihn jeweils vorwärts fahren, bis er eine Kreuzung erkennt. Dann soll er anhalten. Falls der Roboter eine Kreuzung detektiert, gibt intersectionDetecting() True zurück, sonst False.

 

from mbrobot_plusV3 import *

forward()
repeat:
    if intersectionDetecting():
        stop()
    delay(100)
► In Zwischenablage kopieren
 

Erklärungen zum Programmcode:

Die Funktion intersectionDetecting()gibt True zurück, wenn sich der Roboter auf einer Kreuzung befindet.
Den Grenzwert von 250 muss man je nach Umgebungshelligkeit und Helligkeit der Lichtquelle noch anpassen.

 

 


Aufgaben:


1)


Zeichne eine Bahn, die aus mehreren 20 cm langen Strecken besteht. Verwende PID Control um die Bahn genau abzufahren.

 


2)


Erstelle einen Tunnel aus einer Kartonschachtel und lasse den Roboter durchfahren. Der Roboter soll selbst merken, wann er sich im Tunnel befindet und seine LEDs einschalten. Nach dem Tunnel schaltet er die LEDs wieder aus.


 


3)
Erstelle eine Bahn mit Kreuzungen und lasse den Roboter bestimmte Wege abfahren.  




4)


Baue eine Bahn mit senkrechten Wänden und lasse den Roboter mit Hilfe vom LIDAR-Sensor durchfahren