Создание примера внедрения для интерфейса планирования путей
createPlanningTemplate создает шаблон планирования для подкласса nav.StateSpace класс. Функция открывает файл в редакторе MATLAB ®. Сохраните пользовательскую реализацию и убедитесь, что файл доступен по пути MATLAB. Альтернативный синтаксис :createPlanningTemplate("StateSpace")
createPlanningTemplate("StateValidator") создает шаблон для подкласса nav.StateValidator класс.
В этом примере показано, как использовать createPlanningTemplate создание шаблона для настройки собственного определения пространства состояний и дискретизатора для использования с алгоритмами планирования путей. Шаблон обеспечивает простую реализацию.
Вызовите функцию создания шаблона. Эта функция создает файл определения класса для изменения для собственной реализации.
createPlanningTemplate
Определение класса и свойства
Первая часть шаблона определяет определение класса и любые свойства класса. Вывести из nav.StateSpace класс. В этом примере создайте свойство для равномерного и нормального распределений. Здесь можно указать любые дополнительные пользовательские свойства.
classdef MyCustomStateSpace < nav.StateSpace & ... matlabshared.planning.internal.EnforceScalarHandle properties UniformDistribution NormalDistribution % Specify additional properties here end
Сохраните пользовательский класс пространства состояний и убедитесь, что имя файла совпадает с именем класса.
Конструктор классов
Используйте конструктор, чтобы задать имя пространства состояний, количество переменных состояний и определить его границы. Можно также добавить входные аргументы в функцию и передать переменные при создании объекта.
Для каждой переменной состояния определите [min max] значения для границ состояний.
Вызовите конструктор базового класса.
В этом примере значения свойств нормального и равномерного распределения задаются с помощью предварительно определенных NormalDistribution и UniformDistribution классы.
Здесь укажите любые другие пользовательские значения свойств.
methods
function obj = MyCustomStateSpace
spaceName = "MyCustomStateSpace";
numStateVariables = 3;
stateBounds = [-100 100; % [min max]
-100 100;
-100 100];
obj@nav.StateSpace(spaceName, numStateVariables, stateBounds);
obj.NormalDistribution = matlabshared.tracking.internal.NormalDistribution(numStateVariables);
obj.UniformDistribution = matlabshared.tracking.internal.UniformDistribution(numStateVariables);
% User-defined property values here
end
Копирование семантики
Укажите copy определение метода. Скопируйте все значения пользовательских переменных в новый объект, чтобы copyObj является глубокой копией. Поведение по умолчанию, приведенное в этом примере, создает новую копию объекта с тем же именем, границами состояний и распределениями.
function copyObj = copy(obj) copyObj = feval(class(obj)); copyObj.StateBounds = obj.StateBounds; copyObj.UniformDistribution = obj.UniformDistribution.copy; copyObj.NormalDistribution = obj.NormalDistribution.copy; end
Принудительное применение ограничений состояния
Укажите, как гарантировать, что состояния всегда находятся в пределах состояний. В этом примере значения состояния насыщаются при минимальных или максимальных значениях для границ состояния.
function boundedState = enforceStateBounds(obj, state) nav.internal.validation.validateStateMatrix(state, nan, obj.NumStateVariables, "enforceStateBounds", "state"); boundedState = state; boundedState = min(max(boundedState, obj.StateBounds(:,1)'), ... obj.StateBounds(:,2)'); end
Образец равномерно
Укажите поведение выборки для равномерного распределения. поддерживают множество синтаксисов для ограничения равномерного распределения в близлежащее состояние в пределах определенного расстояния и выборки множества состояний.
STATE = sampleUniform(OBJ) STATE = sampleUniform(OBJ,NUMSAMPLES) STATE = sampleUniform(OBJ,NEARSTATE,DIST) STATE = sampleUniform(OBJ,NEARSTATE,DIST,NUMSAMPLES)
В этом примере используйте функцию проверки для обработки varargin ввод, который обрабатывает изменяющиеся входные аргументы.
function state = sampleUniform(obj, varargin) narginchk(1,4); [numSamples, stateBounds] = obj.validateSampleUniformInput(varargin{:}); obj.UniformDistribution.RandomVariableLimits = stateBounds; state = obj.UniformDistribution.sample(numSamples); end
Образец из Gaussian Distribution
Укажите поведение выборки по гауссову распределению. Поддержка нескольких синтаксисов для выборки одного состояния или нескольких состояний.
STATE = sampleGaussian(OBJ, MEANSTATE, STDDEV) STATE = sampleGaussian(OBJ, MEANSTATE, STDDEV, NUMSAMPLES)
function state = sampleGaussian(obj, meanState, stdDev, varargin) narginchk(3,4); [meanState, stdDev, numSamples] = obj.validateSampleGaussianInput(meanState, stdDev, varargin{:}); obj.NormalDistribution.Mean = meanState; obj.NormalDistribution.Covariance = diag(stdDev.^2); state = obj.NormalDistribution.sample(numSamples); state = obj.enforceStateBounds(state); end
Интерполяция между государствами
Определите способ интерполяции между двумя состояниями в пространстве состояний. Используйте входные данные, fraction, чтобы определить, как выполнять выборку по пути между двумя состояниями. В этом примере определите основной метод линейной интерполяции, используя разницу между состояниями.
function interpState = interpolate(obj, state1, state2, fraction) narginchk(4,4); [state1, state2, fraction] = obj.validateInterpolateInput(state1, state2, fraction); stateDiff = state2 - state1; interpState = state1 + fraction' * stateDiff; end
Расчет расстояния между состояниями
Укажите способ вычисления расстояния между двумя состояниями в пространстве состояний. Используйте state1 и state2 входные данные для определения начального и конечного положений. Оба входа могут быть одним состоянием (вектор строки) или несколькими состояниями (матрица векторов строки). Для этого примера вычислите расстояние на основе евклидова расстояния между каждой парой положений состояний.
function dist = distance(obj, state1, state2) narginchk(3,3); nav.internal.validation.validateStateMatrix(state1, nan, obj.NumStateVariables, "distance", "state1"); nav.internal.validation.validateStateMatrix(state2, size(state1,1), obj.NumStateVariables, "distance", "state2"); stateDiff = bsxfun(@minus, state2, state1); dist = sqrt( sum( stateDiff.^2, 2 ) ); end
Завершите методы и разделы классов.
end end
Сохраните определение класса пространства состояния. Теперь можно использовать конструктор класса для создания объекта для области состояний.
В этом примере показано, как использовать 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 | stateSpaceSE2 | validatorOccupancyMap
Имеется измененная версия этого примера. Открыть этот пример с помощью изменений?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.