主要内容

以编程方式创建驱动场景

这个例子展示了如何生成合成传感器数据和跟踪算法的地面真相。它还显示了如何更新演员姿态在开环和闭环仿真。最后,展示了如何使用驾驶场景执行坐标转换并将它们合并到鸟瞰图中。

在本例中,您将从MATLAB®命令行以编程方式创建驱动场景。属性以交互方式创建场景驾驶场景设计师例如,请参见交互式创建驾驶场景和生成合成传感器数据

介绍

驾驶场景的目标之一是生成“地面真相”测试用例,用于特定车辆上的传感器检测和跟踪算法。

这个ground truth通常定义在一个全局坐标系中;但是,由于传感器通常安装在移动的车辆上,这些数据需要转换成与车辆一起移动的参考系。驾驶场景自动促进了这种转换,允许您在全局坐标中指定对象的道路和轨迹,并提供工具来在场景中的任何参与者的参考框架中转换和可视化这些信息。

将姿态信息转换为参与者的参考框架

一个drivingScenario由道路模型和可移动物体组成,称为行动者。您可以使用actors来建模场景中的行人、停车计时器、消防栓和其他对象。角色由长、宽、高的长方体和雷达横截面(RCS)组成。一个参与者被定位和导向在其底部面中心的一个单一点。

在车轮上移动的一种特殊的行动者是车辆,它位于后轴中心正下方的地面上,这是一个更自然的旋转中心。

所有参与者(包括车辆)可以通过指定他们各自的位置放置在场景中的任何地方位置球场偏航速度,AngularVelocity属性。

下面是一个场景的例子,两辆车相距10米,分别以每秒3米和4米的速度向原点驶去:

场景= drivingScenario;v1 =车辆(场景中,“ClassID”1 ',“位置”(6 0 0),“速度”(3 0 0),“偏航”, 180)
v1 =车辆的属性:FrontOverhang: 0.9000 RearOverhang: 1轴距:2.8000 EntryTime: 0 ExitTime:正ActorID: 1 ClassID: 1名称:“PlotColor:[0 0.4470 - 0.7410]位置:[6 0 0]速度:[3 0 0]偏航:180节:0卷:0 AngularVelocity:(0 0 0)长度:4.7000宽度:1.8000高度:1.4000网:[1 x1 extendedObjectMesh] RCSPattern:[2x2 double] RCSAzimuthAngles: [-180 180] RCSElevationAngles: [-90 90]
v2 =车辆(场景中,“ClassID”, 1“位置”(10 0),“速度”(0 4 0),“偏航”, -90)
v2 =车辆的属性:FrontOverhang: 0.9000 RearOverhang: 1轴距:2.8000 EntryTime: 0 ExitTime:正ActorID: 2 ClassID: 1名称:“PlotColor:(0.8500 0.3250 0.0980)位置:[0 10 0]速度:[0 4 0]偏航:-90节:0卷:0 AngularVelocity:(0 0 0)长度:4.7000宽度:1.8000高度:1.4000网:[1x1 extendedobjectesh] rcsppattern: [2x2 double] RCSAzimuthAngles: [-180 180] RCSElevationAngles: [-90 90]

要想象一个场景,打电话给情节功能上:

情节(场景);集(gcf,“名字”“场景情节”20) xlim ([-20]);ylim (20 [-20]);

创建了场景中的所有参与者之后,您可以通过检查位置球场偏航速度,AngularVelocity属性,或者可以通过调用actorPoses场景功能:

美联社= actorPoses(场景)
ap = 2x1 struct数组与字段:ActorID位置速度滚动俯仰偏航角速度

要获取特定参与者在其自己的参考系中看到的所有其他物体(或目标)的姿态信息,可以调用targetPoses对actor本身的函数:

v2TargetPoses = targetPoses (v2)
v2targetpose = struct with fields: ActorID: 1 ClassID: 1 Position: [10 6.0000] Velocity: [-4 -3.0000] Roll: 0 Pitch: 0 Yaw: -90.0000 AngularVelocity: [0 00]

我们可以通过添加一辆车的追逐图来定性地确定车辆的相对位置。默认情况下,追逐情节显示的是从车辆后面固定距离的投射透视视图。

这里我们展示了第二辆车后面的透视图(红色)。第二辆车所看到的目标姿态显示,另一辆车(蓝色)的位置在第二辆车前方6米,左侧10米。我们可以从追逐图中看出这一点:

chasePlot (v2)组(gcf,“名字”“追逐情节”

一般情况下,所有与驾驶场景相关的图都会在模拟过程中进行更新推进函数。如果手动更新另一个参与者的位置属性,则可以调用updatePlots要立即看到结果:

v1。偏航= 135;updatePlots(场景);

将道路边界转换为行动者的参考框架

驾驶场景还可以用于检索场景中定义的道路边界。

这里我们使用了简单的椭圆轨迹以程序方式定义道路布局,占地约200米长,100米宽,曲度为9度:

场景= drivingScenario;roadCenters =...[0 40 49 50 100 50 49 40 -40 -49 -50 -100 -50 -49 -40 0 -50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 00 00];bankAngles =...[0 0 9 9 9 9 9 9 0 0 9 9 9 9 9 0 0];路(场景、roadCenters bankAngles“道”lanespec (2));情节(场景);

若要获取定义道路边界的线,请使用roadBoundaries驱动场景命令功能。它返回一个包含道路边界的单元格数组(在上面的场景图中显示为实黑线)。

rb = roadBoundaries(场景)
Rb = 1x2 cell array {258x3 double} {258x3 double}

在上面的例子中,有两个道路边界(一个外部边界和一个内部边界)。你可以自己绘制如下图:

figure outerBoundary = rb{1};innerBoundary = rb {2};plot3 (innerBoundary (: 1) innerBoundary (:, 2), innerBoundary (:, 3),“r”...outerBoundary (: 1), outerBoundary (:, 2), outerBoundary (:, 3),‘g’)轴平等的

你可以使用roadBoundaries函数,以获得角色坐标中的道路边界。为此,只需将actor作为第一个参数传递,而不是场景。

为了看到这一点,添加一个“自我载体”,并将其放在轨道上:

egoCar =车辆(场景中,“ClassID”, 1“位置”(80 -40 0.45),“偏航”, 30);

接下来,调用roadBoundaries在飞行器上起作用,像之前一样画出来。它将被渲染相对于车辆的坐标:

figure rb = roadBoundaries(egoCar) outerBoundary = rb{1};innerBoundary = rb {2};plot3 (innerBoundary (: 1) innerBoundary (:, 2), innerBoundary (:, 3),“r”...outerBoundary (: 1), outerBoundary (:, 2), outerBoundary (:, 3),‘g’)轴平等的
Rb = 1x2 cell array {258x3 double} {258x3 double}

指定演员轨迹

您可以沿着预定义的三维路径定位和绘制任何特定的参与者。

下面是两辆车分别以30米/秒和50米/秒的速度在跑道上行驶的例子,每辆车都在各自的车道上。我们通过将偏移位置设置为2.7米的半车道宽度,以及赛道倾斜角度部分的一半,使车辆从道路中心偏移:

chasePlot (egoCar);fastCar =车辆(场景中,“ClassID”1);d = 2.7 / 2;h = .45/2;roadOffset = d [0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 d d d - d - d - d - d d d d - d - d - d - d 0 0 h h h h h 0 0 h h h h h 0 0] ';rWayPoints =道路中心+道路偏移量;lWayPoints = roadCenters - roadOffset;绕着跑道跑四圈rWayPoints = [repmat (rWayPoints (1: end-1,:), 5, 1);: rWayPoints (1)];lWayPoints = [repmat (lWayPoints (1: end-1,:), 5, 1);: lWayPoints (1)];smoothTrajectory (egoCar rWayPoints (:,:), 30);smoothTrajectory (fastCar lWayPoints (:,:), 50);

推进仿真

通过调用更新跟踪轨迹的参与者推进关于驾驶场景。当推进调用时,沿着轨迹的每个参与者将向前移动,相应的情节将被更新。只有定义了轨迹的参与者才会更新。这样您就可以在模拟运行时提供自己的逻辑。

SampleTime属性控制更新之间的时间间隔。默认值是10毫秒,但是你可以用任意的分辨率来指定:

场景。SampleTime = 0.02
scenario = driingscenario with properties: SampleTime: 0.0200 StopTime: Inf SimulationTime: 0 IsRunning: 1 Actors: [1x2 driving.scenario. .]障碍物:[0x0 driving.scenario.Barrier]

您可以通过调用来运行模拟推进在while循环的条件句中,并在循环体中放置检查或修改场景的命令。

当任何车辆的轨迹完成或可选时,while循环将自动终止StopTime已经达到了。

场景。StopTime= 4;推进(场景)暂停(0.001)结束

记录一个场景

为方便起见,当所有行动者的轨迹预先已知时,可以调用记录函数用于返回一个结构,该结构包含每个参与者在每个时间步中的姿态信息。

例如,您可以检查模拟的前100毫秒内每个参与者的姿态信息,并检查第5个记录的样本:

关闭所有场景。StopTime= 0.100; poseRecord = record(scenario) r = poseRecord(5) r.ActorPoses(1) r.ActorPoses(2)
poseRecord = 1 x5结构体数组字段:SimulationTime ActorPoses r =结构体字段:SimulationTime: 0.0800 ActorPoses: [2 x1 struct] ans =结构体字段:ActorID: 1位置:[2.4000 - -51.3502 0]速度:30.0000 - -0.0038[0]卷:0节:0偏航:-0.0073 AngularVelocity: [0 0 -0.0823] ans =结构体字段:ActorID: 2位置:[4.0000 -48.6504 0]速度:[50.0000 -0.0105 0]滚动:0俯仰:0偏航:-0.0120角速度:[0 0 -0.1235]

结合鸟瞰图的多个视图

在调试模拟时,您可能希望报告特定参与者的鸟瞰图中的“ground truth”数据,同时查看由场景生成的图。要做到这一点,你可以先创建一个自定义排列的图形:

关闭所有;hFigure =图;hFigure.Position (3) = 900;hPanel1 = uipanel (hFigure,“单位”“归一化”“位置”,[0 1/4 1/2 /4],“标题”“场景情节”);hPanel2 = uipanel (hFigure,“单位”“归一化”“位置”,[0 0 1/2 1/4]“标题”“追逐情节”);hPanel3 = uipanel (hFigure,“单位”“归一化”“位置”,[1/2 0 /2 1],“标题”“鸟”眼中的阴谋”);hAxes1 =轴(“父”, hPanel1);hAxes2 =轴(“父”, hPanel2);hAxes3 =轴(“父”, hPanel3);

一旦定义了坐标轴,就可以通过属性:

%将场景图分配到第一个轴,并为actor 1和2添加指示符情节(场景中,“父”hAxes1,“ActorIndicators”[1, 2]);%分配追逐图到第二个轴chasePlot (egoCar“父”, hAxes2);%将鸟瞰图分配到第三个轴egoCarBEP = birdsEyePlot (“父”hAxes3,“XLimits”(-200 200),“YLimits”240年[-240]);fastTrackPlotter = trackPlotter (egoCarBEP,“MarkerEdgeColor”“红色”“DisplayName的”“目标”“VelocityScaling”5);egoTrackPlotter = trackPlotter (egoCarBEP,“MarkerEdgeColor”“蓝”“DisplayName的”“自我”“VelocityScaling”5);egoLanePlotter = laneBoundaryPlotter (egoCarBEP);plotTrack (egoTrackPlotter [0 0]);egoOutlinePlotter = outlinePlotter (egoCarBEP);

现在可以重新启动模拟并运行到完成,这一次通过提取目标汽车的位置信息targetPoses并在鸟瞰图中显示出来。类似地,你也可以调用roadBoundariestargetOutlines直接从自我车辆中提取道路边界和行动者的轮廓。鸟瞰图能够直接显示这些函数的结果:

重启(场景)的场景。StopTime =正;advance(scenario) t = targetpose (egoCar);plotTrack (fastTrackPlotter t.Position t.Velocity);苏格兰皇家银行(rbs) = roadBoundaries (egoCar);plotLaneBoundary (egoLanePlotter,苏格兰皇家银行);[position, yaw, length, width, originOffset, color] = targetOutlines(egoCar);位置,偏航,长度,宽度,“OriginOffset”originOffset,“颜色”、颜色);结束

下一个步骤

这个例子展示了如何生成和可视化地面的合成传感器数据和跟踪算法使用drivingScenario对象。要在交互式环境中模拟、可视化或修改此驾驶场景,请尝试导入drivingScenario对象导入Driving Scenario Designer应用程序:

drivingScenarioDesigner(场景)

进一步的信息

有关如何定义角色和道路的更多信息,请参见以编程方式创建Actor和Vehicle的轨迹以程序方式定义道路布局

有关如何使用带有探测和轨迹的鸟瞰图的更深入示例,请参见可视化传感器覆盖,探测和轨迹

有关使用驾驶场景来帮助生成合成数据的示例,请参见模型雷达传感器检测模型视觉传感器检测,基于合成雷达和视觉数据的传感器融合

另请参阅

应用程序

对象

功能

相关的话题