Zum Inhalt springen
Deutsch

Lidar

Das Lidar misst Entfernungen in Metern rund um den Roboter, wie viele Abstandssensoren auf einmal. Beim Starter-Roboter heißt es lidar und sitzt oben auf dem Roboter.

Es misst 512 Punkte rund um den Roboter, in 4 übereinanderliegenden Schichten, bis zu 1 m weit. Ein Punkt, der nichts trifft, liefert inf.

getLayerRangeImage(0) liefert die 512 Entfernungen einer Schicht. Die erste liegt vor dem Roboter, und sie verlaufen im Uhrzeigersinn: Nach einem Viertel kommt die rechte Seite, nach der Hälfte die Rückseite und nach drei Vierteln die linke Seite.

Die Punkte einer Lidar-Schicht rund um den Roboter: 0 vorne, 128 rechts, 256 hinten und 384 links

from controller import Robot
robot = Robot()
timeStep = int(robot.getBasicTimeStep())
lidar = robot.getDevice("lidar")
lidar.enable(timeStep)
n = lidar.getHorizontalResolution() # Number of points in each layer
print("Points per layer:", n, "Layers:", lidar.getNumberOfLayers())
while robot.step(timeStep) != -1:
distances = lidar.getLayerRangeImage(0) # One layer, in meters, clockwise from the front
front = distances[0]
right = distances[n // 4]
back = distances[n // 2]
left = distances[3 * n // 4]
print("front:", round(front, 3), "right:", round(right, 3), "back:", round(back, 3), "left:", round(left, 3))

Hier ist eine Schicht, die der Starter-Roboter in world1.wbt gemessen hat, von oben gezeichnet, mit dem Roboter in der Mitte. Die Wände um ihn herum erscheinen als Reihen von Punkten.

Eine Lidar-Schicht von oben: Wände um den Roboter als Reihen von Punkten

Das Lidar kann jeden Punkt auch als Position relativ zum Lidar liefern. Das ist nützlich, um eine Karte von dem zu zeichnen, was der Roboter sieht. Die Berechnung kostet zusätzliche Zeit, also aktiviere sie nur, wenn du sie brauchst.

from controller import Robot
robot = Robot()
timeStep = int(robot.getBasicTimeStep())
lidar = robot.getDevice("lidar")
lidar.enable(timeStep)
lidar.enablePointCloud() # Computing the point cloud takes extra time
while robot.step(timeStep) != -1:
points = lidar.getPointCloud()
point = points[0] # Positions relative to the lidar, in meters
print("x:", round(point.x, 3), "y:", round(point.y, 3), "z:", round(point.z, 3), "layer:", point.layer)