createPlanningTemplate
Créer un exemple d'implémentation pour l'interface de planification de chemin
Depuis R2019b
Syntaxe
Description
createPlanningTemplate
crée un modèle de planification pour une sous-classe de la classe nav.StateSpace
. La fonction ouvre un fichier dans l'éditeur MATLAB® . Enregistrez votre implémentation personnalisée et assurez-vous que le fichier est disponible sur le chemin MATLAB . Syntaxe alternative : createPlanningTemplate("StateSpace")
createPlanningTemplate("StateValidator")
crée un modèle pour une sous-classe de la classe nav.StateValidator
.
createPlanningTemplate("StateSampler")
crée un modèle pour une sous-classe de la classe nav.StateSampler
.
Exemples
Créer un espace d'état personnalisé pour la planification des chemins
Cet exemple montre comment utiliser la fonction createPlanningTemplate
pour générer un modèle permettant de personnaliser votre propre définition d'espace d'état et votre échantillonneur à utiliser avec les algorithmes de planification de chemin. Une implémentation simple est fournie avec le modèle.
Appelez la fonction de création de modèle. Cette fonction génère un fichier de définition de classe que vous pouvez modifier pour votre propre implémentation.
createPlanningTemplate
Définition de classe et de propriété
La première partie du modèle spécifie la définition de classe et toutes les propriétés de la classe. Dérivez de la classe nav.StateSpace
. Pour cet exemple, créez une propriété pour les distributions uniforme et normale. Vous pouvez spécifier ici toutes les propriétés supplémentaires définies par l'utilisateur.
classdef MyCustomStateSpace < nav.StateSpace & ... matlabshared.planning.internal.EnforceScalarHandle properties UniformDistribution NormalDistribution % Specify additional properties here end
Enregistrez votre classe d'espace d'état personnalisée et assurez-vous que votre nom de fichier correspond au nom de la classe.
Constructeur de classe
Utilisez le constructeur pour définir le nom de l'espace d'état, le nombre de variables d'état et définir ses limites. Vous pouvez également ajouter des arguments d'entrée à la fonction et transmettre les variables lorsque vous créez un objet.
Pour chaque variable d'état, définissez les valeurs
[min max]
pour les limites d'état.Appelez le constructeur de la classe de base.
Pour cet exemple, vous spécifiez les valeurs des propriétés de distribution normale et uniforme à l'aide des classes prédéfinies
NormalDistribution
etUniformDistribution
.Spécifiez ici toute autre valeur de propriété définie par l'utilisateur.
methods function obj = MyCustomStateSpace spaceName = "MyCustomStateSpace"; numStateVariables = 3; stateBounds = [-100 100; % [min max] -100 100; -100 100]; obj@nav.StateSpace(spaceName, numStateVariables, stateBounds); obj.NormalDistribution = matlabshared.tracking.internal.NormalDistribution(numStateVariables); obj.UniformDistribution = matlabshared.tracking.internal.UniformDistribution(numStateVariables); % User-defined property values here end
Copier la sémantique
Spécifiez la définition de la méthode copy
. Copiez toutes les valeurs de vos variables définies par l'utilisateur dans un nouvel objet, donc copyObj
est une copie complète. Le comportement par défaut donné dans cet exemple crée une nouvelle copie de l'objet avec le même nom, les mêmes limites d'état et les mêmes distributions.
function copyObj = copy(obj) copyObj = feval(class(obj)); copyObj.StateBounds = obj.StateBounds; copyObj.UniformDistribution = obj.UniformDistribution.copy; copyObj.NormalDistribution = obj.NormalDistribution.copy; end
Appliquer les limites de l'État
Spécifiez comment garantir que les États sont toujours dans les limites de l'État. Pour cet exemple, les valeurs d'état sont saturées aux valeurs minimales ou maximales des limites d'état.
function boundedState = enforceStateBounds(obj, state) nav.internal.validation.validateStateMatrix(state, nan, obj.NumStateVariables, "enforceStateBounds", "state"); boundedState = state; boundedState = min(max(boundedState, obj.StateBounds(:,1)'), ... obj.StateBounds(:,2)'); end
Échantillonner uniformément
Spécifiez le comportement d’échantillonnage sur une distribution uniforme. prend en charge plusieurs syntaxes pour contraindre la distribution uniforme à un état proche dans une certaine distance et échantillonner plusieurs états.
STATE = sampleUniform(OBJ) STATE = sampleUniform(OBJ,NUMSAMPLES) STATE = sampleUniform(OBJ,NEARSTATE,DIST) STATE = sampleUniform(OBJ,NEARSTATE,DIST,NUMSAMPLES)
Pour cet exemple, utilisez une fonction de validation pour traiter une entrée varargin
qui gère les différents arguments d'entrée.
function state = sampleUniform(obj, varargin) narginchk(1,4); [numSamples, stateBounds] = obj.validateSampleUniformInput(varargin{:}); obj.UniformDistribution.RandomVariableLimits = stateBounds; state = obj.UniformDistribution.sample(numSamples); end
Échantillon de distribution gaussienne
Spécifiez le comportement d'échantillonnage sur une distribution gaussienne. Prend en charge plusieurs syntaxes pour échantillonner un seul état ou plusieurs états.
STATE = sampleGaussian(OBJ, MEANSTATE, STDDEV) STATE = sampleGaussian(OBJ, MEANSTATE, STDDEV, NUMSAMPLES)
function state = sampleGaussian(obj, meanState, stdDev, varargin) narginchk(3,4); [meanState, stdDev, numSamples] = obj.validateSampleGaussianInput(meanState, stdDev, varargin{:}); obj.NormalDistribution.Mean = meanState; obj.NormalDistribution.Covariance = diag(stdDev.^2); state = obj.NormalDistribution.sample(numSamples); state = obj.enforceStateBounds(state); end
Interpoler entre les états
Définissez comment interpoler entre deux états dans votre espace d’états. Utilisez une entrée, fraction
, pour déterminer comment échantillonner le long du chemin entre deux états. Pour cet exemple, définissez une méthode d'interpolation linéaire de base utilisant la différence entre les états.
function interpState = interpolate(obj, state1, state2, fraction) narginchk(4,4); [state1, state2, fraction] = obj.validateInterpolateInput(state1, state2, fraction); stateDiff = state2 - state1; interpState = state1 + fraction' * stateDiff; end
Calculer la distance entre les États
Spécifiez comment calculer la distance entre deux états dans votre espace d'état. Utilisez les entrées state1
et state2
pour définir les positions de début et de fin. Les deux entrées peuvent être un seul état (vecteur ligne) ou plusieurs états (matrice de vecteurs lignes). Pour cet exemple, calculez la distance en fonction de la distance euclidienne entre chaque paire de positions d'état.
function dist = distance(obj, state1, state2) narginchk(3,3); nav.internal.validation.validateStateMatrix(state1, nan, obj.NumStateVariables, "distance", "state1"); nav.internal.validation.validateStateMatrix(state2, size(state1,1), obj.NumStateVariables, "distance", "state2"); stateDiff = bsxfun(@minus, state2, state1); dist = sqrt( sum( stateDiff.^2, 2 ) ); end
Terminez les méthodes et les sections de classe.
end end
Enregistrez la définition de votre classe d'espace d'état. Vous pouvez maintenant utiliser le constructeur de classe pour créer un objet pour votre espace d'état.
Créer un validateur d'espace d'état personnalisé pour la planification des chemins
Cet exemple montre comment utiliser la fonction createPlanningTemplate
pour générer un modèle permettant de personnaliser votre propre classe de validation d'état. La validation d'état est utilisée avec des algorithmes de planification de chemin pour garantir la validité des chemins. La fonction modèle fournit une implémentation de base à des fins d'exemple.
Appelez la fonction de création de modèle. Cette fonction génère un fichier de définition de classe que vous pouvez modifier pour votre propre implémentation. Enregistrez ce fichier.
createPlanningTemplate("StateValidator")
Définition de classe et de propriété
La première partie du modèle spécifie la définition de classe et toutes les propriétés de la classe. Dérivez de la classe nav.StateValidator
. Vous pouvez spécifier ici toutes les propriétés supplémentaires définies par l'utilisateur.
classdef MyCustomStateValidator < nav.StateValidator & ... matlabshared.planning.internal.EnforceScalarHandle properties % User-defined properties end
Enregistrez votre classe de validateur d'état personnalisée et assurez-vous que votre nom de fichier correspond au nom de la classe.
Constructeur de classe
Utilisez le constructeur pour définir le nom du validateur d'espace d'état et spécifier l'objet d'espace d'état. Définissez une valeur par défaut pour l’espace d’état si aucune n’est fournie. Appelez le constructeur de la classe de base. Initialisez toutes les autres propriétés définies par l'utilisateur. Cet exemple utilise une valeur par défaut de MyCustomStateSpace
, qui a été illustrée dans l'exemple précédent.
methods function obj = MyCustomStateValidator(space) narginchk(0,1) if nargin == 0 space = MyCustomStateSpace; end obj@nav.StateValidator(space); % Initialize user-defined properties end
Copier la sémantique
Spécifiez la définition de la méthode copy
. Copiez toutes les valeurs de vos variables définies par l'utilisateur dans un nouvel objet, donc copyObj
est une copie complète. Le comportement par défaut donné dans cet exemple crée une nouvelle copie de l'objet avec le même type.
function copyObj = copy(obj) copyObj = feval(class(obj), obj.StateSpace); end
Vérifier la validité de l'état
Définissez comment un état donné est validé. L'entrée state
peut être soit un vecteur de ligne unique, soit une matrice de vecteurs de ligne pour plusieurs états. Personnalisez cette fonction pour tout comportement de validation spécial pour votre espace d'état, comme la vérification des collisions par rapport aux obstacles.
function isValid = isStateValid(obj, state) narginchk(2,2); nav.internal.validation.validateStateMatrix(state, nan, obj.StateSpace.NumStateVariables, ... "isStateValid", "state"); bounds = obj.StateSpace.StateBounds'; inBounds = state >= bounds(1,:) & state <= bounds(2,:); isValid = all(inBounds, 2); end
Vérifier la validité du mouvement
Définissez comment générer le mouvement entre les états et déterminez s'il est valide. Pour cet exemple, utilisez linspace
pour interpoler uniformément entre les états et vérifiez si ces états sont valides à l'aide de isStateValid
. Personnalisez cette fonction pour échantillonner entre les états ou envisagez d'autres méthodes analytiques pour déterminer si un véhicule peut se déplacer entre des états donnés.
function [isValid, lastValid] = isMotionValid(obj, state1, state2) narginchk(3,3); state1 = nav.internal.validation.validateStateVector(state1, ... obj.StateSpace.NumStateVariables, "isMotionValid", "state1"); state2 = nav.internal.validation.validateStateVector(state2, ... obj.StateSpace.NumStateVariables, "isMotionValid", "state2"); if (~obj.isStateValid(state1)) error("statevalidator:StartStateInvalid", "The start state of the motion is invalid."); end % Interpolate at a fixed interval between states and check state validity numInterpPoints = 100; interpStates = obj.StateSpace.interpolate(state1, state2, linspace(0,1,numInterpPoints)); interpValid = obj.isStateValid(interpStates); % Look for invalid states. Set lastValid state to index-1. firstInvalidIdx = find(~interpValid, 1); if isempty(firstInvalidIdx) isValid = true; lastValid = state2; else isValid = false; lastValid = interpStates(firstInvalidIdx-1,:); end end
Terminez les méthodes et les sections de classe.
end end
Enregistrez la définition de votre classe de validateur d’espace d’état. Vous pouvez désormais utiliser le constructeur de classe pour créer un objet pour la validation des états pour un espace d'état donné.
Créer une classe pour implémenter un échantillonneur d'état personnalisé
Cet exemple montre comment utiliser la fonction createPlanningTemplate
pour générer un modèle pour créer votre propre échantillonneur d'état. L'échantillonnage dans l'espace d'états est utilisé avec des algorithmes de planification de chemin pour générer des échantillons valides pour calculer les chemins optimaux. La fonction modèle fournit une implémentation de base à des fins d'exemple.
Appelez la fonction de création de modèle. Cette fonction génère un fichier de définition de classe que vous pouvez modifier pour votre propre implémentation. Enregistrez ce fichier.
createPlanningTemplate("StateSampler")
Définition de classe et de propriété
La première partie du modèle spécifie la définition de classe et toutes les propriétés de la classe. Dérivez de la classe nav.StateSampler
. Vous pouvez spécifier ici toutes les propriétés supplémentaires définies par l'utilisateur.
classdef MyCustomStateSampler < nav.StateSampler & ... matlabshared.planning.internal.EnforceScalarHandle properties % User-defined properties end
Enregistrez votre classe d'échantillonneur d'état personnalisée et assurez-vous que votre nom de fichier correspond au nom de la classe.
Constructeur de classe
Utilisez le constructeur pour définir le nom de l'échantillonneur d'état et spécifier l'objet d'espace d'état. Définissez une valeur par défaut pour l’espace d’état si aucune n’est fournie. Cet exemple utilise un stateSpaceSE2
comme espace d'état par défaut. Appelez le constructeur de la classe de base. Initialisez toutes les autres propriétés définies par l'utilisateur. L'objet espace d'état est validé dans la classe de base StateSampler
.
methods function obj = MyCustomStateSampler(space) narginchk(0,1) if nargin == 0 space = stateSpaceSE2; end obj@nav.StateSampler(space); % Initialize user-defined properties end
Copier la sémantique
Spécifiez la définition de la méthode copy
. Copiez toutes les valeurs de vos variables définies par l'utilisateur dans un nouvel objet, donc copyObj
est une copie complète. Le comportement par défaut donné dans cet exemple crée une nouvelle copie de l'objet avec le même type.
function copyObj = copy(obj) copyObj = feval(class(obj), obj.StateSampler); % Place your code here end
Générer des échantillons d'état
Définissez la manière dont les échantillons d’état doivent être générés. Spécifiez le nombre d'échantillons à générer. S’il n’est pas spécifié, le nombre par défaut d’échantillons générés est 1. Vous pouvez également ajouter des arguments d'entrée supplémentaires à la fonction. Par défaut, la fonction calcule les échantillons en utilisant une distribution uniforme. Vous pouvez remplacer le comportement de la fonction par défaut par votre code personnalisé.
function states = sample(obj, numSamples) arguments obj numSamples = 1 end % Default behavior: Do uniform sampling states = obj.StateSpace.sampleUniform(numSamples); %-------------------------------------------------------------- % Place your code here to replace default function behavior. %-------------------------------------------------------------- end
Terminez les méthodes et les sections de classe.
end end
Enregistrez la définition de votre classe d’échantillonneur d’état. Vous pouvez désormais utiliser le constructeur de classe pour créer un objet permettant d'échantillonner un espace d'état donné.
Historique des versions
Introduit dans R2019bR2023b: Modèle de classe pour créer un échantillonneur d'état personnalisé
Vous pouvez maintenant utiliser la fonction createPlanningTemplate
pour générer un modèle de classe permettant de créer un échantillonneur d'état personnalisé. Utilisez la syntaxe
createPlanningTemplate("StateSampler")
Voir aussi
Classes
Objets
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)