What: A dataset of 631 objects scanned with a Velodyne HDL-64E LIDAR.
Where: Sydney CBD.
Why: To test 3D feature extraction and object classification algorithms.
This object dataset was collected from the robot Shrimp (left), which has a Velodyne LIDAR. It spins around at 20Hz to produce a dynamic 3D point cloud of the scene. The dataset consists of 631 object instances segmented from Velodyne scans of the Sydney CBD. A few instances are shown below.
View a few objects in your browser here (a recent, webgl-compatible browser is required).
The ACFR has developed two open-source libraries you may find useful.
Reading the data
Each object is available in 3 formats. The simplest to read is ascii csv format (objects/*.csv). A more compact and faster-to-process format is binary csv (objects/*.bin). These both have the same fields, described in the *.meta files, which are all as follows:
|t||Timestamp, microseconds since epoch||int64|
|intensity||Laser return intensity (0-255)||uint8|
|id||Laser id (the Velodyne has 64 lasers)||uint8|
|x,y,z||3D point||float32 x3|
|azimuth||Horizontal azimuth angle, radians, calibration-corrected||float32|
|range||Range (m) of laser return, calibration-corrected||float32|
|pid||Point id of the original, full 360deg scan.||int32|
These can be read in Python with Numpy, as shown in this example:
# -*- coding: utf-8 -*- """ Simple example for loading object binary data. """ import numpy as np names = ['t','intensity','id', 'x','y','z', 'azimuth','range','pid'] formats = ['int64', 'uint8', 'uint8', 'float32', 'float32', 'float32', 'float32', 'float32', 'int32'] binType = np.dtype( dict(names=names, formats=formats) ) data = np.fromfile('objects/excavator.0.10974.bin', binType) # 3D points, one per row P = np.vstack([ data['x'], data['y'], data['z'] ]).T
cat objects/excavator.0.10974.bin | \ csv-from-bin "t,ub,ub,f,f,f,f,f,i" > excavator.0.10974.csv
With snark, you can display the points:
cat objects/excavator.0.10974.bin | \ view-points --binary "t,ub,ub,f,f,f,f,f,i" --fields t,,,x,y,z
In addition to the individual objects, the full 360deg scans are also provided, as the original velodyne data packets. Each object is named by:
For example, the segmented excavator is in objects/excavator.0.10974.bin, and the full 360deg scan that contains the excavator is in scans/scan.10974.bin. The field 'pid' indicates which points in the full scan are from the excavator.
The 'full scan' data are stored in the raw Velodyne format (8 byte timestamp in microseconds + 1206 byte packet, see the Velodyne manual). You can read this data using snark's velodyne-to-csv application. The calibration parameters for our Velodyne are in db.xml.
Only the most populous classes were used for testing classification algorithms. A reasonable set of 588 objects was selected from the full 631, split evenly into 4 folds. See folds/folds*.txt for the objects in each fold. Folds were selected to ensure no object appeared in two folds (some objects appear more than once in the dataset, scanned from different positions). This set still contains many challenging instances of highly occluded objects.