lidar
Deutsch   English   

15. LIDAR, PID und LICHTSENSOR (nur mbrobot plusV3)

 

 

DU LERNST HIER...

 

wie du die weiterführenden Funktionen des mbRobots Plus V3 verwenden kannst. Das neueste Maqueen-Modell Plus V3 verfügt neben den Funktionen, die in den vorhergehenden Kapiteln beschrieben sind, über folgende Erweiterungen:

  • LIDAR : Matrix Laser Entfernungssensor
  • PID Control: Motorencoder und PID-Regelung
  • Lichtsensor: Light Intensity Sensor
  • Kreuzung Erkennung


 

WIE FUNKTIONIERT 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 kannst du folgende Funktionen verwenden:

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(index) liefert Distanz-Werte in der Reihe index
getDistanceAt(x, y) liefert den Abstand zum Punkt (x, y) der Matrix


 

MUSTERBEISPIELE

 

Beispiel 1: Objekte erkennen
Schliesse den Lidarsensor an die erste oder zweite I2C-Schnittstelle an. Der Roboter fährt vorwärts und misst mit dem LIDAR die Distanz zu den Objekten, die vor ihm liegen. Du verwendest 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

 

Beispiel 2: Lidar-Messwerte links und rechts vergleichen

Der Befehl getDistanceRow(4) liefert eine Liste mit 8 Messwerten (die vierte Reihe der Matrix). Du vergleichst die Messewerte links und rechts. 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. Stelle das Objekt an verschiedene Positionen und beobachte die Messwerte.

 
from mbrobot_plusV3 import *

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

 

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


 

PID CONTROL

 

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



 

MUSTERBEISPIEL

 

Beispiel 1: 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

pidControlDistance(1, 20) : der Roboter bewegt sich 20 cm vorwärts.
pidControlDistance(2, 20) : der Roboter bewegt sich 20 cm rückwärts.
pidControlDistance(90) : der Roboter dreht 90° nach links.
pidControlDistance(-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, wobei 0 sehr dunkel und 1023 sehr hell bedeutet. Die Sensoren befinden sich vorne links und rechts am Chassis.



 

MUSTERBEISPIEL

  Roboter mit einer Taschenlampe steuern
Mit einer Taschenlampe beleuchtest du 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

Den Grenzwert von 250 muss du eventuell der Umgebungshelligkeit anpassen.

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


 

KREUZUNG ERKENNUNG

 

MbRobot 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.



 

MUSTERBEISPIEL

 

In deinem 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. Der Roboter detektiert eine Kreuzung, wenn die Bedingung
if intersectionDetecting() == 1: oder kurz
if intersectionDetecting(): erfüllt ist.
(Da in der Informatik 1 True und 0 False bedeutet, kannst du " == 1" weglassen).

 

from mbrobot_plusV3 import *

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

 

 

MERKE DIR...

 

Lidar-Sensor misst die Distanz zu Objekten, die sich vor ihn befinden und liefert eine Matrix mit 64 Messwerten. Je nach Problemstellung, kannst du nur einen Wert, eine Liste der Werte in einer Reihe oder eine Liste aller 64 Messwerte verwenden

Mit PID Control kannst du den Roboter um eine genaue Distanz (in cm) vorwärts oder rückwärts bewegen, oder um einen Winkel drehen.

Mit den Lichtsensoren kannst du die Intensität des Umgebungslichts messen. Die Messwerte liegen im Bereich 0 bis 1023. Höhere Werte bekommst du insbesondere dann, wenn du die Sensoren mit einer Taschenlampe beleuchtest.

Die Funktion intersectionDetecting() gibt 1 zurück, wenn sich der Roboter auf einer Kreuzung befindet. Um die Art der Kreuzung fest zu legen, verwendest du mit Vorteil die Infrarotsensoren irL2 bzw. irR2, welche die Helligkeit der Unterlage neben dem Fahrstreifen detektieren können.

 

 

ZUM SELBST LÖSEN

 

 

1.

Baue eine Bahn und lasse den Roboter mit Hilfe vom LIDAR-Sensor durchfahren, so wie im folgenden YouTube Video: VideoLIDAR

   
 
2.

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

 
 
3.
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.  

4.
Erstelle eine Bahn mit Streifen und Kreuzungen und lasse den Roboter bestimmte Wege abfahren.