addEgo
Ajouter les corps de l'ego à la liste des capsules 3D
Depuis R2020b
Description
addEgo(
ajoute un ou plusieurs corps du moi à la liste des capsules dynamiques 3D avec les valeurs d'ID, d'état et de géométrie spécifiées données dans capsuleListObj
,egoStruct
)egoStruct
.
renvoie en outre un indicateur indiquant si chaque corps d'ego spécifié a été ajouté, mis à jour ou un doublon.status
= addEgo(capsuleListObj
,egoStruct
)
Exemples
Construisez des chemins corporels de l'ego en 3D et vérifiez les collisions avec des obstacles en 3D
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
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);
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);
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);
Arguments d'entrée
capsuleListObj
— Liste de capsules dynamique
dynamicCapsuleList3D
objet
Liste de capsules dynamique, spécifiée comme objet dynamicCapsuleList3D
.
egoStruct
— Paramètres du corps de l'ego
structure | tableau de structures
Paramètres du corps de l'ego, spécifiés sous la forme d'une structure d'éléments N ou d'un tableau de structures, où N est le nombre de corps de l'ego ajoutés. Les champs de chaque structure définissent l'ID, la géométrie et les états d'un corps du moi :
ID
–– Entier qui identifie chaque objet. Stocké dans la propriétéEgoIDs
de l'objetdynamicCapsuleList3D
spécifié par l'argumentcapsuleListObj
.States
–– Emplacement 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.Geometry
–– Structure avec les champsLength
,Radius
etFixedTransform
. Ces champs définissent la taille de l'objet basé sur la capsule en utilisant la longueur spécifiée pour le cylindre et le rayon de l'hémisphère pour les embouts. Pour déplacer la géométrie de la capsule par rapport à l'origine par défaut, spécifiez le champFixedTransform
comme transformation fixe par rapport au cadre local de la capsule. Pour conserver l'origine de la capsule par défaut, spécifiez la transformation commeeye(4)
.
Arguments de sortie
status
— Résultat de l'ajout de corps d'ego
N-élément colonne vecteur
Résultat de l'ajout de corps de l'ego, renvoyé sous la forme d'un vecteur colonne d'éléments N composé de uns, de zéros et de uns négatifs. N est le nombre de corps du moi spécifié dans l'argument egoStruct
. Chaque valeur indique si le corps associé est ajouté (1
), mis à jour (0
) ou un doublon (-1
). Lors de l'ajout de corps d'ego, si plusieurs structures avec le même ID de corps sont trouvées dans le tableau de structures egoStruct
, alors la fonction marque l'entrée précédente comme en double et l'ignore.
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
Voir aussi
Objets
Fonctions
Commande MATLAB
Vous avez cliqué sur un lien qui correspond à cette commande MATLAB :
Pour exécuter la commande, saisissez-la dans la fenêtre de commande de MATLAB. Les navigateurs web ne supportent pas les commandes MATLAB.
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)