NDS中车道连接关系的制作方法

2020 年 3 月 04 日

NDS中车道连接关系的制作方法

1. 导读


在高精度导航数据中,车道级数据,取代了原来标精数据中的道路级数据。从原来的道路 A 连接道路 B,变为车道 A 连接车道 B。高精数据,极大的提高了导航的精确度,是自动驾驶不可缺少的一个模块。


本文着重介绍基于 NDS 的高精导航数据中,车道连接关系是如何制作的。


2. 如何定义“车道连接关系”


2.1 定义


个人认为,在高精数据中,车道是导航数据中的最小单元。每一个车道等同于标精数据中的每一根道路。而车道连接关系表达了车道之间的连通性。导航应用通过数据中存储的车道连接关系,可以知道当前车道的前序和后继车道有哪些,从而利用这些信息完成车道引导、车道计算等功能。


2.2 NDS 中表达方法


NDS 规格中定义了 LANE BuildingBlock(以下简称为 Lane BB),是用于表达高精的车道级数据。Lane BB 中 Lane Group 的定义是:一组位置平行或属性相同的车道组合。在 Lane Group 中,定义了很多的属性,比如:车道数、车道类型、车道边线类型、车道中心线形点、车道连接关系等等。


而 NDS 中是使用 connector ID 来表达车道连接关系的。我们可以这样理解 connector ID:一个车道在入口处和出口处各有一个 ID,如果两个车道是相互连接的,那么它们连接处的 connector ID 必须要相同。


如下图 LaneGroup 1 的 Lane1-1 和 LaneGroup 2 的 Lane2-1 是连通的,所以 Lane1-1 出口的 connector ID 和 Lane2-1 的入口的 connector ID 都等于 4。这就表达了两个车道的相互连接关系。



connector ID 的取值分为 NDS 2.5.2 和 NDS2.5.4:


  • NDS 2.5.2

  • 定义:connector ID是一个varuint16类型的变量,范围是0~32639。Tile内唯一,但是Tile边界的connector ID必须在周围9 tile内唯一。如果不唯一会引发车道连接错误的bug。

  • 缺点:可用范围小。

  • NDS 2.5.4

  • 定义:connector ID是一个varuint32类型的变量,范围是0~536870911。周围9 Tile内唯一。


3. 基于 NDS 的制作方案


3.1 基本思路


基于原有的代码逻辑,connector ID 的制作思路分为三步:


  • 读取原始数据的车道连接关系

  • 构建Lane group graph, 根据Tiling的结果,更新Lane group graph

  • 遍历Lane group graph中每个节点,计算connector ID



3.2 两个难点及解决方案


3.2.1 如何快速找到 Lane Group 和 Lane 的连接关系?


  • 采用图(十字链表)的方式解决

  • 采用图的优点:

  • i.图可以快速的找出当前节点的前序和后继节点,便于后续的connector ID的计算。

  • ii.相比其他数据结构,图可以快速的更新图中的拓扑,适用于车道数据更新后连接关系的维护。


3.2.2 如何计算可用的 connector ID?


在不同的 NDS 版本中,使用了不同的解决方案:


  • NDS 2.5.2

  • 问题:由于可用的ID区间(0~32639)有限,如何既保证Tile内ID唯一,又保证Tile边界处 9 Tile唯一?

  • 思路:最简单的保证唯一值的方案就是获取最大值,但是可用的ID区间很小,如果单纯的获取最大值,很容易出现越界的情况,所以此方案不可行。对于NDS252来说,我认为规格设计是存在缺陷的。connector id的可用范围设计的太小了。日后该版本的NDS数据肯定会被淘汰,所以此处的解法仅供参考。

  • 解法:将varuint16划分为2个区间

  • i.Tile内的ID区间(目前分配 0~19999)

  • ii.Tile边界处的ID区间(20000~32639)


Tile 内 ID 采用自增的逻辑分配,Tile 边界处采用 9 Tile 内垂直比较方法获取可分配的 ID(如下图)。



  • NDS 2.5.4

  • 问题:ID可用空间扩充,如果还采用2.5.2的垂直比较方法,内存撑不住。

  • 思路:到了NDS254,从规格上补足了252设计的缺陷,扩充了connector ID的可用范围。所以我们要寻求一种新的方案来分为9 Tile内唯一ID。如果我们能保证在任意位置,可以给以当前位置为中心的9宫格,分配1~9不同的索引号,这样就能保证任意位置的9宫格内都是唯一ID了(有点类似数独)。顺着这样的思路便有了下面的解法。

  • 解法:根据Tile ID划分不同的connector ID可用区间。

  • i.NDS中Tile ID是一个int变量。虽然它只是一个数,但是是根据一定的规则计算出来的。

  • 如下图,Tile 实际就是把地球按照2的n次方分割下去。如果把Tile ID转换为2进制,我们可以发现,其偶数位是所在的行号,奇数位是所在的列号。我们有了行列号,就可以把其转为9宫格内的唯一编号了(行列号余3)。


  • ii.将connector ID划分为9个区间,目前一个区间分配了100000个connector ID,如果后续不够可以修改区间范围。根据上面计算出的Tile的唯一编号,乘以对应的区间ID,即是当前Tile可用的connector ID区间。

  • iii.Connector ID在区间中采用自增的逻辑即可。


4. 小结


以上就是基于 NDS 的车道连接关系的制作方案。NDS 外其他导航数据规格中表达车道连接关系的形式各不相同。但是本文中的思路同样适用,只需要根据不同规格要求进行适当调整即可。


2020 年 3 月 04 日 14:4893

评论

发布
暂无评论
发现更多内容

Doris服务节点临时失效处理过程时序图

任小龙

极客大学架构师训练营

第六章学习总结

李白

分布式数据库设计中关键几点

dony.zhang

CAP原理

第六周总结

晨光

架构师训练营第六章总结

吴吴

分布式总结

周冬辉

nosql zookeeper 分布式 CAP原理

架构师课程第六周总结

dongge

WEEK6-作业-对CAP理解

蒜泥精英

字节跳动基于Flink的MQ-Hive实时数据集成

Apache Flink

flink

java 后端博客系统文章系统——No6

猿灯塔

week06作业

Safufu

高并发下数据库方案演进

superman

分库分表 极客大学架构师训练营

Android | 《看完不忘系列》之Glide

哈利迪

android

第六周学习总结

CP

week6 学习总结

任小龙

极客大学架构师训练营

架构师0期第六周命题作业

何伟敏

官方剧透:1.11 发版前我们偷看了 Flink 中文社区发起人的聊天记录

Apache Flink

flink

架构师培训第六周习题

小蚂蚁

架构师训练营——第6周学习总结

jiangnanage

架构师训练营 第六周 作业

极客

架构是训练营

week6 总结

雪涛公子

架构师训练营第六章作业

吴吴

第六周·命题作业·CAP原理

刘璐

架构师训练营——第6周作业

jiangnanage

架构师第六周培训学习总结

小蚂蚁

极客大学架构师训练营-cap原理

Geek_zhangjian

Lesson 6 分布式系统架构-分布式数据库、NoSql、ZooKeeper -心得笔记

edd

信创舆情一线--英国禁用华为5G设备

统小信uos

5G

架构师训练营第六周作业

Bruce Xiong

week06 作业

雪涛公子

WEEK6-学习心得

蒜泥精英

NDS中车道连接关系的制作方法-InfoQ