主要内容

从记录数据生成车道信息

这个例子展示了如何使用记录生成车道信息数据。此工作流使您能够添加进口车道规范道路网络标准定义(SD)地图数据使用记录数据从一个摄像头和一个GPS传感器。

概述

您可以使用虚拟驾驶场景再现真实场景记录车辆数据。生成公路网络创建一个虚拟驾驶场景中一个重要的阶段。使用一个drivingScenario对象或驾驶场景设计师应用程序,您可以从OpenStreetMap®,进口道路网络提供了SD地图数据。然而,这样的公路网络缺乏详细的车道信息,对导航在一个自治系统至关重要。在本例中,您创建一个虚拟驾驶场景通过生成一个drivingScenario对象使用一个测试数据记录(自我)车辆和公开文件。OpenStreetMap文件描述区域的道路网络信息数据被记录下来。

记录的数据包括:

  • GPS数据,包含了纬度、经度和海拔高度的自我车辆在每一个时间戳。

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

  • 跟踪数据,包含在每个时间戳的自我检测车道跟踪轨迹在当地坐标系自我的工具。

创建车道规范和模拟一个场景中,遵循这些步骤:

  1. 探讨车辆数据记录。

  2. 导入一个开放地图道路网络为驱动的场景。

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

  4. 确定自我的道路车辆旅行。

  5. 创建车道规范。

  6. 生成一个新的场景。

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

这个图显示了如何使用此示例中的记录数据。注意,您创建驾驶场景从GPS数据,并公开文件。

探索记录车辆数据

自我车辆的位置已经使用了车道检测传感器模块。内置GPS传感器放置在中间的自我车辆的仪表板。相机内置的传感器模块返回车道检测的抛物线参数。

加载数据

定义数据的时间戳的范围。

startTimeStamp = 1461634426377778;endTimeStamp = 1461634462779242;

加载GPS数据,跟踪检测,从各自的垫文件和图像数据为选定的时间戳。

[gpsData, laneDetections cameraImages] = helperLoadFile (startTimeStamp endTimeStamp);

想象自我的轨迹

提取经度、纬度、时间和高度值从GPS数据。

数= (gpsData, 2)大小;时间= arrayfun (@ (x) x.timeStamp gpsData) ';lat = arrayfun (@ (x) x.latitude gpsData) ';朗= arrayfun (@ (x) x.longitude gpsData) ';alt = arrayfun (@ (x) x.altitude gpsData) ';

可视化记录GPS数据使用geoplayer对象。

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

可视化车道检测

记录的车道检测显示自我的驾驶车道车辆的信息。想象这些检测使用一个鸟瞰的阴谋。

currentFigure图(Name = =“莱茵检测”);hPlot =轴(uipanel (currentFigure));cep = birdsEyePlot (XLim = 60 [0], YLim = 35[-35],父= hPlot);bepPlotters。LaneLeft = laneBoundaryPlotter (cep),DisplayName =“左车道标记”,颜色=“红色”线型=“-”);bepPlotters。LaneRight = laneBoundaryPlotter (cep),DisplayName =“右车道标记”,颜色=“红色”线型=“-”);olPlotter = outlinePlotter (cep);i = 1:尺寸(laneDetections, 2) plotOutline (olPlotter [0 0] 0、4.7、1.8, OriginOffset = -1.35[0],颜色= 0.447 - 0.741 [0]);%画左车道边界egoLaneLeft =投([laneDetections(我).left.curvature laneDetections .left.headingAngle(我),laneDetections .left.offset)(我),“单身”);bepPlotters.LaneLeft。线型= drivingUtils.getLaneTypeBEV (laneDetections(我).left.boundaryType);磅= parabolicLaneBoundary (egoLaneLeft);plotLaneBoundary (bepPlotters.LaneLeft磅);%画右车道边界egoLaneRight =投([laneDetections(我).right.curvature laneDetections .right.headingAngle(我),laneDetections .right.offset)(我),“单身”);bepPlotters.LaneRight。线型= drivingUtils.getLaneTypeBEV (laneDetections(我).right.boundaryType);rb = parabolicLaneBoundary (egoLaneRight);plotLaneBoundary (bepPlotters.LaneRight, rb);暂停(0.01);结束

道路网OpenStreetMap导入驾驶场景

道路网络文件用于生成虚拟的场景已经被下载OpenStreetMap (OSM)的网站。OpenStreetMap提供在世界范围内,众包的地图数据。数据开放数据共享开放数据库许可下的(ODbL)。ODbL的更多信息,请参阅开放数据共享开放数据库许可网站。使用经度和纬度数据从GPS获取一个开放地图文件包含相应的道路网络信息。使用roadNetwork函数来将这条道路网络信息导入驾驶场景。

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

场景= drivingScenario;%根据GPS坐标取SD地图url = [“https://api.openstreetmap.org/api/0.6/map?bbox=”num2str(最低(朗))”、“num2str (min (lat))”、“num2str (max(朗))”、“num2str (max (lat)));文件名= websave (“drive_map.osm”、url、weboptions (ContentType =“xml”));roadNetwork(场景中,“公开”文件名);

增加自我从GPS车辆数据导入场景

自我车辆位置从GPS传感器收集的数据和文件存储为垫。这个文件指定了经度,纬度,海拔米,米每秒的速度,在Unix时间戳值POSIX记录时间戳格式为每个数据实例的自我。

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

起源= [(max (lat) +分钟(lat)) / 2, (min(朗)+ max(朗))/ 2,0];路点= 0(统计,3);%纬度和经度转换为局部坐标为自我创建锚点工具(锚点(:1),锚点(:,2)]= latlon2local(纬度、经度、alt、来源);%过滤器来去除噪声窗口=圆(数* 0.2);路点= smoothdata(锚点,“rloess”,窗口);

计算的速度自我。

distancediff = diff(锚点);timediff =投(diff(时间),“替身”)。/ 1000000;egoSpeed = 0(计数,1);egoSpeed(2:结束)= vecnorm (distancediff. / timediff 2 2);egoSpeed (1) = egoSpeed (2);

添加自我车辆进口的场景。

egoVehicle =车辆(场景,ClassID = 1,网= driving.scenario.carMesh);轨迹(egoVehicle中转地点,egoSpeed);

自我识别道路相交的道路

导入的道路网络包含许多道路。提取自我车辆的公路旅行。

(道路、roadData) = helperGetRoadsInEgoPath(场景中,锚点);

helperGetRoadsInEgoPath函数提取自我车辆的公路旅行。该函数返回RoadIDsroadData结构,其中包含信息,如道路中心、道路宽度、和道路名称相关的道路中创建导入的场景。

当连接存在于自我车辆路径,helper函数helperGetRoadsInEgoPath试图创建一个序列的道路没有连接通过扩展连接的连接道路。当辅助函数helperGetRoadsInEgoPath不能这样做,它会返回一个错误。

创建车道规范

这个示例使用记录创建车道车道检测规范。记录数据提供驾驶车道车辆坐标系中的信息。初始化这些参数来创建车道规格:

  • numOfLanes——数量的车道在路上。这个例子假定三车道,车道宽度相同。

  • startingLane——巷ID第一自我车辆的路标。将这个值设置为默认情况下,这个例子3

找到自我巷

辅助函数helperGetEgoLanePosition使用startingLane参数计算的车道自我车辆旅行。突然改变车道宽度在点自我车辆车道变化可以导致函数返回不正确的车道上。

numOfLanes = 3;startingLane = 3;%从进口获取自我构成的场景[偏航、俯仰、滚]= drivingUtils.getEgoPose(场景中,锚点);egoPose =结构(“偏航”偏航,“节”球场上,“滚”、卷);egoLanePosition = helperGetEgoLanePosition (laneDetections egoPose,锚点、startingLane numOfLanes);

创建车道从车道检测规范

创建车道规范使用helperCreateLaneSpecification函数。这个函数接受这些输入参数:车道检测,自我车辆路径点,自我车辆构成,IDs自我的道路车辆旅行,自我的车道,车道车辆存在在每一个路标。

可选地,您还可以指定这些名称参数:

  • showAllLanes——设置这个参数真正的创建车道标记的所有通道。否则,设置这个参数。当设置为,只有巷的函数创建车道标记数据的记录,这是自我车辆的车道。默认情况下,辅助功能设置该参数真正的。在创建non-ego车道标记时,函数使用左车道跟踪检测之间的所有车道标记当前左车道从跟踪检测和左边道路边缘。函数使用右车道跟踪检测之间的所有车道标记当前右车道边缘跟踪检测和正确的道路。

  • RoadEdges——指定左和右车道标志风格道路边缘,分别作为一个双元素车道标记对象的向量。默认情况下,这个helper函数适用于固体车道公路边的标记。

helperCreateLaneSpecification函数返回一个结构存储巷规范和IDs的道路。

%的车道标志风格道路边缘roadEdges = [laneMarking (“固体”颜色=“y”)laneMarking (“固体”));%创建所有车道路面标志%创建车道规范lanespecifications = helperCreateLaneSpecification (laneDetections,锚点、egoPose、道路、numOfLanesegoLanePosition showAllLanes = true, RoadEdges = RoadEdges);

生成的场景

创建一个新的驾驶场景。添加提取的道路,车道规范,自我,和自我发展轨迹的场景。

newScenario = drivingScenario;

添加计算车道的道路规范。

i = 1:长度(lanespecifications) roadId = lanespecifications{我}.RoadID;pos = arrayfun (@ x (x)。ID = = roadId roadData);路(newScenario roadData .RoadCenters (pos),“道”,lanespecifications{我}.specifications);结束

路点产生的GPS数据倾斜到左边。校正因子添加到路径点转移到右边,和平滑路径点删除任何噪音。

修正= 3.5;路点= mathUtils.shiftPoints(锚点,修正,1);窗口=圆(长度(锚点)* 0.2);路点= smoothdata(锚点,“rloess”,窗口);

增加自我车辆及其锚点。

egoVehicle =车辆(newScenario,ClassID = 1,网= driving.scenario.carMesh,长度= 2,宽度= 1);轨迹(egoVehicle(锚点(:1)锚点(:,2)锚点(:,3)],egoSpeed);

模拟和可视化生成场景

运行仿真可视化生成的驾驶场景。自我车辆GPS数据产生的轨迹。验证检测信息产生的记录。

%的可视化currentFigure图(Name = =“生成的场景和相机地面实况图像”位置= [0 0 1400 600]);movegui (currentFigure“中心”);%添加追逐情节hCarViewPanel = uipanel (currentFigure位置=(0.5 0 0.5 - 1),标题=“追逐阴谋”);hCarPlot =轴(hCarViewPanel);chasePlot (egoVehicle父母= hCarPlot ViewPitch = 90, ViewHeight = 120, ViewLocation = [0 0]);%添加顶部视图生成的场景hViewPanel = uipanel (currentFigure位置=(0.5 0 0 1),标题=“相机视图”);hPlot =轴(hViewPanel);i = 1;camerTime =投([cameraImages (:)。时间戳)”——gpsData .timeStamp (1),“替身”)/ 10 ^ 6;推进(newScenario)我< = (camerTime) & & newScenario长度。SimulationTime > = camerTime (i)图像(cameraImages(我).mov.cdata父= hPlot);我=我+ 1;结束暂停(0.001);结束

相关的话题