Найдите оптимальную траекторию вдоль ссылочного пути
trajectoryOptimalFrenet
объект является планировщиком пути, какие выборки и оценивает локальные траектории на основе ссылочного пути. Планировщик генерирует набор конечных состояний на основе ссылочного пути и других параметров в объекте. Планировщик затем соединяет состояние с каждым конечным состоянием с помощью 4th или 5th закажите полиномы. Чтобы выбрать оптимальный путь, произведенные траектории оцениваются для кинематической выполнимости, столкновения, и стоятся.
trajectoryOptimalFrenet(
создает refPath
,validator
)trajectoryOptimalFrenet
объект со ссылочным путем, refPath
, в форме n-by-2 массив [x y]
waypoints и блок проверки допустимости состояния, validator
В виде validatorOccupancyMap
объект.
дополнительные свойства наборов с помощью одной или нескольких пар "имя-значение" в любом порядке.planner
= trajectoryOptimalFrenet(___,Name,Value
)
refPath
— Ссылочный путьСсылочный путь в виде n-by-2 матрица [x y]
пары, где n является количеством waypoints.
Пример: [100,100; 400,400]
Типы данных: double
validator
— Объект блока проверки допустимости состоянияvalidatorOccupancyMap
объектОбъект блока проверки допустимости состояния в виде validatorOccupancyMap
объект.
Примечание
Для 'Weights'
и 'FeasibilityParameters'
свойства, вы не можете задать целые структуры целиком. Вместо этого установите их поля индивидуально как пары "имя-значение". Например, trajectoryOptimalFrenet(refPath,validator,'Deviation',0)
устанавливает 'Deviation'
поле структуры 'Weights'
.
Weights
— Веса для всех затрат траекторииВеса для всей траектории стоят в виде структуры, содержащей скаляры для множителей стоимости соответствующих атрибутов траектории. Общая стоимость траектории является суммой всех атрибутов, умноженных на их веса. Структура имеет эти поля.
Time
— Вес в течение времени стоится
(значение по умолчанию) | положительная скалярная величинаФункция стоимости умножает вес к общему времени, потраченному, чтобы достигнуть конечного состояния. Задайте это значение как разделенную запятой пару 'Time'
и положительная скалярная величина в секундах.
Типы данных: double
ArcLength
— Вес для длины дуги стоится
(значение по умолчанию) | положительная скалярная величинаФункция стоимости умножает вес на общую длину сгенерированных траекторий. Задайте это значение как разделенную запятой пару 'ArcLength'
и положительная скалярная величина в метрах.
Типы данных: double
LateralSmoothness
— Вес для бокового толчка стоится
(значение по умолчанию) | положительная скалярная величинаФункция стоимости умножается, вес интегралом бокового толчка придал квадратную форму. Это значение определяет агрессивность траектории в боковом направлении (перпендикуляр к ссылочному пути). Задайте это значение как разделенную запятой пару 'LateralSmoothness'
и положительная скалярная величина. Чтобы оштрафовать бокового придурка в запланированной траектории увеличивают эту величину затрат.
Типы данных: double
LongitudinalSmoothness
— Вес для продольного толчка стоится
(значение по умолчанию) | положительная скалярная величинаФункция стоимости умножается, вес интегралом продольного толчка придал квадратную форму. Это значение определяет агрессивность траекторий в продольном направлении (направление ссылочного пути). Задайте это значение как разделенную запятой пару 'LongitudinalSmoothness'
и положительная скалярная величина. Чтобы оштрафовать большое изменение на прямом и обратном ускорении увеличивают эту величину затрат.
Типы данных: double
Deviation
— Вес для отклонения от ссылочного пути
(значение по умолчанию) | положительная скалярная величинаФункция стоимости умножает вес на перпендикулярное расстояние от ссылочного пути в конце траектории в метрах. Задайте это значение как разделенную запятой пару 'Deviation'
и положительная скалярная величина в метрах.
Типы данных: double
Типы данных: struct
FeasibilityParameters
— Структура, содержащая параметры выполнимостиПараметры выполнимости в виде структуры, содержащей скалярные значения, чтобы проверять валидность траектории. Структура имеет эти поля.
MaxCurvature
— Максимальное искривление, которое может выполнить транспортное средство
(значение по умолчанию) | положительный действительный скалярМаксимальное искривление, которое может выполнить транспортное средство. Задайте это значение как разделенную запятой пару 'MaxCurvature'
и положительный действительный скаляр в m-1. Это значение определяет кинематическую выполнимость траектории.
Типы данных: double
MaxAcceleration
— Максимальное ускорение в направлении движения транспортного средства
(значение по умолчанию) | положительный действительный скалярМаксимальное ускорение в направлении движения транспортного средства. Задайте это значение как разделенную запятой пару 'MaxAcceleration'
и положительный действительный скаляр в m/s2. Чтобы понизить предел на ускорение транспортного средства в прямом или обратном направлении уменьшают это значение.
Типы данных: double
Типы данных: struct
TimeResolution
— Интервал дискретизации траектории
(значение по умолчанию) | положительный действительный скалярВременной интервал между дискретизированными состояниями траектории. Задайте это значение как разделенную запятой пару 'TimeResolution'
и положительный действительный скаляр в секундах. Эти дискретизированные состояния определяют валидность состояния и функцию стоимости.
Типы данных: double
CostFunction
— Пользовательская функция стоимостиПользовательская функция стоимости в виде указателя на функцию. Функция должна принять матрицу n-by-7 состояния, TRAJSTATES
, для каждой траектории и возвращают величину затрат как скаляр. plan
функция возвращает путь с самой низкой ценой.
Например, leftLaneChangeCost = @(states)((states(end,2) < refPath(end,2))*10)
создает указатель функции стоимости, чтобы приоритизировать оставленный изменения маршрута.
Типы данных: function handle
TrajectoryList
— Список всех возможных траекторийЭто свойство доступно только для чтения.
'TrajectoryList'
свойство, возвращенное как массив структур всех траекторий кандидата и их соответствующих параметров. Каждая структура имеет эти поля:
Trajectory
— n-by-7 матрица [x, y, theta, kappa, speed, acceleration, time]
, где n является количеством траектории waypoints.
Cost
— Стоимость траектории.
MaxAcceleration
— Максимальное ускорение траектории.
MaxCurvature
— Максимальное искривление траектории.
Feasible
— Четырехэлементный векторный [velocity, acceleration, curvature, collision]
указание на валидность траектории.
Значение элементов может быть также,
1 — Траектория допустима.
0 — Траектория недопустима.
-1 — Траектория не проверяется.
Типы данных: struct
TerminalStates
— Структура всех целевых состоянийСтруктура, которая содержит список целевых состояний относительно ссылочного пути. Эти параметры задают поведение выборки для генерации альтернативных сегментов траектории между запуском и каждым целевым состоянием. Структура имеет эти поля.
Longitudinal
— Длины сегмента траектории
(значение по умолчанию) | векторДлины сегмента траектории в виде вектора в метрах.
Типы данных: double
Lateral
— Массив отклонений от ссылочного пути в перпендикулярном направлении в целевом состоянии
(значение по умолчанию) | векторМассив отклонений от ссылочного пути в перпендикулярном направлении в целевом состоянии в виде вектора в метрах.
Типы данных: double
Speed
— Скорость в целевом состоянии в направлении движения
(значение по умолчанию) | положительная скалярная величинаСкорость в целевом состоянии в направлении движения в виде положительной скалярной величины в m/s.
Типы данных: double
Acceleration
— Ускорение в целевом состоянии в направлении движения
(значение по умолчанию) | положительная скалярная величинаУскорение в целевом состоянии в направлении движения в виде положительной скалярной величины в m/s2.
Типы данных: double
Time
— Массив времени окончания для выполнения сегмента траектории
(значение по умолчанию) | положительный векторМассив времени окончания для выполнения сегмента траектории в виде положительного вектора в секундах.
Типы данных: double
Типы данных: struct
Waypoints
— Waypoints ссылочного путиWaypoints ссылочного пути в виде n-by-2 матрица [x y]
пары, где n является количеством waypoints. Waypoints действуют как ссылка для планирования альтернативных траекторий, оптимизированных этим планировщиком.
Типы данных: double
NumSegments
— Количество продольных сегментов для каждой траектории
(значение по умолчанию) | положительная скалярная величинаКоличество продольных сегментов для каждой траектории. Задайте это значение как разделенную запятой пару 'NumSegments'
и положительная скалярная величина. Это свойство генерирует промежуточные продольные конечные состояния, к которым все боковые конечные состояния объединены с для генерации большего количества примитивов движения к каждому конечному состоянию.
Например, 'NumSegments',2
создает два раздела между каждым продольным конечным состоянием. Траектории сгенерированы, чтобы достигнуть промежуточных продольных состояний со всеми доступными боковыми конечными состояниями.
Типы данных: double
DeviationOffset
— Отклонение возмещено от ссылочного пути в боковом направлении
(значение по умолчанию) | скалярОтклонение возмещено от ссылочного пути в боковом направлении. Задайте это значение как разделенную запятой пару 'DeviationOffset'
и скаляр. Отрицательная величина возместила отклонение направо, и положительное значение возместило отклонение слева от ссылочного пути в боковом направлении. Установите это свойство сместить ваше решение определенного направления поворота при предотвращении препятствий в ссылочном пути.
Типы данных: double
cart2frenet | Преобразуйте Декартовы состояния в состояния Frenet |
copy | Создайте глубокую копию объекта |
frenet2cart | Преобразуйте состояния Frenet в Декартовы состояния |
plan | Запланируйте оптимальную траекторию |
show | Визуализация траекторий |
В этом примере показано, как запланировать оптимальную траекторию с помощью trajectoryOptimalFrenet
объект.
Создайте и присвойте карту блоку проверки допустимости состояния
Создайте объект блока проверки допустимости состояния для проверки столкновения.
stateValidator = validatorOccupancyMap;
Создайте карту сетки препятствия.
grid = zeros(50,100); grid(24:26,48:53) = 1;
Создайте binaryOccupancyMap
с картой сетки.
map = binaryOccupancyMap(grid);
Присвойте карту и границы состояния к блоку проверки допустимости состояния.
stateValidator.Map = map; stateValidator.StateSpace.StateBounds(1:2,:) = [map.XWorldLimits; map.YWorldLimits];
Запланируйте и визуализируйте траекторию
Создайте ссылочный путь для планировщика, чтобы следовать.
refPath = [0,25;100,25];
Инициализируйте объект планировщика ссылочным путем и блок проверки допустимости состояния.
planner = trajectoryOptimalFrenet(refPath,stateValidator);
Присвойте продольное конечное состояние, боковое отклонение и максимальные ускоряющие значения.
planner.TerminalStates.Longitudinal = 100; planner.TerminalStates.Lateral = -10:5:10; planner.FeasibilityParameters.MaxAcceleration = 10;
Задайте значение смещения отклонения близко к левому боковому конечному состоянию, чтобы приоритизировать оставленный изменения маршрута.
planner.DeviationOffset = 5;
Планирование траектории
Начальное декартово состояние транспортного средства.
initCartState = [0 25 pi/9 0 0 0];
Преобразуйте декартово состояние транспортного средства к состоянию Frenet.
initFrenetState = cart2frenet(planner,initCartState);
Запланируйте траекторию от начального состояния Frenet.
plan(planner,initFrenetState);
Визуализация траектории
Визуализируйте карту и траектории.
show(map) hold on show(planner,'Trajectory','all')
В этом примере показано, как разделить продольные конечные состояния в оптимальном планировании траектории с помощью trajectoryOptimalFrenet
объект.
Создайте и присвойте карту блоку проверки допустимости состояния
Создайте объект блока проверки допустимости состояния для проверки столкновения.
stateValidator = validatorOccupancyMap;
Создайте карту сетки препятствия.
grid = zeros(50,100); grid(25:27,28:33) = 1; grid(16:18,37:42) = 1; grid(29:31,72:77) = 1;
Создайте binaryOccupancyMap
с картой сетки.
map = binaryOccupancyMap(grid);
Присвойте карту и границы состояния к блоку проверки допустимости состояния.
stateValidator.Map = map; stateValidator.StateSpace.StateBounds(1:2,:) = [map.XWorldLimits; map.YWorldLimits];
Запланируйте и визуализируйте траекторию
Создайте ссылочный путь для планировщика, чтобы следовать.
refPath = [0,25;30,30;75,20;100,25];
Инициализируйте объект планировщика ссылочным путем и блок проверки допустимости состояния.
planner = trajectoryOptimalFrenet(refPath,stateValidator);
Присвойте продольное конечное состояние, боковое отклонение и максимальные ускоряющие значения.
planner.TerminalStates.Longitudinal = 100; planner.TerminalStates.Lateral = -5:5:5; planner.FeasibilityParameters.MaxAcceleration = 10;
Присвойте номер разделов для продольного конечного состояния.
planner.NumSegments = 3;
Планирование траектории
Начальное состояние Frenet транспортного средства.
initFrenetState = zeros(1,6);
Запланируйте траекторию от начального состояния Frenet.
plan(planner,initFrenetState);
Визуализация траектории
Визуализируйте карту и траектории.
show(map) hold on show(planner,'Trajectory','all') hold on
Сгенерируйте контуры маршрута
Вычислите конец ссылочного пути, как Frenet утверждает.
refPathEnd = cart2frenet(planner,[planner.Waypoints(end,:) 0 0 0 0]);
Вычислите смещения маршрута с обеих сторон боковых конечных состояний с половиной значения ширины маршрута.
laneOffsets = unique([planner.TerminalStates.Lateral+2.5 planner.TerminalStates.Lateral-2.5]);
Вычислите положения маршрутов в Декартовом состоянии.
numLaneOffsets = numel(laneOffsets); xRefPathEnd = ceil(refPathEnd(1)); laneXY = zeros((numLaneOffsets*xRefPathEnd)+numLaneOffsets,2); xIndex = 0; for laneID = 1:numLaneOffsets for x = 1:xRefPathEnd laneCart = frenet2cart(planner,[x 0 0 laneOffsets(laneID) 0 0]); xIndex = xIndex + 1; laneXY(xIndex,:) = laneCart(1:2); end xIndex = xIndex + 1; laneXY(xIndex,:) = NaN(1,2); end
Постройте контуры маршрута.
plot(laneXY(:,1),laneXY(:,2),'LineWidth',0.5,'Color',[0.5 0.5 0.5],'DisplayName','Lane Boundaries','LineStyle','--')
Самопересечения в ссылочном пути могут привести к неожиданному поведению.
Планировщик не поддерживает противоположное управление.
Начальная ориентация для планирования должна быть в -pi/2
и pi/2
к ссылочному пути.
Ограничьте количество TerminalStates для приложений реального времени, поскольку вычислительная сложность растет с ним.
[1] Werling, Мориц, Юлиус Циглер, Серен Каммель и Себастиан Трун. "Оптимальная Генерация Траектории для Сценариев Динэмик-Стрит в Системе координат Frenet". 2 010 Международных конференций IEEE по вопросам Робототехники и Автоматизации. 2010, стр 987–993.
validatorOccupancyMap
| nav.StateValidator
| plannerHybridAStar
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.