optimizePathOptions
Créer des options d'optimisation pour la fonction optimisePath
Depuis R2022a
Description
Les options d'optimisation sont regroupées en quatre catégories :
Trajectory Parameters — Spécifiez le mouvement souhaité du robot tout au long du trajet.
Obstacle Parameters — Spécifiez les distances qui dictent l'influence de l'obstacle sur le chemin.
Solver Parameters — Spécifiez les options du solveur utilisé pour optimiser le chemin.
Weights — Spécifiez les pondérations de la fonction de coût.
Remarque
À un niveau très élevé, deux opérations principales se produisent dans la fonction optimizePath
:
Path Adjustment — Augmenter (interpoler) ou diminuer (désinterpoler) les poses dans le chemin.
Optimization — Minimisez le coût du chemin en appelant le solveur (Levenberg – Marquardt).
La propriété NumIteration détermine combien de fois les étapes 1 et 2 seront exécutées dans une boucle. La propriété MaxSolverIteration détermine le nombre maximal d'itérations pour Levenberg-Marquardt à chaque fois qu'elle est invoquée à l'étape 2. Pour les valeurs par défaut, Path Adjustment et Optimization (invocation du solveur) se produiront quatre fois, et à chaque invocation, le solveur effectuera un maximum de 15 fois.
Création
Description
crée un ensemble d'options d'optimisation par défaut pour la fonction options
= optimizePathOptionsoptimizePath
.
Propriétés
Paramètres de trajectoire
MaxPathStates
— Nombre maximum de poses autorisées dans le chemin
200
(par défaut) | entier supérieur ou égal à 3
Nombre maximum de poses autorisées dans le chemin, spécifié sous forme d'entier supérieur ou égal à 3.
Exemple : options.MaxPathStates = 100
Types de données : single
| double
ReferenceDeltaTime
— Temps de trajet entre deux poses consécutives
0.3
(par défaut) | scalaire positif
Temps de trajet entre deux poses consécutives, spécifié sous forme d'un scalaire positif en secondes. Ce paramètre ainsi que MaxVelocity ont un impact sur la distance d'interpolation entre les poses. Augmentez cette valeur pour avoir moins de poses et réduisez-la pour avoir un plus grand nombre de poses dans le chemin de sortie.
Exemple : options.ReferenceDeltaTime = 0.5
Types de données : single
| double
MinTurningRadius
— Rayon de braquage minimum dans la trajectoire
1
(par défaut) | scalaire positif
Rayon de braquage minimum sur la trajectoire, spécifié sous forme d'un scalaire positif en mètres. Notez qu'il s'agit d'une contrainte souple et peut être ignorée en fonction de la valeur du paramètre WeightMinTurningRadius par rapport aux autres poids.
Exemple : options.MinTurningRadius = 1.5
Types de données : single
| double
MaxVelocity
— Vitesse maximale le long du chemin
0.4
(par défaut) | scalaire positif
Vitesse maximale le long du trajet, spécifiée sous forme d'un scalaire positif en mètres par seconde. Notez qu'il s'agit d'une contrainte souple et peut être ignorée en fonction de la valeur du paramètre WeightVelocity par rapport aux autres poids.
Exemple : options.MaxVelocity = 0.5
Types de données : single
| double
MaxAngularVelocity
— Vitesse angulaire maximale le long de la trajectoire
0.3
(par défaut) | scalaire positif
Vitesse angulaire maximale le long du trajet, spécifiée sous forme de scalaire positif en radians par seconde. Notez qu'il s'agit d'une contrainte souple et peut être ignorée en fonction de la valeur du paramètre WeightAngularVelocity par rapport aux autres poids.
Exemple : options.MaxAngularVelocity = 0.5
Types de données : single
| double
MaxAcceleration
— Accélération maximale sur la trajectoire
0.5
(par défaut) | scalaire positif
Accélération maximale le long du trajet, spécifiée sous forme d'un scalaire positif en mètres par seconde carrée. Notez qu'il s'agit d'une contrainte souple et peut être ignorée en fonction de la valeur du paramètre WeightAcceleration par rapport aux autres poids.
Exemple : options.MaxAcceleration = 0.6
Types de données : single
| double
MaxAngularAcceleration
— Accélération angulaire maximale le long de la trajectoire
0.5
(par défaut) | scalaire positif
Accélération angulaire maximale le long de la trajectoire, spécifiée sous forme de scalaire positif en radians par seconde carrée. Notez qu'il s'agit d'une contrainte souple et peut être ignorée en fonction de la valeur du paramètre WeightAngularAcceleration par rapport aux autres poids.
Exemple : options.MaxAngularAcceleration = 0.6
Types de données : single
| double
Paramètres d'obstacles
ObstacleSafetyMargin
— Distance de sécurité par rapport aux obstacles
0.5
(par défaut) | scalaire positif
Distance de sécurité par rapport aux obstacles, spécifiée sous forme d'un scalaire positif en mètres. Notez qu'il s'agit d'une contrainte souple et peut être ignorée en fonction de la valeur du paramètre WeightObstacles par rapport aux autres poids. Voir Paramètres d'obstacles.
Exemple : options.ObstacleSafetyMargin = 0.6
Types de données : single
| double
ObstacleCutOffDistance
— Distance de coupure d'obstacle
2.5
(par défaut) | scalaire positif
Distance limite d'obstacle, spécifiée sous forme d'un scalaire positif en mètres. L'optimiseur de chemin ignore les obstacles au-delà de la distance limite. Voir Paramètres d'obstacles.
Exemple : options.ObstacleCutOffDistance = 1.5
Types de données : single
| double
ObstacleInclusionDistance
— Distance d'inclusion des obstacles
0.75
(par défaut) | scalaire positif
Distance d'inclusion d'obstacle, spécifiée sous forme d'un scalaire positif en mètres. L'optimiseur de chemin prend en compte tous les obstacles situés dans la distance d'inclusion. De plus, l'optimiseur de chemin prend également en compte l'obstacle le plus proche à gauche et à droite du robot entre l'inclusion et la région de coupure. Voir Paramètres d'obstacles.
Exemple : options.ObstacleInclusionDistance = 0.5
Types de données : single
| double
Paramètres du solveur
NumIteration
— Nombre d'appels du solveur
4
(par défaut) | entier positif
Nombre d'appels du solveur, spécifié sous la forme d'un entier positif. Cette valeur spécifie également le nombre de fois où l'interpolation se produit pendant l'optimisation.
Exemple : options.NumIteration = 5
Types de données : single
| double
MaxSolverIteration
— Nombre maximum d'itérations pour chaque appel du solveur
15
(par défaut) | entier positif
Nombre maximal d'itérations pour chaque appel du solveur, spécifié sous la forme d'un entier positif.
Exemple : options.MaxSolverIteration = 12
Types de données : single
| double
Poids
WeightTime
— Poids de la fonction de coût pour le temps
10
(par défaut) | scalaire non négatif
Pondération de la fonction de coût pour le temps, spécifiée sous la forme d'un scalaire non négatif. Pour réduire le temps de trajet, augmentez cette valeur de poids.
Exemple : options.WeightTime = 12
Types de données : single
| double
WeightSmoothness
— Poids de la fonction de coût pour le mouvement non holonomique
1000
(par défaut) | scalaire non négatif
Poids de la fonction de coût pour le mouvement non holonomique, spécifié comme un scalaire non négatif. Pour obtenir un trajet plus fluide, augmentez cette valeur de poids.
Exemple : options.WeightSmoothness = 500
Types de données : single
| double
WeightMinTurningRadius
— Poids fonction coût pour respecter le rayon de braquage minimum
10
(par défaut) | scalaire non négatif
Poids de la fonction de coût pour respecter le rayon de braquage minimum, spécifié sous forme d'un scalaire non négatif. Pour garantir que le rayon de braquage est supérieur au rayon de braquage minimum, augmentez cette valeur de poids.
Exemple : options.WeightMinTurningRadius = 15
Types de données : single
| double
WeightVelocity
— Poids de la fonction de coût pour la vitesse
100
(par défaut) | scalaire non négatif
Pondération de la fonction de coût pour la vitesse, spécifiée sous la forme d'un scalaire non négatif. Pour maintenir la vitesse en dessous de MaxVelocity, augmentez cette valeur de poids.
Exemple : options.WeightVelocity = 120
Types de données : single
| double
WeightAngularVelocity
— Poids de la fonction de coût pour la vitesse angulaire
10
(par défaut) | scalaire non négatif
Poids de la fonction de coût pour la vitesse angulaire, spécifié sous la forme d'un scalaire non négatif. Pour maintenir la vitesse angulaire en dessous de MaxAngularVelocity, augmentez cette valeur de poids.
Exemple : options.WeightAngularVelocity = 15
Types de données : single
| double
WeightAcceleration
— Pondération de la fonction de coût pour l'accélération
10
(par défaut) | scalaire non négatif
Pondération de la fonction de coût pour l'accélération, spécifiée sous la forme d'un scalaire non négatif. Pour maintenir l'accélération en dessous de MaxAcceleration, augmentez cette valeur de poids.
Exemple : options.WeightAcceleration = 15
Types de données : single
| double
WeightAngularAcceleration
— Poids de la fonction de coût pour l'accélération angulaire
10
(par défaut) | scalaire non négatif
Poids de la fonction de coût pour l'accélération angulaire, spécifié sous la forme d'un scalaire non négatif. Pour maintenir l'accélération angulaire en dessous de MaxAngularAcceleration, augmentez cette valeur de poids.
Exemple : options.WeightAngularAcceleration = 15
Types de données : single
| double
WeightObstacles
— Poids fonction coût pour maintenir une distance de sécurité par rapport aux obstacles
50
(par défaut) | scalaire non négatif
Poids de la fonction de coût pour maintenir une distance de sécurité par rapport aux obstacles, spécifié comme un scalaire non négatif. Pour maintenir une distance de sécurité par rapport aux obstacles, augmentez cette valeur de poids.
Exemple : options.WeightObstacles = 60
Types de données : single
| double
Exemples
Optimiser le chemin prévu
Environnement de configuration
Chargez une carte dans l'espace de travail.
map = load("exampleMaps.mat").complexMap;
Créez une carte d'occupation binaire.
map = binaryOccupancyMap(map);
Créez un objet validateur d'état.
stateValidator = validatorOccupancyMap;
Attribuez la carte à l’objet validateur d’état.
stateValidator.Map = map;
Définissez la distance de validation pour le validateur.
stateValidator.ValidationDistance = 0.01;
Planifier le chemin
Initialisez l'objet plannerHybridAStar
avec l'objet validateur d'état. Spécifiez la propriété MinTurningRadius
du planificateur sur 2 mètres.
planner = plannerHybridAStar(stateValidator,MinTurningRadius=2);
Définissez les poses de départ et d'objectif sous forme de vecteurs [x y theta]. x et y précisent la position en mètres, et thêta précise l'angle d'orientation en radians.
start = [6 3 pi/2]; goal = [32 32 0];
Planifiez un chemin depuis la pose de départ jusqu'à la pose d'objectif.
path = plan(planner,start,goal); inpath = path.States;
Optimiser le chemin
Configurez les options d'optimisation.
options = optimizePathOptions
options = optimizePathOptions Trajectory Parameters MaxPathStates: 200 ReferenceDeltaTime: 0.3000 MinTurningRadius: 1 MaxVelocity: 0.4000 MaxAngularVelocity: 0.3000 MaxAcceleration: 0.5000 MaxAngularAcceleration: 0.5000 Obstacle Parameters ObstacleSafetyMargin: 0.5000 ObstacleCutOffDistance: 2.5000 ObstacleInclusionDistance: 0.7500 Solver Parameters NumIteration: 4 MaxSolverIteration: 15 Weights WeightTime: 10 WeightSmoothness: 1000 WeightMinTurningRadius: 10 WeightVelocity: 100 WeightAngularVelocity: 10 WeightAcceleration: 10 WeightAngularAcceleration: 10 WeightObstacles: 50
Définissez la valeur minimale du rayon de braquage comme dans le planificateur.
options.MinTurningRadius = 2;
Spécifiez le nombre maximum de poses autorisées dans le chemin optimisé.
options.MaxPathStates = size(inpath,1) * 3;
Maintenez une distance de sécurité de 0.75
mètres des obstacles.
options.ObstacleSafetyMargin = 0.75;
Optimisez le chemin généré par le planificateur.
optpath = optimizePath(inpath,map,options);
Visualiser
Visualisez le chemin d’entrée et le chemin optimisé dans la carte.
show(map) hold on quiver(inpath(:,1),inpath(:,2),cos(inpath(:,3)),sin(inpath(:,3)),0.1); quiver(optpath(:,1),optpath(:,2),cos(optpath(:,3)),sin(optpath(:,3)),0.1); legend("Input Path","Optimized Path")
En savoir plus
Paramètres d'obstacles
Les paramètres d'obstacle ObstacleSafetyMargin, ObstacleInclusionDistance et ObstacleCutOffDistance déterminent quels obstacles sont pris en compte pour l'optimisation. Des obstacles éloignés entraîneraient des calculs inutiles et n’auraient pas d’impact sur l’optimisation du chemin.
La propriété ObstacleSafetyMargin
précise une distance de sécurité à maintenir entre les poses du chemin et les obstacles. La propriété ObstacleCutOffDistance
spécifie la distance du robot au-delà de laquelle tous les obstacles ne sont pas pris en compte lors de l'optimisation du chemin dans ce cas. La propriété ObstacleInclusionDistance
spécifie la distance du robot à l'intérieur de laquelle tous les obstacles sont pris en compte tout en optimisant le chemin dans ce cas. L'optimiseur de chemin prend également en compte l'obstacle le plus proche à gauche et à droite du robot entre l'inclusion et la région de coupure.
Références
[1] Rosmann, Christoph, Frank Hoffmann, and Torsten Bertram. “Kinodynamic Trajectory Optimization and Control for Car-like Robots.” In 2017 IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS), 5681–86. Vancouver, BC: IEEE, 2017. https://doi.org/10.1109/IROS.2017.8206458.
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 R2022a
Voir aussi
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)