step
Calculer les commandes de vitesse et la trajectoire optimale pour les pas de temps ultérieurs
Depuis R2023a
Description
[
calcule les commandes de vitesse linéaire et angulaire velcmds
,timestamps
,optPath
] = step(controller
,curState
,curVel
)velcmds
, avec leur timestamps
correspondant et le chemin optimisé correspondant optPath
, pour la pose actuelle spécifiée curState
et la vitesse actuelle curVel
d'un robot.
[___,
renvoie des informations supplémentaires, extraInfo
] = step(___)extraInfo
, pour évaluer la solution, en plus de tous les arguments de la syntaxe précédente.
Exemples
Mettre en place un environnement de stationnement
Créez un objet occupancyMap
à partir d'une carte de parking et définissez la résolution de la carte sur 3 cellules par mètre.
load parkingMap.mat;
resolution = 3;
map = occupancyMap(map,resolution);
Visualisez la carte. La carte contient le plan d'étage d'un parking avec quelques emplacements de stationnement déjà occupés.
show(map) title("Parking Lot Map") hold on
Configurer et exécuter le planificateur global
Créez un validateur d'état validatorOccupancyMap
à l'aide de la définition stateSpaceSE2
. Spécifiez la carte et la distance pour interpoler et valider les segments de chemin.
validator = validatorOccupancyMap(stateSpaceSE2,Map=map); validator.ValidationDistance = 0.1;
Créez un planificateur de trajet RRT*. Augmentez la distance de connexion maximale.
rrtstar = plannerRRTStar(validator.StateSpace,validator); rrtstar.MaxConnectionDistance = 0.2;
Définissez les états de départ et d’objectif.
start = [2 9 0]; goal = [27 18 -pi/2];
Planifiez un chemin avec les paramètres par défaut.
rng(42,"twister") % Set random number generator seed for repeatable result. route = plan(rrtstar,start,goal); refpath = route.States;
RRT* utilise une orientation aléatoire, ce qui peut provoquer des virages inutiles.
headingToNextPose = headingFromXY(refpath(:,1:2));
Alignez l'orientation sur le chemin, sauf pour les états de départ et d'objectif.
refpath(2:end-1,3) = headingToNextPose(2:end-1);
Visualisez le chemin.
plot(refpath(:,1),refpath(:,2),"r-",LineWidth=2) hold off
Configurer et exécuter le planificateur local
Créez un objet local occupancyMap
avec une largeur et une hauteur de 15 mètres et la même résolution que la carte globale.
localmap = occupancyMap(15,15,map.Resolution);
Créez un objet controllerTEB
en utilisant le chemin de référence généré par le planificateur global et la carte locale.
teb = controllerTEB(refpath,localmap);
Spécifiez les propriétés de l'objet controllerTEB
.
teb.LookAheadTime = 10; % sec teb.ObstacleSafetyMargin = 0.4; % meters % To generate time-optimal trajectories, specify a larger weight value, % like 100, for the cost function, Time. To follow the reference path % closely, keep the weight to a smaller value like 1e-3. teb.CostWeights.Time = 100;
Créez un clone profond de l'objet controllerTEB
.
teb2 = clone(teb);
Initialisez les paramètres.
curpose = refpath(1,:);
curvel = [0 0];
simtime = 0;
% Reducing timestep can lead to more accurate path tracking.
timestep = 0.1;
itr = 0;
goalReached = false;
Calculez les commandes de vitesse et la trajectoire optimale.
while ~goalReached && simtime < 200 % Update map to keep robot in the center of the map. Also update the % map with new information from the global map or sensor measurements. moveMapBy = curpose(1:2) - localmap.XLocalLimits(end)/2; localmap.move(moveMapBy,FillValue=0.5) syncWith(localmap,map) if mod(itr,10) == 0 % every 1 sec % Generate new vel commands with teb [velcmds,tstamps,curpath,info] = step(teb,curpose,curvel); goalReached = info.HasReachedGoal; feasibleDriveDuration = tstamps(info.LastFeasibleIdx); % If robot is far from goal and only less than third of trajectory % is feasible, then an option is to re-plan the path to follow to % reach the goal. if info.ExitFlag == 1 && ... feasibleDriveDuration < (teb.LookAheadTime/3) route = plan(rrtstar,curpose,[27 18 -pi/2]); refpath = route.States; headingToNextPose = headingFromXY(refpath(:,1:2)); refpath(2:end-1,3) = headingToNextPose(2:end-1); teb.ReferencePath = refpath; end timestamps = tstamps + simtime; % Show the updated information input to or output % from controllerTEB clf show(localmap) hold on plot(refpath(:,1),refpath(:,2),".-",Color="#EDB120", ... DisplayName="Reference Path") quiver(curpath(:,1),curpath(:,2), ... cos(curpath(:,3)),sin(curpath(:,3)), ... 0.2,Color="#A2142F",DisplayName="Current Path") quiver(curpose(:,1),curpose(:,2), ... cos(curpose(:,3)),sin(curpose(:,3)), ... 0.5,"o",MarkerSize=20,ShowArrowHead="off", ... Color="#0072BD",DisplayName="Start Pose") end simtime = simtime+timestep; % Compute the instantaneous velocity to be sent to the robot from the % series of timestamped commands generated by controllerTEB velcmd = velocityCommand(velcmds,timestamps,simtime); % Very basic robot model, should be replaced by simulator. statedot = [velcmd(1)*cos(curpose(3)) ... velcmd(1)*sin(curpose(3)) ... velcmd(2)]; curpose = curpose + statedot*timestep; if exist("hndl","var") delete(hndl) end hndl = quiver(curpose(:,1),curpose(:,2), ... cos(curpose(:,3)),sin(curpose(:,3)), ... 0.5,"o",MarkerSize=20,ShowArrowHead="off", ... Color="#D95319",DisplayName="Current Robot Pose"); itr = itr + 1; drawnow end legend
Arguments d'entrée
Contrôleur TEB, spécifié comme objet controllerTEB
.
Pose actuelle du robot, spécifiée comme un vecteur à trois éléments de la forme [x y theta]. x et y précisent la position du robot en mètres. theta spécifie l'orientation du robot en radians.
Types de données : single
| double
Vitesse actuelle du robot, spécifiée comme un vecteur à deux éléments de la forme [v w]. v spécifie la vitesse linéaire du robot en mètres par seconde. w spécifie la vitesse angulaire du robot en radians par seconde.
Types de données : single
| double
Arguments de sortie
Commandes de vitesse, renvoyées sous forme de matrice N-by-2. La première colonne est la vitesse linéaire en mètres par seconde et la deuxième colonne est la vitesse angulaire en radians par seconde.
Types de données : double
Horodatages correspondant aux commandes de vitesse, renvoyés sous forme de vecteur de colonne d'éléments N.
Types de données : double
Chemin optimisé, renvoyé sous la forme d'une matrice N-by-3. Chaque ligne est de la forme [x y theta], qui définit la position xy et l'angle d'orientation theta en un point du chemin.
N est affecté par les propriétés ReferenceDeltaTime et LookAheadTime de controller
. L'algorithme essaie de garder la différence entre deux timestamps
consécutifs proche de ReferenceDeltaTime
. Si l'écart entre une paire d'horodatages consécutifs est supérieur à ReferenceDeltaTime
, la fonction ajoute des poses et des horodatages au chemin. Si l'écart est inférieur à ReferenceDeltaTime
, la fonction supprime les poses et les horodatages du chemin. De plus, l'algorithme essaie de garder la valeur finale de timestamps
proche de LookAheadTime
, donc augmenter LookAheadTime
augmente N également.
Types de données : double
Informations supplémentaires, renvoyées sous forme de structure. Les champs de la structure sont :
Champ | Description |
---|---|
LastFeasibleIdx | Index spécifiant un élément dans les sorties de chemin optimisé et d'horodatage jusqu'à lequel la trajectoire est réalisable. Au-delà de cet indice, la valeur de |
DistanceFromStartPose | Distance de chaque pose dans |
HasReachedGoal | Indique si le robot a réussi à atteindre la dernière pose dans le ReferencePath dans une tolérance, et renvoie comme |
TrajectoryCost | Coût de la trajectoire optimisée pour les fonctions de coût dans l'algorithme Timed Elastic Band. |
ExitFlag | Valeur scalaire indiquant la condition de sortie de la fonction
|
Types de données : struct
Historique des versions
Introduit dans R2023aL'argument de sortie extraInfo
renvoie désormais un champ d'ajout ExitFlag
qui spécifie plus d'informations sur les commandes de vitesse, les horodatages et le chemin renvoyés par le step
. Fonction $ .
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Sélectionner un site web
Choisissez un site web pour accéder au contenu traduit dans votre langue (lorsqu'il est disponible) et voir les événements et les offres locales. D’après votre position, nous vous recommandons de sélectionner la région suivante : .
Vous pouvez également sélectionner un site web dans la liste suivante :
Comment optimiser les performances du site
Pour optimiser les performances du site, sélectionnez la région Chine (en chinois ou en anglais). Les sites de MathWorks pour les autres pays ne sont pas optimisés pour les visites provenant de votre région.
Amériques
- 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)