exponenta event banner

isMotionValid

Класс: навигация. StateValidator
Пакет: навигация

Проверка допустимости пути между состояниями

Описание

пример

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

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

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

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

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

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

Конечная позиция состояния, заданная как вектор n-элемента или матрица m-на-n векторов строк. n - размер пространства состояния, указанный в свойстве пространства состояния в validatorObj.

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

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

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

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

Конечное допустимое состояние вдоль пути, указанное как вектор 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