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.

addScan

Agregar escaneo al mapa lidar SLAM

Desde R2019b

Descripción

addScan(slamObj,currScan) agrega un escaneo lidar, currScan, al objeto lidar SLAM, slamObj. La función utiliza la coincidencia de escaneo para correlacionar este escaneo con el más reciente y luego lo agrega al gráfico de pose definido en slamObj. Si se acepta el escaneo, addScan detecta cierres de bucle y optimiza según la configuración en slamObj.

ejemplo

addScan(slamObj,currScan,relPoseEst) también especifica una pose relativa a la última pose de escaneo lidar en slamObj. Esta pose relativa mejora la coincidencia del escaneo.

Nota

La entrada relPoseEst se ignora cuando la propiedad ScanRegistrationMethod del objeto lidarSLAM se establece en 'PhaseCorrelation'.

[isAccepted,loopClosureInfo,optimInfo] = addScan(___) genera información detallada sobre cómo agregar el escaneo al objeto SLAM. isAccepted indica si el escaneo se agrega o se rechaza. loopClosureInfo y optimInfo indican si se detecta un cierre de bucle o si se optimiza el gráfico de pose.

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 una 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

Objeto Lidar SLAM, especificado como un objeto lidarSLAM . El objeto contiene los parámetros del algoritmo SLAM, los datos del sensor y el gráfico de pose subyacente utilizado para construir el mapa.

Lectura de escaneo Lidar, especificada como un objeto lidarScan . Este análisis se correlaciona con el análisis más reciente en slamObj mediante la coincidencia de análisis.

Estimación de pose relativa del escaneo, especificada como un vector [x y theta] . Esta pose relativa mejora la coincidencia de escaneos.

Argumentos de salida

contraer todo

Indica si se acepta el escaneo, devuelto como true o false. Si la pose relativa entre escaneos está por debajo de la propiedad MovementThreshold de slamObj, el escaneo se rechaza. De forma predeterminada, se aceptan todos los escaneos.

Detalles de cierre de bucle, devueltos como una estructura con estos campos:

  • EdgeIDs –– ID de bordes recién conectados en el gráfico de pose, devueltos como un vector.

  • Edges –– Bordes de cierre de bucle recién agregados, devueltos como una matriz n-por-2 de ID de nodo que conecta cada borde.

  • Scores –– Puntuación de bordes recién conectados en el gráfico de pose devueltos por la coincidencia de escaneo, devueltos como un vector.

Nota

Si la propiedad LoopClosureAutoRollback se establece en true en slamObj, los bordes de cierre del bucle se pueden eliminar del gráfico de pose. Esta propiedad rechaza el cierre de bucles si el error residual cambia drásticamente después de la optimización. Por lo tanto, es posible que algunos de los ID de borde enumerados en esta estructura no existan en el gráfico de pose real.

Detalles de optimización del gráfico de pose, devueltos como una estructura con estos campos:

  • IsPerformed –– Booleano que indica si se realiza la optimización al agregar este escaneo. El rendimiento de la optimización depende de la propiedad OptimizationInterval en slamObj.

  • IsAccepted –– Booleano que indica si se aceptó la optimización en base a ResidualError.

  • ResidualError –– Error asociado con la optimización, devuelto como escalar.

  • LoopClosureRemoved –– Lista de ID de bordes de cierre de bucle eliminados durante la optimización, devueltos como un vector.

Capacidades ampliadas

Historial de versiones

Introducido en R2019b