plan

Планируйте оптимальную траекторию

Описание

пример

[traj,index,cost,flag] = plan(planner,start) вычисляет допустимую траекторию, traj, из списка потенциальных траекторий, сгенерированных из trajectoryOptimalFrenet объект, planner. start задается как вектор с шестью элементами [s, ds/dt, d2s/dt2, l, dl/ds, d2l/ds2], где s - длина дуги от первой точки в ссылку пути, а l - нормальное расстояние от ближайшей точки в s на ссылку пути.

Выходная траектория, traj, также имеет связанную cost и index для свойства TrajectoryList планировщика. flag - числовой выходной флаг, указывающий состояние решения.

Для улучшения результатов выхода планирования измените параметры на planner объект.

Примеры

свернуть все

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

Сгенерируйте контуры маршрута

Вычислите конец ссылки пути как состояние Френе.

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.

Входные параметры

свернуть все

Оптимальный планировщик траектории в пространстве Френе, заданный как trajectoryOptimalFrenet объект.

Начальное состояние Френе, заданное как вектор 1 на 6 [s, ds/dt, d2s/dt2, l, dl/ds, d2l/ds2].

  • s задает длину дуги от первой точки в ссылку пути в метрах.

  • ds/dt задает первую производную длины дуги.

  • d2s/dt2 задает вторую производную длины дуги.

  • l задает нормальное расстояние от ближайшей точки ссылки пути в метрах.

  • dl/ds задает первую производную от нормального расстояния.

  • d2l/ds2 задает вторую производную от нормального расстояния.

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

свернуть все

Допустимая траектория с минимальной стоимостью, возвращенная как n-на-7 матрица [x, y, theta, kappa, speed, acceleration, time], где n - количество траекторных точек пути.

  • x и y указать положение в метрах.

  • theta задает угол ориентации в радианах.

  • kappa задает кривизну в m-1.

  • speed определяет скорость в m/s.

  • acceleration задает ускорение в м/с2.

  • time задает время в s.

Индекс допустимой траектории с минимальной стоимостью, возвращенный как положительный целочисленный скаляр.

Наименьшая стоимость допустимой траектории, возвращаемая как положительная скалярная величина.

Выходной флаг, указывающий на состояние решения, возвращается как 0 или 1.

  • 0 - Найдена оптимальная траектория.

  • 1 - Никакой допустимой траектории не существует.

Когда допустимая траектория не существует, планировщик возвращает пустую траекторию.

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

Генерация кода C/C + +
Сгенерируйте код C и C++ с помощью Coder™ MATLAB ®

.

См. также

|

Введенный в R2019b