Main Content

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

plannerRRTStar

Créer un planificateur de chemin RRT optimal (RRT*)

Depuis R2019b

Description

L'objet plannerRRTStar crée un planificateur RRT asymptotiquement optimal, RRT*. L'algorithme RRT* converge vers une solution optimale en termes de distance dans l'espace d'état. De plus, son temps d'exécution est un facteur constant du temps d'exécution de l'algorithme RRT. RRT* est utilisé pour résoudre des problèmes de planification géométrique. Un problème de planification géométrique nécessite que deux états aléatoires tirés de l’espace d’état puissent être connectés.

Création

Description

planner = plannerRRTStar(stateSpace,stateVal) crée un planificateur RRT* à partir d'un objet d'espace d'état, stateSpace, et d'un objet validateur d'état, stateVal. L'espace d'état de stateVal doit être le même que celui de stateSpace. stateSpace et stateVal définissent également les propriétés StateSpace et StateValidator du planner Objet $ .

exemple

planner = plannerRRTStar(___,Name=Value) définit les propriétés en utilisant un ou plusieurs arguments nom-valeur en plus des arguments d'entrée dans la syntaxe précédente. Vous pouvez spécifier le StateSampler, BallRadiusConstant, ContinueAfterGoalReached, MaxNumTreeNodes, MaxIterations, MaxConnectionDistance, GoalReachedFcn et GoalBias propriétés comme arguments nom-valeur.

Propriétés

développer tout

Espace d'état pour le planificateur, spécifié comme objet d'espace d'état. Vous pouvez utiliser des objets d'espace d'état tels que stateSpaceSE2, stateSpaceDubins, stateSpaceReedsShepp et stateSpaceSE3. Vous pouvez également personnaliser un objet d'espace d'état à l'aide de l'objet nav.StateSpace .

Validateur d'état pour le planificateur, spécifié en tant qu'objet validateur d'état. Vous pouvez utiliser des objets de validation d'état tels que validatorOccupancyMap, validatorVehicleCostmap et validatorOccupancyMap3D.

Depuis R2023b

Échantillonneur d'espace d'état utilisé pour rechercher des échantillons d'état dans l'espace d'entrée, spécifié comme objet stateSamplerUniform , objet stateSamplerGaussian , objet stateSamplerMPNET ou Objet nav.StateSampler . Par défaut, le plannerRRTStar utilise un échantillonnage d'état uniforme.

Constante utilisée pour estimer le rayon de recherche des voisins proches, spécifié comme un scalaire positif. Le rayon est estimé comme suit :

r=min(γ(log(n)n)1d,η)

où:

  • γ — La valeur de la propriété BallRadiusConstant

  • n — Nombre actuel de nœuds dans l'arborescence

  • d — Dimension de l'espace d'état

  • η — La valeur de la propriété MaxConnectionDistance

γ est défini comme suit :

γ=2d(1+1d)(VFreeVBall)

où:

  • VFree — Volume libre approximatif dans l'espace de recherche

  • VBall — Volume de la bille unitaire dans les dimensions d

Les formules ci-dessus définissent un BallRadiusConstant de taille "appropriée" pour un espace donné, ce qui signifie qu'à mesure que le nombre de nœuds remplissant l'espace augmente et que le rayon diminue, le nombre attendu de voisins augmente de manière logarithmique. Des valeurs plus élevées entraîneront un nombre moyen plus élevé de voisins dans la boule d par itération, conduisant à davantage de candidats au recâblage. Cependant, des valeurs inférieures à ce minimum suggéré pourraient conduire à un seul voisin proche, ce qui ne produirait pas de résultats asymptotiquement optimaux.

Exemple : BallRadiusConstant=80

Types de données : single | double

Décidez si le planificateur continue d'optimiser une fois l'objectif atteint, spécifié comme false ou true. Le planificateur se termine également quelle que soit la valeur de cette propriété si le nombre maximum d'itérations ou le nombre maximum de nœuds d'arborescence est atteint.

Exemple : ContinueAfterGoalReached=true

Types de données : logical

Nombre maximum de nœuds dans l'arborescence de recherche (à l'exclusion du nœud racine), spécifié sous forme d'entier positif.

Exemple : MaxNumTreeNodes=2500

Types de données : single | double

Nombre maximum d'itérations, spécifié sous forme d'entier positif.

Exemple : MaxIterations=2500

Types de données : single | double

Longueur maximale d'un mouvement autorisé dans l'arborescence, spécifiée sous forme de scalaire.

Exemple : MaxConnectionDistance=0.3

Types de données : single | double

Fonction de rappel pour déterminer si l'objectif est atteint, spécifiée comme handle de fonction. Vous pouvez créer votre propre fonction d’objectif atteint. La fonction doit suivre cette syntaxe :

 function isReached = myGoalReachedFcn(planner,currentState,goalState)

où:

  • planner — L'objet de planificateur créé, spécifié comme objet plannerRRTStar .

  • currentState — L'état actuel, spécifié comme un vecteur réel à trois éléments.

  • goalState — L'état objectif, spécifié comme un vecteur réel à trois éléments.

  • isReached — Une variable booléenne pour indiquer si l'état actuel a atteint l'état objectif, renvoyée sous la forme true ou false.

Pour utiliser le GoalReachedFcn personnalisé dans le flux de travail de génération de code, cette propriété doit être définie sur un handle de fonction personnalisé avant d'appeler la fonction de plan et elle ne peut pas être modifiée après l'initialisation.

Types de données : function handle

Probabilité de choisir l'état objectif lors de l'échantillonnage d'état, spécifiée comme un scalaire réel dans la plage [0,1]. La propriété définit la probabilité de choisir l’état objectif réel pendant le processus de sélection aléatoire d’états dans l’espace d’états. Vous pouvez commencer par définir la probabilité sur une petite valeur telle que 0.05.

Exemple : GoalBias=0.1

Types de données : single | double

Fonctions d'objet

planPlanifier le chemin entre deux états
copyCreate copy of planner object

Exemples

réduire tout

Créez un espace d'état.

ss = stateSpaceSE2;

Créez un validateur d'état basé sur occupancyMap en utilisant l'espace d'état créé.

sv = validatorOccupancyMap(ss);

Créez une carte d'occupation à partir d'un exemple de carte et définissez la résolution de la carte sur 10 cellules/mètre.

load exampleMaps.mat
map = occupancyMap(simpleMap,10);
sv.Map = map;

Définissez la distance de validation pour le validateur.

sv.ValidationDistance = 0.01;

Mettre à jour les limites de l'espace d'état pour qu'elles soient identiques aux limites de la carte.

ss.StateBounds = [map.XWorldLimits; map.YWorldLimits; [-pi pi]];

Créez un planificateur de chemin RRT* et permettez une optimisation supplémentaire une fois l'objectif atteint. Réduisez le nombre maximal d'itérations et augmentez la distance de connexion maximale.

planner = plannerRRTStar(ss,sv, ...
          ContinueAfterGoalReached=true, ...
          MaxIterations=2500, ...
          MaxConnectionDistance=0.3);

Définissez les états de départ et d’objectif.

start = [0.5 0.5 0];
goal = [2.5 0.2 0];

Planifiez un chemin avec les paramètres par défaut.

rng(100,'twister') % repeatable result
[pthObj,solnInfo] = plan(planner,start,goal);

Visualisez les résultats.

map.show
hold on
% Tree expansion
plot(solnInfo.TreeData(:,1),solnInfo.TreeData(:,2),'.-')
% Draw path
plot(pthObj.States(:,1),pthObj.States(:,2),'r-','LineWidth',2)

Figure contains an axes object. The axes object with title Occupancy Grid, xlabel X [meters], ylabel Y [meters] contains 3 objects of type image, line.

Chargez une carte d'occupation 3D d'un pâté de maisons dans l'espace de travail. Spécifiez le seuil pour considérer les cellules comme sans obstacle.

mapData = load("dMapCityBlock.mat");
omap = mapData.omap;
omap.FreeThreshold = 0.5;

Gonflez la carte d'occupation pour ajouter une zone tampon pour un fonctionnement sûr autour des obstacles.

inflate(omap,1)

Créez un objet d'espace d'état SE(3) avec des limites pour les variables d'état.

ss = stateSpaceSE3([0 220;0 220;0 100;inf inf;inf inf;inf inf;inf inf]);

Créez un validateur d'état de carte d'occupation 3D à l'aide de l'espace d'état créé. Attribuez la carte d'occupation à l'objet validateur d'état. Spécifiez l’intervalle de distance d’échantillonnage.

sv = validatorOccupancyMap3D(ss, ...
     Map = omap, ...
     ValidationDistance = 0.1);

Créez un planificateur de chemin en étoile RRT avec une distance de connexion maximale accrue et un nombre maximal d'itérations réduit. Spécifiez une fonction d'objectif personnalisée qui détermine qu'un chemin atteint l'objectif si la distance euclidienne jusqu'à la cible est inférieure à un seuil de 1 mètre.

planner = plannerRRTStar(ss,sv, ...
          MaxConnectionDistance = 50, ...
          MaxIterations = 1000, ...
          GoalReachedFcn = @(~,s,g)(norm(s(1:3)-g(1:3))<1), ...
          GoalBias = 0.1);

Spécifiez les poses de départ et d’objectif.

start = [40 180 25 0.7 0.2 0 0.1];
goal = [150 33 35 0.3 0 0.1 0.6];

Configurez le générateur de nombres aléatoires pour un résultat reproductible.

rng(1,"twister");

Planifiez le chemin.

[pthObj,solnInfo] = plan(planner,start,goal);

Visualisez le chemin prévu.

show(omap)
axis equal
view([-10 55])
hold on
% Start state
scatter3(start(1,1),start(1,2),start(1,3),"g","filled")
% Goal state
scatter3(goal(1,1),goal(1,2),goal(1,3),"r","filled")
% Path
plot3(pthObj.States(:,1),pthObj.States(:,2),pthObj.States(:,3), ...
      "r-",LineWidth=2)

Figure contains an axes object. The axes object with title Occupancy Map, xlabel X [meters], ylabel Y [meters] contains 4 objects of type patch, scatter, line.

En savoir plus

développer tout

Références

[1] Karaman, S. and E. Frazzoli. "Sampling-Based Algorithms for Optimal Motion Planning." The International Journal of Robotics Research. Vol. 30, Number 7, 2011, pp 846 – 894.

Capacités étendues

Historique des versions

Introduit dans R2019b

développer tout