В этом примере показано, как автоматизировать создание сценария с помощью drivingScenario объект. В этом примере выполняется автоматизация:
Размещение транспортных средств в сценарии путем определения их начальных и целевых позиций
Выбор ППМ и формирование траектории для движения транспортных средств от их начальных позиций к целевым позициям.
Регулировка скорости таким образом, чтобы транспортные средства ускорялись или замедлялись во избежание столкновения между другими транспортными средствами, которые движутся по той же полосе.
Этот пример можно использовать для синтеза ряда случайных сценариев для тестирования алгоритмов вождения.
drivingScenario объект и приложение «Конструктор сценариев вождения» в Automated Driving Toolbox™ являются эффективными инструментами для создания синтетических сценариев вождения. Вы можете создать дорожную сеть или импортировать дорожную сеть из OpenDRIVE ®, HERE HD Live Map и OpenStreetMap ®. Затем можно добавить субъектов или транспортные средства в дорожную сеть и определить их траектории для синтеза сценария вождения. ППМ, необходимые для формирования траекторий, должны быть тщательно выбраны таким образом, чтобы траектории транспортных средств лежали в пределах дорожной сети, и транспортные средства не сталкивались, когда они движутся по своим траекториям. Определение таких размещений и траекторий часто требует нескольких испытаний и занимает много времени, если у вас есть большие дорожные сети и много транспортных средств для настройки.
Этот пример предоставляет вспомогательные функции и демонстрирует шаги по автоматизации размещения транспортных средств и генерации траекторий с помощью drivingScenario объект. Кроме того, созданный сценарий можно экспортировать в приложение Конструктор сценариев управления. В остальном примере показаны следующие шаги, связанные с автоматизацией создания сценариев.
Импорт дорожной сети - Импорт дорожной сети OpenStreetMap ® в движущий объект сценария с помощью функции помощникаhelperOSMimport.
Определение начальной и целевой позиций - определение областей интересов (ROI) в дорожной сети для выбора начальной и целевой позиций для транспортных средств с помощью функции помощника helperSamplePositions.
Генерация траекторий транспортного средства - генерация ППМ и траекторий с помощью вспомогательной функции helperGenerateWaypoints и trajectory функция.
Изменение профилей скорости во избежание столкновения - изменение профилей скорости транспортных средств в сценарии с использованием модели Simulink ®CollisionFreeSpeedManipulator. Модель проверяет профиль скорости каждого транспортного средства и предотвращает их столкновение друг с другом при движении по их траекториям. Выходные данные модели представляют собой обновленный сценарий, свободный от столкновения между транспортными средствами. Можно преобразовать выходные данные из CollisionFreeSpeedManipulator Модель Simulink к управляющему объекту сценария с помощью вспомогательной функции helpergetCFSMScenario.
Моделирование и визуализация сгенерированного сценария - моделирование и просмотр автоматически сгенерированного сценария с помощью 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 метров.
Во время моделирования транспортные средства нерестятся в начальных точках, а затем перемещаются для достижения целевых точек.
Создайте 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];
Просмотрите объект сценария и проверьте его свойства. 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]
Создайте целевые позиции для транспортных средств в сценарии с помощью 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 корректирует только профиль скорости действующих транспортных средств. Как только транспортное средство достигает целевого положения и становится неактивным в сценарии, оно не рассматривается для проверки столкновений. Если вы хотите создать сценарий вождения с не столкнувшимися транспортными средствами, выберите точки в меньшей близости и на разных полосах в качестве начальной и целевой позиций. Если имеется другое транспортное средство, целевое положение которого близко к неактивному транспортному средству и траектория которого совпадает с траекторией неактивного транспортного средства, то между этими транспортными средствами будет иметь место столкновение. Аналогичным образом, столкновение происходит, когда два транспортных средства, движущиеся по одной или разным полосам, находятся в непосредственной близости на перекрестках дорог. Также шансы на столкновение больше, если две или более позиции ворот лежат в одной полосе.
2. 
[1] Сингх, Арун Кумар и К. Мадхава Кришна. «Предотвращение реактивных столкновений для нескольких роботов по нелинейному масштабированию времени». На 52-й Конференции IEEE по принятию решений и контролю, 952-58. Фиренце: IEEE, 2013. https://doi.org/10.1109/CDC.2013.6760005.
drivingScenario | plot | roadNetwork | vehicle