Автоматическая генерация сценария

В этом примере показано, как автоматизировать генерацию сценария при помощи drivingScenario объект. В этом примере вы автоматизируете

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

  • выбор waypoint и генерация траектории для транспортных средств, чтобы пересечь от их положений запуска до целевых положений.

  • корректировка скорости, таким образом, что транспортные средства ускоряются или deaccelerate, чтобы не сталкиваться между другими транспортными средствами, которые перемещаются в том же маршруте.

Можно использовать этот пример, чтобы синтезировать много случайных сценариев для тестирования ведущих алгоритмов.

Введение

drivingScenario возразите и приложение Driving Scenario Designer в Automated Driving Toolbox™ эффективные инструменты для генерации синтетических ведущих сценариев. Можно создать дорожную сеть или импортировать дорожную сеть из OpenDRIVE®, HD HERE Живая Карта и OpenStreetMap®. Затем можно добавить агентов или транспортные средства к дорожной сети и задать их траектории, чтобы синтезировать ведущий сценарий. waypoints, требуемый для генерации траекторий, должен быть выбран тщательно таким образом, что траектории транспортных средств лежат в дорожной сети, и транспортные средства не сталкивается, когда они перемещаются вдоль своих траекторий. Определение таких размещений транспортного средства и траекторий часто требует нескольких испытаний и является трудоемким, если у вас есть большие дорожные сети, и многие нумеруют транспортных средств, чтобы сконфигурировать.

Этот пример обеспечивает функции помощника и демонстрирует шаги, которые можно использовать, чтобы автоматизировать размещения транспортного средства и генерацию траектории при помощи drivingScenario объект. Можно также экспортировать сгенерированный сценарий в приложение Driving Scenario Designer. Остальная часть примера демонстрирует эти шаги, вовлеченные в автоматизацию генерации сценария.

  1. Импортируйте дорожную сеть - дорожная сеть Import OpenStreetMap® в ведущий объект сценария при помощи функции помощника helperOSMimport.

  2. Задайте запускаются, и целевые положения - Задают область интересов (ROI) в дорожной сети, чтобы выбрать запуск и целевые положения для транспортных средств при помощи функции помощника helperSamplePositions.

  3. Сгенерируйте траектории транспортного средства - Генерируют waypoints и траектории при помощи функции помощника helperGenerateWaypoints и Automated Driving Toolbox™ функционирует trajectory.

  4. Измените профили скорости, чтобы избежать, чтобы столкновение - Изменило профили скорости транспортных средств в сценарии при помощи модели Simulink CollisionFreeSpeedManipulator. Модель проверяет профиль скорости каждого транспортного средства и препятствует тому, чтобы они столкнулись друг с другом, когда они перемещаются вдоль своих траекторий. Выход из модели является обновленным сценарием, который свободен от столкновения между транспортными средствами. Можно преобразовать выход от CollisionFreeSpeedManipulator Модель Simulink к ведущему сценарию возражает при помощи функции помощника helpergetCFSMScenario.

  5. Симулируйте и визуализируйте сгенерированный сценарий - Симулируют и отображают автоматически сгенерированный сценарий при помощи 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 м.

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

1. Выберите Start Positions

Задайте количество случайных точек, которые будут сгенерированы для выбора позиций запуска как 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];

2. Смотрите объект сценария

Отобразитесь сценарий возражают и смотрят его свойства. 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]

3. Выберите Goal Positions

Сгенерируйте целевые положения для транспортных средств в сценарии при помощи 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 настраивает только профиль скорости активных транспортных средств. Если транспортное средство достигает целевого положения и становится неактивным в сценарии, это не рассматривается для проверки столкновений. Если вы хотите сгенерировать ведущий сценарий с несталкивающимися транспортными средствами, выберите точки в меньшем количестве близости и в различных маршрутах как запуск и целевые положения. Если будет другое транспортное средство, целевое положение которого близко к неактивному транспортному средству, и траектория - то же самое как траектория неактивного транспортного средства затем то между этими транспортными средствами будет столкновение. Точно так же столкновение происходит, когда два транспортных средства, перемещающиеся в тех же или различных маршрутах, прибывают в непосредственную близость на дорожных пересечениях. Кроме того, возможности для столкновения больше, если два или больше целевых положения лежат в том же маршруте.

  1. 2.

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

Ссылки

[1] Сингх, Арун Кумар и К. Мэдхэва Кришна. “Реактивное Предотвращение Столкновения для Нескольких Роботов Не Линейное Время, Масштабируясь”. На 52-й Конференции по IEEE по Решению и Управлению, 952–58. Фиренце: IEEE, 2013. https://doi.org/10.1109/CDC.2013.6760005.

Смотрите также

| | |

Похожие темы