Нахождение оптимальной траектории вдоль опорного пути
The trajectoryOptimalFrenet
объект является планировщиком пути, который выборки и оценивают локальные траектории на основе ссылки пути. Планировщик генерирует набор конечных состояний на основе пути ссылки и других параметров объекта. Затем планировщик соединяет состояние с каждым конечным состоянием, используя 4th или 5th Порядок полиномов. Чтобы выбрать оптимальный путь, выбранные траектории оцениваются на кинематическую осуществимость, столкновение и стоимость.
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
(по умолчанию) | положительная скалярная величинаФункция cost умножает вес на общее время, необходимое для достижения конечного состояния. Задайте это значение как разделенную разделенными запятой парами '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'
и положительный действительный скаляр в м/с2. Чтобы снизить предел ускорения транспортного средства в прямом или обратном направлении, уменьшите это значение.
Типы данных: double
Типы данных: struct
TimeResolution
- Интервал дискретизации траектории0.1
(по умолчанию) | положительный действительный скалярВременной интервал между дискретизированными состояниями траектории. Задайте это значение как разделенную разделенными запятой парами 'TimeResolution'
и положительный действительный скаляр в секундах. Эти дискретизированные состояния определяют валидность состояния и функцию затрат.
Типы данных: double
CostFunction
- Определяемая пользователем функция затратОпределяемая пользователем функция затрат, заданная как указатель на функцию. Функция должна принять матрицу n -на-7 состояний, TRAJSTATES
, для каждой траектории и возвращает значение стоимости в виде скаляра. plan
функция возвращает путь с самой низкой стоимостью.
Для примера, leftLaneChangeCost = @(states)((states(end,2) < refPath(end,2))*10)
создает указатель на функцию затрат для определения приоритетов изменений в левой полосе.
Типы данных: function handle
TrajectoryList
- Список всех возможных траекторийЭто свойство доступно только для чтения.
The 'TrajectoryList'
свойство, возвращенное как массив структур из всех траекторий кандидатов и их соответствующих параметров. Каждая структура имеет следующие поля:
Trajectory
- матрица n -by-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
(по умолчанию) | положительная скалярная величинаУскорение в состоянии цели в направлении движения, заданное как положительная скалярная величина в м/с2.
Типы данных: double
Time
- Массив конечных времен для выполнения сегмента траектории7
(по умолчанию) | положительный векторМассив конечных значений времени для выполнения сегмента траектории, заданный как положительный вектор в секундах.
Типы данных: double
Типы данных: struct
Waypoints
- Путевые точки опорного путиТочки пути опорного пути, заданные как матрица n -by-2 [x y]
пар, где n количество путевых точек. Waypoints действует как ссылка для планирования альтернативных траекторий, оптимизированных этим планировщиком.
Типы данных: 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
Сгенерируйте контуры маршрута
Вычислите конец ссылки пути как состояние Френе.
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] Верлинг, Мориц, Юлиус Циглер, Сёрен Каммель и Себастьян Трун. «Оптимальная генерация траектории для динамических уличных сценариев на французской Системе координат». Международная конференция IEEE по робототехнике и автоматизации 2010. 2010, стр 987–993.
nav.StateValidator
| plannerHybridAStar
| validatorOccupancyMap
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.