Main Content

scanContextLoopDetector

Detect loop closures using scan context descriptors

Description

scanContextLoopDetector detects loop closures in point cloud data using global scan context descriptors. A scan context descriptor encodes a point cloud view into a 2-D descriptor. scanContextLoopDetector stores the descriptors with a corresponding view identifier to associate the detected loop closures to a view in a pcviewset for map building.

Creation

Description

example

loopDetector = scanContextLoopDetector() creates a default scanContextLoopDetector object. Use the addDescriptor object function to add descriptors to the loop detector. Use the detectLoop object function to detect loop closures.

Properties

expand all

This property is read-only.

View identifiers, specified as a P-element vector of unique positive integers, where P is the number of descriptors added to the detector.

This property is read-only.

Scan context descriptors, specified as an M-by-N-by-P array. M is the number of radial bins and N is the number of azimuthal bins in the descriptor. P is the number of descriptors in the detector.

Object Functions

addDescriptorAdd descriptor to the loop closure detector
deleteDescriptorDelete descriptors from the loop closure detector
detectLoopDetect loop closures

Examples

collapse all

Create a loop closure detector.

loopDetector = scanContextLoopDetector;

Create a Velodyne PCAP file reader.

veloReader = velodyneFileReader('lidarData_ConstructionRoad.pcap','HDL32E');

Read the point clouds and extract the scan context descriptor from each point cloud scan. Add the descriptors to the detector.

for viewId = 1:10
    ptCloud = readFrame(veloReader,viewId);
    descriptor = scanContextDescriptor(ptCloud);
    addDescriptor(loopDetector,viewId,descriptor);
end

Check if the next point cloud can be classified as a loop closure detection without excluding any recently added descriptors.

viewId = viewId + 1;
ptCloud = readFrame(veloReader,viewId);
descriptor = scanContextDescriptor(ptCloud);
[loopViewId,dists] = detectLoop(loopDetector,descriptor,'NumExcludedDescriptors',0)
loopViewId = uint32
    10
dists = single
    0.0831
Introduced in R2021b