В этом примере показано, как автоматически сгенерировать варианты сценария seed, в котором сталкиваются два агента. Можно сгенерировать случайные варианты сценария столкновения, который можно использовать для проекта и валидации приложений автономного управления автомобилем, таких как системы автоматизированного экстренного торможения (AEB). В этом примере вы генерируете варианты сценария путем изменения скорости агента эго, столкновения, и время поступления агентов в их waypoints. Однако точка столкновения остается то же самое как в сценарии seed.
Если автомобиль, оборудованный датчиком сталкивается с целевым агентом в многократно, этот пример генерирует варианты сценария на основе первого экземпляра столкновения.
Если автомобиль, оборудованный датчиком сталкивается с несколькими целевыми агентами в разное время в сценарии, этот пример генерирует варианты сценария относительно только одного целевого агента. Можно задать желаемого целевого агента, чтобы рассмотреть для генерации вариантов сценария.
Этот пример использует drivingScenario
объект создать сценарий seed, и обеспечивает функции помощника, чтобы сгенерировать варианты из сценария seed. Остальная часть примера демонстрирует эти шаги, вовлеченные в генерацию вариантов сценария.
Сгенерируйте Сценарий Seed - Создают сценарий столкновения при помощи drivingScenario
объект. Сценарий может содержать любое количество экземпляров столкновения и агентов. Однако этот пример генерирует вариант только на основе первого экземпляра столкновения, который находится между автомобилем, оборудованным датчиком и заданным целевым агентом.
Сгенерируйте Вариант Сценария Seed - Изменяют сценарий seed при помощи функций помощника helperComputeCollisionTimeInstant
, helperComputeCollisionTimeDiff
, и helperModifyScenario
. Эти функции помощника позволяют вам сгенерировать варианты сценария seed путем изменения скорости автомобиля, оборудованного датчиком и корректировки времени ожидания и времени записи эго и целевого агента и стартовой позиции целевого агента. Это включенные шаги:
Найдите, что экземпляр времени столкновения - Находит момент времени, в который столкновение находится между автомобилем, оборудованным датчиком и определенной целью в сценарии seed при помощи функции помощника helperComputeCollisionTimeInstant
.
Задайте новую скорость эго и вычислите, разница во времени столкновения - Задают новое значение скорости эго и параметр, чтобы измениться для генерации варианта. Используйте helperComputeCollisionTimeDiff
функция, чтобы вычислить параметры, требуемые для изменения времени поступления эго и целевого агента в каждом waypoint вдоль их траекторий. helperComputeCollisionTimeDiff
функционируйте использует вычисленное время столкновения, чтобы вычислить время столкновения для нового значения скорости эго.
Измените сценарий seed - Использование helperModifyScenario
функция, чтобы сгенерировать вариант сценария seed. helperModifyScenario
функционируйте использует параметры, вычисленные helperComputeCollisionTimeDiff
функция, чтобы изменить время поступления эго и целевого агента в каждом waypoint.
Визуализируйте Сгенерированный Сценарий - Симулируют и отображают сгенерированные варианты сценария при помощи plot
функция.
Сценарий seed должен быть сценарием столкновения, в котором столкновение находится между автомобилем, оборудованным датчиком и по крайней мере одним из целевых агентов в сценарии. В этом примере вы генерируете Car-to-Pedestrian
Nearside
Child
сценарий тестирования европейской новой автомобильной программы оценки (Евро NCAP) тестирует протокол как сценарий seed. Размерности агента, положения, значения скорости и траектории установлены согласно Евро тестовые требования протокола NCAP.
Сценарий имеет автомобиль, оборудованный датчиком и трех агентов. Из этих трех агентов каждый - пешеход, который является движущейся целью, с которой сталкивается автомобиль, оборудованный датчиком. Столкновение происходит только однажды во время времени симуляции. Автомобиль, оборудованный датчиком и агенты неэго должны переместиться на постоянных скоростях. Следовательно, автомобиль, оборудованный датчиком и целевой агент должны каждый иметь скалярное значение скорости.
Создайте ведущий объект сценария.
scenario = drivingScenario;
Задайте ширину и дорожные центры, чтобы создать дорогу при помощи road
функция. Добавьте два ведущих маршрута и маршрут плеча к дороге при помощи lanespec
функция.
roadCenters = [0 0 0; 70 0 0]; marking = [laneMarking("Solid",Color=[0.98 0.86 0.36]), ... laneMarking("Solid"),laneMarking("Solid")]; ltype = [laneType("Driving");laneType("Shoulder")]; lspec = lanespec(2,Width=[5.4 2.6],Marking=marking,Type=ltype); road(scenario,roadCenters,Name="Road",Lanes=lspec);
Добавьте автомобиль, оборудованный датчиком в сценарий и установите его траекторию путем определения waypoints и скорости. Определите имя для автомобиля, оборудованного датчиком как "Ego
in
Scenario
"или "Vehicle
under
Test
". Этот пример использует Name
поле, чтобы идентифицировать автомобиль, оборудованный датчиком в данном сценарии. Следовательно, имя для автомобиля, оборудованного датчиком должно содержать слово "Ego
"или "Test
". Установите скорость автомобиля, оборудованного датчиком к 60 км/час.
egoVehicle = vehicle(scenario,ClassID=1,Position=[3.3 0 0], ... Wheelbase=2.8,Mesh=driving.scenario.carMesh, ... Name="Ego in Scenario"); egoWaypoints = [3.3 0 0; 8.3 0 0; 51.3 0 0; 65 0 0]; egoSpeed = 60; % Convert speed value to m/s egoSpeed = (egoSpeed*1000)/3600; trajectory(egoVehicle,egoWaypoints,egoSpeed);
Добавьте агента класса Pedestrian
к сценарию и набору его траектория путем определения waypoints и скорости. Задайте waypoints и скорость, таким образом, что это сталкивается с автомобилем, оборудованным датчиком. Определите имя для целевого транспортного средства как "Target
Pedestrian
". Этот пример использует Name
поле, чтобы идентифицировать движущуюся цель в данном сценарии. Следовательно, имя для целевого агента должно содержать слово "Target
". Установите скорость целевого агента к 5 км/час.
movingTarget = actor(scenario,ClassID=4, ... Length=0.711, Width=0.5, Height=1.154, ... Position=[55.25 -4 0],RCSPattern=[-8 -8;-8 -8], ... Mesh=driving.scenario.pedestrianMesh,Name ="Target Pedestrian"); targetWaypoints = [55.25 -4 0; 55.25 -2 0; 55.25 0 0; 55.25 4 0]; targetSpeed = 5; % Convert speed value to m/s targetSpeed = (targetSpeed*1000)/3600; trajectory(movingTarget,targetWaypoints,targetSpeed);
Добавьте два транспортных средства в маршрут плеча сценария и установите их как статических агентов.
vehicle(scenario,ClassID=1,Length=4.25, ... Position=[50.75 -2.8125 0],FrontOverhang=0.45, ... Mesh=driving.scenario.carMesh,Name="Small Obstruction Vehicle"); vehicle(scenario,ClassID=1,Length=4.5,Width=1.825, ... Height=1.65,Position=[45.25 -2.8125 0],FrontOverhang=0.7, ... Mesh=driving.scenario.carMesh,Name="Large Obstruction Vehicle");
Сохраните сценарий seed в .mat
fie. Это позволяет вам использовать его, чтобы сгенерировать варианты сценария при помощи всех трех методов.
save("seedScenario.mat","scenario",'-mat');
Отобразите сценарий seed.
figScene = figure; set(figScene,Position=[50,50,500,500]); hPanel1 = uipanel(figScene,Position=[0 0 1 1]); hPlot1 = axes(hPanel1); plot(scenario,Parent=hPlot1); title("Seed Scenario") while advance(scenario) pause(0.01); end
Для скоростей автомобиля, оборудованного датчиком можно сгенерировать варианты сценария seed путем выполнения этих шагов:
Найдите момент времени, в который столкновение находится между двумя агентами в сценарии seed.
Задайте новое значение скорости для автомобиля, оборудованного датчиком.
Выберите параметр, чтобы измениться, чтобы сгенерировать вариант.
Вычислите модификации ко времени поступления автомобиля, оборудованного датчиком и целевого агента в каждом waypoint вдоль их траекторий.
Используйте helperComputeCollisionTimeInstant
функция, чтобы вычислить первый экземпляр времени столкновения между автомобилем, оборудованным датчиком и целевым агентом в сценарии. Функция идентифицирует автомобиль, оборудованный датчиком и целевого агента при помощи ActorID
s или имена агента задал при создании сценария seed. ActorID
значения и имена для каждого транспортного средства в сценарии хранятся в Actors
поле scenario
объект возвращен drivingScenario
функция.
table([scenario.Actors.ActorID],[scenario.Actors.Name],VariableNames={'ActorID','Name'})
ans=1×2 table
ActorID Name
________________ ____________________________________________________________________________________________
1 2 3 4 "Ego in Scenario" "Target Pedestrian" "Small Obstruction..." "Large Obstruction..."
Если любой Name
или ActorID
для эго и целевых агентов известны, можно вызвать helperComputeCollisionTimeInstant
функция при помощи любого из этих синтаксисов:
time = helperComputeCollisionTimeInstant(scenario,EgoID=value,TargetID=value)
- Используйте этот синтаксис, если вы знаете ActorID
значения для автомобиля, оборудованного датчиком и целевого агента. Функция вычисляет первый экземпляр времени столкновения между заданным автомобилем, оборудованным датчиком и целевым агентом.
[time,egoID,targetID] = helperComputeCollisionTimeInstant(scenario)
- Используйте этот синтаксис, если вы не знаете ActorID
значения для автомобиля, оборудованного датчиком и целевого агента. В этом случае, helperComputeCollisionTimeInstant
функционируйте проверки на агентов с именами, которые содержат слова "Ego
"и "Target
"и выбирает их как автомобиль, оборудованный датчиком и целевого агента, соответственно. Функция вычисляет первый экземпляр времени столкновения между выбранными агентами, и также возвращает их ActorID
значения.
[time,~,targetID] = helperComputeCollisionTimeInstant(scenario,EgoID=value)
- Используйте этот синтаксис, если вы не знаете ActorID
для целевого агента. В этом случае, helperComputeCollisionTimeInstant
функционируйте проверки на агента с именем, которое содержит слово "Target
"и выбирает его как целевого агента. Функция вычисляет первый экземпляр времени столкновения между автомобилем, оборудованным датчиком и выбранным агентом. Функция также возвращает ActorID
из выбранной цели.
[time,egoID,~] = helperComputeCollisionTimeInstant(scenario,TargetID=value)
- Используйте этот синтаксис, если вы не знаете ActorID
для автомобиля, оборудованного датчиком. В этом случае, helperComputeCollisionTimeInstant
функционируйте проверки на агента с именем, которое содержит слово "Ego
"и выбирает его как автомобиль, оборудованный датчиком. Функция вычисляет первый экземпляр времени столкновения между выбранным эго и целевым агентом. Функция также возвращает ActorID
из выбранного автомобиля, оборудованного датчиком.
Если оба Name
и ActorID
поскольку эго и целевые агенты не известны, вызывают helperComputeCollisionTimeInstant
функция при помощи этого синтаксиса:
[time,egoID,targetID] = helperComputeCollisionTimeInstant(scenario)
- Используйте этот синтаксис, если вы не знаете ActorID
значения и имена для автомобиля, оборудованного датчиком и целевого агента. В этом случае, helperComputeCollisionTimeInstant
функция выбирает транспортное средство с ActorID
значение 1 как автомобиль, оборудованный датчиком и ActorID
2 как целевой агент.
Задайте ActorID
из автомобиля, оборудованного датчиком и целевого агента, с которым это сталкивается в сценарии seed и вычисляет первый экземпляр времени столкновения.
egoID = 1; targetID = 2; collisionTime = helperComputeCollisionTimeInstant(scenario,egoID,targetID);
Сохраните скорость, waypoints, и ActorID
данные автомобиля, оборудованного датчиком и целевого агента как структуры.
egoData = struct("speed",egoSpeed,"waypoints",egoWaypoints,"id",egoID); targetData = struct("speed",targetSpeed,"waypoints",targetWaypoints,"id",targetID);
Если информация о рыскании для автомобиля, оборудованного датчиком и целевого агента известна, необходимо хранить информацию рыскания в структуре наряду с другими переменными в поле, названном "yaw"
. Например, если значение рыскания для автомобиля, оборудованного датчиком является 45 градусами, то используйте этот синтаксис:
egoData = struct("speed",egoSpeed,"waypoints",egoWaypoints,"id",egoID,"yaw",45)
.
Задайте новое значение скорости для автомобиля, оборудованного датчиком как 15 км/час.
egoNewSpeed = 15;
% Convert the speed value to m/s
egoNewSpeed = (egoNewSpeed*1000)/3600;
Используйте helperComputeCollisionTimeDiff
функция помощника, чтобы вычислить модификации ко времени поступления автомобиля, оборудованного датчиком и целевого агента в каждом waypoint вдоль их траекторий. Можно вычислить модификации путем изменения одного из этих трех параметров: WaitTime
, EntryTime
, или StartingPosition
. Функция оценивает новое время столкновения для нового значения скорости эго на основе параметра, который вы выбираете. helperComputeCollisionTimeDiff
функционируйте выводит структуру с этими полями:
egoCollisionTimeDiff
- Разница во времени между фактическим временем столкновения и временем столкновения, оцененным относительно автомобиля, оборудованного датчиком и новой скорости эго.
targetCollisionTimeDiff
- Разница во времени между временами столкновения целевого агента и автомобиля, оборудованного датчиком оценивается относительно новой скорости эго.
waypoints
- Новый waypoints сгенерирован для целевого агента. Функция возвращает это значение, только если стартовая позиция целевого агента изменяется.
Измените "WaitTime
"чтобы сгенерировать вариант сценария
Если вы выбираете "WaitTime
"чтобы сгенерировать вариант сценария, или автомобиль, оборудованный датчиком или целевой агент должны ожидать в его первом waypoint особого количества времени. Если новое значение скорости эго заставляет автомобиль, оборудованный датчиком прибывать точка столкновения перед целевым агентом, то функция заставляет автомобиль, оборудованный датчиком ожидать в его первом waypoint. Функция выполняет это, устанавливая скорость автомобиля, оборудованного датчиком в его первом waypoint обнулить в течение времени ожидания. Точно так же, если целевой агент прибывает точка столкновения перед автомобилем, оборудованным датчиком, функция заставляет целевого агента ожидать в его первом waypoint. helperComputeCollisionTimeDiff
функция возвращает значения для egoCollisionTimeDiff
и targetCollisionTimeDiff
на основе этого времени ожидания.
Задайте метод модификации как "WaitTime"
и вычислите разницу во времени столкновения.
method = "WaitTime";
wt_parameters = helperComputeCollisionTimeDiff(scenario,egoNewSpeed,collisionTime,egoData,targetData,method);
Смотрите выход helperComputeCollisionTimeDiff
функция. Ненулевое выходное значение для egoCollisionTimeDiff
указывает, что автомобиль, оборудованный датчиком достигает точки столкновения перед целевым агентом, таким образом, функция заставляет его ожидать в ее первом waypoint. Если значение для targetCollisionTimeDiff
поле является ненулевым, вместо этого, затем целевой агент достигает точки столкновения перед автомобилем, оборудованным датчиком, и функция заставляет его ожидать в ее первом waypoint.
wt_parameters
wt_parameters = struct with fields:
egoCollisionTimeDiff: 0
targetCollisionTimeDiff: 7.2600
waypoints: []
Измените "EntryTime
"чтобы сгенерировать вариант сценария
Если вы выбираете "EntryTime
"чтобы сгенерировать вариант сценария, функция изменяет время записи или автомобиля, оборудованного датчиком или целевого агента.
Время записи автомобиля, оборудованного датчиком изменяется, если автомобиль, оборудованный датчиком, как оценивается, достигает точки столкновения перед целевым агентом.
Время записи целевого агента изменяется, если целевой агент, как оценивается, достигает точки столкновения перед автомобилем, оборудованным датчиком.
Задайте метод модификации как "EntryTime
"и вычислите разницу во времени столкновения.
method = "EntryTime";
et_parameters = helperComputeCollisionTimeDiff(scenario,egoNewSpeed,collisionTime,egoData,targetData,method);
Смотрите выход helperComputeCollisionTimeDiff
функция. Ненулевое выходное значение для egoCollisionTimeDiff
указывает, что автомобиль, оборудованный датчиком достигает точки столкновения перед целевым агентом, таким образом, функция изменяет время записи автомобиля, оборудованного датчиком. Если значение для targetCollisionTimeDiff
поле является ненулевым, вместо этого, затем целевой агент достигает точки столкновения перед автомобилем, оборудованным датчиком, и функция изменяет время записи целевого агента.
et_parameters
et_parameters = struct with fields:
egoCollisionTimeDiff: 0
targetCollisionTimeDiff: 8.6700
waypoints: []
Измените "StartingPosition
"чтобы сгенерировать вариант сценария
Если вы выбираете "StartingPosition
"чтобы сгенерировать вариант сценария, функция изменяет стартовую позицию целевого агента. Чтобы использовать этот метод, новое значение скорости эго должно быть больше скорости эго в сценарии seed.
Задайте значение скорости эго как 70 км/час. Задайте метод модификации как "StartingPosition
"и вычислите разницу во времени столкновения. На основе разницы во времени функция изменяет стартовую позицию целевого агента.
egoSpeedSP = 70; % Convert value to m/s egoSpeedSP = (egoSpeedSP*1000)/3600; method = "StartingPosition"; sp_parameters = helperComputeCollisionTimeDiff(scenario,egoSpeedSP,collisionTime,egoData,targetData,method)
sp_parameters = struct with fields:
egoCollisionTimeDiff: 0
targetCollisionTimeDiff: 0
waypoints: [4x3 double]
Смотрите новую цель waypoints возвращенный helperComputeCollisionTimeDiff
функция.
sp_parameters.waypoints
ans = 4×3
55.2500 -3.5139 0
55.2500 -2.0000 0
55.2500 0 0
55.2500 4.0000 0
Сгенерируйте вариант сценария seed при помощи "WaitTime
"
метод.
load seedScenario method = "WaitTime"; wtScenario = helperModifyScenario(scenario,egoNewSpeed,egoData,targetData,wt_parameters,method);
Заметьте, что автомобиль, оборудованный датчиком ожидает в первом waypoint прежде, чем ускориться к новому значению скорости эго.
figScene = figure; set(figScene,Position=[50,50,500,500]); hPanel1 = uipanel(figScene,Position=[0 0 1 1]); hPlot1 = axes(hPanel1); plot(wtScenario,Parent=hPlot1); title({'Scenario Variant - WaitTime method';['Ego speed = ',num2str(egoNewSpeed*3.6),' km/hr']}) while advance(wtScenario) pause(0.01); end
Затем сгенерируйте вариант сценария seed при помощи "EntryTime
"метод. Заметьте, что целевой пешеход вводит сценарий в различное время. Время записи для целевого пешехода хранится в scenario
объект.
load seedScenario method = "EntryTime"; etScenario = helperModifyScenario(scenario,egoNewSpeed,egoData,targetData,et_parameters,method); etScenario.Actors(targetID).EntryTime
ans = 8.6700
Визуализируйте сгенерированный вариант сценария.
restart(etScenario) figScene = figure; set(figScene,Position=[50,50,500,500]); hPanel2 = uipanel(figScene,Position=[0 0 1 1]); hPlot2 = axes(hPanel2); plot(etScenario,Parent=hPlot2); title({'Scenario Variant - EntryTime method';['Ego speed = ',num2str(egoNewSpeed*3.6),' km/hr']}) while advance(etScenario) pause(0.01); end
Наконец, сгенерируйте вариант сценария seed при помощи "StartingPosition
"метод.
load seedScenario method = "StartingPosition"; spScenario = helperModifyScenario(scenario,egoSpeedSP,egoData,targetData,sp_parameters,method);
Визуализируйте сгенерированный сценарий.
restart(spScenario) figScene = figure; set(figScene,Position=[50,50,500,500]); hPanel3 = uipanel(figScene,Position=[0 0 1 1]); hPlot3 = axes(hPanel3); plot(spScenario,Parent=hPlot3); title({'Scenario Variant - StartingPosition method';['Ego speed = ',num2str(egoSpeedSP*3.6),' km/hr']}) while advance(spScenario) pause(0.01); end
Можно также сгенерировать сценарий seed при помощи приложения Driving Scenario Designer. Можно сохранить сценарий в .mat
файл и загрузка данные о сценарии, чтобы сгенерировать варианты.
При генерации вариантов сценария для тестирования систем AEB лучшая практика для нового значения скорости эго, чтобы быть меньше значения скорости эго в сценарии seed. В этом случае можно использовать только "WaitTime
"и "EntryTime
"методы для генерации вариантов.
Результаты не точны, если автомобиль, оборудованный датчиком и целевой агент сталкиваются на пересечении дорог.
В "WaitTime
"метод, если оба автомобиль, оборудованный датчиком и целевой агент присвоены время ожидания, вы не можете использовать сгенерированный вариант сценария для симуляций замкнутого цикла.
[1] ЕВРО Тестовый Протокол v3.0.4 NCAP AEB VRU. Доступный от: https://cdn.euroncap.com/media/62795/euro-ncap-aeb-vru-test-protocol-v304.pdf.
drivingScenario
| laneType
| lanespec
| trajectory
| plot
| advance
| restart