This is machine translation

Translated by Microsoft
Mouseover text to see original. Click the button below to return to the English version of the page.

Note: This page has been translated by MathWorks. Click here to see
To view all translated materials including this page, select Country from the country navigator on the bottom of this page.

buildMap

Build occupancy grid from lidar scans

Syntax

map = buildMap(scans,poses,mapResolution,maxRange)

Description

example

map = buildMap(scans,poses,mapResolution,maxRange) creates a robotics.OccupancyGrid map by inserting lidar scans at the given poses. Specify the resolution of the resulting map, mapResolution, and the maximum range of the lidar sensor, maxRange.

Examples

collapse all

The buildMap function takes in lidar scan readings and associated poses to build an occupancy grid. as lidarScan objects and associated [x y theta] poses to build an robotics.OccupancyGrid.

Load scan and pose estimates collected from sensors on a robot in a parking garage. The data collected is correlated using a robotics.LidarSLAM algorithm, which performs scan matching to associate scans and adjust poses over the full robot trajectory. Check to make sure scans and poses are the same length.

load scansAndPoses.mat
length(scans) == length(poses)
ans = logical
   1

Build the map. Specify the scans and poses in the buildMap function and include the desired map resolution (10 cells per meter) and the max range of the lidar (19.2 meters). Each scan is added at the associated poses and probability values in the occupancy grid are updated.

occGrid = buildMap(scans,poses,10,19.2);
figure
show(occGrid)
title('Occupancy Map of Garage')

Use a LidarSLAM object to iteratively add and compare lidar scans and build an optimized pose graph of the robot trajectory. To get an occupancy map from the associated poses and scans, use the buildMap function.

Load Data and Set Up SLAM Algorithm

Load a cell array of lidarScan objects. The lidar scans were collected in a parking garage on a Husky® robot from ClearPath Robotics®. Typically, lidar scans are taken at a high frequency and each scan is not needed for SLAM. Therefore, down sample the scans by selecting only every 40th scan.

load garage_fl1_southend.mat scans
scans = scans(1:40:end);

To set up the SLAM algorithm, specify the lidar range, map resolution, loop closure threshold, and search radius. Tune these parameters for your specific robot and environment. Create the LidarSLAM object with these parameters.

maxRange = 19.2; % meters
resolution = 10; % cells per meter

slamObj = robotics.LidarSLAM(resolution,maxRange);
slamObj.LoopClosureThreshold = 360;
slamObj.LoopClosureSearchRadius = 8;

Add Scans Iteratively

Using a for loop, add scans to the SLAM object. The object uses scan matching to compare each added scan to previously added ones. To improve the map, the object optimizes the pose graph whenever it detects a loop closure. Every 10 scans, display the stored poses and scans.

for i = 1:numel(scans)

    addScan(slamObj,scans{i});
    
    if rem(i,10) == 0
        show(slamObj);
    end
end

View Occupancy Map

After adding all the scans to the SLAM object, build an robotics.OccupancyGrid map by calling buildMap with the scans and poses. Use the same map resolution and max range you used with the SLAM object.

[scansSLAM,poses] = scansAndPoses(slamObj);
occGrid = buildMap(scansSLAM,poses,resolution,maxRange);
figure
show(occGrid)
title('Occupancy Map of Garage')

Input Arguments

collapse all

Lidar scans used to build the map, specified as a cell array of lidarScan objects.

Poses of lidar scans, specified as an n-by-3 matrix. Each row is an [x y theta] vector representing the xy-position and orientation angle of a scan.

Resolution of the output robotics.OccupancyGrid map, specified as a positive integer in cells per meter.

Maximum range of lidar sensor, specified as a positive scalar in meters. Points in the scans outside this range are ignored.

Name-Value Pair Arguments

Specify optional comma-separated pairs of Name,Value arguments. Name is the argument name and Value is the corresponding value. Name must appear inside quotes. You can specify several name and value pair arguments in any order as Name1,Value1,...,NameN,ValueN.

Example: ['MapWidth',10]

Width of the occupancy grid, specified as the comma-separated pair consisting of 'MapWidth' and a positive scalar. If this value is not specified, the map is automatically scaled to fit all laser scans.

Height of occupancy grid, specified as the comma-separated pair consisting of 'MapHeight' and a positive scalar. If this value is not specified, the map is automatically scaled to fit all laser scans.

Output Arguments

collapse all

Occupancy grid, returned as a robotics.OccupancyGrid object.

Introduced in R2018a