nav.StateSpace class

Пакет: nav

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

Описание

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

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

The 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

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

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

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++ с помощью Coder™ MATLAB ®

.
Введенный в R2019b