Вызовите функцию создания шаблона. Эта функция создает файл определения класса для изменения для собственной реализации. Сохраните этот файл.
Определение класса и свойства
Первая часть шаблона определяет определение класса и любые свойства класса. Вывести из 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
Завершите методы и разделы классов.
Сохраните определение класса проверки пространства состояния. Теперь можно использовать конструктор класса для создания объекта для проверки состояний для данного пространства состояний.