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