Поиск оптимальной траектории вдоль траектории привязки
trajectoryOptimalFrenet объект является планировщиком пути, который выполняет выборку и оценку локальных траекторий на основе ссылочного пути. Плановик генерирует набор состояний терминала на основе пути ссылки и других параметров в объекте. Затем планировщик соединяет состояние с каждым состоянием терминала с помощью полиномов 4-го или 5-го порядка. Для выбора оптимального пути отбираемые траектории оцениваются на предмет кинематической осуществимости, столкновения и стоимости.
trajectoryOptimalFrenet( создает refPath,validator)trajectoryOptimalFrenet объект со ссылочным путем, refPath, в виде массива n-на-2 [x
y] ППМ и средство проверки состояния, validator, указано как validatorOccupancyMap объект.
задает дополнительные свойства, используя одну или несколько пар имя-значение в любом порядке.planner = trajectoryOptimalFrenet(___,Name,Value)
refPath - Опорный путьОпорный путь, заданный как матрица n-by-2 [x
y] пар, где n - количество ППМ.
Пример: [100 100; 400 400]
Типы данных: double
validator - Объект проверки состоянияvalidatorOccupancyMap объектОбъект проверки состояния, указанный как validatorOccupancyMap объект.
Примечание
Для 'Weights' и 'FeasibilityParameters' свойства, нельзя указать все структуры одновременно. Вместо этого задайте их поля по отдельности как пары «имя-значение». Например, trajectoryOptimalFrenet(refPath,validator,'Deviation',0) устанавливает 'Deviation' поле структуры 'Weights'.
Weights - Веса для всех затрат на траекториюВеса для всех затрат на траекторию, указанные как структура, содержащая скаляры для умножителей затрат соответствующих атрибутов траектории. Общая стоимость траектории представляет собой сумму всех атрибутов, умноженных на их веса. Структура имеет эти поля.
Time - Вес для временных затрат0 (по умолчанию) | положительный скалярФункция затрат умножает вес на общее время, необходимое для достижения состояния терминала. Укажите это значение в качестве пары, разделенной запятыми 'Time' и положительный скаляр в секундах.
Типы данных: double
ArcLength - Вес для стоимости длины дуги0 (по умолчанию) | положительный скалярФункция затрат умножает вес на общую длину сгенерированных траекторий. Укажите это значение в качестве пары, разделенной запятыми 'ArcLength' и положительный скаляр в метрах.
Типы данных: double
LateralSmoothness - Вес для стоимости бокового рывка0 (по умолчанию) | положительный скалярФункция стоимости умножает вес на интеграл бокового рывка в квадрате. Это значение определяет агрессивность траектории в поперечном направлении (перпендикулярно траектории привязки). Укажите это значение в качестве пары, разделенной запятыми 'LateralSmoothness' и положительный скаляр. Чтобы наказать боковой рывок в запланированной траектории увеличить это значение стоимости.
Типы данных: double
LongitudinalSmoothness - Вес для стоимости продольного рывка0 (по умолчанию) | положительный скалярФункция стоимости умножает вес на интеграл продольного рывка в квадрате. Это значение определяет агрессивность траекторий в продольном направлении (направлении траектории привязки). Укажите это значение в качестве пары, разделенной запятыми 'LongitudinalSmoothness' и положительный скаляр. Чтобы наказать большие изменения в прямом и обратном ускорении увеличить эту стоимость.
Типы данных: double
Deviation - Вес для отклонения от эталонного пути1 (по умолчанию) | положительный скалярФункция затрат умножает вес на перпендикулярное расстояние от опорной траектории в конце траектории в метрах. Укажите это значение в качестве пары, разделенной запятыми 'Deviation' и положительный скаляр в метрах.
Типы данных: double
Типы данных: struct
FeasibilityParameters - Структура, содержащая параметры выполнимостиПараметры выполнимости, заданные как структура, содержащая скалярные значения для проверки достоверности траектории. Структура имеет эти поля.
MaxCurvature - Максимальная кривизна, которую может выполнять транспортное средство0.1 (по умолчанию) | положительный вещественный скалярМаксимальная кривизна, которую может выполнять транспортное средство. Укажите это значение в качестве пары, разделенной запятыми 'MaxCurvature' и положительный действительный скаляр в m-1. Это значение определяет кинематическую осуществимость траектории.
Типы данных: double
MaxAcceleration - максимальное ускорение в направлении движения транспортного средства;2.5 (по умолчанию) | положительный вещественный скалярМаксимальное ускорение в направлении движения транспортного средства. Укажите это значение в качестве пары, разделенной запятыми 'MaxAcceleration' и положительный действительный скаляр в m/s2. Для снижения предела ускорения транспортного средства в прямом или обратном направлении уменьшите это значение.
Типы данных: double
Типы данных: struct
TimeResolution - Интервал дискретизации траектории0.1 (по умолчанию) | положительный вещественный скалярВременной интервал между дискретизированными состояниями траектории. Укажите это значение в качестве пары, разделенной запятыми 'TimeResolution' и положительный действительный скаляр в секундах. Эти дискретизированные состояния определяют достоверность состояния и функцию затрат.
Типы данных: double
CostFunction - Определяемая пользователем функция затратОпределяемая пользователем функция затрат, указанная как дескриптор функции. Функция должна принимать матрицу состояний n-by-7, TRAJSTATES, для каждой траектории и вернуть значение стоимости в виде скаляра. plan функция возвращает путь с наименьшей стоимостью.
Например, leftLaneChangeCost = @(states)((states(end,2) < refPath(end,2))*10) создает дескриптор функции затрат для определения приоритетности изменений в левой полосе.
Типы данных: function handle
TrajectoryList - Перечень всех возможных траекторийЭто свойство доступно только для чтения.
'TrajectoryList' , возвращаемое как структурный массив всех возможных траекторий и их соответствующих параметров. Каждая структура имеет следующие поля:
Trajectory - Матрица n-на-7 [x, y, theta, kappa, speed, acceleration, time], где n - количество ППМ траектории.
Cost - Стоимость траектории.
MaxAcceleration - Максимальное ускорение траектории.
MaxCurvature - Максимальная кривизна траектории.
Feasible - Четырехэлементный вектор [velocity, acceleration, curvature, collision] индикация достоверности траектории.
Значение элементов может быть следующим:
1 - Траектория действительна.
0 - недопустимая траектория.
-1 - Траектория не проверяется.
Типы данных: struct
TerminalStates - Структура всех состояний целиСтруктура, содержащая список состояний цели относительно пути привязки. Эти параметры определяют поведение выборки для генерации альтернативных сегментов траектории между началом и каждым состоянием цели. Структура имеет эти поля.
Longitudinal - Длины сегмента траектории30:15:90 (по умолчанию) | векторДлины сегмента траектории, заданные как вектор в метрах.
Типы данных: double
Lateral - Массив отклонений от эталонного пути в перпендикулярном направлении при состоянии цели-2:1:2 (по умолчанию) | векторМассив отклонений от эталонного пути в перпендикулярном направлении при состоянии цели, заданный как вектор в метрах.
Типы данных: double
Speed - Скорость в целевом состоянии в направлении движения10 (по умолчанию) | положительный скалярСкорость в целевом состоянии в направлении движения, заданная как положительный скаляр в м/с.
Типы данных: double
Acceleration - Ускорение в целевом состоянии в направлении движения0 (по умолчанию) | положительный скалярУскорение в целевом состоянии в направлении движения, заданное как положительный скаляр в m/s2.
Типы данных: double
Time - Массив конечных времен для выполнения сегмента траектории7 (по умолчанию) | положительный векторМассив конечных времен для выполнения сегмента траектории, заданный как положительный вектор в секундах.
Типы данных: double
Типы данных: struct
Waypoints - Ориентиры траекторииППМ опорного пути, заданная в виде матрицы n-by-2 [x
y] пар, где n - количество ППМ. ППМ служат ориентиром для планирования альтернативных траекторий, оптимизированных этим плановиком.
Типы данных: double
NumSegments - количество продольных сегментов для каждой траектории;1 (по умолчанию) | положительный скалярКоличество продольных сегментов для каждой траектории. Укажите это значение в качестве пары, разделенной запятыми 'NumSegments' и положительный скаляр. Это свойство генерирует промежуточные продольные терминальные состояния, в которых все боковые терминальные состояния объединяются с для генерирования большего количества примитивов движения для каждого терминального состояния.
Например, 'NumSegments',2 создает две перегородки между каждым продольным терминальным состоянием. Траектории генерируются для достижения промежуточных продольных состояний со всеми доступными боковыми концевыми состояниями.
Типы данных: double
DeviationOffset - Смещение отклонения от контрольной траектории в поперечном направлении0 (по умолчанию) | скалярСмещение отклонения от опорной траектории в поперечном направлении. Укажите это значение в качестве пары, разделенной запятыми 'DeviationOffset' и скаляр. Отрицательное значение смещает отклонение вправо, а положительное значение смещает отклонение влево от траектории привязки в поперечном направлении. Установите это свойство для смещения решения к определенному направлению поворота, если избежать препятствий на траектории привязки.
Типы данных: double
cart2frenet | Преобразовать декартовы состояния в состояния Френета |
copy | Создание глубокой копии объекта |
frenet2cart | Преобразовать состояния Френета в декартовы состояния |
plan | Планирование оптимальной траектории |
show | Визуализация траекторий |
В этом примере показано, как планировать оптимальную траекторию с помощью trajectoryOptimalFrenet объект.
Создание и назначение карты средству проверки состояния
Создание объекта проверки состояния для проверки конфликтов.
stateValidator = validatorOccupancyMap;
Создайте карту сетки препятствий.
grid = zeros(50,100); grid(24:26,48:53) = 1;
Создать binaryOccupancyMap с картой сетки.
map = binaryOccupancyMap(grid);
Назначьте карту средству проверки состояния.
stateValidator.Map = map;
Планирование и визуализация траектории
Создайте путь ссылки для плановика.
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];
Преобразовать декартово состояние транспортного средства в состояние Френета.
initFrenetState = cart2frenet(planner,initCartState);
Запланируйте траекторию из начального состояния Френета.
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;
Планирование и визуализация траектории
Создайте путь ссылки для плановика.
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;
Планирование траектории
Начальное состояние Френета транспортного средства.
initFrenetState = zeros(1,6);
Запланируйте траекторию из начального состояния Френета.
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] Верлинг, Мориц, Юлиус Циглер, Сёрен Каммель и Себастьян Трюн. «Оптимальное поколение траектории для сценариев Динэмик-Стрит в структуре Frenet». Международная конференция IEEE 2010 года по вопросам робототехники и автоматизации. 2010, стр 987–993.
nav.StateValidator | plannerHybridAStar | validatorOccupancyMap
Имеется измененная версия этого примера. Открыть этот пример с помощью изменений?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.