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