主要内容

根据记录的车辆数据生成场景

这个例子展示了如何生成一个虚拟的驾驶场景记录车辆数据。生成场景从GPS传感器位置信息记录和记录对象列表处理从激光雷达传感器。

概述

虚拟驾驶场景可以用来创建一个真实场景记录车辆数据。这些虚拟场景允许您可视化研究原始场景。因为你可以通过编程方式修改虚拟场景中,您也可以使用它们合成场景变化在设计和评估自主驾驶系统。

在本例中,您创建一个虚拟驾驶场景通过生成一个drivingScenario对象从一个测试数据记录(自我)车辆和一个ASAM OpenDRIVE®文件。ASAM OpenDRIVE文件描述区域的道路网络数据被记录。记录的车辆数据包括:

  • GPS数据:文本文件包含自我的纬度和经度坐标车辆在每一个时间戳。

  • 激光雷达数据对象列表:文本文件包含non-ego演员的数量和他们的位置中心,相对于自我的车辆,在每一个时间戳。

  • 视频数据:MP4文件记录从一个前置单眼相机安装在自我。

生成和模拟驾驶场景中,您遵循这些步骤:

  1. 探索记录车辆数据。

  2. ASAM OpenDRIVE道路网络导入驾驶场景。

  3. 自我从GPS车辆数据添加到驾驶场景。

  4. 从激光雷达对象添加non-ego演员驾驶场景列表。

  5. 模拟和可视化生成场景。

下面的图显示了如何使用此示例中的记录数据。注意到您创建的驾驶场景GPS、激光雷达对象列表和ASAM OpenDRIVE文件。您使用相机数据可视化的原始场景和场景生成可以比较这些数据。你也想象的场景地图上的路线geoplayer

探索记录车辆数据

自我的位置车辆使用UBlox GPS NEO M8N传感器被抓获。GPS传感器被放置在屋顶的自我中心的车辆。这些数据是保存在文本文件EgoUrban.txt

non-ego演员被抓获的位置使用调速发电机®VLP-16激光雷达传感器和一个30米的范围。VLP-16传感器被放置在屋顶上自我车辆的位置和高度,避免了传感器与自我的主体车辆相撞。从激光雷达点云处理传感器的车辆检测对象和它们的位置相对于自我。这些数据是保存在文本文件NonEgoUrban.txt

帮助理解原始场景、视频从一个单眼相机记录作为参考。这个视频还可以用于视觉上比较原始和生成场景。这个录像的预览视频文件保存urbanpreview.mp4。您可以下载完整的录像文件在这里

生成一个预览的城市交通场景中使用这个例子。

vidObj = VideoReader (“urbanpreview.mp4”);无花果=图;集(无花果,位置= [0,0,800,600]);movegui(图,“中心”);pnl = uipanel(无花果,位置= (0 0 1 1),Title =“城市交通场景”);plt =轴(pnl);hasFrame (vidObj) vidFrame = readFrame (vidObj);图像(vidFrame、家长= plt);plt。可见=“关闭”;暂停(1 / vidObj.FrameRate);结束

图包含一个坐标轴对象和一个uipanel类型的对象。坐标轴对象包含一个类型的对象的形象。

图包含一个坐标轴对象和一个uipanel类型的对象。坐标轴对象包含一个类型的对象的形象。

虽然传感器覆盖范围可以定义在整个自我,这个例子显示了只有前瞻性场景。

ASAM OpenDRIVE道路网络导入驾驶场景

生成虚拟场景的道路网络数据获得开放地图®。OpenStreetMap数据文件转换为ASAM OpenDRIVE文件并保存与扩展.xodr。使用roadNetwork函数导入这个道路网络数据驱动的场景。

创建一个驾驶场景对象并将所需的ASAM OpenDRIVE道路网络导入生成的场景。

场景= drivingScenario;openDRIVEFile =“OpenDRIVEUrban.xodr”;roadNetwork(场景中,“OpenDRIVE”,openDRIVEFile);

自我从GPS车辆数据添加到生成的场景

自我车辆从GPS传感器收集的数据和存储为文本文件。文本文件包含三个列存储的纬度,经度,自我车辆和时间戳值。使用helperGetEgoData函数的自我车辆数据文本文件导入到一个结构在MATLAB®工作区。结构包含三个字段指定经度,纬度和时间戳。

egoFile =“EgoUrban.txt”;egoData = helperGetEgoData (egoFile);

计算轨迹路径点的自我车辆记录GPS坐标。使用latlon2local函数将原始GPS坐标转换为本地east-north-up笛卡尔坐标。转换后的坐标定义自我的轨迹路线点车。

%指定从ASAM OpenDRIVE起源的经度和纬度数据文件。这一点也将定义局部坐标系的原点。alt = 540.0%的平均海拔在海得拉巴,印度
alt = 540.0000 e + 000
起源= (17.425853702697903,78.44939480188313,alt);%(纬度、经度、海拔)%指定自我车辆的经度和纬度lat = egoData.lat;朗= egoData.lon;%计算路径点的自我[X, Y, ~] = latlon2local(纬度、经度、alt、来源);egoWaypoints (: 1) = X;egoWaypoints (:, 2) = Y;

可视化的GPS路径自我车辆使用geoplayer对象。

zoomLevel = 17;球员= geoplayer(纬度(1),经度(1)zoomLevel);plotRoute(纬度,经度);i = 1:尺寸(lat, 1) plotPosition(球员,lat(我),朗(我));结束

图包含一个坐标轴对象地理的球员。坐标轴对象包含4线类型的对象,散射,文本。

使用helperComputeEgoData计算的速度和航向角值自我车辆在每个传感器数据的时间戳。

[egoSpeed, egoAngle] = helperComputeEgoData (egoData, X, Y);

添加自我车辆驾驶场景。

自我=车辆(场景,ClassID = 1,名字=“自我”,长度= 3.6、宽= 1.55,高= 1.6,网= driving.scenario.carMesh);

创建一个对自我车辆的轨迹计算的一组自我锚点和速度。自我车辆轨迹在指定的速度。

轨迹(自我,egoWaypoints egoSpeed);

从激光雷达对象添加Non-Ego演员列表生成场景

non-ego演员从激光雷达传感器和收集的数据存储为文本文件。文本文件包含五列存储演员id、x的位置,y的位置,z位置和时间戳值,分别。使用helperGetNonEgoData函数non-ego演员的数据文本文件导入到一个结构在MATLAB®工作区。输出是一个结构有三个字段:

  1. ActorID——场景定义演员标识符指定为一个正整数。

  2. 位置- - - - - -演员的位置,指定为一个(xyz】真正的向量。单位是米。

  3. 时间——传感器记录的时间戳。

nonEgoPosFile =“NonEgoUrban.txt”;nonEgoPropertiesFile =“NonEgoProperties.txt”;[nonEgoData, nonEgoProperties] =helperGetNonEgoData (nonEgoPosFile nonEgoPropertiesFile);

使用helperComputeNonEgoData计算轨迹路标点和每个non-ego演员的速度在每一个时间戳。轨迹路径点计算相对于自我。

演员=独特(nonEgoData (1) .ActorID);[nonEgoSpeed, nonEgoWaypoints] =helperComputeNonEgoData (egoDataegoWaypoints、nonEgoData egoAngle);

确定non-ego演员根据他们的网类ID。

i = 1:尺寸(nonEgoProperties.ClassID, 1)开关nonEgoProperties.ClassID(我)情况下3 nonEgoProperties.Mesh(我,1)= driving.scenario.bicycleMesh;情况下2 nonEgoProperties.Mesh(我,1)= driving.scenario.truckMesh;否则nonEgoProperties.Mesh(我,1)= driving.scenario.carMesh;结束结束

添加non-ego演员驾驶场景。你可以用适当的填充non-ego演员类ID、尺寸、颜色和网格。为non-ego演员创建轨迹计算的一组演员路标点和速度。

i = 1:尺寸(演员、1)演员=车辆(场景,ClassID = 1,长度= nonEgoProperties.Length(我),宽度= nonEgoProperties.Width(我),身高= nonEgoProperties.Height(我),PlotColor = nonEgoProperties.Color(我),网= nonEgoProperties.Mesh (i));轨迹(演员,nonEgoWaypoints {}, nonEgoSpeed{我});结束

想象你导入的车辆和non-ego演员自我生成的场景。也想象自我的相应的轨迹路线点车辆和non-ego演员。

%创建一个自定义图窗口,定义一个坐标轴对象无花果=图;集(无花果,位置= [0,0,800,600]);movegui(图,“中心”);hViewPnl = uipanel(无花果,位置= (0 0 1 1),Title =“自我车辆和演员”);hCarPlt =轴(hViewPnl);%情节生成的驾驶场景。情节(场景中,“父”,hCarPlt);轴([270 320 80 120]);传奇(“进口道路网”,“道”,“自我车辆”,“演员1”,“演员2”,“演员3”,“演员4”,“演员5”)传说(hCarPlt“boxoff”);

图包含一个坐标轴对象和一个uipanel类型的对象。坐标轴对象包含21个补丁,类型的对象。这些对象代表进口道路网络,车道,自我车辆,演员,演员,演员,演员,演员5。

人物,情节(egoWaypoints (: 1), egoWaypoints (:, 2),颜色=[0 0.447 - 0.741],线宽= 2)i = 1:尺寸(演员、1)情节(nonEgoWaypoints{我}(:1),nonEgoWaypoints{我}(:,2),颜色= nonEgoProperties.Color(我:),线宽= 2)结束轴(“紧”)包含(“X”(m))ylabel (“Y (m)”)标题(“自我车辆和演员轨迹计算”)传说(“自我车辆”,“演员1”,“演员2”,“演员3”,“演员4”,“演员5”,“位置”,“最佳”)举行

模拟和可视化生成场景

情节场景和相应的追逐情节。运行仿真可视化生成的驾驶场景。自我车辆和non-ego演员们按照各自的轨迹。

%创建一个自定义图窗口显示的场景和追逐情节figScene图(Name = =“驾驶场景”,标签=“ScenarioGenerationDemoDisplay”);集(figScene位置= [0,0,1000,400]);movegui (figScene“中心”);%添加追逐情节hCarViewPanel = uipanel (figScene,位置=(0.5 0 0.5 - 1),标题=“追逐相机视图”);hCarPlot =轴(hCarViewPanel);chasePlot(自我,父母= hCarPlot网格=“上”);%添加顶部视图生成的场景hViewPanel = uipanel (figScene,位置=[0 0 0.5 - 1),标题=“视图”);hCarPlot =轴(hViewPanel);chasePlot(自我,父母= hCarPlot网格=“上”,ViewHeight = 120, ViewPitch = 90, ViewLocation = [0]);%运行仿真推进(场景)暂停(0.01)结束

图包含一个坐标轴对象和一个uipanel类型的对象。坐标轴对象包含21个补丁,类型的对象。这些对象代表进口道路网络,车道,自我车辆,演员,演员,演员,演员,演员5。

图驾驶场景包含uipanel类型的对象。

出口到ASAM OpenSCENARIO

您还可以导出该场景ASAM OpenSCENARIO文件。

出口(场景中,“OpenSCENARIO”,“PlaybackScenarioExample.xosc”);

ASAM OpenSCENARIO文件可以导入到其他工具来想象添加使用相同的场景。

总结

这个例子展示了如何从车辆数据记录自动生成一个虚拟的驾驶场景使用全球定位系统(GPS)和激光雷达传感器。

辅助函数

helperGetEgoData

这个函数从一个文本文件中读取自我车辆数据并将其转化为一个结构的能力。

函数[egoData] = helperGetEgoData (egoFile)%从文本文件中读取自我车辆数据文件标识= fopen (egoFile);内容= textscan(文件标识,“% % f % f”);字段= {“纬度”,“朗”,“时间”};egoData = cell2struct(内容、领域、2);文件关闭(文件标识);结束

helperGetNonEgoData

该函数读取激光雷达数据处理和non-ego演员从文本文件属性。你可以将它转换成一个结构。激光雷达数据处理包含non-ego演员的位置信息,是non-ego演员属性包含类型、几何尺寸和颜色的信息各自non-ego演员。

函数[nonEgoPos, nonEgoProperties] =helperGetNonEgoData (nonEgoPosFile nonEgoPropertiesFile)%的激光雷达数据处理non-ego演员从文本文件。fileID1 = fopen (nonEgoPosFile);内容= textscan (fileID1' % d % f % % f % f ');newcontent{1} ={1}的内容;newcontent{2} =[内容内容{2}{3}{4});newcontent{3} ={5}内容;字段= {“ActorID”,“位置”,“时间”};nonEgoPos = cell2struct (newcontent字段2);文件关闭(fileID1);fileID2 = fopen (nonEgoPropertiesFile);内容= textscan (fileID2' % d % f % % % f % f % f ');newcontent{1} ={1}的内容;newcontent{2} ={2}内容;newcontent{3} ={3}内容;newcontent{4} ={4}内容;newcontent{5} =[内容内容{5}{6}{7});字段= {“ClassID”,“长度”,“宽度”,“高度”,“颜色”};nonEgoProperties = cell2struct (newcontent字段2);文件关闭(fileID2);结束

helperComputeEgoData

这个函数计算的速度和航向角自我车辆基于轨迹路标点和时间戳。

函数[egoSpeed, egoAngle] =helperComputeEgoData (egoData, X, Y) egoTime = egoData.Time;timeDiff = diff (egoTime);点= (X, Y);差异= diff(点,1);距离=√总和差异。*差异,2));egoSpeed =某种天体/ timeDiff;egoAngle =每股(diff (Y)。/ diff (X));egoAngle结束(+ 1)= egoAngle(结束);egoSpeed结束(+ 1)= egoSpeed(结束);结束

helperComputeNonEgoData

这个函数计算的速度和航向角每个non-ego演员基于轨迹路标点和时间戳。计算的速度和航向角相对于自我。

函数[nonEgoSpeed, nonEgoWaypoints] =helperComputeNonEgoData (egoData、egoWaypoints nonEgoData egoAngle)演员=独特(nonEgoData.ActorID);numActors =大小(演员、1);nonEgoWaypoints =细胞(numActors, 1);nonEgoSpeed =细胞(numActors, 1);i = 1: numActors id =演员(我);idx = ([nonEgoData找到。ActorID] = = id);actorXData = nonEgoData.Position (idx, 1);actorYData = nonEgoData.Position (idx 2);actorTime = nonEgoData.Time (idx);actorWaypoints = [0 0];%计算non-ego的轨迹路径点的演员[sharedTimeStamps, nonEgoIdx egoIdx] =相交(actorTime egoData.Time,“稳定”);tempX = actorXData (nonEgoIdx);tempY = actorYData (nonEgoIdx);relativeX = -tempX。* cos (egoAngle (egoIdx)) + tempY。*罪(egoAngle (egoIdx));relativeY = -tempX。* sin (egoAngle (egoIdx))——tempY。* cos (egoAngle (egoIdx));actorWaypoints (nonEgoIdx 1) = egoWaypoints (egoIdx 1) + relativeX;actorWaypoints (nonEgoIdx 2) = egoWaypoints (egoIdx 2) + relativeY;%计算non-ego演员的速度值timeDiff = diff (sharedTimeStamps);差异= diff (actorWaypoints, 1);距离=√总和差异。*差异,2));actorSpeed =某种天体/ timeDiff;actorSpeed结束(+ 1)= actorSpeed(结束);%平滑的轨迹路线点non-ego演员actorWaypoints = smoothdata (actorWaypoints,“sgolay”);%存储值轨迹路标点和速度计算每个non-ego的演员nonEgoWaypoints (i) = {actorWaypoints};nonEgoSpeed (i) = {actorSpeed '};结束结束

另请参阅

应用程序

功能

对象

相关的例子

更多关于

外部网站