LIDAR
Lidar mengukur jarak dalam meter di sekeliling robot, seperti banyak sensor jarak sekaligus. Pada robot pemula, namanya lidar, dan letaknya di atas robot.
Lidar mengukur 512 titik di sekeliling robot, dalam 4 lapisan yang bertumpuk, hingga sejauh 1 m. Titik yang tidak mengenai apa pun bernilai inf.
Membaca jarak
Section titled “Membaca jarak”getLayerRangeImage(0) memberikan 512 jarak dari satu lapisan. Jarak pertama berada di depan robot, dan urutannya searah jarum jam: titik di seperempat putaran ada di kanan, di setengah putaran ada di belakang, dan di tiga perempat putaran ada di kiri.
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;}Berikut satu lapisan yang diukur robot pemula di world1.wbt, digambar dari atas dengan robot di tengahnya. Dinding di sekelilingnya tampak sebagai deretan titik.
Awan titik
Section titled “Awan titik”Lidar juga bisa memberikan setiap titik sebagai posisi relatif terhadap lidar, yang berguna untuk menggambar peta dari apa yang dilihat robot. Perhitungannya butuh waktu tambahan, jadi aktifkan hanya jika kamu menggunakannya.
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;}