2. 高精地图数据标准:NDS格式、OpenDRIVE格式、Apollo OpenDRIVE扩展、国内标准(C-ITS)
聊到高精地图,绕不开的就是数据标准。说实话,我入行那会儿,各家地图厂商都是各玩各的格式。后来项目做多了才发现,标准不统一,简直就是自动驾驶落地的噩梦。今天我就把主流的几个标准掰开揉碎了讲一讲。
2.1 NDS格式:汽车界的“通用语言”
NDS,全称Navigation Data Standard。它最早是宝马、大众、戴姆勒这些车企搞出来的。说白了,就是想让地图数据在车机里跑得更顺畅。
核心特点:
- 数据库结构:NDS把地图数据打包成SQLite数据库。一个文件就是一个完整的地图包,拷贝、更新都方便。
- 分层存储:道路、POI、语音引导、3D模型,各玩各的。更新时只换对应层就行,不用全量下载。
- 瓦片化:地图被切成小块。车跑到哪,就加载哪块。内存占用小,加载速度快。
我个人的习惯:在量产项目中,NDS格式特别适合做嵌入式存储。因为它的数据库结构天然支持增量更新。我曾经在一个项目中,地图数据从20GB压缩到6GB,靠的就是NDS的瓦片压缩算法。
避坑指南:NDS虽然好,但版本兼容性是个坑。NDS 2.5和NDS 2.7的瓦片索引方式不一样。我曾经因为没注意版本号,导致地图加载时索引越界,车机直接黑屏。嗯,后来我们加了个版本校验逻辑。
2.2 OpenDRIVE格式:仿真界的“标准答案”
OpenDRIVE是ASAM(德国自动化及测量系统标准协会)推的标准。它用XML描述道路网络。你想想看,一个XML文件就能描述清楚车道线、曲率、坡度,是不是很神奇?
核心结构:
- 道路(Road):每条路都有唯一ID。路里面包含车道、限速、连接关系。
- 车道(Lane):每个车道都有类型(行驶、停车、路肩)。宽度、偏移量都能定义。
- 参考线(Reference Line):道路的骨架。所有车道都基于这条线偏移生成。
- 连接(Junction):路口怎么连,哪个车道连哪个车道,全在这里定义。
<!-- 一个简单的OpenDRIVE道路示例 -->
<road name="Main Street" length="500.0" id="1" junction="-1">
<planView>
<geometry s="0.0" x="0.0" y="0.0" hdg="0.0" length="500.0">
<line/>
</geometry>
</planView>
<lanes>
<laneSection s="0.0">
<left>
<lane id="-1" type="driving" level="false">
<width sOffset="0.0" a="3.5" b="0.0" c="0.0" d="0.0"/>
</lane>
</left>
<center>
<lane id="0" type="none" level="false">
<width sOffset="0.0" a="0.0" b="0.0" c="0.0" d="0.0"/>
</lane>
</center>
<right>
<lane id="1" type="driving" level="false">
<width sOffset="0.0" a="3.5" b="0.0" c="0.0" d="0.0"/>
</lane>
</right>
</laneSection>
</lanes>
</road>
注意:OpenDRIVE的XML结构非常严格。少一个标签,解析器就会报错。我建议你在写代码时,先用官方Schema做一遍校验。不然调试起来,你会怀疑人生的。
2.3 Apollo OpenDRIVE扩展:百度给的标准“打了补丁”
百度Apollo在OpenDRIVE基础上做了扩展。为什么?因为原版OpenDRIVE在描述中国路况时,有些力不从心。比如复杂的立交桥、潮汐车道、可变导向车道,原版标准根本没法表达。
Apollo扩展了什么?
- 车道属性扩展:增加了
lane_type枚举值,比如bus_lane、tidal_lane。 - 信号灯关联:每个车道可以绑定信号灯ID。车看到红灯,就知道哪个车道该停。
- 道路边界:增加了
road_boundary标签,描述路沿、护栏的位置。 - 重叠区域:处理高架桥下穿道路时,原版OpenDRIVE会报错。Apollo加了
overlap标签,完美解决。
我记得有一次,我们在上海做路测。有一段路是“潮汐车道”,早高峰方向朝东,晚高峰方向朝西。原版OpenDRIVE根本没法描述这种动态变化。后来我们用了Apollo的扩展,在lane标签里加了dynamic_period属性,才把这个问题搞定。
2.4 国内标准(C-ITS):中国自己的“游戏规则”
C-ITS,全称China Intelligent Transportation System。这是中国主导的标准,专门针对国内复杂的交通环境。说实话,我刚开始接触C-ITS时,觉得它跟NDS、OpenDRIVE差不多。但深入一看,发现它更接地气。
C-ITS的核心特点:
- 面向车路协同:C-ITS不只是地图数据,还包含了RSU(路侧单元)的信息。比如红绿灯状态、施工区域、事故预警。
- 动态数据融合:地图数据可以跟实时交通信息融合。比如,地图告诉你前方有施工,但C-ITS会告诉你施工什么时候结束。
- 坐标系统一:国内标准强制使用CGCS2000坐标系。你想想看,以前用WGS84,偏差几十米是常事。现在统一了,定位精度直接提升一个量级。
| 标准 | 适用场景 | 数据格式 | 动态更新 | 国内适配度 |
|---|---|---|---|---|
| NDS | 嵌入式存储、量产车 | SQLite | 支持增量更新 | 中等 |
| OpenDRIVE | 仿真测试、研发验证 | XML | 不支持 | 低(需扩展) |
| Apollo OpenDRIVE | Apollo平台、复杂路况 | XML(扩展) | 部分支持 | 高 |
| C-ITS | 车路协同、国内量产 | 二进制/JSON | 实时更新 | 极高 |
我的建议:如果你做的是国内量产项目,优先考虑C-ITS。虽然它还在完善中,但政策导向很明显。如果你做的是仿真测试,OpenDRIVE是首选。至于NDS,适合做离线地图包。Apollo扩展嘛,适合那些想用百度生态的团队。
2.5 实战中的选择策略
说了这么多,到底怎么选?我分享一个实际案例。
去年我们做L3级高速领航辅助。地图数据来源是高德,他们提供的是NDS格式。但我们的仿真平台只认OpenDRIVE。怎么办?
我们写了一个转换工具:
- 先把NDS的SQLite数据读出来,提取道路拓扑和车道几何。
- 然后按照OpenDRIVE的Schema,生成XML文件。
- 最后用Apollo的扩展标签,补充信号灯和车道属性。
整个过程花了大概两周。但效果很好,仿真测试的通过率从70%提升到了95%。
注意:转换过程中,最容易出问题的是坐标系。NDS用的是WGS84,OpenDRIVE用的是局部笛卡尔坐标系。转换时一定要做投影变换。我曾经因为忘记做投影,导致仿真里的车直接开到路外面去了。嗯,那画面,挺尴尬的。
好了,关于数据标准,今天就聊这么多。下一章,我会讲高精地图的采集与制作流程。到时候,我会分享一些采集车上的“坑”,保证让你少走弯路。