enforceStateBounds

Класс: nav. StateSpace
Пакет: nav

Ограничьте состояние границами состояния

Описание

пример

boundedState = enforceStateBounds(ssObj,state) возвращает ограниченное состояние, которое лежит внутри границ состояния на основе заданного state. Используйте этот метод, чтобы задать конкретное ограничивающее поведение, такой как перенос угловых состояний. Границы заданы в StateBounds свойство ssObj.

Входные параметры

расширить все

Объект пространства состояний, заданный как объект подкласса nav.StateSpace.

Положение состояния, заданное как n элемент или m -by - n матрица векторов-строк. n - размерность пространства состояний, заданная в NumStateVariables свойство ssObj.

Выходные аргументы

расширить все

Положение состояния с принудительными границами состояния, заданное как n элемент или m -by - n матрица векторов-строк. n - размерность пространства состояний, заданная в NumStateVariables свойство ssObj.

Примеры

расширить все

В этом примере показано, как использовать 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

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

Введенный в R2019b
Для просмотра документации необходимо авторизоваться на сайте