Main Content

Cette page a été traduite par traduction automatique. Cliquez ici pour voir la dernière version en anglais.

dynamicCapsuleList3D

Liste d'obstacles dynamique basée sur des capsules

Depuis R2020b

Description

L'objet dynamicCapsuleList3D gère deux listes d'objets de collision basés sur des capsules dans l'espace 3D. Les objets de collision sont séparés en deux listes, les corps du moi et les obstacles. Pour les corps de l'ego et les obstacles en 2D, voir l'objet dynamicCapsuleList .

Chaque objet de collision dans les deux listes comporte trois éléments clés :

  • ID –– Entier qui identifie chaque objet, stocké dans la propriété EgoIDs pour les corps de l'ego et dans la propriété ObstacleIDs pour les obstacles.

  • États –– Localisation et orientation de l'objet sous la forme d'une matrice M-par 6, où chaque ligne est de la forme [x y z qW qX qY qZ] et M est le nombre d'états le long du chemin de l'objet dans le cadre du monde. La liste des états suppose que chaque état est séparé par un intervalle de temps fixe. xyz-les positions sont en mètres et l'orientation est un vecteur quaternion à quatre éléments. L'origine locale par défaut est située au centre de l'hémisphère gauche de la capsule.

  • Géométrie –– Taille de l'objet basé sur la capsule en fonction de la longueur et du rayon spécifiés. Le rayon s'applique aux extrémités sphériques et la longueur s'applique à la longueur du cylindre. Pour décaler la géométrie de la capsule et l'origine locale par rapport au point d'origine par défaut, spécifiez une transformation 4 x 4 par rapport au cadre local de la capsule. Pour conserver la transformation par défaut, spécifiez eye(4).

Capsule geometry image showing the position and orientation of the capsule dimensions. Positive X is the right direction from the world frame. Positive Y is up. Positive Z is into the page, based on right-hand rule. Quaternion is a four-element quaternion relative to the world frame. The capsule geometry has a radius for the spherical ends and a length for the cylindrical section in the middle.

Utilisez les fonctions d'objet pour ajouter, supprimer et mettre à jour dynamiquement les géométries et les états des différents objets de votre environnement. Pour ajouter un corps d'ego, consultez la fonction objet addEgo . Pour ajouter un obstacle, voir la fonction objet addObstacle .

Après avoir spécifié tous les chemins d'objet, validez les chemins du corps de l'ego et vérifiez les collisions avec des obstacles à chaque étape en utilisant la fonction objet checkCollision . La fonction vérifie uniquement si un corps du moi entre en collision avec un obstacle, ignorant les collisions entre uniquement des obstacles ou uniquement des corps du moi.

Création

Description

exemple

obstacleList = dynamicCapsuleList3D crée une liste d'obstacles dynamique basée sur des capsules sans corps ni obstacles d'ego. Pour commencer à créer une liste d'obstacles, utilisez les fonctions d'objet addEgo ou addObstacle .

Propriétés

développer tout

Nombre maximum de pas de temps dans la liste d'obstacles, spécifié sous forme d'entier positif. Le nombre d'étapes détermine la longueur maximale du champ States pour un corps ou un obstacle spécifique de l'ego.

Types de données : double

Ce propriété est en lecture seule.

Liste d'identifiants pour les corps du moi, renvoyés sous forme de vecteur d'entiers positifs.

Types de données : double

Ce propriété est en lecture seule.

Liste d'identifiants d'obstacles, renvoyés sous forme de vecteur d'entiers positifs.

Types de données : double

Ce propriété est en lecture seule.

Nombre d'obstacles dans la liste, renvoyé sous forme d'entier.

Types de données : double

Ce propriété est en lecture seule.

Nombre de corps du moi dans la liste, renvoyé sous forme d'entier.

Types de données : double

Fonctions d'objet

addEgoAjouter les corps de l'ego à la liste des capsules 3D
addObstacleAjouter des obstacles à la liste des capsules 3D
checkCollisionVérifier les collisions entre les corps de l'ego et les obstacles
egoGeometryPropriétés géométriques des corps du moi
egoPosePoses of ego bodies
obstacleGeometryPropriétés géométriques des obstacles
obstaclePosePoses d'obstacles
removeEgoSupprimer les corps de l'ego de la liste des capsules
removeObstacleSupprimer les obstacles de la liste des capsules
showAfficher les corps de l'ego et les obstacles dans l'environnement
updateEgoGeometryMettre à jour les propriétés géométriques des corps du moi
updateEgoPoseMettre à jour les états des corps du moi
updateObstacleGeometryMettre à jour les propriétés géométriques des obstacles
updateObstaclePoseMettre à jour les états des obstacles

Exemples

réduire tout

Construisez un chemin corporel de l'ego et maintenez les états d'obstacles à l'aide de l'objet dynamicCapsuleList3D . Visualisez les états de tous les objets de l'environnement à différents horodatages. Validez le chemin du corps de l’ego en vérifiant les collisions avec des obstacles dans l’environnement.

Créez l'objet dynamicCapsuleList3D . Extrayez le nombre maximum d'étapes à utiliser comme nombre d'horodatages pour vos chemins d'objet.

obsList = dynamicCapsuleList3D;
numSteps = obsList.MaxNumSteps;

Ajouter un corps d'ego

Définissez un corps d'ego en spécifiant l'ID, la géométrie et l'état ensemble dans une structure. La géométrie de la capsule a une longueur de 3 m et un rayon de 1 m. Spécifiez l'état comme un chemin linéaire de x = 0 m à x = 100 m.

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

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

show(obsList,"TimeStep",1:numSteps);
ylim([-20 20])
zlim([-5 20])
view(-45,25)
hold on

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

Ajouter des obstacles

Spécifiez les états de deux obstacles séparés du corps du moi de 5 m dans des directions opposées sur l'axe  y . Supposons que les obstacles ont la même géométrie geom que le corps de l'ego.

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

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

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

cla
show(obsList,"TimeStep",1:numSteps);

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

Mettre à jour les obstacles

Modifiez l'emplacement de vos obstacles et les dimensions géométriques au fil du temps. Utilisez la structure générée précédemment, modifiez les champs et mettez à jour les obstacles à l'aide des fonctions objets updateObstacleGeometry et updateObstaclePose . Réduisez le rayon du premier obstacle à 0,5 m, et changez le chemin pour le déplacer vers le corps de l'ego.

obsCapsule1.Geometry.Radius = 0.5;

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

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

Vérifier les collisions

Visualisez les nouveaux chemins. Montrez où se produisent les collisions entre le corps du moi et un obstacle, que l'écran met en évidence en rouge. Notez que les collisions entre les obstacles ne sont pas vérifiées.

cla
show(obsList,"TimeStep",1:numSteps,"ShowCollisions",1);

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

Vérifiez par programme les collisions en utilisant la fonction objet checkCollision . La fonction renvoie un vecteur de valeurs logiques qui indique l'état de collision à chaque pas de temps. Le vecteur est transposé à des fins d'affichage.

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

Pour valider des chemins avec un grand nombre d'étapes, utilisez la fonction any sur le vecteur des valeurs de collision.

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

Mettre à jour le chemin de l'ego

Spécifiez un nouveau chemin pour le corps de l’ego. Visualisez à nouveau les chemins, affichant les collisions.

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

updateEgoPose(obsList,1,egoCapsule1);

cla
show(obsList,"TimeStep",1:numSteps,"ShowCollisions",1);

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

Capacités étendues

Génération de code C/C++
Générez du code C et C++ avec MATLAB® Coder™.

Historique des versions

Introduit dans R2020b