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