isMotionValid

Класс: nav.StateValidator
Пакет: военно-морской

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

Описание

пример

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

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

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

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

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

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

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

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

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

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

Типы данных: логический

Итоговое допустимое состояние вдоль пути в виде n - вектор элемента. n является размерностью пространства состояний, заданного в свойстве пространства состояний в 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

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

Задайте, как подтверждено данное состояние. 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