В этом примере показано, как автоматизировать генерацию сценария при помощи drivingScenario
объект. В этом примере вы автоматизируете:
Размещения транспортного средства в сценарии путем определения их запуска и целевых положений
Выбор Waypoint и генерация траектории для транспортных средств, чтобы пересечь от их положений запуска до целевых положений.
Корректировка скорости, таким образом, что транспортные средства ускоряются или замедляются, чтобы не сталкиваться между другими транспортными средствами, которые перемещаются в том же маршруте.
Можно использовать этот пример, чтобы синтезировать много случайных сценариев для тестирования ведущих алгоритмов.
drivingScenario
возразите и приложение Driving Scenario Designer в Automated Driving Toolbox™ эффективные инструменты для генерации синтетических ведущих сценариев. Можно создать дорожную сеть или импортировать дорожную сеть из OpenDRIVE®, HD HERE Живая Карта и OpenStreetMap®. Затем можно добавить агентов или транспортные средства к дорожной сети и задать их траектории, чтобы синтезировать ведущий сценарий. waypoints, требуемый для генерации траекторий, должен быть выбран тщательно таким образом, что траектории транспортных средств лежат в дорожной сети, и транспортные средства не сталкивается, когда они перемещаются вдоль своих траекторий. Определение таких размещений транспортного средства и траекторий часто требует нескольких испытаний и является трудоемким, если у вас есть большие дорожные сети и много транспортных средств, чтобы сконфигурировать.
Этот пример обеспечивает функции помощника и демонстрирует шаги, чтобы автоматизировать размещения транспортного средства и генерацию траектории при помощи drivingScenario
объект. Можно также экспортировать сгенерированный сценарий в приложение Driving Scenario Designer. Остальная часть примера демонстрирует эти шаги, вовлеченные в автоматизацию генерации сценария.
Импортируйте дорожную сеть - дорожная сеть Import OpenStreetMap® в ведущий объект сценария при помощи функции помощника helperOSMimport
.
Задайте запускаются, и целевые положения - Задают видимые области (ROIs) в дорожной сети, чтобы выбрать запуск и целевые положения для транспортных средств при помощи функции помощника helperSamplePositions
.
Сгенерируйте траектории транспортного средства - Генерируют waypoints и траектории при помощи функции помощника helperGenerateWaypoints
и trajectory
функция.
Измените профили скорости, чтобы избежать, чтобы столкновение - Изменило профили скорости транспортных средств в сценарии при помощи модели CollisionFreeSpeedManipulator
Simulink®. Модель проверяет профиль скорости каждого транспортного средства и препятствует тому, чтобы они столкнулись друг с другом, когда они перемещаются вдоль своих траекторий. Выход из модели является обновленным сценарием, который свободен от столкновения между транспортными средствами. Можно преобразовать выход от
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 purposes scenario_in = helperOSMImport(bbox);
Отобразите дорожную сеть MCity при помощи plot
функция.
figure
plot(scenario_in)
title('Imported Road Network')
xlim([-50 190])
ylim([-85 330])
Чтобы создать ведущий сценарий, необходимо сначала задать отдельные моменты на дорожной сети, которая может служить, запускаются и целевые положения для транспортных средств в сценарии. Используйте helperSamplePositions
функция, чтобы сгенерировать случайный набор этих точек в дорожной сети. Можно использовать один или несколько из этих аргументов пары "имя-значение" helperSamplePositions
функции, чтобы сконфигурировать запуск и целевые положения по-разному"
Используйте 'Seed
'чтобы задать случайные настройки генератора, которые будут использоваться для генерации случайных точек. Можно выбрать любые точки в сгенерированном наборе, как запускаются и целевые положения.
Используйте 'ROI
'чтобы задать один или несколько ROI в дорожной сети, в которой вы хотите задать запуск и целевые положения. ROI могут быть круговыми, прямоугольными, или область многоугольника с любым количеством вершин. Значение для ROI является матрицей N-2, задающей пространственные координаты закрытой области. Если это значение не задано, функция генерирует случайные точки через целую дорожную сеть.
Используйте 'Lanes
'чтобы задать маршруты, в которых вы хотите задать запуск и целевые положения. Чтобы выбрать однополосное, задайте номер маршрута как скалярное значение. Для нескольких маршрутов, значения 'Lanes
'должен быть вектор, содержащий желаемые числа маршрута. Если это значение не задано, функция выбирает маршруты случайным образом.
Используйте 'LongitudinalDistance
'чтобы установить продольное расстояние между двумя последовательными точками. Если это значение не задано, функция налагает по крайней мере 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; theta = 0: pi/10: 2*pi; roiCircular(:,1) = xCor+radius*cos(theta); roiCircular(:,2) = yCor+radius*sin(theta);
Задайте число точек, которое будет сгенерировано в 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
Отобразите положения запуска и транспортные средства в сценарии.
Эти 3 запускаются, положения красного цвета были выбраны из этих 10 случайных точек, заданных в сценарии.
Эти 3 запускаются, положения черного цвета цвета были выбраны из этих 3 случайных точек, заданных в круговом ROI.
Эти 3 запускаются, положения синего цвета были выбраны из этих 3 случайных точек, заданных в прямоугольном ROI.
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: [1×9 driving.scenario.Vehicle]
Barriers: [0×0 driving.scenario.Barrier]
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: [1×1 extendedObjectMesh]
RCSPattern: [2×2 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);
Сгенерируйте остающийся набор целевых положений таким способом, которым они все лежат в определенном маршруте. Используйте 'Lanes
'аргумент пары "имя-значение", чтобы задать номер маршрута для целевых положений.
numPoints2 = 4;
goalSet2 = helperSamplePositions(scenario,numPoints2,'Lanes',1);
Отобразите сценарий и выбранные целевые положения.
5 точек на красном показе целевые положения заданы в ROI многоугольника.
4 точки на синем показе целевые положения заданы через целый сценарий.
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') 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
откорректировать скорость транспортных средств, таким образом, что они не сталкиваются, когда они пересекают вдоль их траекторий. Модель использует нелинейное время, масштабируясь, чтобы реактивным образом ускорить или замедлить транспортное средство, не изменяя его траекторию [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.
roadNetwork
| vehicle
| plot
| drivingScenario