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.

nav.StateSpace Clase

Espacio de nombres: nav

Crear espacio de estado para la planificación de rutas

Desde R2019b

Descripción

La clase es una interfaz para espacios de estados utilizados para la planificación de rutas.nav.StateSpace Deriva de esta clase si quieres definir tu propio espacio de estados. Esta representación permite muestrear, interpolar y calcular distancias entre espacios en el espacio de estados.

Para crear una plantilla de muestra para generar su propia clase de espacio de estados, llame a createPlanningTemplate. Para implementaciones específicas de la clase de espacio de estados para aplicación general, consulte Espacios de estados en Planificación de movimiento.

La clase nav.StateSpace es una clase handle .

Atributos de clase

Abstracto
verdadero

Para obtener información sobre los atributos de clase, consulte Class Attributes.

Creación

Descripción

ejemplo

ssObj = nav.StateSpace(Name,NumStateVariables,StateBounds) crea un objeto de espacio de estados con un nombre determinado, número de variables de estado y límites de estado. Este constructor sólo se puede llamar desde una clase derivada. Cree su propia definición de clase usando createPlanningTemplate.

Propiedades

expandir todo

Propiedades públicas

Número de variables en el espacio de estados, especificadas como un escalar numérico positivo. Esta propiedad es la dimensión del espacio de estados.

Ejemplo: 3

Atributos:

Establecer acceso
inmutable

Límites mínimos y máximos de las variables de estado, especificados como una matriz [min max] n por 2. Esta propiedad depende de NumStateVariables, donde n es el número de variables de estado. Al especificar la construcción, utilice la entrada Bounds .

Ejemplo: [-10 10; -10 10; -pi pi]

Atributos:

Tener acceso
público
Establecer acceso
protegido
Dependiente
verdadero

Tipos de datos: double

Propiedades protegidas

Nombre del objeto del espacio de estados, especificado como una cadena escalar o un vector de caracteres.

Ejemplo: "customSE2StateSpace"

Atributos:

Tener acceso
protegido
Establecer acceso
protegido

Métodos

expandir todo

Ejemplos

contraer todo

Este ejemplo muestra cómo utilizar la función createPlanningTemplate para generar una plantilla para personalizar su propia definición de espacio de estados y muestra para usar con algoritmos de planificación de rutas. Con la plantilla se proporciona una implementación sencilla.

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.

createPlanningTemplate

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.StateSpace . Para este ejemplo, cree una propiedad para las distribuciones uniforme y normal. Puede especificar aquí cualquier propiedad adicional definida por el usuario.

classdef MyCustomStateSpace < nav.StateSpace & ...
        matlabshared.planning.internal.EnforceScalarHandle
     properties
        UniformDistribution
        NormalDistribution
        % Specify additional properties here
end

Guarde su clase de espacio 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 espacio de estados, el número de variables de estado y definir sus límites. Alternativamente, puede agregar argumentos de entrada a la función y pasar las variables cuando crea un objeto.

  • Para cada variable de estado, defina los valores [min max] para los límites del estado.

  • Llame al constructor de la clase base.

  • Para este ejemplo, especifique los valores de propiedad de distribución normal y uniforme utilizando clases predefinidas NormalDistribution y UniformDistribution .

  • Especifique aquí cualquier otro valor de propiedad definido por el usuario.

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

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 nombre, límites de estado y distribuciones.

function copyObj = copy(obj)
    copyObj = feval(class(obj));
    copyObj.StateBounds = obj.StateBounds;
    copyObj.UniformDistribution = obj.UniformDistribution.copy;
    copyObj.NormalDistribution = obj.NormalDistribution.copy;
end

Hacer cumplir los límites estatales

Especifique cómo garantizar que los estados estén siempre dentro de los límites estatales. Para este ejemplo, los valores de estado se saturan en los valores mínimos o máximos de los límites del estado.

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

Muestra uniformemente

Especifique el comportamiento para el muestreo en una distribución uniforme. Admite múltiples sintaxis para restringir la distribución uniforme a un estado cercano dentro de una cierta distancia y muestrear múltiples estados.

STATE = sampleUniform(OBJ)
STATE = sampleUniform(OBJ,NUMSAMPLES)
STATE = sampleUniform(OBJ,NEARSTATE,DIST)
STATE = sampleUniform(OBJ,NEARSTATE,DIST,NUMSAMPLES)

Para este ejemplo, utilice una función de validación para procesar una entrada varargin que maneja los diferentes argumentos de entrada.

 function state = sampleUniform(obj, varargin)
    narginchk(1,4);
    [numSamples, stateBounds] = obj.validateSampleUniformInput(varargin{:});
    
    obj.UniformDistribution.RandomVariableLimits = stateBounds;
    state = obj.UniformDistribution.sample(numSamples);
 end

Muestra de distribución gaussiana

Especifique el comportamiento del muestreo en una distribución gaussiana. Admite múltiples sintaxis para muestrear uno o varios estados.

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

Interpolar entre estados

Defina cómo interpolar entre dos estados en su espacio de estados. Utilice una entrada, fraction, para determinar cómo realizar el muestreo a lo largo de la ruta entre dos estados. Para este ejemplo, defina un método de interpolación lineal básico utilizando la diferencia entre estados.

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

Calcular la distancia entre estados

Especifique cómo calcular la distancia entre dos estados en su espacio de estados. Utilice las entradas state1 y state2 para definir las posiciones inicial y final. Ambas entradas pueden ser de un solo estado (vector fila) o de múltiples estados (matriz de vectores fila). Para este ejemplo, calcule la distancia basándose en la distancia euclidiana entre cada par de posiciones estatales.

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

Termine los métodos y las secciones de clase.

    end
end

Guarde su definición de clase de espacio de estado. Ahora puedes usar el constructor de clases para crear un objeto para tu espacio de estados.

Capacidades ampliadas

Generación de código C/C++
Genere código C y C++ mediante MATLAB® Coder™.

Historial de versiones

Introducido en R2019b