exponenta event banner

класс nav.StateSpace

Пакет: навигация

Создание пространства состояния для планирования путей

Описание

nav.StateSpace является интерфейсом для пространств состояний, используемых для планирования тракта. Производное от этого класса, если требуется определить собственное пространство состояний. Это представление позволяет выполнять выборку, интерполяцию и вычисление расстояний между пространствами в пространстве состояний.

Чтобы создать образец шаблона для создания собственного класса пространства состояний, вызовите createPlanningTemplate. Конкретные реализации класса проверки состояния для общего применения см. в разделе Пространства состояний в планировании движения.

nav.StateSpace класс является handle класс.

Атрибуты класса

Abstract
true

Сведения об атрибутах класса см. в разделе Атрибуты класса.

Создание

Описание

пример

ssObj = nav.StateSpace(Name,NumStateVariables,Bounds) создает объект пространства состояний с заданным именем и границами состояний. NumStateVariables указывает количество переменных состояния. Этот конструктор может быть вызван только из производного класса. Создайте собственное определение класса с помощью createPlanningTemplate.

Свойства

развернуть все

Общедоступные свойства

Число переменных в пространстве состояний, указанное как положительный числовой скаляр. Это свойство является размерностью пространства состояния.

Пример: 3

Атрибуты:

SetAccess - immutable

Мин. и макс. границы переменных состояния, указанных как [min max] матрица n-by-2. Это свойство зависит от NumStateVariables, где n - число переменных состояния. При определении конструкции используйте Bounds вход.

Пример: [-10 10; -10 10; -pi pi]

Атрибуты:

GetAccess
public
SetAccess
protected
Dependent
true

Типы данных: double

Защищенные свойства

Имя объекта пространства состояния, указанное как строковый скалярный или символьный вектор.

Пример: "customSE2StateSpace"

Атрибуты:

GetAccess
protected
SetAccess
protected

Методы

развернуть все

Примеры

свернуть все

В этом примере показано, как использовать createPlanningTemplate создание шаблона для настройки собственного определения пространства состояний и дискретизатора для использования с алгоритмами планирования путей. Шаблон обеспечивает простую реализацию.

Вызовите функцию создания шаблона. Эта функция создает файл определения класса для изменения для собственной реализации.

createPlanningTemplate

Определение класса и свойства

Первая часть шаблона определяет определение класса и любые свойства класса. Вывести из nav.StateSpace класс. В этом примере создайте свойство для равномерного и нормального распределений. Здесь можно указать любые дополнительные пользовательские свойства.

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

Сохраните пользовательский класс пространства состояний и убедитесь, что имя файла совпадает с именем класса.

Конструктор классов

Используйте конструктор, чтобы задать имя пространства состояний, количество переменных состояний и определить его границы. Можно также добавить входные аргументы в функцию и передать переменные при создании объекта.

  • Для каждой переменной состояния определите [min max] значения для границ состояний.

  • Вызовите конструктор базового класса.

  • В этом примере значения свойств нормального и равномерного распределения задаются с помощью предварительно определенных NormalDistribution и UniformDistribution классы.

  • Здесь укажите любые другие пользовательские значения свойств.

 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

Копирование семантики

Укажите copy определение метода. Скопируйте все значения пользовательских переменных в новый объект, чтобы copyObj является глубокой копией. Поведение по умолчанию, приведенное в этом примере, создает новую копию объекта с тем же именем, границами состояний и распределениями.

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

Принудительное применение ограничений состояния

Укажите, как гарантировать, что состояния всегда находятся в пределах состояний. В этом примере значения состояния насыщаются при минимальных или максимальных значениях для границ состояния.

        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

Образец равномерно

Укажите поведение выборки для равномерного распределения. поддерживают множество синтаксисов для ограничения равномерного распределения в близлежащее состояние в пределах определенного расстояния и выборки множества состояний.

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

В этом примере используйте функцию проверки для обработки varargin ввод, который обрабатывает изменяющиеся входные аргументы.

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

Образец из Gaussian Distribution

Укажите поведение выборки по гауссову распределению. Поддержка нескольких синтаксисов для выборки одного состояния или нескольких состояний.

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

Интерполяция между государствами

Определите способ интерполяции между двумя состояниями в пространстве состояний. Используйте входные данные, fraction, чтобы определить, как выполнять выборку по пути между двумя состояниями. В этом примере определите основной метод линейной интерполяции, используя разницу между состояниями.

        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

Расчет расстояния между состояниями

Укажите способ вычисления расстояния между двумя состояниями в пространстве состояний. Используйте state1 и state2 входные данные для определения начального и конечного положений. Оба входа могут быть одним состоянием (вектор строки) или несколькими состояниями (матрица векторов строки). Для этого примера вычислите расстояние на основе евклидова расстояния между каждой парой положений состояний.

        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

Завершите методы и разделы классов.

    end
end

Сохраните определение класса пространства состояния. Теперь можно использовать конструктор класса для создания объекта для области состояний.

Расширенные возможности

Создание кода C/C + +
Создайте код C и C++ с помощью MATLAB ® Coder™

.
Представлен в R2019b