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

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

  • Размещение транспортного средства в сценарии путем определения их начального и целевого положения

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

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

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

Введение

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

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

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

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

  3. Сгенерируйте траектории транспортного средства - Сгенерируйте путевые точки и траектории при помощи функции helper helperGenerateWaypoints и trajectory функциональные .

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

  5. Симулируйте и визуализируйте сгенерированный сценарий - Моделируйте и отображайте автоматически сгенерированный сценарий при помощи plot функция. Вы также можете читать и моделировать сценарий с помощью приложения Driving Scenario Designer.

Импорт дорожной сети

Вы можете загрузить дорожную сеть из https://www.openstreetmap.org, которая обеспечивает доступ к картографическим данным по всему миру. Данные лицензированы под лицензией Open Data Commons Open Database License (ODbL), https://opendatacommons.org/licenses/odbl/.

Задайте координаты ограничивающего прямоугольника, чтобы импортировать карту тестового средства MCity из openstreetmap.org при помощи helperOSMImport функция. Функция возвращает объект сценария вождения, который содержит дорожную сеть из импортированных данных карты. Можно также использовать roadNetwork функция для импорта дорожной сети из файлов OpenDRIVE ®, HERE HD Live Map или 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 могут быть круглыми, прямоугольными или многоугольными областями с любым количеством вершин. Значение для информации только для чтения является матрицей N-by-2, задающей пространственные координаты замкнутой области. Если это значение не задано, функция генерирует случайные точки по всей дорожной сети.

  • Используйте 'Lanes', чтобы задать полосы движения, в которых необходимо задать начальное и целевое положения. Чтобы выбрать одну полосу, задайте номер полосы как скалярное значение. Для нескольких маршрутов значение 'Lanes'должен быть вектором, содержащим требуемые номера маршрутов. Если это значение не задано, функция выбирает полосы случайным образом.

  • Используйте 'LongitudinalDistance', чтобы задать продольное расстояние между двумя последовательными точками. Если это значение не задано, функция накладывает не менее 5 метров расстояния между двумя последовательными точками в одной полосе. Это означает, что продольное расстояние между двумя последовательными транспортными средствами, расположенными в одной полосе, составляет не менее 5 метров.

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

1. Выбор начальных позиций

Сгенерируйте 10 случайных точек для использования в качестве потенциальных начальных положений. Задайте флаг для установки генератора случайных чисел. Установите значение для setSeed Значение 1, чтобы задать seed для генератора случайных чисел. Передайте настройки случайного генератора как вход в helperSamplePositions функция при помощи 'SeedАргумент в виде пары имя-значение.

The 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

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

xCor = 0;
yCor = 0;
radius = 50;
theta = 0: pi/10: 2*pi;
roiCircular(:,1) = xCor+radius*cos(theta);
roiCircular(:,2) = yCor+radius*sin(theta);

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

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

Задайте координаты для прямоугольного информация только для чтения. Установите число точек, генерируемых в информация только для чтения, и количество транспортных средств, помещаемых в информация только для чтения, равным 3. Установите продольное расстояние между двумя последовательными точками в одной полосе движения равным 30 метрам. Если информация только для чтения недостаточно велика, чтобы разместить заданное число точек на заданном продольном расстоянии, то helperSamplePositions функция возвращает только то число точек, которое может быть использовано в информация только для чтения. Чтобы получить необходимое число точек, необходимо либо уменьшить продольное расстояние, либо увеличить площадь информации только для чтения.

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

Постройте график сгенерированных точек выборки и ROIs.

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 случайных точек, определенных в круговом информация только для чтения.

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

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. Смотрите объект сценария

Отобразите объект сценария и проверьте его свойства. The Actors свойство scenario объект является массивом 1 на 9, который хранит информацию о 9 транспортных средствах, которые добавляются к сценарию вождения. Доступ к деталям каждого транспортного средства в Actors свойство при помощи индексации через точку. Отображение подробных данных о первом транспортном средстве в сценарии вождения. The Position свойство содержит начальное положение транспортного средства.

scenario
scenario = 
  drivingScenario with properties:

        SampleTime: 0.0100
          StopTime: Inf
    SimulationTime: 0
         IsRunning: 1
            Actors: [1×9 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: [1×1 extendedObjectMesh]
            RCSPattern: [2×2 double]
      RCSAzimuthAngles: [-180 180]
    RCSElevationAngles: [-90 90]

3. Выбор позиций цели

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

numGoalPositions = length(startPositions)
numGoalPositions = 9

Задайте координаты для многоугольника информации только для чтения и найдите 5 случайных точек в многоугольнике информации только для чтения. Выберите эти точки в качестве позиций цели для первых 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 очков красного цвета показа целевые положения, заданные в многоугольник информации только для чтения.

  • На 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 функция для вычисления путевых точек, которые соединяют начальное и целевое положения. Функция возвращает массив структур, который содержит центры дорог, вычисленные точки пути и угол рыскания для каждого транспортного средства в сценарии. Считайте информацию о транспортном средстве из scenario объект и задайте значения случайной скорости для каждого транспортного средства. Используйте trajectory функция для генерации траекторий для каждого транспортного средства с помощью вычисленных точек пути и значений случайной скорости.

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

  1. 2.

Ссылки

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

См. также

| | |

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте