主要内容

此处使用高清实时地图数据验证车道配置

此示例显示如何从HERE HD Live Map(HERE HDLM)服务读取和可视化记录的驾驶路线的车道配置。该可视化可用于验证车载传感器(如单目摄像机)感知系统检测到的车道配置。

在此示例中,您了解如何从HDLM服务访问瓷砖层,并识别相关的道路级和车道级拓扑,几何和属性。

要阅读数据,请使用a这里目的。使用此处HD Live Map服务需要有效的HDLM凭据。您需要在此处进入单独的协议,以便访问HDLM服务,并获取所需的凭据(Access_key_ID和Access_key_secret)使用此处服务。

概述

高清(HD)地图是指专门为自动驾驶应用开发的映射服务。这些地图的精确几何形状(赤道附近最多1厘米)使它们适用于超出传统路线图的路线规划应用的自动驾驶工作流程。此类工作流程包括车道级验证,本地化和路径规划。此示例显示如何使用来自HD映射数据的路线级信息验证车道检测系统的性能。

HD映射数据的准确性使其用作地板传感器感知系统验证的地面真理数据的源。这种高精度可以更快,更准确地验证现有的已部署算法。

这里HD Live Map(HEDLM)是由此开发的基于云的高清地图服务,以支持高度自动化的驾驶。金宝app数据由瓷砖映射层组成,可提供对道路网络的准确几何和鲁棒属性的访问。将图层分组为以下模型:

  • 道路中心线模型:提供道路拓扑(指定为图中的节点和链接),形状几何和其他道路级属性。

  • 高清车道模型:提供Lane拓扑(作为车道组和车道组连接器),高精度的几何和车道级属性。

  • 高清本地化模型:提供支持车辆本地化策略的功能。金宝app

有关此处HDLM图层的概述,请参阅这里有高清实时地图图层

摄像头用于自动驾驶,以收集车辆周围道路拓扑的语义信息。车道边界检测、车道类型分类和道路标志检测算法构成了此类摄像头处理管道的核心。您可以使用HERE HDLM服务以及安装在车辆上的高精度GPS来评估此类算法的准确性并验证其性能。

在此示例中,您将学习如何:

  1. 阅读Road和Lane信息的HEDLM服务以获取录制的GPS序列。

  2. 对记录的GPS数据应用启发式路径匹配方法。由于GPS数据通常不精确,因此有必要解决将记录的地理坐标与道路网表示相匹配的问题。

  3. 识别与车辆相关的环境属性。一旦在地图上下文中成功定位车辆,您可以使用与车辆相关的道路和车道属性来验证车辆车载摄像头传感器记录的数据。

加载并显示摄像头和GPS数据

从记录的驱动器加载数据开始。本例中记录的数据来自Udacity®自驾汽车团队收集的驾驶数据集。这些数据包括由前向单目摄像头捕获的视频以及由GPS记录的车辆位置和速度。

加载centercamera.avi.相机视频数据和相应的视频时间戳。

RecordedData = fullfile(toolboxdir('驾驶'),'divertdata'......“udacity”'drive_segment_09_29_16');[VideoreR,videotime] = HelperLoadCameradata(FullFile(RecordedData));%显示相机数据的第一帧imageFrame=readFrame(视频阅读器);imshow(图像帧,“边界”'紧的');

从中加载GPS数据gpssequence.mat.垫锉。

数据=加载(完整文件)(记录数据,'gpssequence.mat'));gpsdata = data.gpstt;%绘制完整的路线和从GPS记录的第一位置gpsPlayer = geoplayer(gpsData.Latitude(1), gpsData.Longitude(1), 18);plotRoute (gpsPlayer gpsData。纬度,gpsData.Longitude);plotPosition (gpsPlayer gpsData.Latitude (1) gpsData.Longitude (1));

将记录的车辆位置与道路匹配

创建一个读者,用于读取此处的HD Live Map Tiles,其涵盖驱动器中的所有录制的GPS位置。如果此前未在此处设置HDLM凭据,则对话框会提示您输入它们。输入访问密钥ID访问关键秘密您从这里获得的技术,然后点击好啊

reader=此处HDLMReader(gpsData.Latitude,gpsData.Longitude);

阅读和绘制道路拓扑数据来自TopologiceGeometry.层。该层表示道路网络的配置。网络的节点对应于交叉点和死角。节点之间的链接表示连接街道的形状作为折线。这些功能的连接和几何形状包含在linksstartingintile.nodesintile.字段。

TopologyLayer =读(读者,'topologicegeometry') 数字('姓名''topologicegeometry');拓扑结构= plot(拓扑层);持有(拓扑,'在');Geoplot(拓扑结构,gpsdata.latitude,gpsdata.longitude,......'bo-''显示名称''路线');
TopologicalLayer =与属性的拓扑结果:数据:Heretiled:309106790 IntersectingLinkrefs:[44×1结构] LinkSstartingTile:Data :: OLP-HERE-HARE:HER-HDLM-PROTOBUF-NA-2'目录Version:4601使用绘图可视化顶部Gearyometry数据。

打印功能在螺旋桨层函数,其可视化HD Live Map层的可用数据,在同一地理轴上的录制驱动器。此函数在示例结束时定义,将用于绘制后续层。

鉴于沿驱动器记录的GPS位置,可以使用路由匹配算法来确定网络上的网络上的道路对应于。此示例使用启发式路由匹配算法,其认为空间最近的链接到录制的地理点。该算法施加车辆的行程方向以确定最可能的链路。此路由匹配方法不考虑具有高位置误差的道路连接,车辆访问或GPS数据。因此,这种方法可能不适用于所有方案。

终止训练器功能从给定的拓扑层中提取几何信息,并在具有相应链路的表中返回此信息。

拓扑Table =螺旋常规|(TopologyLayer.linksstartingintile,......{'linkid''geometry.here2dcoordindiffs'});拓扑Table.properties.variablenames = {'linkid''几何学'};

助手链接匹配器类创建链接匹配器,其中包含所需地图图块中的每个链路的形状几何。该类使用基本的空间分析来将记录位置与道路链路的形状坐标匹配。

linkMatcher=HelperLinkMatcher(拓扑表);%匹配录制路线的第一点到最可能的链接[linkId,linkLat,linkLon]=match(linkMatcher,gpsData.Latitude(1),......GPSDATA.Longitude(1),GPSDATA.VELOCITY(1,1:2));%绘制链接的形状几何形状geoplot(gpsplayer.axes,linklat,linklon,'r.-');

沿着匹配的道路检索速度限制

沿着特定道路的所有通道共用的特征归因于描述该道路的链接元素。一种这样的属性,速度限制描述了在链路上行驶的车辆的最大法律速度。一旦给定的地理坐标与链接匹配,就可以识别该链路的速度限制。因为速度限制的特征通常沿链路的长度变化,所以识别这些属性用于链路的特定范围。

SpeedAttributes.图层包含有关链接上预期车辆速度的信息,包括发布的速度限制。

SpeedLayer =读(读者,“速度属性”);

螺旋铲除限制功能提取链路相关长度和方向的速度限制数据。与提取链路的几何信息一样,特别是捕获速度限制数据需要专门的代码。

SpeedTable =螺旋螺钉螺旋限制(SpeedLayer);%找到匹配链接的速度限制条目速度=速度表(speedTable.LinkId==LinkId,:);

将录制的位置匹配到车道组

HD车道模型包含车道级的几何图形和道路属性,为支持自动驾驶应用提供必要的细节。金宝app与道路中心线模型相似,HD车道模型也遵循一种模式,即在车道层面使用拓扑来描述道路网络。然后,将通道组的特征归于该拓扑的元素。在HD车道模型中,主要的拓扑元素是车道群。

读取和绘制车道拓扑数据LaneTopology层。该层将车道拓扑表示为车道组和车道组连接件。车道组表示连接(路段)内的一组车道。车道组连接件将各个车道组相互连接。这些特征的连接性和几何图形包含在LaneGroupsStartingInTileLaneGroupConnectorsInTile字段,分别用于车道组和车道组连接件。

lanetopologylayer =读(读者,'lanetopology')LANEAXES = HELPERPLOTLAYER(LanetopologyLayer,......gpsdata.latitude,gpsdata.longitude);Geolimits(LaneAxes,[37.3823,37.3838],[-122.1151,-122.1128]);
LanetopologyLayer =具有属性的Lanetopology:数据:Heretiled:309106790 IntersectingLanegrouprefs:[56×1结构] LanegroupConnectorstile:[1174×1结构] LineGroupsstartingTileItle:[1783×1结构] TileCenterHere2doorditile:[37.3865 -122.1130]元数据:目录:'HRN:HRN:这里:Data :: OLP-HERE-HATE:HER-HDLM-PROTOBUF-NA-2'目录Version:4601使用图来可视化Lanetopology数据。

车道组代表多个车道。因此,该元素的几何形状由组所采用的多边形形状给出,如通道组的左和右边界所表达的。通过使用通过使用车道边界获取此车道几何形状终止训练器功能。

LaneGroupFields = {'lanegroupid'......'BoundaryGeometry.LeftBoundary.Here2CoordinatedIffs'......“BoundaryGeometry.RightBoundary.Here2dCoordinateDiffs”};lanetopologytable =螺杆植物(LanetopologyLayer.lanegroupsstartingintile,......LaneGroupFields);lanetopologytable.properties.variablenames = {'lanegroupid'......'refregeometry''命令大学'};

与开发匹配算法以识别最可能的旅行链路一样,与给定的GPS数据匹配到最可能的车道组可以遵循多种方法。这里描述的方法使用两层:LaneroadReferences.LaneTopology

  • LaneroadReferences.图层使您能够将道路中心线模型上的位置(由链接给定)转换为HD车道模型上的相应位置(由车道组给定)。由于链接先前已标识,因此可以将车道组匹配的候选项筛选到平铺中可用的所有车道组的较小子集。

  • LaneTopology层给出几何数据,其可用于考虑空间存在于每个候选车道组的边界内的数据。与将GPS数据与链路进行空间匹配一样,这种方法容易出错,并且受到记录的GPS数据的准确性的影响。除了匹配车道组外,还需要匹配车辆相对于车道组方向的方向向量。此步骤是必要的,因为车道的属性是根据拓扑方向定义的。

使用终止奖励函数生成存在至少一些链路的所有通道组的表。

referenceLayer=读取(读卡器,“LANEROADRENCES”);引用=升天设备(引荐);

创建一个通道组匹配器,其中包含所需地图块中的每个车道组的边界几何。这HelperlaneGroupMatcher.类创建一个车道组匹配器,其中包含所需地图块中的每个车道组的边界形状几何。它还包含与Lane组链接的参考表。和我们一样助手链接匹配器类,该类使用简单的空间分析方法来确定给定记录坐标是否存在于车道组的边界内。

LaneGroupMatcher = HelperlaneGroupMatcher(参考,LanetopologyTable);%匹配车道组和相对方向[LaneGroupid,insforward,broundgeometry] =匹配(LineGroupMatcher,LinkId,......GPSDATA.lititude(1),GPSDATA.Longitude(1),GPSDATA.VELOCITY(1,1:2));%绘制车道组的边界几何Geoplot(GPSPlayer.Axes,Ringgeometry(:1),界限测量(:,2),'M.-');

检索匹配的车道组的车道配置

与乘坐标识符映射到链接的速度属性一样,Lane属性也通过使用Lane组ID将功能分配给Lane组。这兰尼特贡品图层包含有关车道组的信息,包括本组中的每个通道的类型和车道边界的特征。

使用螺旋螺钉娱乐用于提取瓦片中的每个车道组的不同通道类型和车道边界标记的功能。

laneattributeslayer =读(读者,'laneattributes');laneattributeStable =螺杆植物(Laneattributeslayer);%找到匹配的车道组的Lane属性条目laneAttribute=LaneAttributeTestable.LaneGroupId==LaneGroupId;

使用此处HDLM数据可视化和验证录制的驱动器

生成的匹配算法和用于识别道路和车道属性的表可以扩展到记录的GPS坐标序列。对于每次步骤,车辆的位置与道路上的链路和车道组匹配。另外,速度限制和车道配置与相应的相机图像一起显示。

帮手梅类创建用于从录制的驱动器流式传输视频和GPS数据的工具,并在每个录制的车辆位置显示来自所选HD Live Map层的相关信息。

hdlmui = helperhdlmui(gpsdata.latitude(1),GPSData.Longitude(1));%将相机和GPS数据同步到通用时间表中synchronizeddata =同步(录像带,gpsdata);Videoreader.Currenttime = 0;maxdisplayrate = Videoreader.framerate * 5;%初始化一些变量以维护历史prevlinkid = 0;prevlanegroupid = 0;为了IDX = 1:高度(SynchronizedData)时间戳= SynchronizedData.time(IDX);%检查当前时间戳是否具有GPS数据hasgpsframe =〜(ismissing(synchronizeddata.latitude(idx))||......ismissing(SynchronizedData.Longitude(IDX)));如果hasgpsframe latitude = synchronizeddata.lattitude(IDX);rongitude = synchronizeddata.Longitude(IDX);Velocity = SynchronizedData.velocity(IDX,1:2);%匹配GPS位置链接[linkId, linkLat, linkLon] = match(linkMatcher,......纬度,经度,速度);如果linkid〜= prevlinkId%更新链接updatelink(hdlmui,linklat,linklon);prevlinkid = linkid;%更新速度限制速度=速度表(speedTable.LinkId==LinkId,:);更新(HDLMUI,Speed.Value);结尾%匹配GPS位置到Lane组[LaneGroupid,insforward,broundgeometry] =匹配(LineGroupMatcher,LinkId,......纬度,经度,速度);如果LaneGroupid〜= prevlanegroupid%更新车道组updateLaneGroup (hdlmUI boundGeometry);prevLaneGroupId = laneGroupId;%更新车道类型和边界标记laneAttribute=LaneAttributeTestable.LaneGroupId==LaneGroupId;plotlanes(hdlmui,laneattributestable.lanes {laneattribute},......laneattributestable.laneboundaries {laneattribute},是勇敢的);结尾更新位置(hdlmUI、纬度、经度);别的%读取视频的帧imageframe = ReadFrame(Videoreader);结尾UpdateImage(HDLMUI,ImageFrame);UpdateTime(HDLMUI,时间戳);暂停(1 / maxdisplayrate);结尾

结论

在此示例中,您探讨了如何:

  1. 从这里的HD Live Map服务中访问给定GPS序列的HD映射数据,并将该数据导入MATLAB。

  2. 将记录的GPS数据与导入的道路网络数据相匹配,以查找每个地理坐标的相关链路和车道组。

  3. 查询匹配链路和车道组的属性,例如速度限制和车道类型,开发用于对录制的相机数据的视觉验证道路的特征的工具。

可以进一步扩展在该示例中讨论的技术以支持感知算法的自动验证。金宝app

金宝app支持功能

螺旋桨层地理图中的图层数据和路由。

功能GX =螺旋平板(层,纬度,经度)%HelperplotLayer使用图层数据和路线创建地理绘图%gx =螺旋平板(层,纬度,经度)创建一个地理用识别的HDLM层和纬度给出的路线%轴绘图在新图中的百分比和经度。数字;%绘图层gx = plot(图层);%启用将数据添加到绘图中持有(GX,'在');%绘图纬度,经度数据Geoplot(GX,纬度,经度,'bo-''显示名称''路线');持有(GX,'离开');结尾

终止训练器从表格的层中提取拓扑元素的几何形状。

功能GeometRytable =螺杆凝固率(图层,字段)%促使geporyry创建一个具有拓扑元素的几何形状的表%geometrytable = enpergetgeometry(图层,字段)返回一个表百分比与顶部Geefometry的指定几何字段格式化%和lanetopology层。%预分配结构s = repmat(结构,大小(图层));为了字段=字段C = strsplit(字段{:},'。');为了idx = 1:numel(图层)fieldname = strjoin(c,'');s(idx)。(fieldname)= getfield(图层,{idx},c {:});结尾结尾geometrytable = struct2table;结尾

螺旋铲除限制从表格中的图层中提取速度限制数据。

功能SpeedTable =螺杆悬架Xeedlimits(图层)%HerpergetSpeedLimits创建具有速度限制的数据表%speedtable = helpergetspeedlimits(图层)返回格式化的表%速度限制启动,结束,方向和值沿指定链接由图层指定的SpeedAttributes层对象给出的%。speed = struct(......'linkid',{},......'开始',{},......'结尾',{},......'方向',{},......'价值',{});为了idx = 1:numel(tillay.linkattribution)%分配链接IDlink = layer.linkAttribution(IDX);属性= link.parameTricAttribution;%检查分配给链接的每个属性为了attrindex = 1:numel(属性)linkattr = vertcat(attribules.linkparametricattribution);每个属性的%,检查速度限制信息是否是%上市。如果规定了速度限制,请进入。为了linkattrindex = 1:numel(linkattr)如果〜isempty(linkattr(linkattrindex).speedlimit)%分配给指定链接的速度限制speedlimit = struct;speedlimit.linkid = link.linklocalref;speedlimit.start =属性(attrindex).appliestorange.rangeOffsetFromStart;speedlimit.end =属性(attrindex).appliestorange.rangeOffsetFromend;speedlimit.direction =属性(attrindex).appliestodirection;speedlimit.value = linkattr(linkattrindex).speedlimit.value;%将公里/小时转换为英里/小时如果strcmpi(linkattr(linkattrindex).speedlimit.unit,'kilomers_per_hour')speedlimit.value = speedlimit.value / 1.609;结尾如果Strcmpi(speedlimit.direction,'两个都')速度= [速度;速度极限];%#OK 结尾结尾结尾结尾结尾speedtable = struct2table(速度);结尾

终止奖励以表格的形式从图层对象提取车道道路参照。

功能LaneroadReferenceTable = HelpergetReferences(图层)%helperGetReferences使用车道道路参照创建数据表%laneroadreferenceTable = herpergetreferences(图层)返回一个表%格式化,其中包含在指定链接上存在的所有通道组列表由图层指定的laneroocoReferstations对象给出的%。numlinks = numel(layer.linklanegroupreferences;参考= repmat(结构('linkid',{},'lanegroupid',{}),numlinks,1);%获取与Lane组链接的引用为了idx = 1:numlinks link = tillay.linklanegroupreferences(Idx);LaneGroups = Vertcat(link.lanegroupreferences.lanegroupref);参考(IDX).linkId = link.linklocalref;参考(idx).lanegroupid = [Lanegroups(:)。Lanegroupid]';结尾laneroadreferenceTable = struct2table(参考);结尾

螺旋螺钉娱乐以表格的形式从图层对象中提取通道属性。

功能laneattributeStable =螺杆植物娱乐(层)%herpergetlaneattributes创建一个带有车道和边界类型的表%laneattributeStable = HelpergetLaneattributes(图层)返回表格%格式化的车道类型和每个车道边界标记%Lane组在图层指定的Laneattributes层对象中。为了laneGroupAttrIndex=1:numel(layer.LaneGroupAttribute)laneGroup=layer.LaneGroupAttribute(laneGroupAttrIndex);属性(laneGroupAttrIndex)。LaneGroupId=laneGroup.LaneGroupRef;%#好的%GET LANE类型为每个车道组为了laneattrindex = 1:numel(Lanegroup.laneattribution)Lane = LaneGroup.laneattribution(Laneattrindex);laneattr = Vertcat(Lane.ParameTricAttribution);laneattr = Vertcat(laneattr.laneparameTricatributif);为了IDX = 1:NUMEL(LANEATTR)如果〜isempty(laneattr(idx).lanetype)属性(Lanegroupattrindex).lanes {lane.lanenumber} =......laneAttr(idx).LaneType;结尾结尾结尾%获取每个车道组的车道边界为了laneBoundaryIndex=1:numel(laneGroup.LaneboundaryAttributes)laneBoundary=laneGroup.LaneboundaryAttributes(laneBoundaryIndex);边界=顶点(laneBoundary.ParametericAttribute.laneBoundary ParametericAttribute);属性(laneGroupAttrIndex).LaneBoundaries{laneBoundary.LaneBoundaryNumber}=......界限.LANEBOUdaryMarking;结尾结尾LaneAttributeTestable=struct2table(属性);结尾

HelperloadCameradata.从文件夹加载视频读取器和时间戳。

功能[videoreader,videotime] = helperloadcameradata(dirname)%HelperLoadCameradata从时间表中的文件夹加载相机图像%[videoreader,videotime] = helperloadcameradata(dirname)加载视频%从文件夹DirName。视频的时间戳是从a读取的名为timestamps.mat的文件夹中的%mat文件。如果~isfolder(dirName)错误('预期的山谷是文件夹的路径。结尾matFileName=fullfile(dirName,'centercameratime.mat');如果存在(Matfilename,'文件')~=2误差('预期的dirname有一个名为centercameratime.mat的垫文件。'结尾%使用时间戳加载MAT文件ts = load(matfilename);FieldNames =字段(TS);时间= ts。(fieldnames {1});Videofilename = fullfile(dirname,'centercamera.avi');如果存在(Matfilename,'文件')~=2误差('预期的垃圾名是有一个名为centercamera.avi的视频文件。结尾%加载视频文件视频时间=时间表(时间);videoReader=videoReader(videoFileName);结尾

也可以看看

||

相关话题