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.

lidarSLAM

Realizar localización y mapeo mediante escaneos LIDAR

Desde R2019b

Descripción

La clase lidarSLAM realiza localización y mapeo simultáneos (SLAM) para las entradas de los sensores de escaneo lidar. El algoritmo SLAM toma escaneos LIDAR y los adjunta a un nodo en un gráfico de pose subyacente. Luego, el algoritmo correlaciona los escaneos mediante la coincidencia de escaneos. También busca cierres de bucles, donde los escaneos se superponen a regiones previamente mapeadas, y optimiza las poses de los nodos en el gráfico de poses.

Creación

Descripción

slamObj = lidarSLAM crea un objeto lidar SLAM. El tamaño predeterminado del mapa de ocupación es de 20 celdas por metro. El alcance máximo para cada escaneo lidar es de 8 metros.

ejemplo

slamObj = lidarSLAM(mapResolution,maxLidarRange) crea un objeto lidar SLAM y establece las propiedades MapResolution y MaxLidarRange en función de las entradas.

slamObj = lidarSLAM(mapResolution,maxLidarRange,maxNumScans) especifica el límite superior del número de escaneos aceptados permitidos al generar código. maxNumScans es un número entero positivo. Este límite de escaneo solo es necesario al generar código.

Propiedades

expandir todo

Gráfico de pose subyacente que conecta escaneos, especificado como un objeto poseGraph . Agregar escaneos a lidarSLAM actualiza este gráfico de pose. Cuando se encuentran cierres de bucle, el gráfico de pose se optimiza usando OptimizationFcn.

Resolución del mapa cuadriculado de ocupación, especificada como un número entero positivo en celdas por metro. Especifique la resolución del mapa en la construcción.

Alcance máximo del sensor lidar, especificado como escalar positivo en metros. Especifique el alcance máximo en la construcción.

Función de optimización del gráfico de pose, especificada como un identificador de función. De forma predeterminada, el algoritmo llama a la función optimizePoseGraph . Para especificar su propio método de optimización, la clase requiere que la firma de la función sea:

[updatedPose,stat] = myOptimizationFcn(poseGraph)
poseGraph es un objeto poseGraph . updatedPose es un vector n-por 3 de [x y theta] poses enumeradas en orden secuencial de ID de nodo. stat es una estructura que contiene un campo ResidualError como escalar positivo. Utilice la estructura stat para incluir otra información relevante para su optimización.

Umbral de la puntuación del algoritmo de coincidencia de escaneo para aceptar cierres de bucle, especificado como un escalar positivo. Los umbrales más altos corresponden a una mejor coincidencia, pero las puntuaciones varían según los datos del sensor.

Radio de búsqueda para la detección de cierre de bucle, especificado como un escalar positivo. Aumentar este radio afecta el rendimiento al aumentar el tiempo de búsqueda. Ajuste esta distancia según su entorno y la trayectoria esperada del vehículo.

Número de intentos de encontrar cierres de bucle, especificado como un entero positivo. Aumentar el número de intentos afecta el rendimiento al aumentar el tiempo de búsqueda.

Permitir la reversión automática de cierres de bucles agregados, especificados como true o false. El objeto SLAM rastrea el error residual devuelto por OptimizationFcn. Si detecta un cambio repentino en el error residual y esta propiedad es true, rechaza (revierte) el cierre del bucle.

Número de cierres de bucle aceptados para activar la optimización, especificado como un entero positivo. De forma predeterminada, PoseGraph se optimiza cada vez que lidarSLAM agrega un cierre de bucle.

Cambio mínimo de pose requerido para procesar escaneos, especificado como un vector [translation rotation] . Un cambio de pose relativo para un escaneo recién agregado se calcula como [x y theta]. Si la traducción en xy-posición o rotación de theta excede estos umbrales, el objeto lidarSLAM acepta el escaneo y agrega una pose. agregado al PoseGraph.

Método de registro de escaneo, especificado como un vector de caracteres.

Nota

Se requiere Image Processing Toolbox™ para utilizar el método de correlación de fases.

Rango de búsqueda traslacional de coincidencia incremental, especificado como un vector de dos elementos con el formato [x y] en metros. Esta propiedad solo se aplica cuando la propiedad ScanRegistrationMethod está establecida en 'BranchAndBound'.

Estos valores definen la ventana de búsqueda alrededor de la estimación de traducción inicial especificada en el argumento relPoseEst de la función addScan . Establezca el valor de esta propiedad en la traducción máxima esperada entre escaneos aceptados consecutivos.

Esta propiedad es similar al argumento del par nombre-valor 'TranslationSearchRange' en la función matchScansGrid .

Rango de búsqueda rotacional de coincidencia incremental, especificado como escalar positivo en radianes. Esta propiedad solo se aplica cuando la propiedad ScanRegistrationMethod está establecida en 'BranchAndBound'.

Estos valores definen la ventana de búsqueda alrededor de la estimación de rotación inicial especificada en el argumento relPoseEst de la función addScan . Establezca el valor de esta propiedad en la rotación máxima esperada entre escaneos aceptados consecutivos.

Esta propiedad es similar al argumento del par nombre-valor 'RotationSearchRange' en la función matchScansGrid .

Funciones del objeto

addScanAgregar escaneo al mapa lidar SLAM
copyCopiar objeto lidar SLAM
removeLoopClosures Eliminar cierres de bucle del gráfico de pose
scansAndPoses Extraer escaneos y poses correspondientes.
showEscaneos de gráficas y poses de robots.

Ejemplos

contraer todo

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')

Más acerca de

expandir todo

Referencias

[1] Hess, Wolfgang, Damon Kohler, Holger Rapp, and Daniel Andor. "Real-Time Loop Closure in 2D LIDAR SLAM." 2016 IEEE International Conference on Robotics and Automation (ICRA). 2016.

Capacidades ampliadas

Historial de versiones

Introducido en R2019b