Aller au contenu
Français

LIDAR

Le LIDAR mesure les distances en mètres tout autour du robot, comme de nombreux capteurs de distance à la fois. Sur le robot de départ, il s’appelle lidar et se trouve sur le dessus du robot.

Il mesure 512 points autour du robot, sur 4 couches superposées, jusqu’à 1 m de distance. Un point qui ne touche rien vaut inf.

getLayerRangeImage(0) donne les 512 distances d’une couche. La première est devant le robot, et elles tournent dans le sens des aiguilles d’une montre : au quart, c’est à droite, à la moitié, c’est derrière, et aux trois quarts, c’est à gauche.

Les points d’une couche du LIDAR autour du robot : 0 devant, 128 à droite, 256 derrière et 384 à gauche

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))

Voici une couche mesurée par le robot de départ dans world1.wbt, dessinée vue de dessus avec le robot au centre. Les murs qui l’entourent apparaissent comme des lignes de points.

Une couche du LIDAR vue de dessus : les murs autour du robot forment des lignes de points

Le LIDAR peut aussi donner chaque point sous forme de position relative au LIDAR, ce qui est utile pour dessiner une carte de ce que voit le robot. Le calcul prend du temps supplémentaire : ne l’activez donc que si vous l’utilisez.

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)