Main Content

Esta página se ha traducido mediante traducción automática. Haga clic aquí para ver la última versión en inglés.

isMotionValid

Clase: nav.StateValidator
Espacio de nombres: nav

Comprobar si la ruta entre estados es válida

Desde R2019b

Descripción

ejemplo

[isValid,lastValid] = isMotionValid(validatorObj,state1,state2) determina si el movimiento entre dos estados es válido interpolando entre estados. La función también devuelve el último estado válido a lo largo de la ruta.

Se proporciona una implementación predeterminada para este método cuando llama a createPlanningTemplate.

Argumentos de entrada

expandir todo

Objeto validador de estado, especificado como un objeto de una subclase de nav.StateValidator. Para conocer los objetos del validador de estado proporcionados, consulte validatorOccupancyMap o validatorVehicleCostmap.

Posición de estado inicial, especificada como un vector de elemento n o m-por- n matriz de vectores fila. n es la dimensión del espacio de estados especificado en la propiedad del espacio de estados en validatorObj.

Posición del estado final, especificada como un vector de elemento n o m-por- n matriz de vectores fila. n es la dimensión del espacio de estados especificado en la propiedad del espacio de estados en validatorObj.

Argumentos de salida

expandir todo

Estados válidos, especificados como un vector de elementos m de 1 s y 0 s.

Tipos de datos: logical

Estado válido final a lo largo de la ruta, especificado como un vector de elemento n. n es la dimensión del espacio de estados especificado en la propiedad del espacio de estados en validatorObj.

Ejemplos

expandir todo

Este ejemplo muestra cómo utilizar la función createPlanningTemplate para generar una plantilla para personalizar su propia clase de validación de estado. La validación de estado se utiliza con algoritmos de planificación de rutas para garantizar rutas válidas. La función de plantilla proporciona una implementación básica a modo de ejemplo.

Llame a la función de creación de plantilla. Esta función genera un archivo de definición de clase que puede modificar para su propia implementación. Guarde este archivo.

createPlanningTemplate("StateValidator")

Definición de clase y propiedad

La primera parte de la plantilla especifica la definición de clase y las propiedades de la clase. Deriva de la clase nav.StateValidator . Puede especificar aquí cualquier propiedad adicional definida por el usuario.

classdef MyCustomStateValidator < nav.StateValidator & ...
        matlabshared.planning.internal.EnforceScalarHandle
    properties
       % User-defined properties
    end

Guarde su clase de validador de estado personalizado y asegúrese de que el nombre de su archivo coincida con el nombre de la clase.

Constructor de clases

Utilice el constructor para establecer el nombre del validador del espacio de estados y especificar el objeto del espacio de estados. Establezca un valor predeterminado para el espacio de estado si no se proporciona uno. Llame al constructor de la clase base. Inicialice cualquier otra propiedad definida por el usuario. Este ejemplo utiliza un valor predeterminado de MyCustomStateSpace, que se ilustró en el ejemplo anterior.

methods
        function obj = MyCustomStateValidator(space)
            narginchk(0,1)
            
            if nargin == 0
                space = MyCustomStateSpace;
            end

            obj@nav.StateValidator(space);
            
           % Initialize user-defined properties
        end

Copiar semántica

Especifique la definición del método copy . Copie todos los valores de sus variables definidas por el usuario en un nuevo objeto, de modo que copyObj sea una copia profunda. El comportamiento predeterminado dado en este ejemplo crea una nueva copia del objeto con el mismo tipo.

        function copyObj = copy(obj)
            copyObj = feval(class(obj), obj.StateSpace);
        end

Verificar validez del estado

Defina cómo se valida un estado determinado. La entrada state puede ser un vector fila o una matriz de vectores fila para múltiples estados. Personalice esta función para cualquier comportamiento de validación especial para su espacio de estado, como la verificación de colisiones contra obstáculos.

        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

Verificar la validez del movimiento

Defina cómo generar el movimiento entre estados y determine si es válido. Para este ejemplo, use linspace para interpolar uniformemente entre estados y verifique si estos estados son válidos usando isStateValid. Personalice esta función para realizar muestreos entre estados o considere otros métodos analíticos para determinar si un vehículo puede moverse entre estados determinados.

        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

Termine los métodos y las secciones de clase.

    end
end

Guarde la definición de clase del validador de espacio de estados. Ahora puede utilizar el constructor de clases para crear un objeto para la validación de estados para un espacio de estados determinado.

Historial de versiones

Introducido en R2019b