Main Content

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

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 :

    1. Path Adjustment — Augmenter (interpoler) ou diminuer (désinterpoler) les poses dans le chemin.

    2. 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

    exemple

    options = optimizePathOptions crée un ensemble d'options d'optimisation par défaut pour la fonction optimizePath .

    Propriétés

    développer tout

    Paramètres de trajectoire

    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

    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

    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

    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

    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

    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

    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

    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

    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

    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

    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

    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

    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

    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

    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

    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

    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

    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

    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

    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

    réduire tout

    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")

    Figure contains an axes object. The axes object with title Binary Occupancy Grid, xlabel X [meters], ylabel Y [meters] contains 3 objects of type image, quiver. These objects represent Input Path, Optimized Path.

    En savoir plus

    développer tout

    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