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

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

在这个例子中,您将学习如何从HDLM服务访问平铺层,以及相关的道路级和通道电平拓扑结构,几何形状和属性。

读取数据,您可以使用hereHDLMReader宾语。在这里HD动态地图服务的使用需要有效HERE HDLM凭据。你需要以获得对HDLM服务,并得到使用HERE服务所需的凭据(APP_ID和App_Code文件),在这里进入到一个单独的协议。

概观

高清地图是指专门为自动驾驶应用开发的地图服务。这些地图的精确几何形状(在赤道附近可达1厘米分辨率)使其适合自动驾驶工作流,超出了传统道路地图的路线规划应用。这种工作流包括局域网级验证、本地化和路径规划。本例演示如何使用来自HD映射数据的车道级别信息来验证车道检测系统的性能。

HD映射数据的准确性使得其作为地面实况数据的板载传感器感知系统的验证源使用。这种高精度能使现有的部署算法更快,更准确的验证。

这里HD动态地图(这里HDLM)是这里技术开发,以支持高度自动化驾驶基于云的高清地图服务。金宝app该数据是由提供获得准确的几何形状和道路网络的鲁棒属性平铺映射层。该层分为以下型号:

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

  • 高清车道模型:提供车道拓扑结构(如通道组和通道组连接器),高度精确的几何形状,和车道级属性。

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

对于这里HDLM层的概述,请参阅这里HD动态地图图层

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

在本例中,您将学习如何:

  1. 阅读从一个记录的GPS序列HERE HDLM服务道路和车道信息。

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

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

装载和显示摄像机和GPS数据

首先从记录的驱动器加载数据。本例中记录的数据来自于Udacity®自动驾驶汽车团队收集的驾驶数据集。这些数据包括前面的单目摄像机拍摄的视频和GPS记录的车辆位置和速度。

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

recordedData =完整文件(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;绘制完整路线和GPS记录的第一个位置gpsPlayer =地理玩家(gpsData.Latitude(1), gpsData.Longitude(1), 18);plotRoute (gpsPlayer gpsData。纬度,gpsData.Longitude);plotPosition (gpsPlayer gpsData.Latitude (1) gpsData.Longitude (1));

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

阅读覆盖在驱动器的所有记录的GPS位置HERE高清直播地图图块创建读者。如果你以前没有在这里设置HDLM证书,一个对话框,提示你输入密码。输入应用程序ID应用程序代码你从这里获得的技术,并点击好吧

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

读取并绘制道路拓扑数据TopologyGeometry层。该层表示道路网络的配置。网络对应于交叉点和死角的节点。节点之间的链路表示连接街道为折线的形状。属性中包含这些特性的连接性和几何形状LinksStartingInTileNodesInTile领域。

topologyLayer =读(读出器,“TopologyGeometry”图()'名称'“TopologyGeometry”);topologyAxes =情节(topologyLayer);保持(topologyAxes,'上');geoplot (topologyAxes gpsData。gpsData.Longitude纬度,...'BO-''显示名称'“路线”);
topologyLayer = TopologyGeometry具有属性:数据:HereTileId:309106790个IntersectingLinkRefs:[59×1结构] LinksStartingInTile:[603×1结构] NodesInTile:[443×1结构] TileCenterHere2dCoordinate:[37.3865 -122.1130元数据:目录:“这里-hdmap-ext-NA-1' CatalogVersion:2349地块使用可视化TopologyGeometry数据。

的内部捕获绘图功能helperPlotLayer功能,它从一个HD动态地图层与上相同的地理坐标轴所记录的驱动器可视化的数据。该功能,在实施例的端部限定,将用于绘制后续层。

由于沿驱动器来记录GPS位置,就可以使用路由匹配算法的记录位置对应于确定网络上哪条路来。此示例使用考虑了最近的链接空间上所记录的地理点启发式路线匹配算法。该算法适用于车辆行驶的方向,以确定最有可能的联系。这条路线的匹配方法不考虑道路的连接,车辆出入,或以高的位置误差的GPS数据。因此,这种方法可能并不适用于所有情况。

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

topologyTable = helperGetGeometry(topologyLayer.LinksStartingInTile,...{“链路ID”'Geometry.Here2dCoordinateDiffs'});topologyTable.Properties.VariableNames = {“链路ID”'几何'};

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

linkMatcher = HelperLinkMatcher (topologyTable);%比赛记录路线的第一点最有可能的链接[linkId, linkLat, linkLon] = match(linkMatcher, gpsData.Latitude(1),...gpsData.Longitude (1) gpsData.Velocity (1:2));%画出链路的几何形状geoplot(gpsPlayer.Axes,linkLat,LINKLON,' r . - ');

在匹配的道路上恢复限速

通常会沿着一个给定的公路所有车道特性归因于描述道路的链接元素。一个这样的属性,限速,描述了车辆的链路上行驶的最高限速。一旦给定的地理坐标匹配到一个链接,您可以识别限速沿着链接。因为像速度限制特征往往沿连杆的长度变化,这些属性确定用于该链接的特定范围。

SpeedAttributes层包含关于链接,包括张贴的速度限制在预期车辆速度信息。

speedLayer =读(读出器,“SpeedAttributes”);

helperGetSpeedLimits函数提取速度中的链接的相关长度和方向限制的数据。与提取的链接的几何结构的信息,具体地捕获所述速度限制数据需要专门的代码。

speedTable = helperGetSpeedLimits(speedLayer);%查找匹配的链接速度的限制条目速度= speedTable (speedTable。林吉德==林吉德,:);

将记录的位置匹配到一个泳道组

高清车道模型包含车道级别的几何图形和道路属性,提供了支持自动驾驶应用程序所需的细节。金宝app与道路中心线模型非常相似,HD车道模型也遵循一种使用拓扑来描述车道级别的道路网络的模式。然后将lane组的特征归因于该拓扑的元素。在HD Lane模型中,主要的拓扑元素是Lane group。

从中读取和绘制车道拓扑数据LaneTopology层。这一层将车道拓扑表示为车道组和车道组连接器。Lane组表示链路(道路段)中的一组Lane。Lane组连接器将各个Lane组彼此连接起来。属性中包含这些特性的连接性和几何形状LaneGroupsStartingInTileLaneGroupConnectorsInTile分别用于lane组和lane组连接器的字段。

laneTopologyLayer =读(读出器,'LaneTopology')laneAxes = helperPlotLayer(laneTopologyLayer,...gpsData.Latitude,gpsData.Longitude);geolimits(laneAxes,[37.3823,37.3838],[-122.1151,-122.1128]);
laneTopologyLayer = LaneTopology具有属性:数据:HereTileId:309106790个IntersectingLaneGroupRefs:[55×1结构] LaneGroupConnectorsInTile:[1212×1结构] LaneGroupsStartingInTile:[1848×1结构] TileCenterHere2dCoordinate:[37.3865 -122.1130元数据:目录:“这里-hdmap-ext-NA-1' CatalogVersion:2349地块使用可视化LaneTopology数据。

通道组表示多个车道。因此,该元件的几何形状由多边形形状的基团占据,如通过通道组的左和右边界表达给出。通过使用获得车道边界的这条车道几何helperGetGeometry功能。

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

作为与发展中国家的匹配算法来找出最可能的旅游环线,给定的GPS数据的匹配最有可能的车道组可以按照多种方式。这里介绍的方法使用两层:LaneRoadReferencesLaneTopology

  • LaneRoadReferences层允许您将道路中心线模型上的位置(由链接提供)转换为高清车道模型上的相应位置(由车道组提供)。由于之前已经确定了链接,所以可以将lane组匹配的候选项筛选到tile中可用的所有lane组的一个更小的子集。

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

使用helperGetReferences函数的作用是:生成一个表,该表包含存在至少一定长度的链接的所有lane组。

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

创建包含在所希望的地图瓦片的每个通道组的边界的几何形状的通道组匹配。该HelperLaneGroupMatcher类创建包含用于在所希望的地图瓦片的每个通道组的边界形状的几何形状的通道组匹配。它还包含链接到车道组的参考表。如同HelperLinkMatcher这个类使用一个简单的空间分析方法来确定给定的记录坐标是否存在于一个lane组的边界内。

laneGroupMatcher = HelperLaneGroupMatcher(referenceTable,laneTopologyTable);%匹配通道组和相对方向[laneGroupId, isForward, boundGeometry] =匹配(laneGroupMatcher, linkId,...gpsData.Longitude gpsData.Latitude (1) (1), gpsData.Velocity (1:2));%绘制车道组的边界形状geoplot(gpsPlayer.Axes,boundGeometry(:,1),boundGeometry(:,2),'m.-');

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

作为与由标识符映射到链路的速度属性,车道通过使用车道组ID也分配属性功能,以车道组。该LaneAttributes层包含关于车道组的信息,包括组中每个车道的类型和车道边界的特征。

使用helperGetLaneAttributes函数来提取不同车道类型和车道边界标记为在瓦片每个通道组。

laneAttributesLayer =读(读出器,'LaneAttributes');laneAttributesTable = helperGetLaneAttributes (laneAttributesLayer);%查找匹配的车道组车道属性条目laneAttribute = laneAttributesTable。LaneGroupId = = LaneGroupId;

可视化和验证记录的行驶在这里HDLM数据

生成以识别道路和车道属性的匹配算法和表格可以扩展到记录的GPS坐标的一个序列。对于每个时间段,车辆的位置匹配到道路上的链接和车道组。此外,限制速度和通道配置与相应的照相机图像一起显示。

HelperHDLMUI类创建用于从记录的行驶视频流和GPS数据,并在每个记录车辆位置显示所选HERE高清直播地图图层相关信息的工具。

hdlmUI = HelperHDLMUI(gpsData.Latitude(1),gpsData.Longitude(1));%同步照相机和GPS数据到一个共同的时间表synchronizedData =同步(videoTime,gpsData);videoReader.CurrentTime = 0;maxDisplayRate = videoReader.FrameRate * 5;初始化一些变量以维护历史记录prevLinkId = 0;prevLaneGroupId = 0;对于IDX = 1:高度(synchronizedData)的timeStamp = synchronizedData.Time(IDX);检查当前时间戳是否有GPS数据hasGPSFrame = ~(ismissing(synchronizedData.Latitude(idx))) ||...ismissing (synchronizedData.Longitude (idx)));如果hasGPSFrame纬度= synchronizedData.Latitude(IDX);经度= synchronizedData.Longitude(IDX);速度= synchronizedData.Velocity(IDX,1:2);%比赛GPS位置链接[linkId, linkLat, linkLon] = match(linkMatcher,...经度、纬度、速度);如果LINKID〜= prevLinkId%更新链接updateLink(hdlmUI,linkLat,LINKLON);prevLinkId = LINKID;%更新速度限制速度= speedTable (speedTable。林吉德==林吉德,:);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);注册(hdlmUI,时间戳);暂停(1 / maxDisplayRate);结束

结论

在本例中,您探索了如何:

  1. 从这里HD动态地图服务给定的GPS序列和进口访问HD测绘数据的数据到MATLAB。

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

  3. 查询相匹配的路段和车道组的属性,如限速和车道类型,以开发一种工具,根据所记录的摄像机数据来直观地验证道路的特征。

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

金宝app支持功能

helperPlotLayer图表上的地理绘图层数据和路线。

函数GX = helperPlotLayer(层,纬度,经度)helperPlotLayer使用层数据和路由创建地理图% gx = helperPlotLayer(层,纬度,经度)创建地理信息%坐标轴绘图,包含可绘图的HDLM层和由纬度提供的路由%和经度上了一个新的身影。数字;%绘图层gx =情节(层);%启用将数据添加到情节保持(GX,'上');绘制纬度、经度数据geoplot(GX,纬度,经度,'BO-''显示名称'“路线”);保持(GX,“关闭”);结束

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

函数geometryTable = helperGetGeometry(层,字段)%helperGetGeometry与几何拓扑元素创建一个表%geometryTable = helperGetGeometry(层,字段)返回一个表%与TopologyGeometry的指定几何字段格式化%和LaneTopology层。%预先分配结构S = repmat(结构,尺寸(层));对于字段=字段C = strsplit(场{:},'');对于IDX = 1:numel(层)字段名= strjoin(C,“”);。S(IDX)(字段名)= getfield命令(层,{IDX},C {:});结束结束geometryTable = struct2table(年代);结束

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

函数speedTable = helperGetSpeedLimits(层)%helperGetSpeedLimits创建具有速度极限的数据表%speedTable = helperGetSpeedLimits(层)返回与格式化的表%速度限制开始,结束,方向,和沿着指定的链接值%,如通过由层指定的SpeedAttributes层对象给出。速度=结构(...“链路ID”{}...'开始'{}...'结束'{}...'方向'{}...'值',{});对于IDX = 1:numel(layer.LinkAttribution)%分配链接ID链接= layer.LinkAttribution(IDX);归因= link.ParametricAttribution;%检查分配给链路中的每个属性对于attrIndex = 1: numel(attributions) linkAttr = vertcat(attributions. link参属性);%对于每个属性,检查是否该速度限制信息是%上市。如果规定了限速,则进入。对于linkAttrIndex = 1:numel(linkAttr)如果〜的isEmpty(linkAttr(linkAttrIndex).SpeedLimit)%分配限速到指定的链接speedLimit =结构;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,'KILOMETERS_PER_HOUR')speedLimit.Value = speedLimit.Value / 1.609;结束如果strcmpi(speedLimit.Direction,'都')速度= [速度;速度极限];%#确定结束结束结束结束结束speedTable = struct2table(速度);结束

helperGetReferences以表的形式从层对象中提取lane道路引用。

函数laneRoadReferenceTable = helperGetReferences(层)helperGetReferences使用lane道路引用创建一个数据表% laneRoadReferenceTable = helperGetReferences(层)返回一个表%与现有的指定链路上的所有车道组的列表格式%,如通过由层指定的LaneRoadReferences层对象给出。numLinks = numel(layer.LinkLaneGroupReferences);参考= repmat(结构(“链路ID”{}'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创建一个包含lane和边界类型的表%laneAttributesTable = helperGetLaneAttributes(层)返回一个表与%车道类型及车道标识线每个格式化由层指定的LaneAttributes层对象中的% lane组。对于laneGroup = layer. laneGroupAttrIndex = 1: numel(layer. laneGroupAttrIndex);属性(laneGroupAttrIndex)。LaneGroupId = laneGroup.LaneGroupRef;%#好%获取车道类型为每个车道组对于laneAttrIndex = 1: numel(lanegroup . lane归属);laneAttr = vertcat (lane.ParametricAttribution);laneAttr = vertcat (laneAttr.LaneParametricAttribution);对于IDX = 1:numel(laneAttr)如果〜的isEmpty(laneAttr(IDX).LaneType)属性(laneGroupAttrIndex).Lanes {lane.LaneNumber} =...laneAttr (idx) .LaneType;结束结束结束每个车道组获取%车道边界对于laneyindex = 1: numel(lanegroup . laneyattribuyindex);边界= vertcat (laneBoundary.ParametricAttribution.LaneBoundaryParametricAttribution);属性(laneGroupAttrIndex) .LaneBoundaries {laneBoundary。LaneBoundaryNumber} =...boundaries.LaneBoundaryMarking;结束结束laneAttributesTable = struct2table(属性);结束

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

函数[videoReader,videoTime] = helperLoadCameraData(目录名)helperLoadCameraData加载相机图像文件夹在一个时间表%[videoReader,videoTime] = helperLoadCameraData(目录名)的负载的视频%从文件夹目录名称。对于视频时间戳是从读%MAT文件中的文件夹命名timeStamps.mat。如果~ isfolder(目录名)错误(“希望dirName是文件夹的路径。”结束matFileName = fullfile(目录名,'centerCameraTime.mat');如果存在(matFileName,'文件') ~= 2错误(预计dirName会有一个名为centerCameraTime的mat文件。包含时间戳垫。”结束%加载MAT文件时间戳ts =负载(matFileName);=字段字段名(ts);时间= ts。(字段名{1});videoFileName = fullfile(目录名,'centerCamera.avi');如果存在(matFileName,'文件') ~= 2错误(“预计DIRNAME有一个名为centerCamera.avi视频文件。”结束%负载的视频文件videoTime =时间表(时间);videoReader = videoReader (videoFileName);结束

也可以看看

||

相关的话题