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