主要内容

在这里使用高清实时地图数据来验证车道配置

这个例子展示了如何阅读和可视化车道配置高清生活的记录行驶路线地图(这里HDLM)服务。这个可视化可以用于验证车道配置检测到机载传感器的感知系统,如单眼相机。

在这个例子中,您将了解如何访问平铺层从HDLM服务并确定相关road-level lane-level拓扑,几何和属性。

读取数据,可以使用hereHDLMReader对象。使用高清生活地图服务需要有效这里HDLM凭证。你需要进入一个单独的协议,为了获得HDLM服务和获得所需的凭证(access_key_id和access_key_secret)使用这里的服务。

概述

高清晰度(HD)地图指映射服务专为自动驾驶开发的应用程序。这些地图的精确几何(1厘米决议赤道附近)使他们适用于自动驾驶路线规划以外的工作流应用传统的路线图。这样的工作流程包括lane-level验证、本地化和路径规划。这个例子向您展示了如何验证巷的性能检测系统使用从高清lane-level信息映射数据。

高清地图数据的准确性使其使用的地面实况数据验证机载传感器的感知系统。这种高精度使更快和更准确的验证现有的部署算法。

高清生活地图(这里HDLM)是一个基于云的高清地图服务开发的技术来支持高度自动驾驶。金宝app瓷砖组成的数据映射层,提供精确的几何和健壮的道路网络的属性。层分为以下模型:

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

  • 高清车道模型:提供巷拓扑(如车道组和车道组连接器),高度精确的几何,lane-level属性。

  • 高清定位模型:提供功能支持车辆定位策略。金宝app

这里HDLM层的概述,请参阅高清生活映射层

相机用于自动驾驶收集车辆周围的道路拓扑语义信息。车道边界检测、车道类型分类和路标检测算法形成这样一个相机处理管道的核心。您可以使用这里HDLM服务,以及一个高精度GPS安装在车辆,来评估这些算法的准确性和验证他们的性能。

在这个例子中,您将了解如何:

  1. 从这里读路和车道信息HDLM服务记录GPS序列。

  2. 启发式路由匹配的方法应用于GPS数据记录。因为GPS数据往往是不精确的,有必要解决匹配问题的记录地理坐标表示的道路网络。

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

加载和显示相机和GPS数据

首先加载的数据记录驱动器。记录的数据在这个例子中是开车从一个数据集收集的Udacity®无人驾驶汽车的团队。这些数据包括一个视频捕捉到一个前置单眼相机和GPS车辆位置和速度记录。

加载centerCamera.avi摄像头视频数据和相应的视频时间戳。

recordedData = fullfile (toolboxdir (“开车”),“drivingdata”,“udacity”,“drive_segment_09_29_16”);[videoReader, videoTime] = helperLoadCameraData (fullfile (recordedData));%显示相机的第一帧数据imageFrame = readFrame (videoReader);imshow (imageFrame“边界”,“紧”);

负载的GPS数据gpsSequence.matMAT-file。

data =负载(fullfile (recordedData,“gpsSequence.mat”));gpsData = data.gpsTT;%画出完整的路线和第一个位置记录从GPSgpsPlayer = geoplayer (gpsData.Latitude (1) gpsData.Longitude (1), 18);plotRoute (gpsPlayer gpsData。纬度,gpsData.Longitude);plotPosition (gpsPlayer gpsData.Latitude (1) gpsData.Longitude (1));

匹配记录车辆的道路

创建一个读者阅读高清生活地图瓦片覆盖所有记录GPS位置的驱动器。如果你以前没有设置这里HDLM凭证,一个对话框,提示您输入它们。进入访问密钥ID访问密钥的秘密你从这里获得技术,并点击好吧

读者= hereHDLMReader (gpsData。纬度,gpsData.Longitude);

阅读和绘制道路拓扑数据TopologyGeometry层。这一层代表了道路网络的配置。网络的节点对应于十字路口和死角。连接节点之间连接的街道的形状表示为折线。连通性和几何中包含这些特性LinksStartingInTileNodesInTile字段。

topologyLayer =阅读(读者,“TopologyGeometry”图()“名字”,“TopologyGeometry”);topologyAxes =情节(topologyLayer);持有(topologyAxes“上”);geoplot (topologyAxes gpsData。gpsData.Longitude纬度,“bo - - - - - -”,“DisplayName的”,“路线”);
topologyLayer = TopologyGeometry属性:数据:HereTileId: 309106790 IntersectingLinkRefs: [44×1 struct] LinksStartingInTile: [895×1 struct] NodesInTile: [651×1 struct] TileCenterHere2dCoordinate:[37.3865 - -122.1130]元数据:目录:“hrn::数据::olp-here-had: here-hdlm-protobuf-na-2”CatalogVersion: 4601使用图来可视化TopologyGeometry数据。

中捕获的绘图功能helperPlotLayer函数,该函数可视化数据从高清生活地图层记录驱动器在同一地理轴。这个函数,定义在这个例子中,将使用情节后续层。

给定一个GPS定位记录在开车,你可以使用一个路由匹配算法,以确定哪些道路网络上的记录位置对应。这个示例使用启发式路径匹配算法考虑到最近的空间地理记录点的链接。旅行的算法适用于车辆的方向来确定最可能的链接。这条路线匹配方法没有考虑道路连通性,车辆访问,或GPS数据与高位置错误。因此,这种方法可能并不适用于所有情况。

helperGetGeometry从给定的拓扑层函数提取几何信息,并返回这个信息表中相应的链接。

topologyTable = helperGetGeometry (topologyLayer.LinksStartingInTile,{“LinkId”,“Geometry.Here2dCoordinateDiffs”});topologyTable.Properties。VariableNames = {“LinkId”,“几何”};

HelperLinkMatcher匹配器类创建一个链接,它包含每个链接的几何形状所需的地图瓦片。这类使用一个基本空间分析与道路的形状坐标位置记录链接。

linkMatcher = HelperLinkMatcher (topologyTable);%匹配记录的第一点最可能的链接[linkId, linkLat linkLon] =匹配(linkMatcher, gpsData.Latitude (1),gpsData.Longitude (1) gpsData.Velocity (1:2));%绘制的形状几何链接geoplot (gpsPlayer。轴,linkLat linkLon,' r . - ');

检索匹配道路速度限制

特征共同所有车道一个给定的路上都归因于link元素描述这条路。这样的一个属性,限速,描述了汽车旅行的最大合法速度联系。一旦一个给定的地理坐标匹配一个链接,您可以识别限速沿着链接。因为功能,如限速经常改变沿着一个链接,这些属性确定为特定范围的链接。

SpeedAttributes层包含预期的车速信息链接,包括最高限速。

speedLayer =阅读(读者,“SpeedAttributes”);

helperGetSpeedLimits相关函数提取速度限制数据长度和方向的一个链接。与提取的几何信息链接,专门捕捉速度限制数据需要专门的代码。

speedTable = helperGetSpeedLimits (speedLayer);%找到匹配的速度限制条目的链接速度= speedTable (speedTable。LinkId = = LinkId:);

车道组匹配记录的位置

高清车道模型包含lane-level几何和属性,支持自动驾驶的应用提供必要的细节。金宝app就像道路中心线模型,使用的高清车道模型也遵循一个模式的道路网络拓扑描述巷的水平。然后车道组的特点归因于此拓扑的元素。在高清车道模型中,主车道组拓扑元素。

阅读和情节巷拓扑数据LaneTopology层。这个拓扑层代表巷巷组和车道组连接器。车道组代表一群车道内链接(公路段)。车道组连接器连接各个车道组。连通性和几何中包含这些特性LaneGroupsStartingInTileLaneGroupConnectorsInTile领域,分别为车道组和车道组连接器。

laneTopologyLayer =阅读(读者,“LaneTopology”)laneAxes = helperPlotLayer (laneTopologyLayer,gpsData。纬度,gpsData.Longitude);geolimits (laneAxes [37.3823, 37.3838], [-122.1151, -122.1128]);
laneTopologyLayer = LaneTopology属性:数据:HereTileId: 309106790 IntersectingLaneGroupRefs: [56×1 struct] LaneGroupConnectorsInTile: [1174×1 struct] LaneGroupsStartingInTile: [1783×1 struct] TileCenterHere2dCoordinate:[37.3865 - -122.1130]元数据:目录:“hrn::数据::olp-here-had: here-hdlm-protobuf-na-2”CatalogVersion: 4601使用图来可视化LaneTopology数据。

莱茵集团代表多个车道。因此,这个元素是由多边形的几何形状的组织,所表达的车道组的左和右边界。获得这个胡同间的几何边界通过使用helperGetGeometry函数。

laneGroupFields = {“LaneGroupId”,“BoundaryGeometry.LeftBoundary.Here2dCoordinateDiffs”,“BoundaryGeometry.RightBoundary.Here2dCoordinateDiffs”};laneTopologyTable = helperGetGeometry (laneTopologyLayer.LaneGroupsStartingInTile,laneGroupFields);laneTopologyTable.Properties。VariableNames = {“LaneGroupId”,“LeftGeometry”,“RightGeometry”};

与开发匹配算法找出最可能的旅行链接,匹配给定的GPS数据最可能的车道组可以遵循多个方法。这里描述的方法使用两层:LaneRoadReferencesLaneTopology

  • LaneRoadReferences层允许您将一个位置在路上中心线模型(链接)给出的相应位置高清车道模型(由一个车道组)。由于以前确定的联系,您可以过滤车道组匹配的候选人的一个小子集中的所有车道组可用瓷砖。

  • LaneTopology层给出了几何数据,可以用于考虑数据存在空间内每个候选人车道组的界限。与空间匹配的GPS数据链接,这种方法容易出错,如GPS数据记录的准确性。除了匹配的车道组,您还需要匹配的矢量方向车辆相对于车道组的方向。这一步是必要的,因为道的属性定义的拓扑取向。

使用helperGetReferences函数来生成一个表的所有车道组存在至少有一些链接的长度。

referenceLayer =阅读(读者,“LaneRoadReferences”);referenceTable = helperGetReferences (referenceLayer);

创建一个车道组匹配器,包含每个车道组的边界几何形状所需的地图瓦片。的HelperLaneGroupMatcher类创建一个车道组匹配器,包含每个车道组的边界几何形状所需的地图瓦片。它还包含一个引用表的链接车道组。与HelperLinkMatcher类,这个类使用一个简单的空间分析方法来确定一个给定的记录坐标范围内存在一个车道组。

laneGroupMatcher = HelperLaneGroupMatcher (referenceTable laneTopologyTable);%匹配车道组和相对方向[laneGroupId, isForward boundGeometry] =匹配(laneGroupMatcher linkId,gpsData.Longitude gpsData.Latitude (1) (1), gpsData.Velocity (1:2));%的阴谋的边界几何车道组geoplot (gpsPlayer。轴,boundGeometry (: 1), boundGeometry (:, 2),“m - - - - - -”);

检索匹配车道车道配置组

与速度属性映射到链接的一个标识符,还车道属性指定特性车道组通过车道组ID。LaneAttributes层包含车道组的信息,包括类型的组中的每个车道,车道边界的特征。

使用helperGetLaneAttributes函数来提取不同车道类型和车道边界标记每个车道组的瓷砖。

laneAttributesLayer =阅读(读者,“LaneAttributes”);laneAttributesTable = helperGetLaneAttributes (laneAttributesLayer);%找到匹配的车道属性条目车道组laneAttribute = laneAttributesTable。LaneGroupId = = LaneGroupId;

与这里HDLM数据可视化和验证记录驱动器

生成的匹配算法和表来识别道路和车道属性可以扩展到一系列记录GPS坐标。对于每一个时间步,车辆的位置匹配一个链接和车道组在路上。此外,限速和车道配置显示连同相应的摄像机图像。

HelperHDLMUI类创建一个流媒体视频的工具从记录和GPS数据驱动和显示相关信息从这里选择高清生活地图层在每个记录车辆的位置。

hdlmUI = HelperHDLMUI (gpsData.Latitude (1) gpsData.Longitude (1));%同步相机和GPS数据到一个共同的时间表synchronizedData =同步(videoTime gpsData);videoReader。CurrentTime = 0;maxDisplayRate = videoReader。帧速率* 5;%初始化一些变量来维持历史prevLinkId = 0;prevLaneGroupId = 0;idx = 1:高度(synchronizedData)时间戳= synchronizedData.Time (idx);%检查当前时间戳GPS数据hasGPSFrame = ~ (ismissing (synchronizedData.Latitude (idx)) | |ismissing (synchronizedData.Longitude (idx)));如果hasGPSFrame纬度= synchronizedData.Latitude (idx);经度= synchronizedData.Longitude (idx);速度= synchronizedData。速度(idx 1:2);%匹配GPS位置链接[linkId, linkLat linkLon] =匹配(linkMatcher,经度、纬度、速度);如果linkId ~ = prevLinkId%更新链接updateLink (hdlmUI linkLat linkLon);prevLinkId = linkId;%更新速度限制速度= speedTable (speedTable。LinkId = = LinkId:);updateSpeed (hdlmUI speed.Value);结束%的GPS位置匹配到车道组[laneGroupId, isForward boundGeometry] =匹配(laneGroupMatcher linkId,经度、纬度、速度);如果laneGroupId ~ = prevLaneGroupId%更新车道组updateLaneGroup (hdlmUI boundGeometry);prevLaneGroupId = laneGroupId;%更新车道类型和边界的标记laneAttribute = laneAttributesTable。LaneGroupId = = LaneGroupId;plotLanes (hdlmUI laneAttributesTable.Lanes {laneAttribute},laneAttributesTable。LaneBoundaries {laneAttribute}, isForward);结束updatePosition (hdlmUI,经度和纬度);其他的%读帧的视频imageFrame = readFrame (videoReader);结束updateImage (hdlmUI imageFrame);updateTime (hdlmUI、时间戳);暂停(1 / maxDisplayRate);结束

结论

在这个例子中,您学习了如何:

  1. 访问高清映射数据对于一个给定的GPS序列从高清生活地图服务和数据导入MATLAB。

  2. 匹配记录GPS数据对进口道路网络数据找到相关链接为每个地理坐标和车道组。

  3. 查询匹配链接和车道组的属性,如限速和车道类型、发展道路的一个工具,用来验证功能对相机记录数据。

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

金宝app支持功能

helperPlotLayer块层数据和地理的情节路线。

函数gx = helperPlotLayer(层、纬度、经度)% helperPlotLayer创建地理图与层数据和路线% gx = helperPlotLayer(层、纬度、经度)创建了一个地理%轴情节与plottable HDLM层和由纬度的路线%和经度新的图。图;%绘制层gx =情节(层);%可以将数据添加到情节持有(gx“上”);%的阴谋经度,纬度数据geoplot (gx,经度,纬度,“bo - - - - - -”,“DisplayName的”,“路线”);持有(gx“关闭”);结束

helperGetGeometry从一层提取几何拓扑元素的形式表。

函数geometryTable = helperGetGeometry(层、字段)% helperGetGeometry用几何拓扑元素创建一个表% geometryTable = helperGetGeometry(层、字段)返回一个表% TopologyGeometry几何领域的指定格式%和LaneTopology层。%预先分配结构S = repmat(结构、大小(层));字段= C = strsplit字段(字段{:},“。”);idx = 1:元素个数(层)字段名= strjoin (C,);S (idx)。(字段名)= getfield C层,{idx}, {:});结束结束geometryTable = struct2table(年代);结束

helperGetSpeedLimits提取速度限制的数据层的形式表。

函数speedTable = helperGetSpeedLimits(层)用限速% helperGetSpeedLimits创建一个数据表% speedTable = helperGetSpeedLimits(层)返回一个表的格式%限速开始、结束、方向和价值在一个指定的链接%由SpeedAttributes层对象指定的层。速度=结构(“LinkId”{},“开始”{},“结束”{},“方向”{},“价值”,{});idx = 1:元素个数(layer.LinkAttribution)%分配ID的联系链接= layer.LinkAttribution (idx);归因= link.ParametricAttribution;%检查每个属性分配给的链接attrIndex = 1:元素个数(归因)linkAttr = vertcat (attributions.LinkParametricAttribution);%为每个属性,检查是否限速信息%上市。如果提供的速度限制,使一个条目。linkAttrIndex = 1:元素个数(linkAttr)如果~ isempty (linkAttr (linkAttrIndex) .SpeedLimit)%将速度限制分配给指定的链接speedLimit =结构;speedLimit。LinkId = link.LinkLocalRef;speedLimit。开始=归因(attrIndex) .AppliesToRange.RangeOffsetFromStart;speedLimit。结束=归因(attrIndex) .AppliesToRange.RangeOffsetFromEnd;speedLimit。方向=归因(attrIndex) .AppliesToDirection;speedLimit。Value = linkAttr(linkAttrIndex).SpeedLimit.Value;%转换公里时速如果strcmpi (linkAttr .SpeedLimit.Unit (linkAttrIndex),“KILOMETERS_PER_HOUR”)speedLimit。值= speedLimit。价值/ 1.609;结束如果strcmpi (speedLimit.Direction“两个”)速度=[速度;speedLimit];% #好< AGROW >结束结束结束结束结束speedTable = struct2table(速度);结束

helperGetReferences提取车道公路从一层对象引用一个表的形式。

函数laneRoadReferenceTable = helperGetReferences(层)% helperGetReferences用巷路引用创建一个数据表% laneRoadReferenceTable = helperGetReferences(层)返回一个表%与所有现有车道组的列表格式指定的链接%由LaneRoadReferences层对象指定的层。numLinks =元素个数(layer.LinkLaneGroupReferences);参考= repmat(结构体(“LinkId”{},“LaneGroupId”{})numLinks 1);%获得链接的引用车道组idx = 1: numLinks链接= layer.LinkLaneGroupReferences (idx);laneGroups = vertcat (link.LaneGroupReferences.LaneGroupRef);参考(idx)。LinkId = link.LinkLocalRef;参考(idx)。LaneGroupId = [laneGroups (:) .LaneGroupId];结束laneRoadReferenceTable = struct2table(参考);结束

helperGetLaneAttributes从一层对象提取车道属性表的形式。

函数laneAttributesTable = helperGetLaneAttributes(层)% helperGetLaneAttributes与车道和边界类型创建一个表% laneAttributesTable = helperGetLaneAttributes(层)返回一个表%格式化车道类型和车道边界标记%车道组LaneAttributes层中的对象指定的层。laneGroupAttrIndex = 1:元素个数(layer.LaneGroupAttribution) laneGroup = layer.LaneGroupAttribution (laneGroupAttrIndex);属性(laneGroupAttrIndex)。LaneGroupId = laneGroup.LaneGroupRef;% #好吧%获得每个车道组的车道类型laneAttrIndex = 1:元素个数(laneGroup.LaneAttribution)巷= laneGroup.LaneAttribution (laneAttrIndex);laneAttr = vertcat (lane.ParametricAttribution);laneAttr = vertcat (laneAttr.LaneParametricAttribution);idx = 1:元素个数(laneAttr)如果~ isempty (laneAttr (idx) .LaneType)属性(laneGroupAttrIndex) .Lanes{巷。LaneNumber} =laneAttr (idx) .LaneType;结束结束结束%获得每个车道组的车道边界laneBoundaryIndex = 1:元素个数(laneGroup.LaneBoundaryAttribution) laneBoundary = laneGroup.LaneBoundaryAttribution (laneBoundaryIndex);边界= vertcat (laneBoundary.ParametricAttribution.LaneBoundaryParametricAttribution);属性(laneGroupAttrIndex) .LaneBoundaries {laneBoundary。LaneBoundaryNumber} =boundaries.LaneBoundaryMarking;结束结束laneAttributesTable = struct2table(属性);结束

helperLoadCameraData加载视频读者和时间戳从文件夹中。

函数[videoReader, videoTime] = helperLoadCameraData(目录名)% helperLoadCameraData加载摄像头的图像文件夹在一个时间表% (videoReader videoTime] = helperLoadCameraData(目录名)加载一个视频%的文件夹目录名。读取视频从一个时间戳% MAT-file timeStamps.mat命名的文件夹。如果~ isfolder(目录名)错误(预期的目录名是一个文件夹的路径。”)结束matFileName = fullfile(目录名,“centerCameraTime.mat”);如果存在(matFileName“文件”)~ = 2错误(有一个名叫centerCameraTime MAT-file的预期的目录名。包含时间戳垫。”)结束%加载MAT-file时间戳ts =负载(matFileName);=字段字段名(ts);时间= ts。(字段名{1});videoFileName = fullfile(目录名,“centerCamera.avi”);如果存在(matFileName“文件”)~ = 2错误(“预期的目录名视频文件名为centerCamera.avi。”)结束%加载视频文件videoTime =时间表(时间);videoReader = videoReader (videoFileName);结束

另请参阅

||

相关的话题