Main Content

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

nav.StateValidator Classe

Namespace : nav

Créer un validateur d'état pour la planification du chemin

Depuis R2019b

Description

nav.StateValidator est une interface pour tous les validateurs d'état utilisés pour la planification de chemin. Dérivez de cette classe si vous souhaitez définir votre propre validateur d'état. Cette représentation permet la validation de l'état et du mouvement.

Pour créer un exemple de modèle permettant de générer votre propre classe d'espace d'état, appelez createPlanningTemplate ("StateValidator"). Pour des implémentations spécifiques de la classe de validateur d'état pour une application générale, voir State Validation dans Planification du mouvement.

La classe nav.StateValidator est une classe handle .

Attributs de classe

Abstrait
vrai

Pour plus d'informations sur les attributs de classe, voir Class Attributes.

Création

Description

exemple

ssObj = nav.StateValidator(stateSpace) crée un objet validateur d'état qui valide les états dans l'espace d'état donné. Ce constructeur ne peut être appelé qu'à partir d'une classe dérivée. Créez votre propre définition de classe en utilisant createPlanningTemplate.

Propriétés

développer tout

Définition de l'espace d'état, spécifiée comme objet d'une sous-classe de nav.StateSpace. Spécifiez cette propriété en utilisant l'entrée stateSpace sur la construction. Vous pouvez également spécifier n'importe lequel de nos objets prédéfinis dans la section State Validation à partir de Planification du mouvement.

Exemple : stateSpaceSE2

Les attributs:

Avoir accès
publique
DéfinirAccès
immuable

Méthodes

développer tout

Exemples

réduire tout

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

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 R2019b