В этом примере показано, как автоматизировать генерацию сценария при помощи drivingScenario
объект. В этом примере вы автоматизируете
размещения транспортного средства в сценарии путем определения их запуска и целевых положений
выбор waypoint и генерация траектории для транспортных средств, чтобы пересечь от их положений запуска до целевых положений.
корректировка скорости, таким образом, что транспортные средства ускоряются или deaccelerate, чтобы не сталкиваться между другими транспортными средствами, которые перемещаются в том же маршруте.
Можно использовать этот пример, чтобы синтезировать много случайных сценариев для тестирования ведущих алгоритмов.
drivingScenario
возразите и приложение Driving Scenario Designer в Automated Driving Toolbox™ эффективные инструменты для генерации синтетических ведущих сценариев. Можно создать дорожную сеть или импортировать дорожную сеть из OpenDRIVE®, HD HERE Живая Карта и OpenStreetMap®. Затем можно добавить агентов или транспортные средства к дорожной сети и задать их траектории, чтобы синтезировать ведущий сценарий. waypoints, требуемый для генерации траекторий, должен быть выбран тщательно таким образом, что траектории транспортных средств лежат в дорожной сети, и транспортные средства не сталкивается, когда они перемещаются вдоль своих траекторий. Определение таких размещений транспортного средства и траекторий часто требует нескольких испытаний и является трудоемким, если у вас есть большие дорожные сети, и многие нумеруют транспортных средств, чтобы сконфигурировать.
Этот пример обеспечивает функции помощника и демонстрирует шаги, которые можно использовать, чтобы автоматизировать размещения транспортного средства и генерацию траектории при помощи drivingScenario
объект. Можно также экспортировать сгенерированный сценарий в приложение Driving Scenario Designer. Остальная часть примера демонстрирует эти шаги, вовлеченные в автоматизацию генерации сценария.
Импортируйте дорожную сеть - дорожная сеть Import OpenStreetMap® в ведущий объект сценария при помощи функции помощника helperOSMimport
.
Задайте запускаются, и целевые положения - Задают область интересов (ROI) в дорожной сети, чтобы выбрать запуск и целевые положения для транспортных средств при помощи функции помощника helperSamplePositions
.
Сгенерируйте траектории транспортного средства - Генерируют waypoints и траектории при помощи функции помощника helperGenerateWaypoints
и Automated Driving Toolbox™ функционирует trajectory
.
Измените профили скорости, чтобы избежать, чтобы столкновение - Изменило профили скорости транспортных средств в сценарии при помощи модели Simulink CollisionFreeSpeedManipulator
. Модель проверяет профиль скорости каждого транспортного средства и препятствует тому, чтобы они столкнулись друг с другом, когда они перемещаются вдоль своих траекторий. Выход из модели является обновленным сценарием, который свободен от столкновения между транспортными средствами. Можно преобразовать выход от CollisionFreeSpeedManipulator
Модель Simulink к ведущему сценарию возражает при помощи функции помощника helpergetCFSMScenario
.
Симулируйте и визуализируйте сгенерированный сценарий - Симулируют и отображают автоматически сгенерированный сценарий при помощи plot
функция. Можно также считать и симулировать автоматически сгенерированный сценарий при помощи приложения Driving Scenario Designer.
Можно загрузить дорожную сеть с https://www.openstreetmap.org, который обеспечивает доступ к полученным толпой данным о карте во всем мире. Данные лицензируются под Открытыми Данными палата общин Открытая Лицензия Базы данных (ODbL), https://opendatacommons.org/licenses/odbl/.
Задайте координаты ограничительной рамки, чтобы импортировать тестовую карту средства MCity из openstreetmap.org
при помощи helperOSMImport
функция. Функция возвращает ведущий объект сценария, который содержит дорожную сеть из импортированных данных о карте. Можно также использовать roadNetwork
функционируйте, чтобы импортировать дорожную сеть из OpenDRIVE®, HD HERE Живая Карта или файлы OpenStreetMap®.
% Import the road network of MCity minLat = 42.2990; maxLat = 42.3027; minLon = -83.6996; maxLon = -83.6965; bbox = [minLat maxLat;minLon maxLon]; scenario = helperOSMImport(bbox); % Create another scenario object for plotting purpose scenario_in = helperOSMImport(bbox);
Отобразите дорожную сеть MCity при помощи plot
функция.
figure
plot(scenario_in)
title('Imported Road Network')
xlim([-50 190])
ylim([-85 330])
Чтобы создать ведущий сценарий, необходимо сначала задать отдельные моменты на дорожной сети, которая может служить, запускаются и целевые положения для транспортных средств в сценарии. Используйте helperSamplePositions
функция, чтобы сгенерировать случайный набор точек в дорожной сети, которую можно выбрать, как запускаются и целевые положения для транспортных средств. Можно использовать один или несколько аргументов пары "имя-значение" helperSamplePositions
функции, чтобы сконфигурировать запуск и целевые положения по-разному.
Используйте 'Seed
'аргумент пары "имя-значение" helperSamplePositions
функция, чтобы задать случайные настройки генератора, которые будут использоваться для генерации случайных точек. Можно выбрать любые точки в сгенерированном наборе, как запускаются и целевые положения.
Используйте 'ROI
'аргумент пары "имя-значение" helperSamplePositions
функция, чтобы задать одну или несколько областей интересов (ROI) в дорожной сети, в которой вы хотите задать запуск и целевые положения. ROI могут быть круговыми, прямоугольными или область многоугольника с любым количеством вершин. Значение для ROI является матрицей N-2, задающей пространственные координаты закрытой области. Если не заданный, функция генерирует случайные точки через целую дорожную сеть.
Используйте 'Lanes
'аргумент пары "имя-значение" helperSamplePositions
функция, чтобы задать маршруты, в которых вы хотите задать запуск и целевые положения. Чтобы выбрать однополосное, задайте номер маршрута как скалярное значение. В случае нескольких маршрутов, значения для 'Lanes
'аргумент значения имени должен быть вектором, содержащим желаемые числа маршрута. Если не заданный, функция выбирает маршруты случайным образом.
Используйте 'LongitudinalDistance
'аргумент пары "имя-значение" helperSamplePositions
функционируйте, чтобы установить продольное расстояние между двумя последовательными точками. Если не заданный, функция налагает расстояние на по крайней мере 5 м между двумя последовательными точками в том же маршруте. Это подразумевает, что продольное расстояние между двумя последовательными транспортными средствами, помещенными в тот же маршрут, составляет по крайней мере 5 м.
В процессе моделирования, икра транспортных средств в стартовых точках и затем, перемещения, чтобы достигнуть целевых точек.
Задайте количество случайных точек, которые будут сгенерированы для выбора позиций запуска как 10. Задайте флаг для установки генератора случайных чисел. Установите значение для setSeed
к 1, чтобы задать seed для генератора случайных чисел. Передайте случайные настройки генератора, как введено helperSamplePositions
функция при помощи 'Seed
'аргумент пары "имя-значение".
helperSamplePositions
функционируйте выводит 3-D пространственные координаты случайным образом выбранных точек в импортированной дорожной сети. Функция также выводит углы отклонения от курса относительно выбранных точек. Угол отклонения от курса, полученный относительно точки, задает ориентацию для транспортного средства, которое будет помещено в ту точку.
numPoints = 10; setSeed = 1; if setSeed == 1 seed = 2; rng(seed); s = rng; [points,yaw] = helperSamplePositions(scenario,numPoints,'Seed',s); else [points,yaw] = helperSamplePositions(scenario,numPoints); end
Задайте количество транспортных средств, которые будут помещены в сценарий как 3. Выберите любые три точки в сгенерированном наборе как положения запуска для транспортных средств.
numVehicles = 3; startSet1 = [points(2,:);points(4,:);points(7,:)]; yaw1 = [yaw(2);yaw(4);yaw(7)];
Поместите транспортные средства в выбранные точки при помощи vehicle
функция.
for idx = 1 : numVehicles vehicle(scenario,'Position',startSet1(idx,:),'Yaw',yaw1(idx),'ClassID',1); end
Сгенерируйте другой набор точек путем определения ROI. Вычислите координаты, чтобы задать круговой ROI.
xCor = 0; yCor = 0; radius = 50; thetha = 0: pi/10: 2*pi; roiCircular(:,1) = xCor+radius*cos(thetha); roiCircular(:,2) = yCor+radius*sin(thetha);
Задайте число точек, которое будет сгенерировано в ROI и количестве транспортных средств, чтобы поместить в ROI как 3. Выберите все точки в круговом ROI как положения запуска для транспортных средств.
numPoints = 3; numVehicles = numPoints; [startSet2,yaw2] = helperSamplePositions(scenario,numPoints,'ROI',roiCircular); for idx = 1 : size(startSet2,1) vehicle(scenario,'Position',startSet2(idx,:),'Yaw',yaw2(idx),'ClassID',1); end
Задайте координаты для прямоугольного ROI. Установите число точек быть сгенерированным в ROI и количестве транспортных средств, чтобы поместить в ROI как 3. Установите продольное расстояние между двумя последовательными точками в том же маршруте как 30 м. Если область ROI не является достаточно большой, чтобы разместить конкретное количество точек на заданном продольном расстоянии, то helperSamplePositions
функция возвращает только тех число точек, которое может быть вмещено в ROI. Чтобы получить желаемое число точек, необходимо или уменьшить продольное расстояние или увеличить область ROI.
roiRectangular = [0 0;100 100]; numPoints = 3; [startSet3,yaw3] = helperSamplePositions(scenario,numPoints,'ROI',roiRectangular,'LongitudinalDistance',30);
Поместите транспортные средства в выбранные точки при помощи vehicle
функция.
for idx = 1 : size(startSet3,1) vehicle(scenario,'Position',startSet3(idx,:),'Yaw',yaw3(idx),'ClassID',1); end
Постройте сгенерированные точки выборки и ROI.
figScene = figure('Name','AutomaticScenarioGeneration'); set(figScene,'Position',[0, 0, 900,500]); hPanel1 = uipanel(figScene,'Position',[0 0 0.5 1]); hPlot1 = axes(hPanel1); plot(scenario_in,'Parent',hPlot1); title('Points for Selecting Start Positions') hold on plot(points(:,1),points(:,2),'ro','MarkerSize',5,'MarkerFaceColor','r'); plot(roiCircular(:,1),roiCircular(:,2),'LineWidth',1.2,'Color','k') plot(startSet2(:,1),startSet2(:,2),'ko','MarkerSize',5,'MarkerFaceColor','k'); plot([roiRectangular(1,1);roiRectangular(1,1);roiRectangular(2,1);roiRectangular(2,1);roiRectangular(1,1)],... [roiRectangular(1,2);roiRectangular(2,2);roiRectangular(2,2);roiRectangular(1,2);roiRectangular(1,2)],... 'LineWidth',1.2,'Color','b'); plot(startSet3(:,1),startSet3(:,2),'bo','MarkerSize',5,'MarkerFaceColor','b'); xlim([-50 190]) ylim([-85 330]) hold off
Отобразите положения запуска и транспортные средства в сценарии.
hPanel2 = uipanel(figScene,'Position',[0.5 0 0.5 1]); hPlot2 = axes(hPanel2); plot(scenario,'Parent',hPlot2); title('Start Positions and Vehicle Placement') hold on plot(startSet1(:,1),startSet1(:,2),'rs','MarkerSize',15,'LineWidth',1.2); plot(startSet2(:,1),startSet2(:,2),'ks','MarkerSize',15,'LineWidth',1.2); plot(startSet3(:,1),startSet3(:,2),'bs','MarkerSize',15,'LineWidth',1.2); xlim([-50 190]) ylim([-85 330]) hold off
Объедините все положения запуска в одну матрицу. Количество положений запуска подразумевает общее количество транспортных средств в ведущем сценарии.
startPositions = [startSet1;startSet2;startSet3];
Отобразитесь сценарий возражают и смотрят его свойства. Actors
свойство scenario
объект 1 9 массив, и это хранит информацию о 9 транспортных средствах, которые добавляются к ведущему сценарию. Доступ к деталям каждого транспортного средства в Actors
свойство при помощи точечной индексации. Отобразите детали о первом транспортном средстве в ведущем сценарии. Position
свойство содержит положение запуска транспортного средства.
scenario
scenario = drivingScenario with properties: SampleTime: 0.0100 StopTime: Inf SimulationTime: 0 IsRunning: 1 Actors: [1x9 driving.scenario.Vehicle]
scenario.Actors(1)
ans = Vehicle with properties: FrontOverhang: 0.9000 RearOverhang: 1 Wheelbase: 2.8000 EntryTime: 0 ExitTime: Inf ActorID: 1 ClassID: 1 Name: "" PlotColor: [0 0.4470 0.7410] Position: [130.7903 -12.2335 -2.0759e-04] Velocity: [0 0 0] Yaw: 96.6114 Pitch: 0 Roll: 0 AngularVelocity: [0 0 0] Length: 4.7000 Width: 1.8000 Height: 1.4000 Mesh: [1x1 extendedObjectMesh] RCSPattern: [2x2 double] RCSAzimuthAngles: [-180 180] RCSElevationAngles: [-90 90]
Сгенерируйте целевые положения для транспортных средств в сценарии при помощи helperSamplePositions
функция. Общее количество целевых положений должно быть тем же самым как общее количество положений запуска.
numGoalPositions = length(startPositions)
numGoalPositions = 9
Задайте координаты для ROI многоугольника и найдите 5 случайных точек в ROI многоугольника. Выберите эти точки как целевые положения для первых 5 транспортных средств в сценарии.
roiPolygon = [-50 170;30 250;72 170;-50 170];
numPoints1 = 5;
goalSet1 = helperSamplePositions(scenario,numPoints1,'ROI',roiPolygon);
Отобразите сценарий и выбранные целевые положения.
figure plot(scenario); title('Goal Positions') hold on plot(roiPolygon(:,1), roiPolygon(:,2),'LineWidth',1.2,'Color','r') plot(goalSet1(:,1), goalSet1(:,2),'ro','MarkerSize',5,'MarkerFaceColor','r')
Сгенерируйте остающийся набор целевых положений таким способом, которым они все лежат в определенном маршруте. Используйте 'Lanes
'аргумент пары "имя-значение", чтобы задать номер маршрута для целевых положений.
numPoints2 = 4; goalSet2 = helperSamplePositions(scenario,numPoints2,'Lanes',1); plot(goalSet2(:,1),goalSet2(:,2),'bo','MarkerSize',5,'MarkerFaceColor','b') xlim([-50 190]) ylim([-85 310]) hold off
Объедините все целевые положения в одну матрицу.
goalPositions = [goalSet1;goalSet2];
Отобразите положения запуска и целевые положения относительно каждого транспортного средства в сценарии.
vehicleNum = 1:length(startPositions); table(vehicleNum(:),startPositions,goalPositions,'VariableNames',{'Vehicle','Start positions','Goal positions'})
ans=9×3 table
Vehicle Start positions Goal positions
_______ _____________________________________ _____________________________________
1 130.79 -12.233 -0.00020759 49.544 173.51 0.0009993
2 113.86 -44.576 -0.00076866 53.168 198.75 0.00070254
3 143.37 297.8 -0.00188 3.5187 187.51 0.00057965
4 -25.863 37.977 0.00020468 30.912 175.81 0.00087745
5 24.74 -28.221 -0.00031535 -3.3494 178.66 0.00055764
6 -29.047 -7.817 -0.00053606 108.15 -34.789 -0.00049719
7 26.393 62.042 0.00095438 118.42 192.5 0.00054377
8 73.989 42.717 0.00094018 110.09 248.17 -0.00032446
9 73.996 64.436 0.0011401 177.2 267.68 -0.0015615
Используйте helperGenerateWaypoints
функция, чтобы вычислить waypoints, которые соединяют запуск и целевые положения. Функция возвращает массив структур, который содержит дорожные центры, вычислил waypoints и угол отклонения от курса для каждого транспортного средства в сценарии. Считайте информации транспортного средства из scenario
возразите и задайте случайные значения скорости для каждого транспортного средства. Используйте trajectory
функция, чтобы сгенерировать траектории для каждого транспортного средства при помощи вычисленного waypoints и случайных значений скорости.
info = helperGenerateWaypoints(scenario,startPositions,goalPositions); for indx = 1:length(startPositions) vehicleData = scenario.Actors(indx); speed = randi([10,25],1,1); waypts = info(indx).waypoints; trajectory(vehicleData,waypts,speed); end
Установите время остановки для сценария.
scenario.StopTime = 50;
Создайте пользовательскую фигуру и отобразите симулированный ведущий сценарий.
close all; figScene = figure; set(figScene,'Position',[0,0,600,600]); movegui(figScene,'center'); hPanel = uipanel(figScene,'Position',[0 0 1 1]); hPlot = axes(hPanel); plot(scenario,'Parent',hPlot); title('Generated Scenario') % Run the simulation while advance(scenario) pause(0.01) end
В сгенерированном сценарии все транспортные средства пересекают вдоль их траекторий на особой скорости, чтобы достигнуть их целевых положений. Можно также наблюдать столкновение между двумя агентами, когда они пересекают вдоль их траекторий. В то время как вы синтезируете сценарий для тестирования ведущих алгоритмов, важно, чтобы транспортные средства в сценарии не сталкивались. Чтобы предотвратить столкновение, необходимо настроить скорость транспортных средств так, чтобы они не сталкивались друг с другом при перемещении вдоль их путей.
Используйте модель Simulink CollisionFreeSpeedManipulator
откорректировать скорость транспортных средств, таким образом, что они не сталкиваются, когда они пересекают вдоль их траекторий. Модель использует нелинейное время, масштабируясь, чтобы реактивным образом ускориться или de-accelerate транспортное средство, не изменяя его траекторию [1].
% Open the Simulink system block open_system('CollisionFreeSpeedManipulator'); % Pass the scenario object as input set_param('CollisionFreeSpeedManipulator/VelocityUpdate',... 'ScenarioName','scenario') % Run the simulation and log the output out = sim('CollisionFreeSpeedManipulator','StopTime','50'); % Clear all the temporary variables and close the Simulink block bdclose
Используйте helpergetCFSMScenario
функционируйте, чтобы преобразовать модель Simulink выход в ведущий объект сценария. Симулируйте и отобразите ведущий сценарий. Вы видите, что транспортные средства перемещаются вдоль заданных траекторий, чтобы достигнуть их целевых положений.
newScenario = helpergetCFSMScenario(out,scenario); close all; figScene = figure; set(figScene,'Position',[0,0,600,600]); movegui(figScene,'center'); hPanel = uipanel(figScene,'Position',[0 0 1 1]); hPlot = axes(hPanel); plot(newScenario,'Parent',hPlot); title('Updated Scenario') hold on h1 = plot(goalPositions(:,1),goalPositions(:,2),'gs','MarkerSize',15,'LineWidth',1.2); h2 = plot(startPositions(:,1),startPositions(:,2),'rs','MarkerSize',15,'LineWidth',1.2); legend([h2 h1],{'Start Positions';'Goal Positions'},'Location','southoutside','Orientation','horizontal') hold off % Run the simulation while advance(newScenario) pause(0.01) end
Можно также экспортировать сценарий в приложение Driving Scenario Designer и запустить симуляцию.
drivingScenarioDesigner(newScenario)
Модель Simulink CollisionFreeSpeedManipulator
настраивает только профиль скорости активных транспортных средств. Если транспортное средство достигает целевого положения и становится неактивным в сценарии, это не рассматривается для проверки столкновений. Если вы хотите сгенерировать ведущий сценарий с несталкивающимися транспортными средствами, выберите точки в меньшем количестве близости и в различных маршрутах как запуск и целевые положения. Если будет другое транспортное средство, целевое положение которого близко к неактивному транспортному средству, и траектория - то же самое как траектория неактивного транспортного средства затем то между этими транспортными средствами будет столкновение. Точно так же столкновение происходит, когда два транспортных средства, перемещающиеся в тех же или различных маршрутах, прибывают в непосредственную близость на дорожных пересечениях. Кроме того, возможности для столкновения больше, если два или больше целевых положения лежат в том же маршруте.
2.
Если вы хотите сгенерировать ведущий сценарий с несталкивающимися транспортными средствами, выберите случайные точки в меньшем количестве близости и в различных маршрутах как запуск и целевые положения.
[1] Сингх, Арун Кумар и К. Мэдхэва Кришна. “Реактивное Предотвращение Столкновения для Нескольких Роботов Не Линейное Время, Масштабируясь”. На 52-й Конференции по IEEE по Решению и Управлению, 952–58. Фиренце: IEEE, 2013. https://doi.org/10.1109/CDC.2013.6760005.
drivingScenario
| plot
| roadNetwork
| vehicle