Main Content

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

addEgo

Ajouter les corps de l'ego à la liste des capsules

Depuis R2020b

Description

exemple

addEgo(capsuleListObj,egoStruct) ajoute un ou plusieurs corps du moi à la liste des capsules dynamiques 2D avec les valeurs d'ID, d'état et de géométrie spécifiées données dans egoStruct.

status = addEgo(capsuleListObj,egoStruct) renvoie en outre un indicateur indiquant si chaque corps d'ego spécifié a été ajouté, mis à jour ou un doublon.

Exemples

réduire tout

Construisez un chemin corporel de l'ego et maintenez les états d'obstacles à l'aide de l'objet dynamicCapsuleList . 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 dynamicCapsuleList . Extrayez le nombre maximum d'étapes à utiliser comme nombre d'horodatages pour vos chemins d'objet.

obsList = dynamicCapsuleList;
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 sous forme de chemin linéaire de x = 0m à x = 100m.

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.

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];
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.

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éduit le rayon du premier obstacle à 0,5 m et modifie 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)]; % theta

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

Vérifier les collisions

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

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.

Vérifiez par programme les collisions à l'aide de la fonction objet checkCollision . La fonction renvoie un vecteur de valeurs logiques qui indique l'état de 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)]; % 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.

Arguments d'entrée

réduire tout

Liste de capsules dynamique, spécifiée comme objet dynamicCapsuleList .

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'objet dynamicCapsuleList spécifié par l'argument capsuleListObj .

  • States –– Emplacement et orientation de l'objet sous la forme d'une matrice M-par 3, où chaque ligne est de la forme [x y theta], et M est le nombre d'états pour le corps du moi spécifié dans le cadre mondial. La liste des états suppose que chaque état est séparé par un intervalle de temps fixe. xy-les positions sont en mètres et theta est en radians.

  • Geometry –– Structure avec les champs Length, Radius et FixedTransform. 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 du demi-cercle pour les embouts. Pour déplacer la géométrie de la capsule par rapport à l'origine par défaut, spécifiez le champ FixedTransform 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 comme eye(3).

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.

Arguments de sortie

réduire tout

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