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