情景生成从记录的车辆数据

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

概述

虚拟驾驶情况下,可以用来重新从记录的车辆数据的真实场景。这些虚拟场景使您能够可视化和研究的原始方案。因为你可以通过编程修改虚拟场景,您也可以用它来合成场景变化时,设计和评估自主驾驶系统。

在这个例子中,创建通过生成一个虚拟驾驶场景drivingScenario从被从测试(EGO)车辆和OpenDRIVE®文件记录的数据对象。该OpenDRIVE文件描述了数据记录区的道路网。所记录的车辆数据包括:

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

  • 激光雷达对象列表数据:含有相对于自身车辆的非自我角色的数量和它们的中心位置,在每个时间戳的文本文件。

  • 视频数据: MP4文件记录从一个向前的单目摄像机安装在自我车辆。

为了产生和模拟驱动的情况下,请按照下列步骤:

  1. 查看记录的车辆数据。

  2. 将OpenDRIVE道路网络引入到驾驶场景中。

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

  4. 添加激光雷达对象列表非我演员驾驶的情况。

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

下图显示了如何在这个例子中使用记录的数据。请注意,您创建一个从GPS,激光雷达对象名单,并OpenDRIVE文件的驱动方案。您可以使用相机的数据可视化的原始方案,并可以与您生成方案比较这些数据。您还使用可视化地图上的路线方案geoplayer

浏览记录的车辆数据

自身车辆的位置,使用一个GPS UBLOX NEO M8N传感器捕获。GPS传感器放置在自主车辆的车顶的中心。该数据被保存在文本文件中EgoUrban.txt

使用Velodyne®VLP-16激光雷达传感器捕获非自我演员的位置,其范围为30米。VLP-16传感器被放置在ego车辆车顶的位置和高度上,以避免传感器与ego车辆的车身发生碰撞。将激光雷达传感器的点云处理在车辆上,检测目标及其相对于车辆的位置。该数据被保存在文本文件中NonEgoUrban.txt

为了帮助理解原始方案,从单眼相机录制视频作为参考。该视频也可以用来直观地比较原始和产生的场景。这个录制的视频的预览保存在视频文件urbanpreview.mp4。您可以从完整记录的视频文件这里

生成本例中使用的城市交通场景的预览。

vidObj = VideoReader('urbanpreview.mp4');无花果=图;集(无花果,'位置',[0,0,800,600]);movegui(无花果,“中心”);PNL = uipanel(无花果,'位置',[0 0 1 1],'标题'“城市交通方案”);PLT =轴(PNL);hasFrame(vidObj)vidFrame = readFrame(vidObj);图像(vidFrame,“父”、plt);currAxes。可见=“关闭”;暂停(1 / vidObj.FrameRate);结束

虽然传感器覆盖区域可以定义在整个ego车辆周围,但是这个例子只显示了前瞻性的场景。

将OpenDRIVE道路网络引入到驾驶场景中

用于产生虚拟场景中的道路网数据是从获得的OpenStreetMap的®。OpenStreetMap的数据文件转换为OpenDRIVE文件并保存与推广.xodr。使用公路网功能,这个道路网数据导入到行车方案。

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

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

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

车辆数据从GPS传感器收集并以文本文件的形式存储。文本文件由三列组成,分别存储ego vehicle的纬度、经度和时间戳值。使用helperGetEgoData函数从文本文件中的自主车辆数据导入到在工作区MATLAB®的结构。该结构包含三个字段指定的纬度,经度和时间戳。

egoFile ='EgoUrban.txt';egoData = helperGetEgoData(egoFile);

从记录的GPS坐标计算自身车辆的轨迹航点。使用latlon2local函数的作用是:将原始的GPS坐标转换为局部的东北向上的笛卡尔坐标。变换后的坐标定义了ego车辆的轨迹路径点。

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

使用可视化自身车辆的GPS路径geoplayer宾语。

zoomLevel = 17;球员= geoplayer(纬度(1),经度(1)zoomLevel);plotRoute(纬度,经度);对于I = 1:长度(LAT)plotPosition(播放器,LAT(ⅰ),LON(I));结束

使用helperComputeEgoData来计算速度和在每个传感器数据时间戳的自主车辆的方位角值。

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

本车添加到驾驶情形。

自我=车辆(场景中,'长度',1“宽度”,0.6,'高度',0.6);

从自我路径点和速度的计算集为自我车辆创建一个轨迹。自我车辆以指定的速度跟随轨迹。

轨迹(自我,egoWaypoints,egoSpeed);

添加激光雷达对象列表非我演员制作的情节

非自我演员数据从激光雷达传感器收集和作为文本文件存储。该文本文件包含存储演员的ID五列,X的位置,ÿ的位置,ž位上和时间戳值,分别。使用helperGetNonEgoData函数的作用是:将文本文件中的非自我参与者数据导入MATLAB®工作空间中的结构。输出是一个有三个字段的结构:

  1. actorId来- 方案定义的演员的标识符,指定为一个正整数。

  2. 位置 -角色的位置,指定为[Xÿž]真正的载体。单位为米。

  3. 时间- 所述传感器记录的时间戳。

nonEgoFile ='NonEgoUrban.txt';nonEgoData = helperGetNonEgoData(nonEgoFile);

使用helperComputeNonEgoData计算每个非我行动者在每个时间戳上的轨迹路径点和速度。相对于自我车辆计算弹道路径点。

演员=独特(nonEgoData.ActorID);[nonEgoSpeed, nonEgoWaypoints] = helperComputeNonEgoData(egoData,egoWaypoints,nonEgoData,egoAngle);

非自我的演员加入驾驶情形。创建从计算出的设定演员的航点和速度的非自我行为轨迹。

对于i = 1:长度(演员)'长度',1“宽度”,0.6,'高度',0.6);轨迹(演员,nonEgoWaypoints {}, nonEgoSpeed{我});结束

可视化自身车辆和您导入到生成的场景下非自我的演员。也可视自身车辆和非自我角色的相应轨迹航点。

%创建自定义图窗口并定义一个轴对象无花果=图;集(无花果,'位置',[0,0,800,600]);movegui(无花果,“中心”);hViewPnl = uipanel(无花果,'位置',[0 0 1 1],'标题'“自车辆和演员”);hCarPlt =轴(hViewPnl);%绘制所产生的驱动方案。情节(场景中,“父”,hCarPlt);轴([270320 80120]);传奇(“进口路网”“通道”“自车辆”“演员1”《演员2》“演员3”“演员4”“演员5”)图例(hCarPlt,'boxoff');

图中,图(egoWaypoints(:,1),egoWaypoints(:,2),“颜色”,[0 0.447 0.741],“线宽”2)保持cMValues = [0.85 0.325 0.098; 0.929 0.694 0.125; 0.494 0.184 0.556; 0.466 0.674 0.188; 0.301 0.745 0.933];对于i = 1:长度(演员)情节(nonEgoWaypoints{我}(:1),nonEgoWaypoints{我}(:,2),“颜色”,cMValues(I,:),“线宽”,2)结束轴(“紧”)xlabel('X(米)')ylabel('Y(M)')标题(计算自我车辆和行为轨迹)传说(“自车辆”“演员1”《演员2》“演员3”“演员4”“演员5”'位置''最好')保持

模拟和可视化生成的脚本

情节情节和相应的追逐情节。运行模拟以可视化生成的驾驶场景。自我载体和非自我行动者遵循各自的轨迹。

%创建一个自定义图形窗口显示场景和情节的追逐所有;figScene =系数('名称'“驾驶情形”“标签”'ScenarioGenerationDemoDisplay');集(figScene,'位置',[0, 0, 1032, 1032]);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);情节(场景中,“父”,hCarPlot);%设定轴界限仅显示有效区域XMIN =分钟(egoWaypoints(:,1));XMAX = MAX(egoWaypoints(:,1));YMIN =分钟(egoWaypoints(:,2));YMAX = MAX(egoWaypoints(:,2));极限= [XMIN XMAX YMIN YMAX];轴(限制);%运行仿真推进(场景)暂停(0.01)结束

摘要

此示例示出了如何自动生成从使用GPS和激光雷达传感器记录车辆数据的虚拟驾驶情形。

辅助函数

helperGetEgoData

该函数读取从一个文本文件,并转换成结构中的自主车辆的数据。

功能[egoData] = helperGetEgoData(egoFile)%阅读从文本文件中的自我车辆数据FILEID =的fopen(egoFile);含量= textscan(FILEID,'%F%F%F');字段= {'LAT''LON''时间'};egoData = cell2struct(内容,字段,2);FCLOSE(FILEID);结束

helperGetNonEgoData

该函数读取从一个文本文件,并转换成结构中的处理的激光雷达数据。激光雷达数据包含了非自我角色信息进行处理。

功能[nonEgoData] = helperGetNonEgoData(nonEgoFile)%从阅读文本文件的非自我角色的处理LiDAR数据。FILEID =的fopen(nonEgoFile);含量= textscan(FILEID,'%d%F%F%F%F');newcontent {1} =含量{1};newcontent {2} = [内容{2}内容{3}含量{4}];newcontent {3} =含量{5};字段= {“ActorID”'位置''时间'};nonEgoData = cell2struct(newcontent,字段,2);FCLOSE(FILEID);结束

helperComputeEgoData

此函数计算基于轨迹的航点和时间戳的自身车辆的速度和航向角。

功能[egoSpeed, egoAngle] = helperComputeEgoData(egoData, X, Y);timeDiff = diff (egoTime);点= [X Y];差值= diff(点数,1);距离= sqrt(和(差。*差,2));egoSpeed =某种天体/ timeDiff;egoAngle =每股(diff (Y)。/ diff (X));egoAngle结束(+ 1)= egoAngle(结束);egoSpeed结束(+ 1)= egoSpeed(结束);结束

helperComputeNonEgoData

此函数计算的速度和基于轨迹航点和时间戳每个非自我演员的航向角。的速度和航向角是相对于自主车辆计算。

功能[nonEgoSpeed,nonEgoWaypoints] = helperComputeNonEgoData(egoData,egoWaypoints,nonEgoData,egoAngle)演员=唯一的(nonEgoData.ActorID);numActors =长度(演员);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];%计算非自我行动者的轨迹路径点[sharedTimeStamps,nonEgoIdx,egoIdx] =相交(actorTime,egoData.Time,'稳定');tempX = actorXData(nonEgoIdx);tempY = actorYData(nonEgoIdx);relativeX = -tempX * COS(egoAngle(egoIdx))+ tempY * SIN(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;%计算非我演员的速度值timeDiff测量= DIFF(sharedTimeStamps);差= DIFF(actorWaypoints,1);距离= sqrt(和(差。*差,2));actorSpeed = distance./timeDiff;actorSpeed(端+ 1)= actorSpeed(端);%平滑非我演员的轨迹航点actorWaypoints = smoothdata(actorWaypoints,'sgolay');%存储轨迹航点和速度计算每个非自我演员的价值nonEgoWaypoints(ⅰ)= {actorWaypoints};nonEgoSpeed(ⅰ)= {actorSpeed'};结束结束

也可以看看

应用程序

职能

对象

相关话题

外部网站