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

В этом примере показано, как автоматически сгенерировать варианты сценария 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

Сценарий 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

Figure contains an axes object and an object of type uipanel. The axes object with title Seed Scenario contains 8 objects of type patch, line.

Сгенерируйте варианты сценария Seed

Для скоростей автомобиля, оборудованного датчиком можно сгенерировать варианты сценария seed путем выполнения этих шагов:

  1. Найдите момент времени, в который столкновение находится между двумя агентами в сценарии seed.

  2. Задайте новое значение скорости для автомобиля, оборудованного датчиком.

  3. Выберите параметр, чтобы измениться, чтобы сгенерировать вариант.

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

Найдите экземпляр времени столкновения

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

Сгенерируйте вариант сценария 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

Figure contains an axes object and an object of type uipanel. The axes object with title Scenario Variant - WaitTime method Ego speed = 15 km/hr contains 8 objects of type patch, line.

Затем сгенерируйте вариант сценария 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

Figure contains an axes object and an object of type uipanel. The axes object with title Scenario Variant - EntryTime method Ego speed = 15 km/hr contains 8 objects of type patch, line.

Наконец, сгенерируйте вариант сценария 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

Figure contains an axes object and an object of type uipanel. The axes object with title Scenario Variant - StartingPosition method Ego speed = 70 km/hr contains 8 objects of type patch, line.

Советы

  • Можно также сгенерировать сценарий 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.

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

Приложения

Функции

Похожие темы