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.
Entfernungen auslesen
Abschnitt betitelt „Entfernungen auslesen“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.
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 layerprint("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))#include <iostream>#include <webots/Robot.hpp>#include <webots/Lidar.hpp>
using namespace webots;using namespace std;
int main() { Robot *robot = new Robot(); int timeStep = (int)robot->getBasicTimeStep();
Lidar *lidar = robot->getLidar("lidar"); lidar->enable(timeStep); int n = lidar->getHorizontalResolution(); // Number of points in each layer cout << "Points per layer: " << n << " Layers: " << lidar->getNumberOfLayers() << endl;
while (robot->step(timeStep) != -1) { const float *distances = lidar->getLayerRangeImage(0); // One layer, in meters, clockwise from the front cout << "front: " << distances[0] << " right: " << distances[n / 4] << " back: " << distances[n / 2] << " left: " << distances[3 * n / 4] << endl; }
delete robot; return 0;}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.
Punktwolke
Abschnitt betitelt „Punktwolke“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)#include <iostream>#include <webots/Robot.hpp>#include <webots/Lidar.hpp>
using namespace webots;using namespace std;
int main() { Robot *robot = new Robot(); int timeStep = (int)robot->getBasicTimeStep();
Lidar *lidar = robot->getLidar("lidar"); lidar->enable(timeStep); lidar->enablePointCloud(); // Computing the point cloud takes extra time
while (robot->step(timeStep) != -1) { const LidarPoint *points = lidar->getPointCloud(); const LidarPoint &point = points[0]; // Positions relative to the lidar, in meters cout << "x: " << point.x << " y: " << point.y << " z: " << point.z << " layer: " << point.layer_id << endl; }
delete robot; return 0;}