主要内容

以编程方式创建驾驶场景

此示例演示如何为合成传感器数据和跟踪算法生成地面真实值。它还显示了如何在开环和闭环模拟中更新演员姿势。最后,演示了如何使用驾驶场景执行坐标转换,并将它们合并到鸟瞰图中。

在本例中,您可以从MATLAB®命令行以编程方式创建驱动场景。或者,您可以通过使用驾驶场景设计器app.有关示例,请参阅交互式创建驾驶场景,生成合成传感器数据

介绍

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

该地面真实值通常在全球坐标系中定义;但是,由于传感器通常安装在移动车辆上,因此需要将该数据转换为随车辆移动的参考坐标系。驾驶场景会自动促进此转换,允许您在gl中指定道路和对象的轨迹obal协调并提供工具,在场景中任何参与者的参考框架中转换和可视化这些信息。

将姿势信息转换为演员的参考帧

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

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

所有参与者(包括车辆)可通过指定其各自的位置放置在场景中的任何位置位置偏航速度AngularVelocity财产。

这里有一个场景的例子,两辆车相距10米,以每秒3米和4米的速度朝原点驶去:

场景= drivingScenario;v1 =车辆(场景中,“ClassID”,1',“位置”(6 0 0),“速度”,[-3 0 0],“偏航”, 180)
v1=具有以下特性的车辆:前悬:0.9000后悬:1轴距:2.8000入口时间:0出口时间:Inf ActorID:1 ClassID:1名称:“”绘图颜色:[0.4470 0.7410]位置:[6 0 0]速度:[-3 0]偏航:180节距:0横滚:0角度速度:[0 0 0 0 0]长度:4.7000宽度:1.8000高度:1.4000网格:[1x1 extendedObjectMesh]RCSPattern:[2x2双]RCSAzimuthAngles:[-180]RCSElevationAngles:[-90]
v2 =车辆(场景中,“ClassID”1.“位置”(10 0),“速度”,[0 -4 0],“偏航”, -90)
v2=具有以下特性的车辆:前悬:0.9000后悬:1轴距:2.8000入口时间:0出口时间:Inf ActorID:2 ClassID:1名称:“”绘图颜色:[0.8500 0.3250 0.0980]位置:[0 10 0]速度:[0-40]偏航:-90节距:0横滚:0角速度:[0 0 0 0 0 0 0]长度:4.7000宽度:1.8000高度:1.4000网格:[1x1 extendedObjectMesh]RCSPattern:[2x2双]RCSAzimuthAngles:[-180]RCSElevationAngles:[-90]

要可视化场景,请调用情节它的功能:

绘图(场景);设置(gcf,“名字”“场景情节”)xlim([-20]);ylim([-20]);

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

ap=actorPoses(场景)
ap = 2x1 struct array with fields: ActorID Position Velocity Roll Pitch Yaw angle Velocity . ap = 2x1 struct array with fields

要获取特定参与者在其自己的参考帧中看到的所有其他对象(或目标)的姿势信息,可以调用targetPoses作用于actor本身:

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

我们可以通过为车辆添加追逐图定性地确认相对车辆位置。默认情况下,追逐图显示车辆后方固定距离的投影透视图。

这里我们展示了第二辆车(红色)后面的视角。第二辆车看到的目标姿态显示,另一辆车(蓝色)的位置在第二辆车前方6米和左边10米。我们可以从追捕情节中看出来:

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

通常情况下,所有与驾驶场景相关的图都是在模拟过程中调用推进作用如果手动更新另一个参与者的position属性,则可以调用updatePlots要立即看到结果:

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

将道路边界转换为角色的参考框架

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

这里我们使用中描述的简单椭圆形轨迹以编程方式定义道路布局,面积约二百米长,一百米宽,曲线成九度角,

场景= 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 00 0 .45 .45 .45 . 50 . 50 . 50 00 . 50 . 50 . 50 . 50 00 . 50 . 50 . 50 . 50 00bankAngles =...[0 0 9 9 9 0 0 9 9 9 9 0 0];道路(场景、道路中心、河岸角、,“道”情节(情景);

要获得定义道路边界的线,请使用道路边界功能在驾驶场景。它返回一个单元格数组,其中包含道路边界(在上面的场景图中显示为黑色实线)。

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”...外三元(:,1),外三元(:,2),外三元(:,3),‘g’)轴平等的

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

要看到这一点,添加一个“自我载体”,并把它放在轨道上:

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

接下来,调用道路边界在车辆上的功能,并绘制它像以前一样。它将相对于车辆的坐标进行渲染:

figure rb = roadBoundaries(egoCar) outerBoundary = rb{1};innerBoundary = rb {2};plot3 (innerBoundary (: 1) innerBoundary (:, 2), innerBoundary (:, 3),“r”...外三元(:,1),外三元(:,2),外三元(:,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 -道路偏移量;绕跑道四圈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 = drivingScenario with properties: SampleTime: 0.0200 StopTime: Inf SimulationTime: 0 IsRunning: 1 Actors: [1x2 driving.scenario.]障碍:[0x0驾驶。场景。parklots: [0x0 driving.scenario. parklot]

您可以通过调用推进在while循环的条件下,在循环体中放置命令以检查或修改场景。

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

场景1.StopTime=4;虽然推进(场景)暂停(0.001)结束

记录一个场景

为了方便起见,当所有参与者的轨迹都提前知道时,您可以调用记录函数返回一个结构,该结构包含每个参与者在每个时间步长的姿态信息。

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

关闭全部的场景。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.000 -0.0105 0]滚:0俯仰:0偏航:-0.0120角速度:[0 0 -0.1235]

结合多种视图与鸟的眼睛图

调试模拟时,您可能希望报告特定参与者的鸟瞰图中的“地面真相”数据,同时查看场景生成的图。为此,您可以首先创建一个图形,并将轴放置在自定义排列中:

关闭全部的;hFigure=图形;hFigure.位置(3)=900;hPanel1=仪表板(hFigure,“单位”“归一化”“位置”,[0 1/4 / 3/4],“头衔”“场景情节”);hPanel2 = uipanel (hFigure,“单位”“归一化”“位置”,[0 0 1/2 1/4],“头衔”“追逐情节”);hPanel3=uipanel(图,“单位”“归一化”“位置”,[1/2 0 1/2],“头衔”“鸟瞰图”); hAxes1=轴(“家长”, hPanel1);hAxes2 =轴(“家长”,hPanel2);hAxes3=轴(“家长”, hPanel3);

定义轴后,可以通过属性创建打印时:

%分配场景图到第一个轴,并为ActorIDs 1和2添加指示器情节(场景,“家长”,hAxes1,“ActorIndicators”,[1 2]);%将chase plot指定给第二个轴chasePlot (egoCar“家长”, hAxes2);%将鸟瞰图指定给第三个轴egoCarBEP = birdsEyePlot (“家长”hAxes3,“XLimits”(-200 200),“YLimits”,[-240]);fastTrackPlotter=轨迹绘图仪(egoCarBEP,“MarkerEdgeColor”“红色”“DisplayName的”“目标”“速度缩放”5);egoTrackPlotter = trackPlotter (egoCarBEP,“MarkerEdgeColor”“蓝色”“DisplayName的”“自我”“速度缩放”5);egoLanePlotter = laneBoundaryPlotter (egoCarBEP);plotTrack (egoTrackPlotter [0 0]);egoOutlinePlotter = outlinePlotter (egoCarBEP);

现在,您可以重新启动模拟并将其运行到完成,这一次通过提取目标车辆的位置信息targetPoses并在鸟瞰图中显示。同样,你也可以打电话道路边界targetOutlines直接从自我车辆中提取出道路的边界和行动者的轮廓。鸟瞰图能够直接显示这些功能的结果:

重启(场景)的场景。StopTime =正;虽然前进(场景)t=目标姿态(egoCar);plotTrack(fastTrackPlotter,t.位置,t.速度);rbs=道路边界(egoCar);plotLaneBoundary(egoLanePlotter,rbs);[位置,偏航,长度,宽度,初始偏移,颜色]=目标输出线(egoCar);plotOutline(egoOutlinePlotter,位置,偏航,长度,宽度,“OriginOffset”originOffset,“颜色”,颜色);结束

下一个步骤

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

drivingScenarioDesigner(场景)

进一步的信息

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

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

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

另请参阅

应用程序

对象

功能

相关话题