drivingScenario
创建驾驶场景
描述
的drivingScenario
对象代表了一个3 d领域包含道路、停车场、车辆、行人、障碍,和其他方面的驾驶场景。使用这个对象模型真实的交通场景和为测试控制器或生成合成检测传感器融合算法。
您还可以创建驾驶场景交互地使用驾驶场景设计师应用。此外,你可以出口drivingScenario
对象的应用程序产生场景变化用于应用程序或仿真软件金宝app®。更多细节,请参阅通过编程方式创建驾驶场景变化。
创建
描述
创建一个空的驾驶场景。场景
= drivingScenario
设置场景
= drivingScenario (名称,值
)SampleTime
,StopTime
,GeoReference
属性使用名称-值对。例如,drivingScenario (“GeoReference”, [42.3 - -71.0 0])
设置场景的地理起源的经度坐标(42.3,-71.0)和0的高度。
属性
SampleTime
- - - - - -之间的时间间隔场景模拟步骤
0.01
(默认)|积极的真正的标量
之间的时间间隔场景仿真的步骤,指定为一个积极的真正的标量。单位是秒。
例子:1.5
StopTime
- - - - - -仿真结束时间
正
(默认)|积极的真正的标量
结束时间的模拟,指定为一个积极的真正的标量。单位是秒。默认的StopTime
的正
导致仿真结束当第一个演员结束其轨迹。
例子:60.0
SimulationTime
- - - - - -当前时间的模拟
非负实数
这个属性是只读的。
当前时间的模拟,指定为一个非负实数。重置为0的时候,调用重新启动
函数。单位是秒。
正在
- - - - - -模拟状态
真正的
|假
这个属性是只读的。
模拟状态,指定为真正的
或假
。如果模拟运行,正在
是真正的
。
障碍
- - - - - -壁垒中包含的场景
异构的数组障碍
对象
这个属性是只读的。
壁垒中包含的场景中,指定为异构的数组障碍
对象。添加障碍驾驶的情况下,使用障碍
函数。
停车场
- - - - - -场景中包含的停车场
异构的数组停车场
对象
这个属性是只读的。
停车场中包含的场景中,指定为异构的数组停车场
对象。增加停车场开车的情况下,使用停车场
函数。
GeoReference
- - - - - -地理坐标的公路网络
三元素数字行向量的形式(纬度
,朗
,alt
]
这个属性是只读的。
道路网络的地理坐标原点,指定为一个三元素数字行向量的形式纬度
,朗
,alt
),地点:
纬度
是纬度的协调度。朗
是经度的协调度。alt
在米的高度协调。
这些值的WGS84参考椭球体,这是一个标准的椭球由GPS数据使用。
你可以设置GeoReference
当您创建驱动的场景。的roadNetwork
函数还设置这个属性,当你道路导入到一个空的驾驶场景。
如果你进口道路通过指定坐标,那么
roadNetwork
函数集GeoReference
第一个(或)指定的坐标。如果你进口道路通过指定区域或地图文件,然后
roadNetwork
集GeoReference
地区或地图的中心点。
的roadNetwork
函数将覆盖任何之前设置GeoReference
价值。
在驾驶场景设计师应用程序,当你导入地图数据和导出drivingScenario
对象,GeoReference
属性的对象设置为地理参考的应用场景。
通过指定这些坐标的原点latlon2local
功能,你可以行驶路线的地理坐标转换成当地的驾驶场景的坐标。然后,您可以指定该路线的车辆轨迹场景转换。
如果你的驾驶场景不使用地理坐标,然后GeoReference
是一个空数组,[]
。
对象的功能
场景
演员
演员 |
加上演员驾驶场景 |
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”,“上”);标题(“场景”);
显示演员的姿态和概要文件。
allActorPoses = actorPoses(场景)
allActorPoses =242×1结构体数组字段:辊距偏航AngularVelocity ActorID位置速度
allActorProfiles = actorProfiles(场景)
allActorProfiles =242×1结构体数组字段:ActorID ClassID长度宽度高度OriginOffset MeshVertices MeshFaces RCSPattern RCSAzimuthAngles RCSElevationAngles
因为有障碍在这个场景中,每个障碍部分被认为是一个演员,actorPoses
和actorProfiles
函数返回所有平稳和非平稳的演员的姿势。只获得非平稳的姿态和概要演员如汽车和自行车,首先获得相应的演员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)结束
生成对象和车道边界检测
创建一个驾驶场景包含一个自我车辆和目标车辆沿着三车道公路旅行。检测车道边界通过使用视觉检测发电机。
场景= 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);
运行仿真。
创建一个鸟瞰的情节和相关的策划者。
显示传感器覆盖范围。
显示车道标记。
在路上获得地面实况提出的目标。
获得理想的车道边界点提前60米。
从理想目标姿态和生成检测车道边界。
显示目标的轮廓。
显示对象时检测对象检测是有效的。
显示巷巷时边界检测是有效的。
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);
添加传感器和模拟驾驶场景
添加视觉和超声波传感器的驾驶场景中使用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)结束
辅助函数
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)”)结束结束
算法
指定的演员在驾驶场景中运动
指定角色的运动在驾驶的情况下,您可以定义轨迹的演员或手动指定他们的运动。
的轨迹
和smoothTrajectory
函数确定演员构成属性基于一组路径点,演员之间的旅行路线点速度。演员构成属性的位置,速度,滚,音高,偏航角速度。使用这种方法,运动是由速度,不是速度,因为运动的轨迹决定了方向。
的smoothTrajectory
另外确定演员之间的锚点的加速度函数基于路径点,速度,和最大纵向混蛋。
演员沿着轨迹每次移动推进
函数被调用。您可以手动更新演员构成属性在任何时间在一个模拟世界中。然而,这些属性与更新的值覆盖下一个调用推进
。
当你手动指定演员动作,设置速度或角速度属性并不会自动移动演员连续调用推进
函数。因此,您必须使用自己的运动模型来更新位置,速度,和其他构成参数在每个仿真时间步。
版本历史
介绍了R2017a
Abrir比如
这种版本modificada德埃斯特比如。害怕Desea abrir埃斯特比如con sus modificaciones吗?
第一de MATLAB
Ha事实clic en联合国围绕此时一个埃斯特第一de MATLAB:
Ejecute el第一introduciendolo en la ventana de第一de MATLAB。洛杉矶navegadores网络没有admiten第一de MATLAB。
你也可以从下面的列表中选择一个网站:
表现最好的网站怎么走吗
选择中国网站(中文或英文)最佳站点的性能。其他MathWorks国家网站不优化的访问你的位置。