isStateValid

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

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

Описание

isValid = isStateValid(validatorObj,states) определяет если states допустимы.

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

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

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

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

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

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

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

Примеры

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

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