Main Content

Log and Visualize 3-D Data from Velodyne LiDAR Sensor

This example shows how to acquire lidar data from a Velodyne LiDAR® sensor device. A lidar sensor creates a 3-D map of the surrounding environment by using scanning laser beams and time of flight distance measurements. Lidar systems are used in a variety of application areas, such as a 3-D mapping, surveying, industrial automation, and autonomous vehicle navigation.

A Velodyne Puck (VLP-16) sensor is used in this example. This model has 16 scanning laser beams (channels), up to 360 degrees horizontal field of view (FOV), 30 degrees vertical FOV, and 100 meter range. The velodyneLidar interface in MATLAB® supports a variety of Velodyne LiDAR models. Choose a sensor model appropriate for your particular application by consulting the instrument specifications provided by the manufacturer.

Requirements

This example requires:

  • MATLAB R2020b or later.

  • Lidar Toolbox.

  • Lidar Toolbox Support Package for Velodyne LiDAR Sensors.

  • A supported Velodyne LiDAR sensor. A Velodyne Puck (VLP-16) is used in this example.

Set Up and Configure Velodyne LiDAR Sensor

The Velodyne Puck (VLP-16) sensor is an Ethernet network connected device that provides an integrated web server for configuring operating parameters, such as FOV or rotation rate. Consult the VLP-16 User Manual for required network setup and sensor parameter configuration. In this example, the VLP-16 sensor is directly connected to a computer with a dedicated Ethernet adapter, and the sensor's default IP address value is used (192.168.1.201).

To configure the sensor's parameters, access the sensor's web interface by opening the sensor's web server URL (http://192.168.1.201/) in a web browser. To test the sensor network setup, configuration, and operation, use VeloView, an application provided by the manufacturer.

Connect to Velodyne LiDAR Sensor

Create a velodynelidar object to receive data from the VLP-16 device. MATLAB uses the default UDP port value of 2368 to receive data from the device. If your device is configured to broadcast data to a different port, you need to specify the port number as an additional name-value pair argument, for example, velodynelidar('VLP16','Port',2368).

lidar = velodynelidar('VLP16');

Preview Live Lidar Data

View live scan data acquired from the lidar sensor using the preview function.

preview(lidar)
pause(10)
closePreview(lidar)

Acquire Lidar Data

The lidar sensor continuously streams 3-D maps of the surroundings as frames of data. Each data frame represents one full scan of the FOV. The velodynelidar interface provides a continuous buffered acquisition functionality, which can be initiated using the start function. The processed lidar data frames are stored in an input buffer.

% Start acquisition
start(lidar)

Read one data frame from the lidar sensor. Each data frame is represented in MATLAB as a pointCloud datatype. The data values represent a distance measurement and the default units are meters (m).

Use the read function to read data frames into MATLAB workspace. You can use the optional second argument to read the frame timestamp. The timestamp is returned as a datetime datatype.

[frame,timestamp] = read(lidar,1)
frame = 
  pointCloud with properties:

     Location: [32×1846×3 double]
        Color: []
       Normal: []
    Intensity: [32×1846 double]
        Count: 59072
      XLimits: [-90.9482 83.9612]
      YLimits: [-103.9809 102.8859]
      ZLimits: [-3.2730 15.8287]

timestamp = datetime
   24-Apr-2019 12:20:15:622

Visualize Acquired Data Frame

Display the data frame (point cloud) using pcplayer and use the data limits as the view XYZ limits.

lidarViewer = pcplayer(frame.XLimits,frame.YLimits,frame.ZLimits);
view(lidarViewer, frame)

Configure the viewing region of interest by setting the pcplayer axes limits.

lidarViewer.Axes.XLim = [-30 30];
lidarViewer.Axes.YLim = [-30 30];
lidarViewer.Axes.ZLim = [-10 10];

Read a Sequence of Frames

Read a sequence of 100 frames. The acquired frames data are represented as a pointCloud array, and the acquired timestamps as a datetime array.

numFrames = 100;
[frames,timestamps] = read(lidar,numFrames);

Stop Acquisition

Stop acquisition and disconnect from the lidar sensor.

stop(lidar)
clear lidar

Save Acquired Data

Save the acquired data frames and timestamps to a MAT-file.

save lidardata.mat frames timestamps

Determine Lidar Frame Rate

You can use the timestamps data to determine the number of acquired lidar data frames per second (frame rate). The lidar sensor's frame rate depends on the configured motor RPM, FOV, and other sensor parameters.

fps = 1/mean(seconds(diff(timestamps)))
fps = 11.6484

View Replay of Lidar Data

Use the existing pcplayer object (lidarViewer) to replay acquired frames as an animation. This uses a custom helper function (replay), which is included at the end of this example.

replay(lidarViewer,frames,fps)

Lidar Data Processing and Analysis

The following toolboxes provide specialized algorithms and tools for processing and analysis of lidar and 3-D point cloud data:

  • Computer Vision Toolbox™

  • Automated Driving Toolbox™

Local Functions

function replay(lidarViewer,frames,fps)
%REPLAY Replays point cloud array data in a PCPLAYER figure
% LIDARVIEWER is an existing PCPLAYER object
% FRAMES is a pointCloud array
% FPS is the approximate playback frame rate
%
% Example usage:
%  lidar = velodynelidar('VLP16');
%  start(lidar)
%  [frames,timestamps] = read(lidar,100);
%  stop(lidar)
%  clear lidar
%  fps = 1/mean(seconds(diff(timestamps)));
%  lidarViewer = pcplayer([-40 40], [-40 40],[-10 10]);
%  replay(lidarViewer,frames,fps);

    dt = 1/fps;

    for ii = 1:numel(frames)
        view(lidarViewer,frames(ii))
        pause(dt)
    end

end