Пакет: nav
Создайте пространство состояний для планирования пути
nav.StateSpace
является интерфейсом для пространств состояний, используемых для планирования пути. Производитесь от этого класса, если хотите задать собственное пространство состояний. Это представление позволяет проводить выборку, интерполяцию и вычислять расстояния между пространствами в пространстве состояний.
Чтобы создать образец шаблона для генерации собственного класса пространства состояний, вызовите createPlanningTemplate
. Для конкретных реализаций класса валидатора состояний для общего приложения смотрите Пространства in Motion Planning.
The nav.StateSpace
класс является handle
класс.
Abstract | true |
Для получения информации об атрибутах класса см. раздел «Атрибуты класса».
создает объект пространства состояний с заданным именем и границами состояний. ssObj
= nav.StateSpace(Name
,NumStateVariables
,Bounds
)NumStateVariables
задает количество переменных состояния. Этот конструктор можно вызвать только из производного класса. Создайте собственное определение класса с помощью createPlanningTemplate
.
NumStateVariables
- Количество переменных в пространстве состоянийКоличество переменных в пространстве состояний, заданное как положительный числовой скаляр. Это свойство является размерностью пространства состояний.
Пример: 3
SetAccess - immutable
StateBounds
- Минимальная и максимальная границы переменных состояния[min max]
| n -by-2 матрицаМинимальная и максимальная границы переменных состояния, заданные как [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. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.