exponenta event banner

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

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

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

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

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

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

Введение

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

Этот пример предоставляет вспомогательные функции и демонстрирует шаги по автоматизации размещения транспортных средств и генерации траекторий с помощью drivingScenario объект. Кроме того, созданный сценарий можно экспортировать в приложение Конструктор сценариев управления. В остальном примере показаны следующие шаги, связанные с автоматизацией создания сценариев.

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

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

  3. Генерация траекторий транспортного средства - генерация ППМ и траекторий с помощью вспомогательной функции helperGenerateWaypoints и trajectory функция.

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

  5. Моделирование и визуализация сгенерированного сценария - моделирование и просмотр автоматически сгенерированного сценария с помощью plot функция. Можно также прочитать и смоделировать сценарий с помощью приложения «Конструктор сценариев управления».

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

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

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

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

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

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

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

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

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

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

Просмотрите объект сценария и проверьте его свойства. 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]

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

Можно также экспортировать сценарий в приложение «Конструктор сценариев управления» и запустить моделирование.

drivingScenarioDesigner(newScenario)

Советы по предотвращению столкновений

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

  1. 2.

Ссылки

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

См. также

| | |

Связанные темы