Main Content

Esta página se ha traducido mediante traducción automática. Haga clic aquí para ver la última versión en inglés.

buildMap

Cree un mapa de ocupación a partir de escaneos LIDAR

Desde R2019b

Descripción

ejemplo

map = buildMap(scans,poses,mapResolution,maxRange) crea un mapa occupancyMap insertando lidar scans en el poses dado. Especifique la resolución del mapa resultante, mapResolution y el alcance máximo del sensor lidar, maxRange.

Ejemplos

contraer todo

La función buildMap toma lecturas de escaneo lidar y poses asociadas para construir una cuadrícula de ocupación como objetos lidarScan y poses [x y theta] asociadas para construir una occupancyMap.

Cargue estimaciones de escaneo y pose recopiladas de sensores en un robot en un estacionamiento. Los datos recopilados se correlacionan mediante un algoritmo lidarSLAM , que realiza coincidencias de escaneos para asociar escaneos y ajustar poses a lo largo de la trayectoria completa del robot. Verifique que los escaneos y las poses tengan la misma longitud.

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

Construye el mapa. Especifique los escaneos y las poses en la función buildMap e incluya la resolución del mapa deseada (10 celdas por metro) y el alcance máximo del lidar (19,2 metros). Cada escaneo se agrega en las poses asociadas y se actualizan los valores de probabilidad en la cuadrícula de ocupación.

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

Figure contains an axes object. The axes object with title Occupancy Map of Garage, xlabel X [meters], ylabel Y [meters] contains an object of type image.

Utilice un objeto lidarSLAM para agregar y comparar de forma iterativa escaneos LIDAR y crear un gráfico de pose optimizado de la trayectoria del robot. Para obtener un mapa de ocupación de las poses y escaneos asociados, use la función buildMap .

Cargar datos y configurar el algoritmo SLAM

Cargue un arreglo de celdas de objetos lidarScan . Los escaneos LIDAR se recopilaron en un estacionamiento en un robot Husky® de ClearPath Robotics®. Normalmente, los escaneos LIDAR se realizan a alta frecuencia y cada escaneo no es necesario para SLAM. Por lo tanto, reduzca la muestra de los escaneos seleccionando solo cada 40 escaneos.

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

Para configurar el algoritmo SLAM, especifique el rango lidar, la resolución del mapa, el umbral de cierre del bucle y el radio de búsqueda. Ajuste estos parámetros para su robot y entorno específicos. Cree el objeto lidarSLAM con estos parámetros.

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

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

Agregar escaneos iterativamente

Usando un bucle for , agregue escaneos al objeto SLAM. El objeto utiliza la coincidencia de escaneos para comparar cada escaneo agregado con los agregados anteriormente. Para mejorar el mapa, el objeto optimiza el gráfico de pose cada vez que detecta un cierre de bucle. Cada 10 escaneos, muestra las poses y escaneos almacenados.

for i = 1:numel(scans)

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

Ver mapa de ocupación

Después de agregar todos los escaneos al objeto SLAM, cree un mapa occupancyMap llamando a buildMap con los escaneos y las poses. Utilice la misma resolución de mapa y alcance máximo que utilizó con el objeto SLAM.

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

Argumentos de entrada

contraer todo

Escaneos Lidar utilizados para construir el mapa, especificados como una arreglo de celdas de objetos lidarScan .

Poses de escaneos LIDAR, especificadas como una matriz n-por-3. Cada fila es un vector [x y theta] que representa la posición xy y el ángulo de orientación de un escaneo.

Resolución del mapa occupancyMap de salida, especificado como un entero positivo en celdas por metro.

Alcance máximo del sensor lidar, especificado como escalar positivo en metros. Los puntos en el scans fuera de este rango se ignoran.

Argumentos de par nombre-valor

Especifique pares de argumentos opcionales como Name1=Value1,...,NameN=ValueN, donde Name es el nombre del argumento y Value es el valor correspondiente. Los argumentos nombre-valor deben aparecer después de los otros argumentos, pero el orden de los pares no importa.

Antes de R2021a, utilice comas para separar cada nombre y valor, y encierre Name entre comillas.

Ejemplo: ['MapWidth',10]

Ancho de la cuadrícula de ocupación, especificado como el par separado por comas que consta de 'MapWidth' y un escalar positivo. Si no se especifica este valor, el mapa se escala automáticamente para adaptarse a todos los escaneos láser.

Altura de la cuadrícula de ocupación, especificada como el par separado por comas que consta de 'MapHeight' y un escalar positivo. Si no se especifica este valor, el mapa se escala automáticamente para adaptarse a todos los escaneos láser.

Argumentos de salida

contraer todo

Mapa de ocupación, devuelto como un objeto occupancyMap .

Historial de versiones

Introducido en R2019b