Класс: навигация. StateValidator
Пакет: навигация
Проверка допустимости пути между состояниями
[ определяет, является ли движение между двумя состояниями действительным путем интерполяции между состояниями. Функция также возвращает последнее допустимое состояние по пути.isValid,lastValid] = isMotionValid(validatorObj,state1,state2)
Реализация по умолчанию для этого метода предоставляется при вызове createPlanningTemplate.
validatorObj - Объект проверки состоянияnav.StateValidatorОбъект проверки состояния, указанный как объект из подкласса nav.StateValidator. Для получения информации об объектах проверки состояния см. validatorOccupancyMap или validatorVehicleCostmap.
state1 - Исходное положениеПозиция начального состояния, заданная как вектор n-элемента или матрица m-на-n векторов строк. n - размер пространства состояния, указанный в свойстве пространства состояния в validatorObj.
state2 - Положение конечного состоянияКонечная позиция состояния, заданная как вектор n-элемента или матрица m-на-n векторов строк. n - размер пространства состояния, указанный в свойстве пространства состояния в validatorObj.
isValid - Действительные состояния1s и 0sДопустимые состояния, указанные как вектор m-элемента 1s и 0s.
Типы данных: logical
lastValid - Окончательное действительное состояние вдоль траекторииКонечное допустимое состояние вдоль пути, указанное как вектор 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
Сохраните определение класса проверки пространства состояния. Теперь можно использовать конструктор класса для создания объекта для проверки состояний для данного пространства состояний.
Имеется измененная версия этого примера. Открыть этот пример с помощью изменений?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.