exponenta event banner

trajectoryOptimalFrenet

Поиск оптимальной траектории вдоль траектории привязки

Описание

trajectoryOptimalFrenet объект является планировщиком пути, который выполняет выборку и оценку локальных траекторий на основе ссылочного пути. Плановик генерирует набор состояний терминала на основе пути ссылки и других параметров в объекте. Затем планировщик соединяет состояние с каждым состоянием терминала с помощью полиномов 4-го или 5-го порядка. Для выбора оптимального пути отбираемые траектории оцениваются на предмет кинематической осуществимости, столкновения и стоимости.

Создание

Описание

trajectoryOptimalFrenet(refPath,validator) создает trajectoryOptimalFrenet объект со ссылочным путем, refPath, в виде массива n-на-2 [x y] ППМ и средство проверки состояния, validator, указано как validatorOccupancyMap объект.

пример

planner = trajectoryOptimalFrenet(___,Name,Value) задает дополнительные свойства, используя одну или несколько пар имя-значение в любом порядке.

Входные аргументы

развернуть все

Опорный путь, заданный как матрица n-by-2 [x y] пар, где n - количество ППМ.

Пример: [100 100; 400 400]

Типы данных: double

Объект проверки состояния, указанный как validatorOccupancyMap объект.

Свойства

развернуть все

Примечание

Для 'Weights' и 'FeasibilityParameters' свойства, нельзя указать все структуры одновременно. Вместо этого задайте их поля по отдельности как пары «имя-значение». Например, trajectoryOptimalFrenet(refPath,validator,'Deviation',0) устанавливает 'Deviation' поле структуры 'Weights'.

Веса для всех затрат на траекторию, указанные как структура, содержащая скаляры для умножителей затрат соответствующих атрибутов траектории. Общая стоимость траектории представляет собой сумму всех атрибутов, умноженных на их веса. Структура имеет эти поля.

Функция затрат умножает вес на общее время, необходимое для достижения состояния терминала. Укажите это значение в качестве пары, разделенной запятыми 'Time' и положительный скаляр в секундах.

Типы данных: double

Функция затрат умножает вес на общую длину сгенерированных траекторий. Укажите это значение в качестве пары, разделенной запятыми 'ArcLength' и положительный скаляр в метрах.

Типы данных: double

Функция стоимости умножает вес на интеграл бокового рывка в квадрате. Это значение определяет агрессивность траектории в поперечном направлении (перпендикулярно траектории привязки). Укажите это значение в качестве пары, разделенной запятыми 'LateralSmoothness' и положительный скаляр. Чтобы наказать боковой рывок в запланированной траектории увеличить это значение стоимости.

Типы данных: double

Функция стоимости умножает вес на интеграл продольного рывка в квадрате. Это значение определяет агрессивность траекторий в продольном направлении (направлении траектории привязки). Укажите это значение в качестве пары, разделенной запятыми 'LongitudinalSmoothness' и положительный скаляр. Чтобы наказать большие изменения в прямом и обратном ускорении увеличить эту стоимость.

Типы данных: double

Функция затрат умножает вес на перпендикулярное расстояние от опорной траектории в конце траектории в метрах. Укажите это значение в качестве пары, разделенной запятыми 'Deviation' и положительный скаляр в метрах.

Типы данных: double

Типы данных: struct

Параметры выполнимости, заданные как структура, содержащая скалярные значения для проверки достоверности траектории. Структура имеет эти поля.

Максимальная кривизна, которую может выполнять транспортное средство. Укажите это значение в качестве пары, разделенной запятыми 'MaxCurvature' и положительный действительный скаляр в m-1. Это значение определяет кинематическую осуществимость траектории.

Типы данных: double

Максимальное ускорение в направлении движения транспортного средства. Укажите это значение в качестве пары, разделенной запятыми 'MaxAcceleration' и положительный действительный скаляр в m/s2. Для снижения предела ускорения транспортного средства в прямом или обратном направлении уменьшите это значение.

Типы данных: double

Типы данных: struct

Временной интервал между дискретизированными состояниями траектории. Укажите это значение в качестве пары, разделенной запятыми 'TimeResolution' и положительный действительный скаляр в секундах. Эти дискретизированные состояния определяют достоверность состояния и функцию затрат.

Типы данных: double

Определяемая пользователем функция затрат, указанная как дескриптор функции. Функция должна принимать матрицу состояний n-by-7, TRAJSTATES, для каждой траектории и вернуть значение стоимости в виде скаляра. plan функция возвращает путь с наименьшей стоимостью.

Например, leftLaneChangeCost = @(states)((states(end,2) < refPath(end,2))*10) создает дескриптор функции затрат для определения приоритетности изменений в левой полосе.

Типы данных: function handle

Это свойство доступно только для чтения.

'TrajectoryList' , возвращаемое как структурный массив всех возможных траекторий и их соответствующих параметров. Каждая структура имеет следующие поля:

  • Trajectory - Матрица n-на-7 [x, y, theta, kappa, speed, acceleration, time], где n - количество ППМ траектории.

  • Cost - Стоимость траектории.

  • MaxAcceleration - Максимальное ускорение траектории.

  • MaxCurvature - Максимальная кривизна траектории.

  • Feasible - Четырехэлементный вектор [velocity, acceleration, curvature, collision] индикация достоверности траектории.

    Значение элементов может быть следующим:

    • 1 - Траектория действительна.

    • 0 - недопустимая траектория.

    • -1 - Траектория не проверяется.

Типы данных: struct

Структура, содержащая список состояний цели относительно пути привязки. Эти параметры определяют поведение выборки для генерации альтернативных сегментов траектории между началом и каждым состоянием цели. Структура имеет эти поля.

Длины сегмента траектории, заданные как вектор в метрах.

Типы данных: double

Массив отклонений от эталонного пути в перпендикулярном направлении при состоянии цели, заданный как вектор в метрах.

Типы данных: double

Скорость в целевом состоянии в направлении движения, заданная как положительный скаляр в м/с.

Типы данных: double

Ускорение в целевом состоянии в направлении движения, заданное как положительный скаляр в m/s2.

Типы данных: double

Массив конечных времен для выполнения сегмента траектории, заданный как положительный вектор в секундах.

Типы данных: double

Типы данных: struct

ППМ опорного пути, заданная в виде матрицы n-by-2 [x y] пар, где n - количество ППМ. ППМ служат ориентиром для планирования альтернативных траекторий, оптимизированных этим плановиком.

Типы данных: double

Количество продольных сегментов для каждой траектории. Укажите это значение в качестве пары, разделенной запятыми 'NumSegments' и положительный скаляр. Это свойство генерирует промежуточные продольные терминальные состояния, в которых все боковые терминальные состояния объединяются с для генерирования большего количества примитивов движения для каждого терминального состояния.

Например, 'NumSegments',2 создает две перегородки между каждым продольным терминальным состоянием. Траектории генерируются для достижения промежуточных продольных состояний со всеми доступными боковыми концевыми состояниями.

Типы данных: double

Смещение отклонения от опорной траектории в поперечном направлении. Укажите это значение в качестве пары, разделенной запятыми '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')

Figure contains an axes. The axes with title Binary Occupancy Grid contains 5 objects of type image, line, patch. These objects represent Waypoints, Reference Path, Optimal Trajectory.

В этом примере показано, как разделить продольные терминальные состояния при оптимальном планировании траектории с помощью 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','--')

Figure contains an axes. The axes with title Binary Occupancy Grid contains 6 objects of type image, line, patch. These objects represent Waypoints, Reference Path, Optimal Trajectory, Lane Boundaries.

Ограничения

  • Самопересечение в траектории привязки может привести к неожиданному поведению.

  • Плановик не поддерживает движение задним ходом.

  • Первоначальная ориентация для планирования должна быть в пределах -pi/2 и pi/2 к пути ссылки.

  • Ограничьте число TerminalStates для приложений реального времени, так как вместе с этим растет вычислительная сложность.

Ссылки

[1] Верлинг, Мориц, Юлиус Циглер, Сёрен Каммель и Себастьян Трюн. «Оптимальное поколение траектории для сценариев Динэмик-Стрит в структуре Frenet». Международная конференция IEEE 2010 года по вопросам робототехники и автоматизации. 2010, стр 987–993.

Расширенные возможности

Создание кода C/C + +
Создайте код C и C++ с помощью MATLAB ® Coder™

.
Представлен в R2019b