Планируйте оптимальную траекторию
[
вычисляет допустимую траекторию, 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')
Этот пример показывает, как разбить продольные конечные состояния в оптимальном планировании траектории с помощью 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','--')
planner
- Оптимальный планировщик траектории в пространстве ФренеtrajectoryOptimalFrenet
объектОптимальный планировщик траектории в пространстве Френе, заданный как trajectoryOptimalFrenet
объект.
start
- Начальное состояние ФренеНачальное состояние Френе, заданное как вектор 1 на 6 [s, ds/dt, d2s/dt2, l, dl/ds, d2l/ds2]
.
s задает длину дуги от первой точки в ссылку пути в метрах.
ds/dt задает первую производную длины дуги.
d2s/dt2 задает вторую производную длины дуги.
l задает нормальное расстояние от ближайшей точки ссылки пути в метрах.
dl/ds задает первую производную от нормального расстояния.
d2l/ds2 задает вторую производную от нормального расстояния.
traj
- Допустимая траектория с минимальной стоимостьюДопустимая траектория с минимальной стоимостью, возвращенная как n-на-7 матрица [x, y, theta, kappa, speed, acceleration, time]
, где n - количество траекторных точек пути.
x и y указать положение в метрах.
theta задает угол ориентации в радианах.
kappa задает кривизну в m-1
.
speed определяет скорость в m/s
.
acceleration задает ускорение в м/с2
.
time задает время в s
.
index
- Индекс допустимой траектории с минимальной стоимостьюИндекс допустимой траектории с минимальной стоимостью, возвращенный как положительный целочисленный скаляр.
cost
- Минимальная стоимость допустимой траекторииНаименьшая стоимость допустимой траектории, возвращаемая как положительная скалярная величина.
flag
- Выходной флаг, указывающий на состояние решения0
| 1
Выходной флаг, указывающий на состояние решения, возвращается как 0
или 1
.
0
- Найдена оптимальная траектория.
1
- Никакой допустимой траектории не существует.
Когда допустимая траектория не существует, планировщик возвращает пустую траекторию.
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.