exponenta event banner

траектория

Создание траектории актера или транспортного средства в сценарии вождения

Описание

trajectory(ac,waypoints) создает траекторию для актера или транспортного средства, ac, из набора ППМ.

Примечание

Функция траектории генерирует траектории, которые имеют разрывы в ускорении между ППМ, что приводит к большим объемам рывка. Чтобы создать гладкую траекторию, ограниченную рывком, используйте smoothTrajectory вместо этого функция.

пример

trajectory(ac,waypoints,speed) также определяет скорость, с которой актер или транспортное средство движется по траектории либо вперед, либо назад.

пример

trajectory(ac,waypoints,speed,waittime) указывает время ожидания актера или транспортного средства в дополнение к входным аргументам в предыдущем синтаксисе. Этот синтаксис используется для создания сценариев останова движения путем приостановки актера или участников движения транспортного средства на определенных ППМ.

пример

trajectory(___,'Yaw',yaw) задает угол ориентации рыскания актера или транспортного средства в каждой точке ППМ в дополнение к любой из комбинаций входных аргументов из предшествующих синтаксисов.

Примеры

свернуть все

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

scenario = drivingScenario('SampleTime',0.05);
roadcenters = [5 0; 30 10; 35 25];
lspec = lanespec(2);
road(scenario,roadcenters,'Lanes',lspec);

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

v = vehicle(scenario,'ClassID',1);
waypoints = [6 2; 18 4; 25 7; 28 10; 31 15; 33 22];
speeds = [30 10 5 5 10 30];
trajectory(v,waypoints,speeds)

Постройте график сценария и выполните моделирование. Наблюдайте, как транспортное средство замедляется при движении по кривой.

plot(scenario,'Waypoints','on','RoadCenters','on')
while advance(scenario)
    pause(0.1)
end

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

scenario = drivingScenario('StopTime',2.75);
roadCenters = [50 1 0; 2 0.9 0];
laneSpecification = lanespec(2,'Width',4);
road(scenario,roadCenters,'Lanes',laneSpecification);
roadCenters = [27 24 0; 27 -21 0];
road(scenario,roadCenters,'Lanes',laneSpecification);

Добавьте ego-транспортное средство к сценарию. Укажите ППМ и значения скорости для транспортного средства в каждом ППМ. Установите время ожидания транспортного средства на втором ППМ. Создайте траекторию, по которой эго-транспортное средство проходит через указанные ППМ с заданной скоростью.

egoVehicle = vehicle(scenario,'ClassID',1,'Position',[5 -1 0]);
waypoints = [5 -1 0; 16 -1 0; 40 -1 0];
speed = [30; 0; 30];
waittime = [0; 0.3; 0];
trajectory(egoVehicle,waypoints,speed,waittime);

Добавьте автомобиль в сценарий. Укажите ППМ и значения скорости для автомобиля в каждом ППМ. Установите время ожидания автомобиля на втором ППМ. Создайте траекторию, по которой автомобиль проходит через указанные ППМ с заданной скоростью.

car = vehicle(scenario,'ClassID',1,'Position',[48 4 0],'PlotColor',[0.494 0.184 0.556], 'Name','Car');
waypoints = [47 3 0; 38 3 0; 10 3 0];
speed = [30; 0; 30];
waittime = [0; 0.3; 0];
trajectory(car,waypoints,speed,waittime);

Добавьте скорую помощь к сценарию. Создайте траекторию, по которой машина скорой помощи проходит через указанные ППМ с постоянной скоростью.

ambulance = vehicle(scenario,'ClassID',6,'Position',[25 22 0],'PlotColor',[0.466 0.674 0.188],'Name','Ambulance');
waypoints = [25 22 0; 25 13 0; 25 6 0; 26 2 0; 33 -1 0; 45 -1 0];
speed = 25;
trajectory(ambulance,waypoints,speed);

Создайте пользовательское окно фигуры для печати сценария.

fig = figure;
set(fig,'Position',[0,0,800,600]);
movegui(fig,'center');
hViewPnl = uipanel(fig,'Position',[0 0 1 1],'Title','Stop-and-Go Scenario');
hPlt = axes(hViewPnl);

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

plot(scenario,'Waypoints','on','RoadCenters','on','Parent',hPlt)
while advance(scenario)
    pause(0.1)
end

Figure contains an axes and an object of type uipanel. The axes contains 13 objects of type patch, line.

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

Создайте сценарий управления. Добавьте сегменты дорог для определения парковки. Первый сегмент дороги определяет парковочные места. Второй сегмент дороги определяет полосу движения и накладывается на первый сегмент дороги.

scenario = drivingScenario;

roadCentersParking = [6 0; 24 0];
lmParking = [laneMarking('Unmarked') ...
            repmat(laneMarking('Solid'),1,5) ...
            laneMarking('Unmarked')];
lspecParking = lanespec(6,'Width',3,'Marking',lmParking);
road(scenario,roadCentersParking,'Lanes',lspecParking);

roadCentersDriving = [12 0; 18 0];
lmDriving = [laneMarking('Unmarked') laneMarking('Unmarked')];
lspecDriving = lanespec(1,'Width',18,'Marking',lmDriving);
road(scenario,roadCentersDriving,'Lanes',lspecDriving);

Добавить транспортное средство к сценарию вождения.

car = vehicle(scenario,'ClassID',1,'Position',[15 -6 0],'Yaw',90);

Определите траекторию транспортного средства. Транспортное средство движется вперед, останавливается, а затем движется задним ходом, пока не вернется в место стоянки. Когда транспортное средство входит в место стоянки, оно имеет угол ориентации рыскания, который составляет 90 градусов против часовой стрелки от места его начала.

waypoints = [15 -6; 15 5; 12 -1.5; 7.3 -1.5];
speed = [4.5; 0; -2; 0];
trajectory(car,waypoints,speed,'Yaw',[90 90 180 180]);

Постройте график сценария движения и отобразите ППМ траектории.

plot(scenario,'Waypoints','on')
while advance(scenario)
    pause(0.001)
end

Определите траекторию пешехода, совершающего резкий правый поворот на перекрестке.

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

scenario = drivingScenario;
roadCenters = [0 10; 0 -10];
road(scenario,roadCenters);
road(scenario,flip(roadCenters,2));

Добавьте в сценарий пешеходного актера.

pedestrian = actor(scenario, ...
    'ClassID',4, ...
    'Length',0.24, ...
    'Width',0.45, ...
    'Height',1.7, ...
    'Position',[-9 0 0], ...
    'RCSPattern',[-8 -8; -8 -8], ...
    'Mesh', driving.scenario.pedestrianMesh, ...
    'Name','Pedestrian');

Определите траекторию движения пешехода. Пешеход подходит к перекрестку, ненадолго делает паузу, а затем делает резкий правый поворот на перекрестке. Чтобы определить резкий поворот вправо, укажите две ППМ на пересечении, которые находятся близко друг к другу. Для этих ППМ задайте угол ориентации рыскания второй ППМ под углом 90 градусов от первой ППМ.

waypoints = [-9 0; -0.25 0; 0 -0.25; 0 -9];
speed = [1.5; 0; 0.5; 1.5];
yaw =  [0; 0; -90; -90];
waittime = [0; 0.2; 0; 0];
trajectory(pedestrian,waypoints,speed,waittime,'Yaw', yaw);

Постройте график сценария движения и отобразите ППМ пешехода.

plot(scenario,'Waypoints','on')
while advance(scenario)
    pause(0.001)
end

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

свернуть все

Актер, принадлежащий drivingScenario объект, указанный как Actor или Vehicle объект. Для создания этих объектов используйте actor и vehicle соответственно.

ППМ траектории, заданные как вещественно-значная N-by-2 или матрица N-by-3, где N - количество ППМ.

  • Если waypoints является N-by-2 матрицей, то каждая строка матрицы представляет координаты (x, y) ППМ. Координата Z каждого ППМ равна нулю.

  • Если waypoints является N-by-3 матрицей, то каждая строка матрицы представляет координаты (x, y, z) ППМ.

ППМ находятся в мировой системе координат. Единицы в метрах.

Пример: [1 0 0; 2 7 7; 3 8 8]

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

Скорость актера на каждом ППМ в waypoints, заданный как действительный скалярный или N-элементный действительный вектор. N - количество ППМ.

  • Когда speed - скаляр, скорость постоянна на протяжении всего движения актера.

  • Когда speed - вектор, значения которого определяют скорость в каждой точке ППМ. Для движения вперед задайте положительные значения скорости. Для обратного движения задайте отрицательные значения скорости. Чтобы изменить направления движения, разделите положительные и отрицательные скорости на ППМ с помощью 0 скорость.

Скорости интерполируются между ППМ. speed может быть нулевым в любом ППМ, но не может быть нулевым в двух последовательных ППМ. Единицы измерения в метрах в секунду.

Пример: [10 8 9] скорость 10 м/с, 8 м/с и 9 м/с.

Пример: [10 0 -10] определяет скорость движения вперед 10 м/с, за которой следует пауза, за которой следует скорость 10 м/с в обратном направлении.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Время паузы для актера, определяемое как вектор N-элементов неотрицательных значений. N - количество ППМ. При указании времени паузы для актера в конкретном ППМ необходимо установить соответствующее значение скорости, равное 0. Можно установить waitime кому 0 в любой ППМ, но невозможно установить waittime при двух последовательных ППМ на ненулевые значения. Единицы измерения в секундах.

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

Угол ориентации актора по оси рыскания в каждой ППМ, определяемый как N-элементный действительный вектор, где N - количество ППМ. Единицы измерения в градусах и углы положительны в направлении против часовой стрелки.

Если не указать yaw, то рыскание в каждом ППМ NaN, что означает, что рыскание не имеет ограничений.

Пример: [0 90] задает актера под углом 0 градусов в первой точке ППМ и под углом 90 градусов во второй точке ППМ.

Пример: [0 NaN] задает актера под углом 0 градусов в первом ППМ. У актера нет ограничений на рыскание на втором ППМ.

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

Алгоритмы

trajectory функция создает траекторию, по которой актер должен следовать в сценарии. Траектория состоит из траектории, по которой следует объект, и его скорости вдоль траектории. Путь задается с помощью N двумерных или трехмерных ППМ. Каждый из N-1 сегментов между ППМ определяет кривую, кривизна которой изменяется линейно с расстоянием вдоль сегмента. Функция соответствует кусочно-клотоидной кривой координатам (x, y) ППМ путем сопоставления кривизны с обеих сторон ППМ. Для незамкнутой кривой кривизна в первой и последней ППМ равна нулю. Если первая и последняя ППМ совпадают, кривизны до и после конечных точек совпадают. Z-координаты траектории интерполируются с использованием сохраняющей форму кусочно-кубической кривой.

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

Представлен в R2018a