主要内容

用于测试AEB系统的自动场景变量生成

这个例子展示了如何自动生成两个参与者碰撞的种子场景的变体。您可以生成碰撞场景的随机变体,用于自动紧急制动(AEB)系统等自动驾驶应用程序的设计和验证。在本例中,您通过修改自我参与者的速度、碰撞和参与者到达路径点的时间来生成场景变量。但是,碰撞点与种子场景中相同。

  • 如果自我车辆多次与目标参与者碰撞,该示例将基于第一次碰撞实例生成场景变量。

  • 如果自我载体在一个场景中的不同时间与多个目标参与者碰撞,这个示例将仅针对一个目标参与者生成场景变体。您可以指定需要考虑的目标参与者来生成场景变量。

本例使用drivingScenario对象来创建种子场景,并提供辅助函数来从种子场景生成变量。示例的其余部分演示了生成场景变量所涉及的这些步骤。

生成种子场景—使用实例创建碰撞场景drivingScenario对象。场景可以包含任意数量的参与者和碰撞实例。然而,本例仅基于自我载体与指定目标参与者之间发生的第一个碰撞实例生成了一个变体。

生成种子场景的变体—使用helper函数修改种子场景helperComputeCollisionTimeInstanthelperComputeCollisionTimeDiff,helperModifyScenario.这些辅助函数使您能够通过改变自我车辆的速度、调整自我和目标参与者的等待时间和进入时间以及目标参与者的起始位置来生成种子场景的变体。以下是所涉及的步骤:

  • 查找碰撞时间实例-在种子场景中,使用辅助函数找到自我载具与特定目标发生碰撞的时间瞬间helperComputeCollisionTimeInstant

  • 指定新的自我速度并计算碰撞时间差-指定新的自我速度值和要更改的参数,以生成变量。使用helperComputeCollisionTimeDiff函数来计算改变自我和目标行动者在其轨迹上的每个路径点的到达时间所需的参数。的helperComputeCollisionTimeDiff函数使用计算出的碰撞时间来计算新的ego speed值的碰撞时间。

  • 修改种子场景-使用helperModifyScenario函数生成种子场景的变体。的helperModifyScenario方法计算的参数helperComputeCollisionTimeDiff函数来改变自我和目标行动者在每个航路点的到达时间。

可视化生成的场景—使用工具模拟和显示生成的场景变量情节函数。

生成种子场景

种子场景必须是碰撞场景,其中自我载体和场景中至少一个目标参与者之间发生碰撞。在本例中,生成Car-to-Pedestrian左侧的孩子欧洲新车评估计划(Euro NCAP)测试方案的测试场景作为种子场景。参与者的尺寸、位置、速度值和轨迹是根据欧洲NCAP测试协议要求设置的。

这个场景有一个自我载体和三个演员。在三个行动者中,一个是行人,这是自我车辆与之碰撞的移动目标。碰撞在模拟时间内只发生一次。自我的载体和非自我的行动者必须以恒定的速度行进。因此,自我车辆和目标参与者必须各自有一个标量速度值。

创建一个驾驶场景对象。

scenario = drivingScenario;

属性指定宽度和道路中心以创建道路函数。在道路上增加两条行车线和一条肩线lanespec函数。

roadCenters = [0 0 0;70 0 0];标记= [laneMarking(“固体”,Color=[0.98 0.86 0.36]),...laneMarking (“固体”), laneMarking (“固体”));ltype = [laneType(“开车”); laneType (“肩膀”));lspec = lanespec(2,Width=[5.4 2.6],Marking= Marking,Type=ltype);路(场景、roadCenters Name =“路”车道= lspec);

在场景中添加一辆自我车辆,并通过指定路径点和速度来设置其轨迹。将自我车辆的名称设置为“自我场景或者车辆测试”。本例使用的名字字段,以识别给定场景中的自我载体。因此,自我载体的名称必须包含“自我或者测试”。设定自我车辆的速度为60公里/小时。

egoVehicle =车辆(场景,ClassID=1,位置=[3.3 0 0],...轴距= 2.8,网= driving.scenario.carMesh,...Name =“情境中的自我”);egoWaypoints = [3.3 0 0;8.3 0 0;51.3 0 0;65 0 0];egoSpeed = 60;将速度值转换为m/segoSpeed = (egoSpeed*1000)/3600;轨迹(egoVehicle egoWaypoints egoSpeed);

添加一个优秀的演员行人并通过指定路径点和速度来设置其轨迹。指定路径点和速度,以便它与自我车辆碰撞。将目标车辆的名称设置为“目标行人”。本例使用的名字字段来识别给定场景中的移动目标。因此,目标参与者的名称必须包含单词“目标”。设定目标演员的速度为5公里/小时。

movingTarget = actor(场景,ClassID=4,...长=0.711,宽=0.5,高=1.154,...Position=[55.25 -4 0], rcpattern =[-8 -8;-8 -8],...网= driving.scenario。pedestrianMesh名称=“目标行人”);targetWaypoints = [55.25 -4 0;55.25 -2 0;55.25 0 0;55.25 4 0];targetSpeed = 5;将速度值转换为m/s目标速度=(目标速度*1000)/3600;轨迹(movingTarget targetWaypoints targetSpeed);

将两辆车添加到场景的肩道,并将它们设置为静态actor。

车辆(场景,ClassID = 1,长度= 4.25,...位置=[50.75 -2.8125 0],FrontOverhang=0.45,...网= driving.scenario.carMesh Name =“小型障碍车辆”);车辆(场景,ClassID = 1,长度= 4.5,宽= 1.825,...身高=1.65,位置=[45.25 -2.8125 0],FrontOverhang=0.7,...网= driving.scenario.carMesh Name =“大型障碍物车辆”);

将种子场景保存到.mat五。这使您能够使用这三种方法来生成场景变量。

保存(“seedScenario.mat”“场景”“垫”);

显示种子场景。

figScene =图;集(figScene位置= [50500500]);hPanel1 = uipanel(figScene,Position=[0 0 1 1]);hPlot1 = axes(hPanel1);情节(场景中,父= hPlot1);标题(“种子场景”推进(场景)暂停(0.01);结束

图中包含一个axis对象和一个uipanel类型的对象。标题为Seed Scenario的axes对象包含8个类型为patch、line的对象。"width=

生成种子场景的变体

对于ego车辆速度,您可以按照以下步骤生成种子场景的变体:

  1. 找到种子场景中两个参与者发生碰撞的时间瞬间。

  2. 为自我车辆指定一个新的速度值。

  3. 选择要更改的参数以生成变体。

  4. 计算自我飞行器和目标行动者在各自轨迹上的每个路径点到达时间的修改。

查找碰撞时间实例

使用helperComputeCollisionTimeInstant函数计算场景中自我车辆与目标参与者之间的第一次碰撞时间实例。函数识别自我载体和目标参与者ActorIDS或在创建种子场景时指定的参与者名称。的ActorID场景中每个车辆的值和名称存储在演员字段场景对象返回的drivingScenario函数。

表([scenario.Actors.ActorID], [scenario.Actors.Name], VariableNames = {“ActorID”“名字”})
ans =1×2表ActorID名字  ________________ ____________________________________________________________________________________________ 1 2 3 4场景”中“自我”的目标行人”“小阻塞……”“大阻塞……”

如果任何的名字ActorID对于自我和目标行动者已知,可以调用helperComputeCollisionTimeInstant函数可以使用以下语法:

  • time = helperComputeCollisionTimeInstant(scenario,EgoID=value,TargetID=value)-如果你知道ActorID自我载体和目标参与者的值。该函数计算指定的自我车辆和目标参与者之间的第一次碰撞时间实例。

  • [time,egoID,targetID] = helperComputeCollisionTimeInstant(场景)-如果您不知道ActorID自我载体和目标参与者的值。在这种情况下,helperComputeCollisionTimeInstant函数检查名称包含“”字样的参与者。自我“而且”目标然后选择他们分别作为自我载体和目标行动者。该函数计算所选参与者之间的第一个碰撞时间实例,并返回它们的碰撞时间ActorID值。

  • [time,~,targetID] = helperComputeCollisionTimeInstant(scenario,EgoID=value)-如果您不知道ActorID对于目标参与者。在这种情况下,helperComputeCollisionTimeInstant函数检查名称中包含单词"的参与者。目标并选择它作为目标参与者。该函数计算自我车辆和所选参与者之间的第一次碰撞时间实例。函数还返回ActorID所选目标的。

  • [time,egoID,~] = helperComputeCollisionTimeInstant(scenario,TargetID=value)-如果您不知道ActorID为了自我的载体。在这种情况下,helperComputeCollisionTimeInstant函数检查名称中包含单词"的参与者。自我并选择它作为自我的载体。该函数计算所选自我与目标参与者之间的第一次碰撞时间实例。函数还返回ActorID选择的自我载体。

如果两者都的名字而且ActorID对于自我和目标演员都不知道,就叫其helperComputeCollisionTimeInstant函数,使用以下语法:

  • [time,egoID,targetID] = helperComputeCollisionTimeInstant(场景)-如果您不知道ActorID自我载体和目标参与者的值和名称。在这种情况下,helperComputeCollisionTimeInstant功能选择车辆与ActorID值1作为自我载体ActorID2作为目标行动者。

指定ActorID自我载具和它在种子场景中碰撞的目标参与者的信息,并计算第一次碰撞时间实例。

egoID = 1;targetID = 2;collisionTime = helperComputeCollisionTimeInstant(scenario,egoID,targetID);

存储速度、路径点和ActorID自我载体和目标行动者的数据作为结构。

egoData = struct(“速度”egoSpeed,“锚点”egoWaypoints,“id”, egoID);targetData = struct(“速度”targetSpeed,“锚点”targetWaypoints,“id”targetID);

如果自我飞行器和目标参与者的偏航信息已知,则必须将偏航信息与其他变量一起存储在结构中,并将其存储在名为“偏航”.例如,如果自我飞行器的偏航值是45度,那么使用下面的语法:

egoData = struct(“speed”,egoSpeed,“waypoints”,egoWaypoints,“id”,egoID,“偏航”,45)

指定新的自我速度和计算碰撞时间差

指定自我车辆的新速度值为15公里/小时。

egoNewSpeed = 15;%将速度值转换为m/segoNewSpeed = (egoNewSpeed*1000)/3600;

使用helperComputeCollisionTimeDiff辅助函数,用于计算自我车辆和目标行为人在其轨迹上的每个路径点到达时间的修改。您可以通过更改以下三个参数之一来计算修改:WaitTimeEntryTime,或StartingPosition.该函数根据您选择的参数为新的自我速度值估计新的碰撞时间。的helperComputeCollisionTimeDiff函数输出一个包含以下字段的结构:

egoCollisionTimeDiff-实际碰撞时间和根据自我车辆和新的自我速度估计的碰撞时间之间的时间差。

targetCollisionTimeDiff-根据新的自我速度估算出的目标行动者与自我车辆碰撞次数的时间差。

路点-为目标参与者生成新的路径点。只有当目标参与者的起始位置被修改时,函数才返回这个值。

改变WaitTime生成场景变量

如果你选择“WaitTime为了生成场景变体,自我载体或目标参与者必须在其第一个路径点等待特定的时间。如果新的自我速度值导致自我载具在目标参与者之前到达碰撞点,那么该函数将使自我载具在其第一个路径点等待。该函数通过将自我车辆在其第一个路径点的速度设置为等待时间的零来实现这一点。类似地,如果目标参与者在自我车辆之前到达碰撞点,该函数将使目标参与者在其第一个路径点等待。的helperComputeCollisionTimeDiff函数返回的值为egoCollisionTimeDiff而且targetCollisionTimeDiff基于这个等待时间。

将修改方法指定为“WaitTime”并计算碰撞时间差。

方法=“WaitTime”;wt_parameters = helperComputeCollisionTimeDiff(scenario,egoNewSpeed,collisionTime,egoData,targetData,method);

检查输出helperComputeCollisionTimeDiff函数。的非零输出值egoCollisionTimeDiff指示自我车辆在目标参与者之前到达碰撞点,因此函数使其在第一个路径点等待。的值targetCollisionTimeDiffField非零,则目标参与者在自我车辆之前到达碰撞点,函数使其在第一个路径点等待。

wt_parameters
wt_parameters =带字段的结构:egoCollisionTimeDiff: 0 targetCollisionTimeDiff: 7.2600 waypoints: []

改变EntryTime生成场景变量

如果你选择“EntryTime为了生成场景变量,该函数修改自我载体或目标参与者的进入时间。

  • 如果自我载具估计在目标行为人之前到达碰撞点,则自我载具的进入时间被修改。

  • 如果目标参与者估计在自我车辆之前到达碰撞点,则修改目标参与者的进入时间。

将修改方法指定为“EntryTime并计算碰撞时间差。

方法=“EntryTime”;et_parameters = helperComputeCollisionTimeDiff(scenario,egoNewSpeed,collisionTime,egoData,targetData,method);

检查输出helperComputeCollisionTimeDiff函数。的非零输出值egoCollisionTimeDiff指示自我载具在目标参与者之前到达碰撞点,因此函数修改自我载具的进入时间。的值targetCollisionTimeDiffField为非零,则目标参与者在自我车辆之前到达碰撞点,函数修改目标参与者的进入时间。

et_parameters
et_parameters =带字段的结构:egoCollisionTimeDiff: 0 targetCollisionTimeDiff: 8.6700 waypoints: []

改变StartingPosition生成场景变量

如果你选择“StartingPosition为了生成场景变量,函数修改了目标参与者的起始位置。要使用这种方法,新的自我速度值必须大于种子场景中的自我速度。

指定ego speed值为70 km/hr。将修改方法指定为“StartingPosition并计算碰撞时间差。基于时间差,函数改变目标参与者的起始位置。

egoSpeedSP = 70;将值转换为m/segoSpeedSP = (egoSpeedSP*1000)/3600;方法=“StartingPosition”;sp_parameters = helperComputeCollisionTimeDiff(scenario,egoSpeedSP,collisionTime,egoData,targetData,method)
sp_parameters =带字段的结构:egoCollisionTimeDiff: 0 targetCollisionTimeDiff: 0 waypoints: [4x3 double]

方法返回的新目标路径点helperComputeCollisionTimeDiff函数。

sp_parameters.waypoints
ans =4×355.2500 -3.5139 0 55.2500 -2.0000 55.2500 00 55.2500 4.0000 0

修改种子场景

通过使用“”生成种子场景的变体WaitTime方法。

负载seedScenario方法=“WaitTime”;wtScenario = helperModifyScenario(scenario,egoNewSpeed,egoData,targetData,wt_parameters,method);

显示生成的场景变体

请注意,在加速到新的自我速度值之前,自我载具在第一个路径点等待。

figScene =图;集(figScene位置= [50500500]);hPanel1 = uipanel(figScene,Position=[0 0 1 1]);hPlot1 = axes(hPanel1);情节(wtScenario、家长= hPlot1);标题({'场景变体-等待时间方法';['自我速度= 'num2str (egoNewSpeed * 3.6)公里/小时的]})推进(wtScenario)暂停(0.01);结束

图中包含一个axis对象和一个uipanel类型的对象。标题为Scenario Variant - WaitTime方法Ego speed = 15 km/hr的坐标轴对象包含8个类型为patch、line的对象。"width=

接下来,通过使用“EntryTime”的方法。注意,目标行人在不同的时间进入场景。目标行人的进入时间存储在场景对象。

负载seedScenario方法=“EntryTime”;etScenario = helperModifyScenario(scenario,egoNewSpeed,egoData,targetData,et_parameters,method);etScenario.Actors .EntryTime (targetID)
Ans = 8.6700

可视化生成的场景变量。

restart(etScenario) figScene = figure;集(figScene位置= [50500500]);hPanel2 = uipanel(figScene,Position=[0 0 1 1]);hPlot2 = axes(hPanel2);情节(etScenario、家长= hPlot2);标题({'场景变体- EntryTime方法';['自我速度= 'num2str (egoNewSpeed * 3.6)公里/小时的]})推进(etScenario)暂停(0.01);结束

图中包含一个axis对象和一个uipanel类型的对象。标题为Scenario Variant - EntryTime方法Ego speed = 15 km/hr的坐标轴对象包含8个类型为patch、line的对象。"width=

最后,通过使用“StartingPosition”的方法。

负载seedScenario方法=“StartingPosition”;spScenario = helperModifyScenario(scenario,egoSpeedSP,egoData,targetData,sp_parameters,method);

可视化生成的场景。

restart(spScenario) figScene = figure;集(figScene位置= [50500500]);hPanel3 = uipanel(figScene,Position=[0 0 1 1]);hPlot3 = axes(hPanel3);情节(spScenario、家长= hPlot3);标题({'场景变体- StartingPosition方法';['自我速度= 'num2str (egoSpeedSP * 3.6)公里/小时的]})推进(spScenario)暂停(0.01);结束

图中包含一个axis对象和一个uipanel类型的对象。标题为Scenario Variant - StartingPosition方法Ego speed = 70 km/hr的坐标轴对象包含8个类型为patch、line的对象。"width=

提示

  • 方法还可以生成种子场景驾驶场景设计可将该场景保存到.mat文件和加载场景数据以生成变量。

  • 当生成用于测试AEB系统的场景变量时,最佳实践是新的自我速度值小于种子场景中的自我速度值。在这种情况下,只能使用WaitTime“而且”EntryTime“生成变量的方法。

限制

  • 当自我车辆与目标行为人在路口发生碰撞时,其结果是不准确的。

  • 在“WaitTime方法,如果自我车辆和目标参与者都分配了等待时间,则不能将生成的场景变量用于闭环模拟。

参考文献

[1] EURO NCAP AEB VRU测试协议v3.0.4。可以从:https://cdn.euroncap.com/media/62795/euro-ncap-aeb-vru-test-protocol-v304.pdf

另请参阅

应用程序

功能

相关的话题