主要内容

drivingScenario

创建驾驶场景

描述

drivingScenario对象代表了一个3 d领域包含道路、停车场、车辆、行人、障碍,和其他方面的驾驶场景。使用这个对象模型真实的交通场景和为测试控制器或生成合成检测传感器融合算法。

  • 增加道路,使用函数。指定车道的道路,创建一个lanespec对象。你也可以从第三方进口道路道路网络使用roadNetwork函数。

  • 增加停车场使用停车场函数。

  • 添加演员(汽车、行人、自行车、等等),使用演员函数。添加演员与属性专门为车辆使用车辆函数。添加障碍,使用障碍函数。所有的演员,包括车辆和障碍,被建模为长方体形状(框)具有独特的演员id。

  • 模拟一个场景中,调用推进函数在一个循环中,提出了仿真时间步。

您还可以创建驾驶场景交互地使用驾驶场景设计师应用。此外,你可以出口drivingScenario对象的应用程序产生场景变化用于应用程序或仿真软件金宝app®。更多细节,请参阅通过编程方式创建驾驶场景变化

创建

描述

例子

场景= drivingScenario创建一个空的驾驶场景。

例子

场景= drivingScenario (名称,值)设置SampleTime,StopTime,GeoReference属性使用名称-值对。例如,drivingScenario (“GeoReference”, [42.3 - -71.0 0])设置场景的地理起源的经度坐标(42.3,-71.0)和0的高度。

属性

全部展开

之间的时间间隔场景仿真的步骤,指定为一个积极的真正的标量。单位是秒。

例子:1.5

结束时间的模拟,指定为一个积极的真正的标量。单位是秒。默认的StopTime导致仿真结束当第一个演员结束其轨迹。

例子:60.0

这个属性是只读的。

当前时间的模拟,指定为一个非负实数。重置为0的时候,调用重新启动函数。单位是秒。

这个属性是只读的。

模拟状态,指定为真正的。如果模拟运行,正在真正的

这个属性是只读的。

演员和车辆包含在该方案中,指定为异构的数组演员车辆对象。添加演员和车辆驾驶的情况下,使用演员车辆功能。

这个属性是只读的。

壁垒中包含的场景中,指定为异构的数组障碍对象。添加障碍驾驶的情况下,使用障碍函数。

这个属性是只读的。

停车场中包含的场景中,指定为异构的数组停车场对象。增加停车场开车的情况下,使用停车场函数。

这个属性是只读的。

道路网络的地理坐标原点,指定为一个三元素数字行向量的形式纬度,,alt),地点:

  • 纬度是纬度的协调度。

  • 是经度的协调度。

  • alt在米的高度协调。

这些值的WGS84参考椭球体,这是一个标准的椭球由GPS数据使用。

你可以设置GeoReference当您创建驱动的场景。的roadNetwork函数还设置这个属性,当你道路导入到一个空的驾驶场景。

  • 如果你进口道路通过指定坐标,那么roadNetwork函数集GeoReference第一个(或)指定的坐标。

  • 如果你进口道路通过指定区域或地图文件,然后roadNetworkGeoReference地区或地图的中心点。

roadNetwork函数将覆盖任何之前设置GeoReference价值。

驾驶场景设计师应用程序,当你导入地图数据和导出drivingScenario对象,GeoReference属性的对象设置为地理参考的应用场景。

通过指定这些坐标的原点latlon2local功能,你可以行驶路线的地理坐标转换成当地的驾驶场景的坐标。然后,您可以指定该路线的车辆轨迹场景转换。

如果你的驾驶场景不使用地理坐标,然后GeoReference是一个空数组,[]

对象的功能

全部展开

推进 推进驾驶场景模拟时间步
情节 情节驱动场景
记录 开车运行场景和演员状态记录
重新启动 从开始重启驾驶场景模拟
updatePlots 更新驱动场景情节
出口 出口驱动的场景ASAM OpenDRIVE,ASAM OpenSCENARIO走鹃高清地图文件
演员 加上演员驾驶场景
actorPoses 位置、速度和方向的演员驾驶场景
actorProfiles 演员的身体和雷达特征驱动的场景
车辆 添加车辆驾驶场景
障碍 添加一个障碍驾驶场景
chasePlot 自我中心投影角度的阴谋
轨迹 创建演员或驾驶场景中车辆轨迹
smoothTrajectory 驾驶场景中创建平滑,jerk-limited演员轨迹
targetPoses 目标位置和方向相对于主机
targetOutlines 概述了目标被演员
driving.scenario.targetsToEgo 把目标从场景构成自我坐标
driving.scenario.targetsToScenario 转换目标提出了从自我到场景坐标
添加道路驾驶场景或道路
roadNetwork 增加道路网络驱动的场景
roadBoundaries 得到道路边界
driving.scenario.roadBoundariesToEgo 道路边界转化为自我车辆坐标
lanespec 创建道路车道规范
laneMarking 创建道路车道标记对象
laneMarkingVertices 车道标记顶点和在驾驶场景
currentLane 得到当前车道的演员
laneBoundaries 把演员巷巷边界
clothoidLaneBoundary Clothoid-shaped车道边界模型
computeBoundaryModel 从回旋曲线车道边界模型计算车道边界点
laneType 创建道路车道类型对象
停车场 增加停车场开车的场景
parkingSpace 定义停车场的停车位
insertParkingSpaces 停车位插入停车场
parkingLaneMarkingVertices 停车车道标记顶点和在驾驶场景

例子

全部折叠

创建一个驾驶场景包含一个弯曲的路,两个笔直的道路,和两个演员:一辆汽车和一辆自行车。两个角色都沿着路60秒钟。

创建驾驶场景对象。

场景= drivingScenario (“SampleTime”0.1”,“StopTime”、60);

使用道路中心创建弯曲的路点弧后800米半径的一个圆。弧始于0°,结束于90°,采样在5°的增量。

ang = [0:5:90] ';R = 800;roadcenters = R * [cosd (ang)信德(ang) 0(大小(ang))];roadwidth = 10;cr =路(场景、roadcenters roadwidth);

添加两个笔直的道路使用默认宽度,使用道路中心分两端。第一个直路道路边缘增加障碍。

roadcenters = [700 0 0;100 0 0];sr1 =路(场景,roadcenters);障碍(场景,sr1)屏障(场景,sr1,“RoadEdge”,“左”)roadcenters = (400 400 0;0 0 0];路(场景,roadcenters);

道路边界。

rbdry = roadBoundaries(场景);

一辆汽车和一辆自行车添加到场景。位置汽车的开头第一个直路。

车=车辆(场景中,“ClassID”,1“位置”(700 0 0),“长度”3,“宽度”2,“高度”,1.6);

自行车位置更远。

自行车=演员(场景中,“ClassID”3,“位置”,(706 376 0)',“长度”2,“宽度”,0.45,“高度”,1.5);

画出场景。

情节(场景中,“中心线”,“上”,“RoadCenters”,“上”);标题(“场景”);

图包含一个坐标轴对象。坐标轴对象与标题的场景中,包含X (m), ylabel Y (m)含有1221块类型的对象,线。

显示演员的姿态和概要文件。

allActorPoses = actorPoses(场景)
allActorPoses =242×1结构体数组字段:辊距偏航AngularVelocity ActorID位置速度
allActorProfiles = actorProfiles(场景)
allActorProfiles =242×1结构体数组字段:ActorID ClassID长度宽度高度OriginOffset MeshVertices MeshFaces RCSPattern RCSAzimuthAngles RCSElevationAngles

因为有障碍在这个场景中,每个障碍部分被认为是一个演员,actorPosesactorProfiles函数返回所有平稳和非平稳的演员的姿势。只获得非平稳的姿态和概要演员如汽车和自行车,首先获得相应的演员IDs使用scenario.Actors.ActorID财产。

movableActorIDs = [scenario.Actors.ActorID];

然后,使用这些id只过滤非平稳演员的姿态和概要文件。

movableActorPoseIndices = ismember ([allActorPoses.ActorID], movableActorIDs);movableActorPoses = allActorPoses (movableActorPoseIndices)
movableActorPoses =2×1结构体数组字段:辊距偏航AngularVelocity ActorID位置速度
movableActorProfiles = allActorProfiles (movableActorPoseIndices)
movableActorProfiles =2×1结构体数组字段:ActorID ClassID长度宽度高度OriginOffset MeshVertices MeshFaces RCSPattern RCSAzimuthAngles RCSElevationAngles

创建一个驾驶场景和展示目标轮廓变化模拟的进展。

创建一个驾驶场景组成的两个相交的笔直的道路。第一段路是45米长。第二个直路是32米长泽壁垒沿着它的边缘,和第一道路相交。一辆车以每秒12.0米的速度沿着前路方法运行人行横道的十字路口为2.0米每秒。

场景= drivingScenario (“SampleTime”,0.1,“StopTime”1);road1 =路(场景中,[-10 0 0;45 -20 0]);road2 =路(场景中,(-10 -10 0;35 10 0]);障碍(场景,road1)屏障(场景、road1“RoadEdge”,“左”)ped =演员(场景中,“ClassID”4“长度”,0.4,“宽度”,0.6,“高度”,1.7);车=车辆(场景中,“ClassID”1);pedspeed = 2.0;carspeed = 12.0;smoothTrajectory (ped [15 3 0;15日3 0],pedspeed);smoothTrajectory(车,-10 -10 0;35 10 0],carspeed);

创建一个自我中心车辆追逐情节。

chasePlot(车,“中心线”,“上”)

创建一个空鸟瞰的情节和添加一个大纲绘图仪和车道边界绘图仪。然后,运行仿真。在每个仿真步骤:

  • 更新追逐情节显示道路边界和目标轮廓。

  • 更新鸟瞰的情节显示更新后的道路边界和目标轮廓。情节的角度总是对自我的车辆。

bepPlot = birdsEyePlot (“XLim”50 [-50],“YLim”,40 [-40]);outlineplotter = outlineplotter (bepPlot);laneplotter = laneBoundaryPlotter (bepPlot);传奇(“关闭”)推进(场景)rb = roadBoundaries(车);(位置、偏航、长度、宽度、originOffset color] = targetOutlines(车);[bposition, byaw blength、bwidth boriginOffset, bcolor, barrierSegments] = targetOutlines(车,“障碍”);plotLaneBoundary (laneplotter, rb) plotOutline (outlineplotter、位置、偏航、长度、宽度、“OriginOffset”originOffset,“颜色”(颜色)plotBarrierOutline outlineplotter、barrierSegments bposition, byaw, blength, bwidth,“OriginOffset”boriginOffset,“颜色”bcolor)暂停(0.01)结束

图包含一个坐标轴对象。坐标轴对象包含X (m), ylabel Y (m)是空的。

创建一个驾驶场景包含一个自我车辆和目标车辆沿着三车道公路旅行。检测车道边界通过使用视觉检测发电机。

场景= drivingScenario;

创建一个三车道公路通过车道规范。

roadCenters = [0 0 0;60 0 0;120年30 0];lspc = lanespec (3);路(场景、roadCenters“道”,lspc);

指定车辆自我中心巷在30 m / s。

egovehicle =车辆(场景中,“ClassID”1);egopath = (1.5 0 0;60 0 0;111年25 0];egospeed = 30;smoothTrajectory (egovehicle egopath egospeed);

指定目标车辆旅行前的自我车辆40 m / s和变更车道车辆接近自我。

targetcar =车辆(场景中,“ClassID”1);定位路径= [8 2;60 -3.2;120年33];targetspeed = 40;定位路径,smoothTrajectory (targetcar targetspeed);

的3 d视图显示一个追逐情节场景从自我后面车辆。

chasePlot (egovehicle)

创建一个视觉检测发电机检测车道和对象。场上的传感器点一度下降。

visionSensor = visionDetectionGenerator (“节”,1.0);visionSensor。DetectorOutput =车道和对象的;visionSensor。演员Profiles = actorProfiles(scenario);

运行仿真。

  1. 创建一个鸟瞰的情节和相关的策划者。

  2. 显示传感器覆盖范围。

  3. 显示车道标记。

  4. 在路上获得地面实况提出的目标。

  5. 获得理想的车道边界点提前60米。

  6. 从理想目标姿态和生成检测车道边界。

  7. 显示目标的轮廓。

  8. 显示对象时检测对象检测是有效的。

  9. 显示巷巷时边界检测是有效的。

cep = birdsEyePlot (“XLim”,60 [0],“YLim”35 [-35]);caPlotter = coverageAreaPlotter (cep),“DisplayName的”,“覆盖范围”,“FaceColor”,“蓝”);detPlotter = detectionPlotter (cep),“DisplayName的”,“对象检测”);lmPlotter = laneMarkingPlotter (cep),“DisplayName的”,“车道标记”);lbPlotter = laneBoundaryPlotter (cep),“DisplayName的”,“车道边界检测”,“颜色”,“红色”);olPlotter = outlinePlotter (cep);plotCoverageArea (caPlotter visionSensor.SensorLocation,visionSensor.MaxRange visionSensor.Yaw,visionSensor.FieldOfView (1));推进(场景)(lmv, lmf) = laneMarkingVertices (egovehicle);plotLaneMarking (lmv lmPlotter, lmf) tgtpose = targetPoses (egovehicle);lookaheadDistance = 0:0.5:60;磅= laneBoundaries (egovehicle,“XDistance”lookaheadDistance,“LocationType”,“内心”);[obdets, nobdets obValid、lb_dets nlb_dets, lbValid] =visionSensor (tgtpose磅,scenario.SimulationTime);[objposition, objyaw objlength、objwidth objoriginOffset, color] = targetOutlines (egovehicle);plotOutline (olPlotter、objposition objyaw、objlength objwidth,“OriginOffset”objoriginOffset,“颜色”、颜色)如果obValid detPos = cellfun (@ (d) d.Measurement (1:2), obdets,“UniformOutput”、假);detPos = vertcat (0 (0, 2), cell2mat (detPos ') ');plotDetection (detPlotter detPos)结束如果lbValid plotLaneBoundary (lbPlotter vertcat (lb_dets.LaneBoundaries))结束结束

在这个例子中,您将添加传感器驱动的情况下使用addSensors函数,得到真实目标提出了基于单个传感器的输入。然后你处理真实目标提出了检测和可视化。

设置场景和鸟's-Eye-Plot开车

创建一个驾驶场景与自我车辆和两个目标车辆。一个目标车辆在前面,另一个是左边的ego-vehicle。

[场景,egovehicle] = helperCreateDrivingScenario;

配置一个视觉传感器被安装在前面的自我。

visionSensor = visionDetectionGenerator (SensorIndex = 1, SensorLocation = 4.0[0],身高= 1.1,= 1.0,DetectorOutput =“只对象”);

配置一个超声波传感器安装在左侧ego-vehicle。

leftUltrasonic = ultrasonicDetectionGenerator (SensorIndex = 2, MountingLocation = (0.5 - 1 0.2), MountingAngles = (90 0 0), FieldOfView = 35 [70], UpdateRate = 100);

创建一个鸟's-eye-plot可视化驾驶场景。

[detPlotter, lmPlotter olPlotter、lulrdPlotter luldetPlotter, bepAxes] = helperCreateBEP (visionSensor leftUltrasonic);

图cep包含一个坐标轴对象。坐标轴对象包含X (m), ylabel Y (m)包含7补丁,类型的对象。一个或多个行显示的值只使用这些对象标记代表视觉覆盖范围,超声波覆盖范围、对象检测、车道标记,离开超声范围,Point-On-Target超声(左)。

添加传感器和模拟驾驶场景

添加视觉和超声波传感器的驾驶场景中使用addSensors函数。您可以添加传感器任何车辆在驾驶场景中使用addSensors函数通过指定的演员ID所需的车辆。在这个例子中,指定ego-vehicle演员ID。

addSensors(场景中,{visionSensor, leftUltrasonic}, egovehicle.ActorID);

模拟驾驶的场景。注意,您被指定单独的目标提出了基于单个传感器各自的传感器id作为输入的targetPoses函数。这个语法只返回目标的真实带来的范围内指定的传感器。然后通过真实对各自的传感器模型生成检测和可视化。

传奇(bepAxes“显示”)lookaheadDistance = 0:0.5:60;推进(场景)磅= laneBoundaries (egovehicle,“XDistance”lookaheadDistance,“LocationType”,“内心”);(lmv, lmf) = laneMarkingVertices (egovehicle);%得到真实目标的姿势分别的视野和超声波传感器tgtposeVision = targetPoses(场景,visionSensor.SensorIndex);tgtposeUltrasonic = targetPoses(场景,leftUltrasonic.SensorIndex);%获得基于目标只有在检测范围内[obdets, obValid] = visionSensor (tgtposeVision scenario.SimulationTime);[lobdets, lobValid] = leftUltrasonic (tgtposeUltrasonic scenario.SimulationTime);helperPlotBEPVision (lmv egovehicle, lmf、obdets obValid, detPlotter, lmPlotter, olPlotter) helperPlotBEPUltrasonic (lobdets、lobValid leftUltrasonic, lulrdPlotter, luldetPlotter)结束

图cep包含一个坐标轴对象。坐标轴对象包含X (m), ylabel Y (m)包含7补丁,类型的对象。一个或多个行显示的值只使用这些对象标记代表视觉覆盖范围,超声波覆盖范围、对象检测、车道标记,离开超声范围,Point-On-Target超声(左)。

辅助函数

helperCreateDrivingScenario创建一个驾驶场景通过指定道路和车辆属性。

函数[场景,egovehicle] = = drivingScenario helperCreateDrivingScenario场景;roadCenters = [-120 30 0; -60 0 0 0 0 0;60 0 0;120年30 0;180 60 0];lspc = lanespec (3);路(场景、roadCenters车道= lspc);%创造一个自我旅行的车辆中心巷30 m / s的速度。egovehicle =车辆(场景,ClassID = 1);egopath = (1.5 0 0;60 0 0;111年25 0];egospeed = 30;smoothTrajectory (egovehicle egopath egospeed);%添加目标车辆,旅行前的自我在右车道车辆为30.5 m / s,和变更车道车辆接近自我。ftargetcar =车辆(场景,ClassID = 1);ftargetpath = [8 2;60 -3.2;120年33];ftargetspeed = 40;smoothTrajectory (ftargetcar ftargetpath ftargetspeed);%添加第二个目标车辆旅行在左边的车道32 m / s。ltargetcar =车辆(场景,ClassID = 1);ltargetpath = (-5.0 - 3.5 0;3.5 60 0;111年28.5 0];ltargetspeed = 30;smoothTrajectory (ltargetcar ltargetpath ltargetspeed);结束

helperCreateBEP创建一个鸟's-eye-plot对于视觉驾驶场景模拟。

函数[detPlotter, lmPlotter olPlotter、lulrdPlotter luldetPlotter, bepAxes] = helperCreateBEP visionSensor, leftUltrasonic figureName =“cep”;图= findobj (“类型”,“图”Name = figureName);如果拉isempty(图)=双(get(大的,“拉”));图=图(Name = figureName);图。拉位置=[拉(3)* 0.17(4)* 0.15拉拉(3)* 0.4 (4)* 0.6);图。NumberTitle =“关闭”;图。菜单条=“没有”;图。工具栏=“没有”;结束clf(图);bepAxes =轴(图);网格(bepAxes,“上”);传奇(bepAxes“隐藏”);cep = birdsEyePlot(父= bepAxes XLim = 60 [-20], YLim = 35 [-35]);caPlotterV = coverageAreaPlotter (cep DisplayName =“视觉覆盖区”FaceColor =“b”);caPlotterU = coverageAreaPlotter (cep DisplayName =“超声覆盖范围”FaceColor =“m”);detPlotter = detectionPlotter (cep DisplayName =“对象检测”);lmPlotter = laneMarkingPlotter (cep DisplayName =“车道标记”);olPlotter = outlinePlotter (cep);plotCoverageArea (caPlotterV visionSensor.SensorLocation,visionSensor.MaxRange visionSensor.Yaw,visionSensor.FieldOfView (1));plotCoverageArea (caPlotterU leftUltrasonic.MountingLocation (1:2),leftUltrasonic.MountingAngles leftUltrasonic.DetectionRange (3) (1),leftUltrasonic.FieldOfView (1));lulrdPlotter = rangeDetectionPlotter (cep DisplayName =“左超声波范围”线型=“-”);luldetPlotter = detectionPlotter (cep DisplayName =“Point-On-Target(左超声波)”MarkerFaceColor =“k”);结束

helperPlotBEPVision情节自我车辆轮廓,鸟's-eye-plot车道和视觉检测。

函数helperPlotBEPVision (lmv egovehicle, lmf、obdets obValid, detPlotter, lmPlotter, olPlotter) plotLaneMarking (lmv lmPlotter, lmf) [objposition、objyaw objlength, objwidth, objoriginOffset, color] = targetOutlines (egovehicle);plotOutline (olPlotter、objposition objyaw、objlength objwidth,OriginOffset = objoriginOffset =颜色)如果obValid detPos = cellfun (@ (d) d.Measurement (1:2), obdets, UniformOutput = false);detPos = vertcat (0 (0, 2), cell2mat (detPos ') ');plotDetection (detPlotter detPos)结束结束

helperPlotBEPUltrasonic情节超声波测量范围和点目标。

函数helperPlotBEPUltrasonic (lobdets、lobValid leftUltrasonic、lulrdPlotter luldetPlotter)如果~ isempty (lobdets) & & lobValid lranges = lobdets {1} .Measurement;plotRangeDetection (lulrdPlotter、lranges leftUltrasonic.FieldOfView (1) leftUltrasonic.MountingLocation, leftUltrasonic.MountingAngles) plotDetection (luldetPlotter, lobdets {1} .ObjectAttributes {1} .PointOnTarget (1:2)”)结束结束

算法

全部展开

版本历史

介绍了R2017a