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.

checkMapCollision

Compruebe si hay colisiones entre el mapa de ocupación 3D y la geometría

Desde R2022b

    Descripción

    Compruebe si hay colisión entre un mapa de ocupación tridimensional y una geometría de colisión convexa. La función checkMapCollision puede buscar colisiones en dos fases: primero, una búsqueda de fase amplia usando volúmenes delimitadores simples, y luego mediante una colisión de fase estrecha verificar si los volúmenes simples chocar. Para la búsqueda de fase amplia, la función verifica entre primitivas simples que consisten en cuadros delimitadores alineados axialmente (AABB). Para la fase estrecha, la función verifica entre las celdas ocupadas, representadas por objetos collisionBox (Robotics System Toolbox) , y el objeto de geometría de colisión de entrada.

    collisionStatus = checkMapCollision(map,geometry) comprueba si un mapa de ocupación 3-D, map, y una geometría de colisión, geometry, están en colisión.

    ejemplo

    [collisionStatus,details] = checkMapCollision(map,geometry,options) especifica las opciones adicionales de verificación de colisiones options y devuelve los detalles de la colisión details.

    Ejemplos

    contraer todo

    Cree un mapa de ocupación en 3D.

    map = occupancyMap3D;

    Especifique 25 coordenadas aleatorias en el mapa de ocupación como ocupadas.

    rng(0)
    pt = (rand(25,3)-.5)*20;
    setOccupancy(map,pt,1);

    Crea una esfera de colisión y un objeto de cilindro de colisión.

    sphere = collisionSphere(1);
    cylinder = collisionCylinder(3,6);
    sphere.Pose = trvec2tform([6.1 -4 -7.5]);

    Visualice el mapa de ocupación y la geometría de colisión en la misma figura.

    exampleHelperPlotCylinderAndSphere(map,cylinder,sphere)

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

    Realice solo la verificación de colisión de fase amplia tanto para la esfera como para el cilindro estableciendo la propiedad CheckNarrowPhase de un objeto occupancyMap3DCollisionOptions en false. Devuelve información de vóxeles y la distancia a los vóxeles ocupados más cercanos.

    bpOpts = occupancyMap3DCollisionOptions(CheckNarrowPhase=false,ReturnDistance=true,ReturnVoxels=true);
    [bpIsCollidingCylinder,bpResultsCylinder] = checkMapCollision(map,cylinder,bpOpts);

    Verifique las distancias de vóxeles para las geometrías de colisión. Tenga en cuenta que, debido a que el cilindro colisiona con los vóxeles, los valores de distancia son NaN. Debido a que la esfera no colisiona con ningún vóxel, los resultados de su distancia no son valores NaN .

    bpDistCylinder = bpResultsCylinder.DistanceInfo.Distance
    bpDistCylinder = NaN
    
    bpWitnessptsCylinder = bpResultsCylinder.DistanceInfo.WitnessPoints
    bpWitnessptsCylinder = 3×2
    
       NaN   NaN
       NaN   NaN
       NaN   NaN
    
    

    Debido a que el cilindro colisiona con los vóxeles, los resultados de distancia contienen valores NaN . Dado que la esfera no colisiona con los vóxeles, los resultados de distancia constan de valores que no son NaN .

    [bpIsCollidingSphere,bpResultsSphere] = checkMapCollision(map,sphere,bpOpts);
    bpDistSphere = bpResultsSphere.DistanceInfo.Distance
    bpDistSphere = 2.3259
    
    bpWitnessptsSphere = bpResultsSphere.DistanceInfo.WitnessPoints
    bpWitnessptsSphere = 3×2
    
        3.0000    5.1000
       -6.0000   -5.0000
       -7.5000   -7.5000
    
    

    Traza una línea entre la esfera y el vóxel más cercano usando sus puntos testigo.

    figure
    exampleHelperPlotCylinderAndSphere(map,cylinder,sphere)
    hold on
    plot3(bpWitnessptsSphere(1,:),bpWitnessptsSphere(2,:),bpWitnessptsSphere(3,:),LineWidth=2,Color='r')
    hold off

    Figure contains an axes object. The axes object with title Occupancy Map, xlabel X [meters], ylabel Y [meters] contains 4 objects of type patch, line.

    Ahora realice una verificación de fase estrecha, utilizando un objeto occupancyMap3DCollisionOptions con la propiedad CheckNarrowPhase establecida en true.

    npOpts = occupancyMap3DCollisionOptions(CheckNarrowPhase=true,ReturnDistance=true,ReturnVoxels=true);
    [npIsCollidingSphere,bpResultsSphere] = checkMapCollision(map,sphere,npOpts);

    Devuelve la distancia del vóxel y las coordenadas del punto testigo de la esfera. La distancia y los puntos testigo son ligeramente más precisos esta vez, porque la fase estrecha usa la distancia entre la primitiva y el vóxel, mientras que la fase amplia anterior usa la distancia entre el cuadro delimitador alineado con el eje (AABB) del objeto de colisión y el vóxel.

    npDist = bpResultsSphere.DistanceInfo.Distance
    npDist = 2.6892
    
    npWitnesspts = bpResultsSphere.DistanceInfo.WitnessPoints
    npWitnesspts = 3×2
    
        3.0000    5.2596
       -6.0000   -4.5419
       -7.5000   -7.5000
    
    

    Visualice nuevamente el mapa de ocupación y trace la línea que muestra la distancia más corta entre el vóxel y la esfera. La línea entre los puntos testigo parece visualmente precisa después de realizar la verificación de fase estrecha.

    exampleHelperPlotCylinderAndSphere(map,cylinder,sphere)
    hold on
    plot3(npWitnesspts(1,:),npWitnesspts(2,:),npWitnesspts(3,:),LineWidth=2,Color='r')
    hold off

    Figure contains an axes object. The axes object with title Occupancy Map, xlabel X [meters], ylabel Y [meters] contains 4 objects of type patch, line.

    Argumentos de entrada

    contraer todo

    Mapa de ocupación tridimensional, especificado como un objeto occupancyMap3D .

    Ejemplo: occupancyMap3D(10)

    Geometría de colisión, especificada como uno de estos objetos:

    • collisionBox

    • collisionCapsule

    • collisionCylinder

    • collisionMesh

    • collisionSphere

    Ejemplo: collisionBox(1,1,3)

    Opciones de verificación de colisiones, especificadas como un objeto occupancyMap3DCollisionOptions .

    Ejemplo: occupancyMap3DCollisionOptions(CheckNarrowPhase=false,ReturnDistance=true);

    Argumentos de salida

    contraer todo

    Estado de colisión, devuelto como 0 o 1. Si la geometría se cruza con cualquier vóxel ocupado, collisionStatus es 1. De lo contrario, el valor es 0.

    Tipos de datos: double

    Detalles de colisión, devueltos como una estructura que puede contener hasta dos campos, DistanceInfo y VoxelInfo:

    • DistanceInfo : este campo está presente cuando la propiedad ReturnDistance de options es true. El campo es una estructura que contiene estos campos.

      • Distance — Si la propiedad NarrowPhase de options se establece en verdadero, este campo contiene la distancia mínima entre la geometría de colisión y la más cercana. vóxel o celda ocupada, representada como un objeto collisionBox . Si NarrowPhase es false, entonces Distance es la distancia mínima entre los AABB de la geometría de colisión y el vóxel más cercano.

        Para geometrías de colisión que no están en colisión, Distance se devuelve como un escalar numérico. Para geometrías de colisión que están en colisión, Distance se devuelve como NaN.

      • WitnessPoints — Puntos testigo entre la geometría de colisión y el vóxel más cercano. Si la geometría de colisión no está en colisión, WitnessPoints se devuelve como una matriz de 3 por 2, donde cada columna representa los puntos testigo en la forma [XYZ]. Si la geometría de colisión está en colisión, WitnessPoints se devuelve como nan(3,2).

    • VoxelInfo : este campo está presente cuando la propiedad ReturnVoxels de options es true. El campo es una estructura que contiene estos campos.

      • Location — Centro(s) de los vóxeles en colisión. El formato de este campo depende del valor de la propiedad Exhaustive de options:

        • trueN matriz -por 3, donde N es el número total de vóxeles en colisión. Cada fila es una coordenada en la forma [X Y Z].

        • false — vector fila de tres elementos que contiene el primer vóxel de colisión como una coordenada en la forma [X Y Z], o como un vector vacío si no hay colisión.

      • Size : longitudes de los bordes de los vóxeles en colisión. El formato de este campo depende del valor de la propiedad Exhaustive de options:

        • trueN- vector columna de elementos, donde N es el número total de vóxeles en colisión. La longitud del borde de cada elemento define el tamaño del vóxel centrado en la ubicación correspondiente en Location.

        • false — Longitud del borde del primer vóxel en colisión, devuelta como un escalar numérico si hay una colisión, o como un vector vacío si no hay colisión.

    Capacidades ampliadas

    Historial de versiones

    Introducido en R2022b

    expandir todo