3. 高精地图数据标准:NDR、OpenDRIVE、ADASIS v2/v3 协议解析与对比

做高精地图这几年,我打交道最多的就是这几个数据标准。NDR、OpenDRIVE、ADASIS,说白了就是三种不同的“地图语言”。你想想看,车厂、图商、Tier1 各说各话,车怎么跑得起来?

今天我就把这三个标准掰开揉碎了讲。我会结合自己踩过的坑,帮你理清它们各自的门道。

3.1 NDR:日本人的“精工细活”

NDR,全称 Navigation Data Standard。这是日本主导的标准,主要服务丰田、本田这些车企。我个人习惯叫它“日式标准”。

核心特点:

  • 极度精细的拓扑关系:NDR 对道路连接的定义非常严格。每条车道、每个路口、每个转向限制,都描述得清清楚楚。
  • 强依赖节点-链路模型:它把道路拆成节点(Node)和链路(Link)。节点是路口或道路属性变化点,链路是连接节点的路段。
  • 分层存储:从宏观的路网到微观的车道线,NDR 分了多个层级。你查数据时,可以按需加载,不用一次全读进来。

重要:NDR 的定位精度通常在米级,但车道级信息需要额外扩展。如果你做的是 L3 以上的自动驾驶,光靠 NDR 可能不够。

代码示例:NDR 节点-链路结构(简化)

// NDR 节点定义
struct NDRNode {
    int node_id;        // 节点ID
    double lat, lon;    // 经纬度
    int link_count;     // 连接的链路数
    int link_ids[8];    // 链路ID列表(最多8条)
};

// NDR 链路定义
struct NDRLink {
    int link_id;        // 链路ID
    int from_node;      // 起始节点
    int to_node;        // 终止节点
    int road_class;     // 道路等级(高速、国道、省道等)
    int lane_count;     // 车道数
    double length;      // 链路长度(米)
};

我的经验:我在做日本某车厂的项目时,发现 NDR 对城市复杂路口的描述特别到位。但它的更新机制比较死板,不像 OpenDRIVE 那样灵活。如果你要频繁更新地图,NDR 会让你头疼。

3.2 OpenDRIVE:欧洲人的“开放生态”

OpenDRIVE 是德国主导的标准,现在基本成了全球高精地图的事实标准。为什么?因为它开放、灵活、扩展性强。

核心特点:

  • 基于 XML 的描述:所有道路、车道、标志、信号灯都用 XML 标签定义。你想想看,XML 的好处就是可读性强,也方便做工具链。
  • 车道级精度:OpenDRIVE 原生支持车道中心线、车道宽度、车道边界线类型。这是为自动驾驶量身定做的。
  • 强扩展性:你可以通过自定义标签(UserData)添加私有数据。比如,我曾在里面加过“路面摩擦系数”和“坡度曲率”。

OpenDRIVE 的道路描述模型:

<!-- OpenDRIVE 道路示例 -->
<road name="ExampleRoad" length="500.0" id="1" junction="-1">
    <link>
        <predecessor elementType="road" elementId="2"/>
        <successor elementType="junction" elementId="100"/>
    </link>
    <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"/>
                    <roadMark sOffset="0.0" type="solid" weight="standard" color="white" width="0.15"/>
                </lane>
            </left>
            <center>
                <lane id="0" type="none" level="false">
                    <roadMark sOffset="0.0" type="broken" weight="standard" color="white" width="0.15"/>
                </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"/>
                    <roadMark sOffset="0.0" type="solid" weight="standard" color="white" width="0.15"/>
                </lane>
            </right>
        </laneSection>
    </lanes>
</road>

注意:OpenDRIVE 虽然强大,但它的 XML 文件体积很大。一个城市的地图动辄几百 MB。我曾经遇到过解析 1GB 的 OpenDRIVE 文件,内存直接爆掉。建议用流式解析(SAX)而不是 DOM。

3.3 ADASIS v2/v3:车上的“实时管道”

ADASIS 跟前面两个不一样。它不是用来存地图的,而是用来在车上“传”地图的。说白了,ADASIS 定义了一套协议,让高精地图数据能从导航系统实时流式传输到 ADAS 控制器。

ADASIS v2:

  • 基于 CAN 总线:数据通过 CAN 报文传输,带宽有限(通常只有几百 kbps)。
  • 分段传输:地图被切成一个个“段”(Segment),车辆行驶过程中按需请求。
  • 精度有限:受限于 CAN 带宽,ADASIS v2 只能传一些宏观信息,比如前方道路曲率、坡度、限速。

ADASIS v3:

  • 基于以太网:带宽大幅提升(100 Mbps 以上),可以传更精细的数据。
  • 支持车道级:v3 可以传车道中心线、车道宽度、甚至车道连接关系。
  • 预测路径:v3 引入了“预测路径”概念,可以提前告诉控制器“前方 500 米要变道”。

ADASIS v3 报文结构(简化):

// ADASIS v3 路径预测报文
struct ADASISv3_PathPrediction {
    uint32_t timestamp;          // 时间戳(毫秒)
    uint16_t path_id;            // 路径ID
    uint8_t  confidence;         // 置信度(0-100%)
    uint16_t point_count;        // 路径点数量
    struct PathPoint {
        double lat;              // 纬度
        double lon;              // 经度
        float  heading;          // 航向角(度)
        float  curvature;        // 曲率(1/m)
        float  slope;            // 坡度(度)
        uint8_t lane_id;         // 车道ID
    } points[256];               // 最多256个路径点
};

避坑指南:我曾经在 ADASIS v2 项目上吃过亏。当时以为 CAN 带宽够用,结果发现地图数据一多,CAN 总线就堵了。后来换成 v3 的以太网方案,问题才解决。所以,如果你做的是 L3 以上,直接上 v3,别犹豫。

3.4 三大标准对比:一张表说清楚

维度 NDR OpenDRIVE ADASIS v2/v3
主要用途 导航地图存储 高精地图存储与交换 车载实时数据传输
数据格式 二进制/专有格式 XML(可扩展标记语言) CAN 报文 / 以太网帧
精度 米级 厘米级(车道级) v2:米级 / v3:厘米级
带宽需求 低(离线存储) 高(文件传输) v2:低(CAN)/ v3:中(以太网)
扩展性 差(封闭生态) 强(UserData 自定义) v2:差 / v3:中等
适用场景 日本市场、传统导航 全球主流、L3+自动驾驶 车载实时 ADAS 功能
学习曲线 陡峭(文档少) 中等(社区活跃) v2:简单 / v3:中等

3.5 我的选择建议

嗯,这里要注意。选哪个标准,取决于你的项目定位。

  • 如果你做的是 L2 辅助驾驶:ADASIS v2 就够了。成本低,实现简单。但别指望它能做车道级控制。
  • 如果你做的是 L3 以上自动驾驶:OpenDRIVE 是首选。它生态好,工具链成熟。我建议搭配 ADASIS v3 做车端传输。
  • 如果你做的是日本市场:NDR 绕不开。但要做好心理准备,它的工具链和社区支持远不如 OpenDRIVE。

核心观点:没有完美的标准,只有合适的标准。我个人习惯是“OpenDRIVE 存数据,ADASIS v3 传数据,NDR 做兼容”。这个组合在多个项目中验证过,效果不错。

好了,这一章就到这里。下一章我会讲高精地图的采集与制作流程,包括激光雷达、摄像头、IMU 的融合方案。到时候我会分享一个“采集车翻车”的真实案例,保证让你印象深刻。