主要内容

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

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

概述

虚拟驾驶场景可用于根据记录的车辆数据重新创建真实场景。这些虚拟场景使您能够可视化和研究原始场景。因为您可以通过编程方式修改虚拟场景,所以在设计和评估自动驾驶系统时,也可以使用虚拟场景来综合场景变化。

在本例中,您通过生成drivingScenario对象来自从测试(ego)车辆和ASAM OpenDRIVE®文件记录的数据。ASAM OpenDRIVE文件描述了记录数据区域的道路网络。记录的车辆数据包括:

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

  • 激光雷达目标列表数据:文本文件,包含每个时间戳中非自我行为者的数量和他们的中心相对于自我载体的位置。

  • 视频数据:MP4从安装在ego车辆上的前向单目摄像头记录的文件。

要生成和模拟驾驶场景,请执行以下步骤:

  1. 浏览记录的车辆数据。

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

  3. 将来自GPS的ego车辆数据添加到驾驶场景中。

  4. 将激光雷达对象列表中的非自我参与者添加到驾驶场景中。

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

下图显示了如何在本示例中使用记录的数据。注意,您是从GPS、激光雷达对象列表和ASAM OpenDRIVE文件中创建驾驶场景的。您可以使用摄像机数据来可视化原始场景,并将该数据与生成的场景进行比较。您还可以在地图上可视化场景路线使用geoplayer

浏览记录的车辆数据

使用UBlox GPS NEO M8N传感器捕捉ego车辆的位置。GPS传感器被放置在“自我”汽车车顶的中央。该数据保存在文本文件中EgoUrban.txt

使用射程为30米的Velodyne®VLP-16激光雷达传感器捕获非ego参与者的位置。VLP-16传感器放置在ego车辆顶部的位置和高度,避免传感器与ego车辆车身碰撞。激光雷达传感器的点云在车辆上处理,以检测对象及其相对于ego车辆的位置。此数据保存在文本文件中NonEgoUrban.txt

为了帮助理解原始场景,录制了单目摄像机的视频作为参考。此视频还可用于直观地比较原始场景和生成的场景。此录制视频的预览保存在视频文件中urbanpreview.mp4.你可以下载完整的录像文件在这里

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

视频阅读器(“urbanpreview.mp4”); 图=图;设置(图,“位置”,[0,0,800, 600]);movegui(图,“中心”); pnl=uipanel(图,“位置”,[0 0 1 1],“头衔”“城市交通场景”);plt=轴(pnl);虽然hasFrame(vidObj)vidFrame=readFrame(vidObj);图像(视频帧,“家长”,plt);电流轴。可见=“关”暂停(1/vidObj.帧速率);结束

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

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

用于生成虚拟场景的道路网络数据来自开放式街道地图®。OpenStreetMap数据文件被转换为ASAM OpenDRIVE文件并以扩展名保存.xodr.使用道路网功能将此道路网络数据导入到驾驶场景中。

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

场景= drivingScenario;openDRIVEFile =“OpenDRIVEUrban.xodr”;道路网络(场景,“OpenDRIVE”,openDRIVEFile);

将来自GPS的Ego车辆数据添加到生成的场景中

ego车辆数据从GPS传感器收集并存储为文本文件。文本文件包括三列,用于存储ego车辆的纬度、经度和时间戳值。使用黑麦草函数将ego车辆数据从文本文件导入到MATLAB®工作空间中的一个结构中。该结构包含三个字段,分别指定纬度、经度和时间戳。

电子档案=“EgoUrban.txt”;egoData=helperGetEgoData(egoFile);

根据记录的GPS坐标计算ego车辆的轨迹路径点。使用拉丁美洲函数将原始GPS坐标转换为本地东-北-上笛卡尔坐标。转换后的坐标定义了ego车辆的轨迹航路点。

%指定从ASAM opdrive文件的数据来源的纬度和经度。这个点也将定义本地坐标系的原点。alt = 540.0%印度海得拉巴的平均海拔高度
alt=540
原点=[17.425853702697903,78.44939480188313,alt];%[纬度,lon,海拔]%指定自我车辆的经度和纬度lat=egoData.lat;lon=egoData.lon;%计算ego车辆的航路点[X,Y,~]=latlon2local(lat,lon,alt,原点);电子航路点(:,1)=X;电子航路点(:,2)=Y;

使用GPS显示ego车辆的GPS路径geoplayer对象

zoomLevel=17;player=GeoLayer(纬度(1)、lon(1)、zoomLevel);plotRoute(播放器、纬度、lon);i=1:长度(横向)绘图位置(播放器、横向(i)、纵向(i));结束

使用助手computeegodata计算每个传感器数据时间戳处ego车辆的速度和航向角值。

[egoSpeed,egoAngle]=帮助器ComputeeGoData(egoData,X,Y);

将ego车辆添加到驾驶场景中。

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

根据计算出的一组ego航路点和速度为ego车辆创建一条轨迹。ego车辆以指定速度跟随轨迹。

轨迹(自我、自我航路点、自我速度);

将激光雷达对象列表中的非自我参与者添加到生成的场景中

非自我参与者数据从激光雷达传感器收集并存储为文本文件。文本文件由存储参与者ID的五列组成,x-职位,y-职位,z-position和timestamp值。使用helperGetNonEgoData函数将文本文件中的非自我参与者数据导入MATLAB®workspace的结构中。输出是一个包含三个字段的结构:

  1. ActorID-场景定义的参与者标识符,指定为一个正整数。

  2. 位置-角色的位置,指定为[xyz】真正的向量。单位是米。

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

nonEgoFile =“NonEgoUrban.txt”;nonEgoData=helperGetNonEgoData(nonEgoFile);

使用助手公司数据计算轨迹航路点和每个非自我参与者在每个时间戳的速度。相对于自我车辆计算轨迹航路点。

actors=unique(nonEgoData.ActorID);[nonEgoSpeed,nonEgoWaypoints]=helpercomputenegodata(egoData,egoWaypoints,nonEgoData,egoagle);

将非自我参与者添加到驾驶场景中。根据计算出的参与者航路点集和速度为非自我参与者创建轨迹。

i=1:长度(参与者)参与者=车辆(场景,“长度”1.“宽度”,0.6,“高度”轨迹(演员,非飞行点{i},非飞行速度{i});结束

可视化您导入到生成场景中的自我载体和非自我参与者。同时可视化自我载体和非自我行动者的相应轨迹路径点。

%创建自定义地物窗口并定义轴对象图=图;集合(图,“位置”,[0,0,800, 600]);movegui(图,“中心”);hViewPnl = uipanel(图,“位置”,[0 0 1 1],“头衔”“自我载体和演员”);hCarPlt=轴(hViewPnl);%绘制生成的驾驶场景。情节(场景,“家长”,hCarPlt);轴线([270 320 80 120]);传奇(“进口道路网”“车道”“自我载体”“演员1”“演员2”“演员3”“演员4”“演员5”)图例(hCarPlt,“boxoff”);

图形、绘图(电子航路点(:,1)、电子航路点(:,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:length(actors)绘图(非gowaypoints{i}(:,1),非gowaypoints{i}(:,2),“颜色”,Cm值(i,:),“线宽”,2)结束轴(“紧”)xlabel(‘X(m)’)伊拉贝尔(‘Y(m)’)头衔(“计算的自我载体和演员轨迹”)传奇(“自我载体”“演员1”“演员2”“演员3”“演员4”“演员5”“位置”“最佳”)持有

模拟和可视化生成的场景

绘制场景和相应的追逐图。运行模拟以可视化生成的驾驶场景。自我车辆和非自我参与者遵循各自的轨迹。

%创建一个自定义图形窗口来显示场景和追逐情节关闭全部的;figScene =图(“名字”“驾驶场景”“标签”“ScenarioGenerationDemoDisplay”); 集(figScene,“位置”,[0,010322,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=min(egoWaypoints(:,1));xMax=max(egoWaypoints(:,1));yMin=min(egoWaypoints(:,2));yMax=max(egoWaypoints(:,2));极限=[xMin-xMax-yMin-yMax];轴(极限);%运行模拟虽然提前(场景)暂停(0.01)结束

总结

这个例子展示了如何从GPS和激光雷达传感器记录的车辆数据自动生成虚拟驾驶场景。

辅助函数

黑麦草

这个函数从文本文件中读取ego车辆数据并将其转换为结构。

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

helperGetNonEgoData

此函数从文本文件中读取处理后的激光雷达数据,并将其转换为结构。处理后的激光雷达数据包含有关非自我参与者的信息。

作用[nonEgoData] = helperGetNonEgoData (nonEgoFile)%从文本文件中读取经过处理的非自我参与者的激光雷达数据。fileID=fopen(nonEgoFile);content=textscan(fileID,'%d %f %f %f'); newcontent{1}=content{1};newcontent{2}=[content{2}content{3}content{4}];newcontent{3}=content{5};字段={“阿克托丽德”“位置”“时间”};nonEgoData = cell2struct (newcontent字段2);文件关闭(文件标识);结束

助手computeegodata

该函数根据轨迹航路点和时间戳计算ego车辆的速度和航向角。

作用[egoSpeed,egoAngle]=helperComputeEgoData(egoData,X,Y)egoTime=egoData.Time;timeDiff=diff(egoTime);points=[xy];difference=diff(points,1);distance=sqrt(总和(差值。*差值,2));egoSpeed=distance./timeDiff;egoAngle=atan(差值(Y)。/diff(X));egoAngle(end+1)=(end);egoSpeed(end+1)=egoSpeed(end);结束

助手公司数据

此函数根据轨迹航路点和时间戳计算每个非ego参与者的速度和航向角。速度和航向角是相对于ego车辆计算的。

作用[nonEgoSpeed,nonEgoWaypoints]=HelperComputeOneGoData(egoData,egoWaypoints,nonEgoData,egoAngle)actors=unique(nonEgoData.ActorID);numActors=长度(演员);非gowaypoints=单元(numActors,1);非高斯速度=单元(numActors,1);i=1:numActors id=actors(i);idx=find([nonEgoData.ActorID]==id);actorXData=nonEgoData.Position(idx,1);actorYData=nonEgoData.Position(idx,2);actorTime=nonEgoData.Time(idx);actorWaypoints=[0];%计算非自我参与者的轨迹航路点[sharedTimeStamps, nonEgoIdx egoIdx] = (actorTime, egoData相交。时间,“稳定”)tempX=actorXData(nonEgoIdx);tempY=actorYData(nonEgoIdx);relativeX=-tempX.*cos(egoagle(egoIdx))+tempY.*sin(egoagle(egoIdx));relativeY=-tempX.*sin(egoagle(egoIdx))-tempY.*cos(egoagle(egoIdx));actorWaypoints(nonEgoIdx,1)=(egoIdx,1)+relativeX;actorWaypoints(nonEgoIdx,2)=egoIdx,2)+相对性;%计算非自我参与者的速度值timeDiff = diff (sharedTimeStamps);差= diff(actorWaypoints, 1);距离=√(sum(difference .* difference, 2));actorSpeed =某种天体/ timeDiff;actorSpeed结束(+ 1)= actorSpeed(结束);%平滑非自我参与者的轨迹航路点actorWaypoints = smoothdata (actorWaypoints,“sgolay”);%存储每个非自我行为者计算的轨迹路径点和速度值nonEgoWaypoints (i) = {actorWaypoints};nonEgoSpeed (i) = {actorSpeed '};结束结束

另请参阅

应用程序

功能

对象

相关的例子

更多关于

外部网站