createPlanningTemplate

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

Описание

пример

createPlanningTemplate создает шаблон планирования для подкласса nav.StateSpace класс. Функция открывает файл в MATLAB® Редактор. Сохраните пользовательскую реализацию и убедитесь, что файл доступен по пути MATLAB. Альтернативный синтаксис: createPlanningTemplate("StateSpace")

пример

createPlanningTemplate("StateValidator") создает шаблон для подкласса nav.StateValidator класс.

Примеры

свернуть все

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

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

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

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

createPlanningTemplate("StateValidator")

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

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

classdef MyCustomStateValidator < nav.StateValidator & ...
        matlabshared.planning.internal.EnforceScalarHandle
    properties
       % User-defined properties
    end

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

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

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

methods
        function obj = MyCustomStateValidator(space)
            narginchk(0,1)
            
            if nargin == 0
                space = stateSpaceSE2;
            end

            obj@nav.StateValidator(space);
            
           % Initialize user-defined properties
        end

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

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

        function copyObj = copy(obj)
            copyObj = feval(class(obj), obj.StateSpace);
        end

Проверяйте валидность состояния

Задайте способ проверки данного состояния. The state Вход может быть либо одной строкой вектора, либо матрицей векторов-строк для нескольких состояний. Настройте эту функцию для любого специального поведения валидации для вашего пространства состояний, такого как проверка столкновения на препятствия.

        function isValid = isStateValid(obj, state) 
            narginchk(2,2);
            nav.internal.validation.validateStateMatrix(state, nan, obj.StateSpace.NumStateVariables, ...
                "isStateValid", "state");
            
            bounds = obj.StateSpace.StateBounds';
            inBounds = state >= bounds(1,:) & state <= bounds(2,:);
            isValid = all(inBounds, 2);
            
        end

Проверяйте валидность движения

Задайте, как сгенерировать движение между состояниями и определите, является ли оно допустимым. В данном примере используйте linspace равномерно интерполировать между состояниями и проверить, действительны ли эти состояния, используя isStateValid. Настройте эту функцию для выборки между состояниями или рассмотрите другие аналитические методы для определения, может ли транспортное средство перемещаться между заданными состояниями.

        function [isValid, lastValid] = isMotionValid(obj, state1, state2)
            narginchk(3,3);
            state1 = nav.internal.validation.validateStateVector(state1, ...
                obj.StateSpace.NumStateVariables, "isMotionValid", "state1");
            state2 = nav.internal.validation.validateStateVector(state2, ...
                obj.StateSpace.NumStateVariables, "isMotionValid", "state2");
            
            if (~obj.isStateValid(state1))
                error("statevalidator:StartStateInvalid", "The start state of the motion is invalid.");
            end
            
            % Interpolate at a fixed interval between states and check state validity
            numInterpPoints = 100;
            interpStates = obj.StateSpace.interpolate(state1, state2, linspace(0,1,numInterpPoints));
            interpValid = obj.isStateValid(interpStates);
            
            % Look for invalid states. Set lastValid state to index-1.
            firstInvalidIdx = find(~interpValid, 1);
            if isempty(firstInvalidIdx)
                isValid = true;
                lastValid = state2;
            else
                isValid = false;
                lastValid = interpStates(firstInvalidIdx-1,:);
            end
            
        end

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

    end
end

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

Введенный в R2019b