isMotionValid

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

Проверьте, действителен ли путь между состояниями

Описание

пример

[isValid,lastValid] = isMotionValid(validatorObj,state1,state2) определяет, является ли движение между двумя состояниями допустимым, путем интерполяции между состояниями. Функция также возвращает последнее допустимое состояние вдоль пути.

Реализация по умолчанию для этого метода предоставляется при вызове createPlanningTemplate.

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

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

Объект-валидатор состояний, заданный как объект из подкласса nav.StateValidator. Для предоставленных объектов валидатора состояний смотрите validatorOccupancyMap или validatorVehicleCostmap.

Начальное положение, заданное как n вектор -элемент или m -by - n матрица векторов-строк. n - размерность пространства состояний, заданная в свойстве state space в validatorObj.

Окончательное положение, заданное как n вектор -элемент или m -by - n матрица векторов-строк. n - размерность пространства состояний, заданная в свойстве state space в validatorObj.

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

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

Допустимые состояния, заданные как m - вектор 1s и 0с.

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

Окончательное допустимое состояние вдоль пути, заданное как n элемент. n - размерность пространства состояний, заданная в свойстве state space в validatorObj.

Примеры

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

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