Создайте пример реализации для интерфейса планирования пути
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
Выборка из Гауссова распределения
Задайте поведение для дискретизации по Гауссову распределению. Поддержка нескольких синтаксисов для дискретизации одного состояния или нескольких состояний.
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
Проверяйте валидность состояния
Задайте способ проверки данного состояния. 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
Завершает методы и разделы классов.
end end
Сохраните определение класса валидатора пространства состояний. Теперь можно использовать конструктор классов, чтобы создать объект для валидации состояний для заданного пространства состояний.
nav.StateSpace
| nav.StateValidator
| stateSpaceSE2
| validatorOccupancyMap
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.