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.

scansAndPoses

Extraer escaneos y poses correspondientes.

Descripción

[scans,poses] = scansAndPoses(slamObj) devuelve los escaneos utilizados por el objeto lidarSLAM como objetos lidarScan, junto con sus poses [x y theta] asociadas del gráfico de poses subyacente de slamObj.

ejemplo

[scans,poses] = scansAndPoses(slamObj,nodeIDs) devuelve los escaneos y poses para los ID de nodo específicos. Para obtener los ID de los nodos, consulte el objeto poseGraph subyacente en slamObj para obtener los ID de los nodos.

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.

ID de nodo del gráfico de pose, especificados como un número entero positivo. Los nodos se agregan al gráfico de pose con números de identificación secuenciales. Para obtener los ID de los nodos, consulte el objeto poseGraph subyacente en slamObj para obtener los ID de los nodos.

Argumentos de salida

contraer todo

Lecturas de escaneo Lidar, devueltas como un objeto lidarScan.

Pose para cada escaneo, devuelta como una matriz n por 3 de vectores [x y theta]. Cada fila es una pose que corresponde a un escaneo en scans.

Capacidades ampliadas

expandir todo

Historial de versiones

Introducido en R2019b