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.

dynamicCapsuleList

Lista de obstáculos dinámica basada en cápsulas

Desde R2020b

Descripción

El objeto dynamicCapsuleList gestiona dos listas de objetos de colisión basados ​​en cápsulas en un espacio 2-D. Los objetos de colisión se dividen en dos listas: cuerpos del ego y obstáculos. Para cuerpos del ego y obstáculos en 3-D, consulte el objeto dynamicCapsuleList3D .

Cada objeto de colisión en las dos listas tiene tres elementos clave:

  • ID –– Entero que identifica cada objeto, almacenado en la propiedad EgoIDs para los cuerpos del ego y la propiedad ObstacleIDs para los obstáculos.

  • Estados –– Ubicación y orientación del objeto como una matriz M-por-3, donde cada fila tiene la forma [x y theta] y M es el número de estados a lo largo de la trayectoria del objeto en el marco mundial. La lista de estados supone que cada estado está separado por un intervalo de tiempo fijo. xy-las posiciones están en metros y theta están en radianes. El origen local predeterminado se encuentra en el centro del semicírculo izquierdo de la cápsula.

  • Geometría –– Tamaño del objeto basado en cápsula en función de una longitud y un radio específicos. El radio se aplica a las tapas de los extremos del semicírculo y la longitud se aplica a la longitud del rectángulo central. Para cambiar la geometría de la cápsula y el origen local en relación con el punto de origen predeterminado, especifique una transformación fija en relación con el marco local de la cápsula.

Capsule geometry image showing the position and orientation of the capsule dimensions. Positive X is the right direction in the world frame. Positive Y is up. Positive theta is a counter-clockwise rotation from the world frame. The capsule geometry has a radius for the circular ends and a length for the rectangular section in the middle.

Utilice las funciones de objeto para agregar, eliminar y actualizar dinámicamente las geometrías y estados de los distintos objetos de su entorno. Para agregar un cuerpo de ego, consulte la función de objeto addEgo . Para agregar un obstáculo, consulte la función de objeto addObstacle .

Después de especificar todos los estados del objeto, valide las rutas del ego-cuerpo y verifique si hay colisiones con obstáculos en cada paso usando la función de objeto checkCollision . La función solo verifica si un cuerpo del ego choca con un obstáculo, ignorando las colisiones solo entre obstáculos o solo cuerpos del ego.

Creación

Descripción

obstacleList = dynamicCapsuleList crea una lista de obstáculos dinámica basada en cápsulas sin cuerpos del ego ni obstáculos. Para comenzar a crear una lista de obstáculos, utilice las funciones de objeto addEgo o addObstacle .

ejemplo

Propiedades

expandir todo

Número máximo de pasos de tiempo en la lista de obstáculos, especificado como un número entero positivo. El número de pasos determina la longitud máxima del campo States para un cuerpo u obstáculo del ego específico.

Tipos de datos: double

Esta propiedad o parámetro es de solo lectura.

Lista de identificadores de cuerpos del ego, devueltos como un vector de números enteros positivos.

Tipos de datos: double

Esta propiedad o parámetro es de solo lectura.

Lista de identificadores de obstáculos, devueltos como un vector de números enteros positivos.

Tipos de datos: double

Esta propiedad o parámetro es de solo lectura.

Número de obstáculos de la lista, devuelto como un número entero.

Tipos de datos: double

Esta propiedad o parámetro es de solo lectura.

Número de cuerpos del ego en la lista, devuelto como un número entero.

Tipos de datos: double

Funciones del objeto

addEgoAgregar cuerpos del ego a la lista de cápsulas
addObstacleAgregue obstáculos a la lista de cápsulas 2-D
checkCollisionCompruebe si hay colisiones entre los cuerpos del ego y los obstáculos.
egoGeometryPropiedades geométricas de los cuerpos del ego.
egoPosePoses de cuerpos del ego.
obstacleGeometryPropiedades geométricas de los obstáculos.
obstaclePosePoses de obstáculos
removeEgoEliminar los cuerpos del ego de la lista de cápsulas
removeObstacleEliminar obstáculos de la lista de cápsulas
showMostrar cuerpos del ego y obstáculos en el entorno.
updateEgoGeometryActualizar las propiedades geométricas de los cuerpos del ego.
updateEgoPoseActualizar estados de los cuerpos del ego.
updateObstacleGeometryActualizar propiedades geométricas de obstáculos.
updateObstaclePoseActualizar estados de obstáculos.

Ejemplos

contraer todo

Construya una ruta del cuerpo del ego y mantenga estados de obstáculos utilizando el objeto dynamicCapsuleList . Visualice los estados de todos los objetos del entorno en diferentes marcas de tiempo. Valide la ruta del cuerpo del ego comprobando colisiones con obstáculos en el entorno.

Cree el objeto dynamicCapsuleList . Extraiga la cantidad máxima de pasos para usar como cantidad de marcas de tiempo para las rutas de sus objetos.

obsList = dynamicCapsuleList;
numSteps = obsList.MaxNumSteps;

Añadir cuerpo del ego

Defina un cuerpo del ego especificando la identificación, la geometría y el estado juntos en una estructura. La geometría de la cápsula tiene una longitud de 3 my un radio de 1 m. Especifique el estado como una ruta lineal desde x = 0 m hasta x = 100 m.

egoID1 = 1;
geom = struct("Length",3,"Radius",1,"FixedTransform",eye(3));
states = linspace(0,1,obsList.MaxNumSteps)'.*[100 0 0];

egoCapsule1 = struct('ID',egoID1,'States',states,'Geometry',geom);
addEgo(obsList,egoCapsule1);

show(obsList,"TimeStep",[1:numSteps]);
ylim([-20 20])

Figure contains an axes object. The axes object contains an object of type patch.

Agregar obstáculos

Especifique estados para dos obstáculos que están separados del cuerpo del ego por 5 m en direcciones opuestas en el eje y. Supongamos que los obstáculos tienen la misma geometría geom que el cuerpo del ego.

obsState1 = states + [0 5 0];
obsState2 = states + [0 -5 0];

obsCapsule1 = struct('ID',1,'States',obsState1,'Geometry',geom);
obsCapsule2 = struct('ID',2,'States',obsState2,'Geometry',geom);

addObstacle(obsList,obsCapsule1);
addObstacle(obsList,obsCapsule2);

show(obsList,"TimeStep",[1:numSteps]);
ylim([-20 20])

Figure contains an axes object. The axes object contains 3 objects of type patch.

Actualizar obstáculos

Modifique las ubicaciones de los obstáculos y las dimensiones geométricas con el tiempo. Utilice la estructura generada previamente, modifique los campos y actualice los obstáculos usando las funciones de objeto updateObstacleGeometry y updateObstaclePose . Reduce el radio del primer obstáculo a 0,5 m y cambia la ruta para moverlo hacia el cuerpo del ego.

obsCapsule1.Geometry.Radius = 0.5;

obsCapsule1.States = ...
    [linspace(0,100,numSteps)' ... % x
     linspace(5,-4,numSteps)' ... % y 
     zeros(numSteps,1)]; % theta

updateObstacleGeometry(obsList,1,obsCapsule1);
updateObstaclePose(obsList,1,obsCapsule1);

Comprobar si existen colisiones

Visualiza los nuevos rutas. Muestra dónde ocurren las colisiones entre el cuerpo del ego y un obstáculo, que la pantalla resalta en rojo. Tenga en cuenta que las colisiones entre los obstáculos no se controlan.

show(obsList,"TimeStep",[1:numSteps],"ShowCollisions",1);
ylim([-20 20])
xlabel("X (m)")
ylabel("Y (m)")

Figure contains an axes object. The axes object with xlabel X (m), ylabel Y (m) contains 3 objects of type patch.

Verifique las colisiones mediante programación utilizando la función de objeto checkCollision . La función devuelve un vector de valores lógicos que indica el estado de cada paso de tiempo. El vector se transpone con fines de visualización.

collisions = checkCollision(obsList)'
collisions = 1x31 logical array

   0   0   0   0   0   0   0   0   0   0   0   0   1   1   1   1   1   1   1   1   1   1   0   0   0   0   0   0   0   0   0

Para validar rutas con una gran cantidad de pasos, use la función any en el vector de valores de colisión.

if any(collisions)
    disp("Collision detected.")
end
Collision detected.

Actualizar ruta del ego

Especifica una ruta nueva para el cuerpo del ego. Visualice las rutas nuevamente, mostrando colisiones.

egoCapsule1.States = ...
    [linspace(0,100,numSteps)' ... % x
    3*sin(linspace(0,2*pi,numSteps))' ... % y
    zeros(numSteps,1)]; % theta

updateEgoPose(obsList,1,egoCapsule1);

show(obsList,"TimeStep",[1:numSteps],"ShowCollisions",1);
ylim([-20 20])

Figure contains an axes object. The axes object contains 3 objects of type patch.

Capacidades ampliadas

Generación de código C/C++
Genere código C y C++ mediante MATLAB® Coder™.

Historial de versiones

Introducido en R2020b