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