trajectory

Создайте агента или траекторию транспортного средства в ведущем сценарии

Описание

пример

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

пример

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

пример

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

пример

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

Примеры

свернуть все

Симулируйте ведущий сценарий с одним автомобилем, перемещающимся на S-кривой. Создайте и постройте контуры маршрута.

Создайте ведущий сценарий с одной дорогой, имеющей S-кривую.

scenario = drivingScenario('StopTime',3);
roadcenters = [-35 20 0; -20 -20 0; 0 0 0; 20 20 0; 35 -20 0];

Создайте маршруты и добавьте их в дорогу.

lm = [laneMarking('Solid','Color','w'); ...
    laneMarking('Dashed','Color','y'); ...
    laneMarking('Dashed','Color','y'); ...
    laneMarking('Solid','Color','w')];
ls = lanespec(3,'Marking',lm);
road(scenario,roadcenters,'Lanes',ls);

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

car = vehicle(scenario, ...
    'ClassID',1, ...
    'Position',[-35 20 0]);
waypoints = [-35 20 0; -20 -20 0; 0 0 0; 20 20 0; 35 -20 0];
trajectory(car,waypoints);

Постройте сценарий и соответствующий график преследования.

plot(scenario)

chasePlot(car)

Запустите цикл симуляции.

  1. Инициализируйте видимый с большого расстояния график и создайте плоттер схемы, лево-маршрут и плоттеры контура правильного маршрута и дорожный граничный плоттер.

  2. Получите дорожные контуры и прямоугольные контуры.

  3. Получите контуры маршрута налево и право на транспортное средство.

  4. Усовершенствуйте симуляцию и обновите плоттеры.

bep = birdsEyePlot('XLim',[-40 40],'YLim',[-30 30]);
olPlotter = outlinePlotter(bep);
lblPlotter = laneBoundaryPlotter(bep,'Color','r','LineStyle','-');
lbrPlotter = laneBoundaryPlotter(bep,'Color','g','LineStyle','-');
rbsEdgePlotter = laneBoundaryPlotter(bep);
legend('off');
while advance(scenario)
    rbs = roadBoundaries(car);
    [position,yaw,length,width,originOffset,color] = targetOutlines(car);
    lb = laneBoundaries(car,'XDistance',0:5:30,'LocationType','Center', ...
        'AllBoundaries',false);
    plotLaneBoundary(rbsEdgePlotter,rbs)
    plotLaneBoundary(lblPlotter,{lb(1).Coordinates})
    plotLaneBoundary(lbrPlotter,{lb(2).Coordinates})
    plotOutline(olPlotter,position,yaw,length,width, ...
        'OriginOffset',originOffset,'Color',color)
end

Создайте ведущий сценарий и добавьте кривую дорогу 2D маршрута к нему.

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

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

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);

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

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);

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

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);

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

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

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

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

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]);

Постройте ведущий сценарий и отобразите waypoints траектории.

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');

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

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);

Постройте ведущий сценарий и отобразите waypoints пешехода.

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

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

свернуть все

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

Траектория waypoints в виде N с действительным знаком-by-2 или N-by-3 матрица, где N является количеством waypoints.

  • Если waypoints N-by-2 матрица, затем каждая строка матрицы представляет (x, y) координаты waypoint. z - координата каждого waypoint является нулем.

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

Waypoints находятся в системе мировой координаты. Модули исчисляются в метрах.

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

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

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

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

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

Скорости интерполированы между waypoints. speed может быть нуль в любом waypoint, но не может быть нуль в двух последовательных waypoints. Модули исчисляются в метрах в секунду.

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

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

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

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

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

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

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

Пример: [0 90] задает агента под углом с 0 степенями в первом waypoint и углом в 90 градусов во втором waypoint.

Пример: [0 NaN] задает агента под углом с 0 степенями в первом waypoint. Агент не имеет никаких ограничений на свое отклонение от курса во втором waypoint.

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

Алгоритмы

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

Можно задать скорость как скаляр или вектор. Когда скорость является скаляром, агент следует за траекторией с постоянной скоростью. Когда скоростью является N - вектор элемента, скорость линейно интерполирована между waypoints. Обнуление скорости в двух последовательных waypoints создает стационарного агента.

Введенный в R2018a