nav.StateSpace class

Пакет: военно-морской

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

Описание

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

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

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

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

Abstract
true

Для получения информации об атрибутах класса см. Атрибуты класса.

Создание

Описание

пример

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

Свойства

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

Общественные собственности

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

Пример 3

Атрибуты:

SetAccess - immutable

Min и макс. границы переменных состояния в виде [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

Выборка от распределения Гаусса

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

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