LIDAR
Lidar, aynı anda çalışan çok sayıda mesafe sensörü gibi, robotun çevresindeki mesafeleri metre cinsinden ölçer. Başlangıç robotunda robotun üstündedir ve adı lidar’dır.
Lidar, robotun çevresinde üst üste dizilmiş 4 katmanda, 1 m uzaklığa kadar 512 nokta ölçer. Hiçbir şeye çarpmayan bir noktanın değeri inf olur.
Mesafeleri okuma
Bölüm başlığı “Mesafeleri okuma”getLayerRangeImage(0), bir katmanın 512 mesafesini verir. İlk değer robotun önüne aittir ve değerler saat yönünde ilerler: dizinin dörtte biri sağa, yarısı arkaya, dörtte üçü sola karşılık gelir.
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;}Aşağıda, başlangıç robotunun world1.wbt içinde ölçtüğü bir katman, robot ortada olacak şekilde yukarıdan çizilmiştir. Çevresindeki duvarlar nokta dizileri olarak görünür.
Nokta bulutu
Bölüm başlığı “Nokta bulutu”Lidar her noktayı lidara göre bir konum olarak da verebilir; bu, robotun gördüklerinin haritasını çizmek için kullanışlıdır. Nokta bulutunu hesaplamak ek zaman aldığı için onu yalnızca kullanacaksan etkinleştir.
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;}