Contenido principal

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

Descripción

addScan(slamObj,currScan) agrega un escaneo LiDAR , currScan, al objeto SLAM LiDAR , 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.

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

ejemplo

[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 se optimiza el gráfico de pose.

Ejemplos

contraer todo

Utilice un objeto lidarSLAM para agregar y comparar iterativamente escaneos LiDAR y construir un gráfico de pose optimizado de la trayectoria del robot. Para obtener un mapa de ocupación a partir de las poses y escaneos asociados, utilice la función buildMap.

Cargar datos y configurar el algoritmo SLAM

Cargar 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 resolución 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. Crea 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
title("Lidar Scans and Poses")
xlabel("X [meters]")
ylabel("Y [meters]")

Figure contains an axes object. The axes object with title Lidar Scans and Poses, xlabel X [meters], ylabel Y [meters] contains 121 objects of type line.

Ver mapa de ocupación

Después de agregar todos los escaneos al objeto SLAM, construya 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')

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.

Argumentos de entrada

contraer todo

Objeto SLAM Lidar, 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 escaneo está correlacionado con el escaneo más reciente en slamObj mediante coincidencia de escaneo.

Estimación de la 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 y se devuelve 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 los bordes recién conectados en el gráfico de pose, devueltos como un vector.

  • Edges –– Aristas de cierre de bucle recientemente agregadas, devueltas como una matriz n por 2 de identificaciones de nodos que cada arista conecta.

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

Nota

Si la propiedad LoopClosureAutoRollback se establece en true en slamObj, los bordes de cierre de 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 un escalar.

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

Capacidades ampliadas

expandir todo

Historial de versiones

Introducido en R2019b