Пакет: военно-морской
Создайте пространство состояний для планирования пути
nav.StateSpace
интерфейс для пространств состояний, используемых в планировании пути. Выведите из этого класса, если вы хотите задать свое собственное пространство состояний. Это представление допускает выборку, интерполяцию и вычисление расстояний между пробелами в пространстве состояний.
Чтобы создать демонстрационный шаблон для генерации вашего собственного класса пространства состояний, вызовите createPlanningTemplate
. Для наших реализаций класса пространства состояний смотрите Пространства состояний.
nav.StateSpace
классом является handle
класс.
Abstract | true |
Для получения информации об атрибутах класса см. Атрибуты класса (MATLAB).
создает объект пространства состояний с именем и границами состояния. ssObj
= nav.StateSpace(Name
,NumStateVariables
,Bounds
)NumStateVariables
задает количество переменных состояния. Этот конструктор может только быть назван от производного класса. Создайте свое собственное определение класса с помощью createPlanningTemplate
.
NumStateVariables
— Количество переменных в пространстве состоянийКоличество переменных в пространстве состояний, заданном в виде положительного числа. Это свойство является размерностью пространства состояний.
Пример 3
SetAccess - immutable
StateBounds
— Min и макс. границы переменных состояния[min max]
| n-by-2 матрицаMin и макс. границы переменных состояния, заданных как [min max]
n-by-2 матрица. Это свойство зависит от NumStateVariables
, где n является количеством переменных состояния. При определении на конструкции используйте Bounds
входной параметр.
Пример: [-10 10; -10 10; -pi pi]
GetAccess | public |
SetAccess | protected |
Dependent | true |
Типы данных: double
Name
— Имя объекта пространства состоянийИмя объекта пространства состояний, заданного как скаляр строки или вектор символов.
Пример: "customSE2StateSpace"
GetAccess | protected |
SetAccess | protected |
copy | Скопируйте массив объектов указателя |
distance | Расстояние между двумя состояниями |
enforceStateBounds | Предельное состояние, чтобы утвердить границы |
interpolate | Интерполируйте между состояниями |
sampleGaussian | Демонстрационное состояние с помощью Распределения Гаусса |
sampleUniform | Демонстрационное состояние с помощью равномерного распределения |
В этом примере показано, как использовать 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
Сохраните свое определение класса пространства состояний. Можно теперь использовать конструктора класса, чтобы создать объект для пространства состояний.
nav.StateValidator
| stateSpaceDubins
| stateSpaceReedsShepp
| stateSpaceSE2
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.