主要内容

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

此示例显示如何从录制的车辆数据生成虚拟驾驶场景。从从GPS传感器记录的位置信息和从LIDAR传感器处理的记录的对象列表产生方案。

概述

虚拟驾驶场景可用于重新创建录制的车辆数据的实际情况。这些虚拟方案使您能够可视化和研究原始方案。因为您可以以编程方式修改虚拟方案,所以您还可以使用它们在设计和评估自主驱动系统时综合方案变化。

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

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

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

  • 视频数据:MP4文件从安装在自助式车辆上的面向正面的单手套摄像头中录制。

要生成和模拟驱动方案,请按照下列步骤操作:

  1. 探索记录的车辆数据。

  2. 将开放式道路网络导入驾驶场景。

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

  4. 从LIDAR对象列表中添加非自我演员到驱动方案。

  5. 模拟和可视化生成的方案。

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

探索记录的车辆数据

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

使用Velodyne®VLP-16 LIDAR传感器捕获非Ego actors的位置,范围为30米。VLP-16传感器位于自助式车辆的顶部,处于避免使传感器与自工载体的主体碰撞的位置和高度。来自LIDAR传感器的点云在车辆上处理以检测相对于自助载体的物体及其位置。该数据保存在文本文件中nonegourban.txt.

为了帮助了解原始方案,从单眼摄像机视频被记录为参考。此视频还可用于在视觉上比较原始和生成的方案。该录制视频的预览保存在视频文件中UrbanPreview.mp4..你可以下载完整的录像文件这里

生成此示例中使用的城市交通方案的预览。

Vidobj = Videoreader('UrbanPreview.mp4');图=图;套(图,'位置',[0,0,800, 600]);movegui(图,'中央');pnl = uipanel(图,'位置',[0 0 1 1],'标题'“城市交通场景”);PLT =轴(PNL);尽管hasfame(vidobj)vidframe = ReadFrame(Vidobj);图像(VidFrame,'父母',PLT);潮流='离开';暂停(1 / Vidobj.framerate);结束

图包含UIPanel类型的轴和对象。轴包含类型图像的对象。

图包含UIPanel类型的轴和对象。轴包含类型图像的对象。

虽然可以在整个自助车辆周围定义传感器覆盖面积,但此示例仅显示前瞻性方案。

将开放式道路网络导入驾驶场景

下载了用于生成虚拟方案的道路网络文件https://www.openstreetmap.org该网站提供了世界各地的众包地图数据。数据是在开放数据共享开放数据库许可证(ODbL)下许可的,https://opendatacommons.org/licenses/odbl/.OpenStreetMap数据文件将转换为OpenDrive文件并使用扩展名保存.xodr.使用公路网将此道路网络数据导入驱动方案的功能。

创建一个驾驶场景对象,并将所需的开放式道路网络导入生成的方案。

场景= drivingScenario;openDRIVEFile ='opendriveurban.xodr';Roadnetwork(情景,“OpenDRIVE”,opendrivefile);

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

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

Egofile =“EgoUrban.txt”;Egodata = Helpergetegodata(Egofile);

根据记录的GPS坐标计算ego车辆的轨迹路径点。使用Latlon2local.功能将原始GPS坐标转换为当地东北笛卡尔坐标。变换的坐标定义了自我车辆的轨迹航点。

%指定数据来源的纬度和经度从OpenDRIVE文件。这个点也将定义本地坐标系的原点。alt = 540.0;印度海德拉巴的%海拔高度来源= [17.425853702697903,78.44939480188313,ALT];%[纬度,lon,海拔]%指定自我车辆的经度和纬度lat = egodata.lat;lon = egodata.lon;自我车辆的%计算航点[x,y,〜] = latlon2local(lat,lon,Alt,Origin);egowaypoints(:,1)= x;egowaypoints(:,2)= y;

可视化自助式车辆的GPS路径使用geoplayer目的。

zoomlevel = 17;玩家= Geoplayer(Lat(1),Lon(1),Zoomlevel);PlotRoute(球员,拉特,Lon);i = 1:长度(LAT)绘图(播放器,LAT(i),Lon(i));结束

图形地理播放器包含轴。轴包含4个类型的类型,分散,文本。

使用HelperComputeeGodata.在每个传感器数据时间戳下计算自我车辆的速度和标题角度。

[Egospeed,EGOANGLE] = HelperComputeeGodata(Egodata,X,Y);

将自我车辆添加到驾驶场景。

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

从计算机的自我航点和速度创建自助车辆的轨迹。EGO车辆以指定速度遵循轨迹。

轨迹(自我,egowaypoints,Egosp);

将非自我演员从LIDAR对象列表中添加到生成的方案

从LIDAR传感器收集非Ego Actor数据并作为文本文件存储。文本文件由五列存储演员ID,x- 留下,y- 留下,z-position和timestamp值。使用helperGetNonEgoData从文本文件导入非自我演员数据的函数将在MATLAB®工作区中的结构中。输出是具有三个字段的结构:

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

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

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

nonEgoFile =“NonEgoUrban.txt”;notgodata = helpergetnonegodata(notgofile);

使用Helpercomputenonegodata.计算轨迹航点以及每个时间戳的每个非自我演员的速度。轨迹航点相对于自助载体计算。

Actors =唯一(非正常数据.Actorid);[NoneGospeed,NotGowayPoints] = HelperComputenoneGodata(Egodata,EgowayPoints,NotGoData,EGoAngle);

将非自我演员添加到驾驶场景中。从计算的演员航路点和速度为非自我演员创建轨迹。

i = 1:长度(演员)Actor =车辆(方案,“ClassID”,1,'长度',1,'宽度',0.6,'高度',0.6);轨迹(演员,NotGowayPoints {i},nonegospeed {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');

图包含UIPanel类型的轴和对象。轴包含9个类型的贴片物体。这些物体代表进口的道路网络,车道,自我车辆,演员1,演员2,演员3,演员4,演员5。

图,绘图(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:长度(演员)绘图(NONGOWayPoints {i}(:,1),NONGOWAYPOINTS {i}(:,2),'颜色',cmvalues(我,:),'行宽'2)结束轴('紧的')xlabel('x(m)')ylabel('y(m)') 标题('计算自我车辆和演员轨迹') 传奇('自我车辆''演员1''演员2''演员3''演员4''演员5''地点'“最佳”) 抓住离开

图包含轴。带有标题的自我车辆和演员轨迹的轴包含6个类型的线。这些物体代表EGO车辆,演员1,演员2,演员3,actor 4,actor 5。

模拟和可视化生成的场景

绘制场景和相应的追逐图。运行模拟以可视化生成的驱动方案。自我车辆和非自我演员遵循各自的轨迹。

%创建一个自定义图形窗口来显示场景和追逐情节关闭全部;figScene =图(“名字”“驾驶场景”'标签'“ScenarioGenerationDemoDisplay”);套装(FICSCENE,'位置',[0,0,1032,1032]);Movegui(Figscene,'中央');%添加追逐曲线hcarviewpanel = Uipanel(FieScene,'位置',[0.5 0 0.5 1],'标题'“追逐相机视图”);hCarPlot =轴(hCarViewPanel);chasePlot(自我,'父母', hCarPlot);%添加生成方案的顶视图HviewPanel = Uipanel(FieScene,'位置',[0 0 0.5 1],'标题''顶视图');hcarplot =轴(hviewpanel);情节(场景,'父母', hCarPlot);%设置轴限制,只显示活动区域xmin = min(egowaypoints(:,1));xmax = max(egowaypoints(:,1));ymin = min(egowaypoints(:,2));ymax = max(egowaypoints(:,2));limits = [xmin xmax ymin yminymax];轴(限制);%运行模拟尽管前进(方案)暂停(0.01)结束

图形驱动场景包含UIPANEL类型的轴和其他对象。轴包含9个类型的贴片物体。

概括

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

辅助功能

Helpergetegodata.

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

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

helperGetNonEgoData

此函数从文本文件中读取已处理的LIDAR数据并转换为结构。处理后的LIDAR数据包含有关非自我演员的信息。

功能[nonEgoData] = helperGetNonEgoData (nonEgoFile)%从文本文件中读取非自我演员的已处理的LIDAR数据。fileid = fopen(notgofile);内容= textscan(文件标识,'%d %f %f %f');new content {1} =内容{1};new content {2} = [content {2}内容{3}内容{4}];new content {3} = content {5};字段= {'actorid''位置'“时间”};nonEgoData = cell2struct (newcontent字段2);文件关闭(文件标识);结束

HelperComputeeGodata.

该功能基于轨迹航点和时间戳来计算自我车辆的速度和标题。

功能[Egospeed,EGoAngle] = HelperComputeeGodata(Egodata,X,Y)Egotime = Egodata.time;timediff = diff(egotime);点= [x y];差异=差异(点,1);距离=√(sum(difference .* difference, 2));Egospeed =距离./timediff;eGoangle = atan(差异(y)./ diff(x));EGoAganle(终点+ 1)= eGOGANGLE(END);Egospeed(终端+ 1)= EGOSPEED(END);结束

Helpercomputenonegodata.

该功能基于轨迹航点和时间戳来计算每个非自我actor的速度和标题角度。相对于自助载体计算速度和标题角度。

功能[NOTGOSPEED,NONGOWAYPOINTS] = HelperComputenoneGodata(EGodata,egowaypoints,No.GoDodata,EGOAngle)Actors =唯一(非正根odActorid);Numattors =长度(演员);NONGOWAYPOINTS = CELL(NUMACTORS,1);nonegospeed = cell(numactors,1);i = 1:numactors id =演员(i);idx = find([nonegodata.actorid] == ID);ACTORXDATA = notGoData.position(idx,1);actorydata = notgodata.position(idx,2);actortime = notgodata.time(IDX);ACTORWAYPOINTS = [0 0];%计算非自我演员的轨迹航点[sharedTimeStamps, nonEgoIdx egoIdx] = (actorTime, egoData相交。时间,“稳定”);tempx = Actorxdata(非极其总奇);Tempy = ActoryData(非极其总数);相对x = -tempx。* cos(egoidx))+ tempy。* sin(egoinle(egoidx));相对= -tempx。* SIN(EGOONGE(egoidx)) -  Tempy。* cos(egoinle(egoidx));ACTORWAYPOINTS(NOTGOIDX,1)= egowaypoints(egoidx,1)+相对x;ACTORWAYPOINTS(NOTGOIDX,2)= egowaypoints(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 '};结束结束

另请参阅

应用

功能

对象

相关话题

外部网站