第1章:V2X消息集与数据格式概述

各位同学,今天我们来聊聊V2X通信中最核心的东西——消息集与数据格式。说实话,我刚接触V2X那会儿,看到一堆BSM、MAP、SPAT的缩写,头都大了。但干这行久了你会发现,这些消息就是车联网世界的“通用语言”。

我习惯把V2X消息比作交通场景下的“对话”。车与车之间、车与路之间,总得有个统一的聊天规则吧?这些规则就定义在消息集里。今天咱们重点看五个:BSM、MAP、SPAT、RSM、RSI。

1.1 BSM(基本安全消息)——车辆的“身份证”

BSM是V2X里最基础的消息,没有之一。每辆车每秒会发10次左右的BSM,告诉周围“我在这儿,我要干嘛”。

协议结构:BSM分两部分——Part 1是必须发的,Part 2是可选补充。

字段 说明 长度
msgCnt 消息计数器,防重放攻击用的 2字节
id 车辆临时ID,保护隐私 4字节
secMark 时间戳,毫秒级 2字节
lat / long 经纬度,精度1e-7度 各4字节
elev 海拔高度 2字节
speed 速度,单位0.02m/s 2字节
heading 航向角,单位0.0125度 2字节
brakes 刹车状态 2字节
size 车辆尺寸 3字节

关键字段解读

  • id:不是车牌号,是临时分配的。每5分钟换一次,防止被跟踪。我在项目里见过有人直接用MAC地址当ID,结果被骂惨了——隐私合规过不去。
  • secMark:这个时间戳特别重要。多车协同的时候,时间不同步会出大问题。我曾经调试过一个追尾预警场景,发现两车时间差200ms,预警直接失效。
  • speed和heading:这两个字段决定了车辆的运动轨迹预测。精度要求很高,0.02m/s的速度分辨率,你想想看,高速上差一点就是几米。

避坑指南:我曾经在实车测试时发现BSM丢包严重,后来排查发现是发送频率太高(20Hz),信道拥塞了。建议城市道路用10Hz,高速场景可以降到5Hz,别盲目追求高频。

1.2 MAP(地图消息)——给车看的“高精地图”

MAP消息说白了就是路侧设备告诉车辆:“前面路口长这样,车道怎么划分的”。没有MAP,自动驾驶车辆连自己在哪条车道都搞不清。

协议结构:MAP消息的核心是节点(Node)和车道(Lane)。

MAP消息结构:
- 时间戳
- 节点列表(NodeList)
  - 节点ID
  - 节点位置(经纬度)
  - 车道列表(LaneList)
    - 车道ID
    - 车道宽度
    - 车道类型(直行/左转/右转)
    - 车道连接关系(ConnectsTo)
    - 车道中心线点列(Points)

关键字段

  • LaneType:车道类型。我见过最坑的是有个路口把左转车道标成了直行,结果车辆全部走错道。嗯,数据质量真的很重要。
  • ConnectsTo:车道连接关系。这个字段决定了车辆能不能从这个车道拐到下一个路口。比如左转车道只能连接到对面路口的左转车道。
  • Points:车道中心线点列。每个点包含经纬度和高度,精度要求厘米级。我建议至少每2米一个点,弯道处要加密到0.5米。

注意:MAP消息不是静态的!道路施工、临时管制都会导致MAP变化。我曾经遇到一个项目,MAP一个月没更新,结果车辆按旧地图走,直接开进了施工区域。所以MAP要有版本号,路侧设备要定期广播更新。

1.3 SPAT(信号灯消息)——红绿灯的“心声”

SPAT消息告诉你红绿灯什么时候变。没有SPAT,自动驾驶车辆只能靠摄像头看灯,遇到大雾天就抓瞎了。

协议结构:SPAT包含信号灯组(SignalGroup)和相位(Phase)。

字段 说明 示例
intersectionId 路口ID,对应MAP中的节点 1001
signalGroup 信号灯组ID 1(对应左转灯)
phase 当前相位(红/黄/绿) green
minEndTime 当前相位最早结束时间 5.2秒
maxEndTime 当前相位最晚结束时间 6.8秒
nextPhase 下一相位信息 yellow, 3秒

为什么要有minEndTime和maxEndTime两个时间?

你想想看,红绿灯不是绝对精确的。有时候行人按了过街按钮,绿灯会延长。所以SPAT给了一个时间窗口,车辆可以在这个范围内做决策。我建议自动驾驶系统取中间值做规划,但紧急情况下取最小值更安全。

实际应用:SPAT最经典的应用是“绿波带”和“红灯倒计时”。我记得有个项目,我们用SPAT让公交车在路口刚好赶上绿灯,平均通行时间缩短了30%。

1.4 RSM(路侧安全消息)——路侧设备的“眼睛”

RSM是路侧设备(RSU)发出的消息,告诉车辆“我检测到了什么”。比如路侧摄像头看到有个行人要过马路,就通过RSM广播出去。

协议结构:RSM包含检测到的目标列表。

RSM消息结构:
- 时间戳
- 目标列表(ObjectList)
  - 目标ID
  - 目标类型(行人/自行车/车辆/障碍物)
  - 目标位置(经纬度+海拔)
  - 目标速度
  - 目标航向
  - 目标尺寸
  - 置信度(0-100%)

关键字段

  • 目标类型:区分行人、自行车、车辆等。我遇到过最头疼的是把路边的垃圾桶识别成了行人,结果车辆频繁急刹。后来加了尺寸过滤才解决。
  • 置信度:这个字段特别重要。置信度低于50%的目标,我建议车辆只做参考,不要直接刹车。曾经有个项目置信度标错了,车辆对假目标做了紧急制动,差点造成追尾。

个人经验:RSM的更新频率建议10Hz以上。因为路侧检测到的目标往往是突然出现的(比如行人从车后窜出),频率低了根本来不及反应。我一般要求RSU至少15Hz发送RSM。

1.5 RSI(路侧信息)——路侧的“广播站”

RSI是路侧设备主动发布的交通事件信息。比如“前方2公里施工”、“这个路段限速60”、“有事故占用左侧车道”。

协议结构:RSI包含事件信息和影响区域。

字段 说明 示例
eventType 事件类型 施工/事故/限速/天气
eventPosition 事件位置 经纬度+车道
eventRadius 影响半径 500米
eventDuration 预计持续时间 2小时
eventDescription 文字描述 "左侧车道封闭"
priority 优先级(0-7) 5(高优先级)

注意:RSI的优先级字段很关键。优先级0-2是普通信息(比如天气提醒),3-5是重要信息(比如限速),6-7是紧急信息(比如事故)。我建议车辆对优先级6以上的RSI做强制响应,低于3的只做提示。否则车辆会被各种信息淹没。

实际案例:我记得有一次测试,路侧设备发了一条RSI说“前方500米有行人横穿高速”。但实际是路侧摄像头误检了。从那以后,我要求所有RSI事件必须经过至少两个传感器的交叉验证才能发送。说白了,宁可不发,也不能发假消息。

小结

这五个消息集构成了V2X通信的基础。BSM是车辆的自我介绍,MAP是道路的说明书,SPAT是红绿灯的时间表,RSM是路侧设备的感知报告,RSI是路侧的广播通知。

我个人习惯在项目开始时,先让团队把这五个消息的编解码跑通。因为后面所有的感知融合、决策规划,都建立在消息正确解析的基础上。你想想看,如果BSM的经纬度解析错了,后面的轨迹预测、碰撞预警全是错的。

下一章我们讲消息的编解码实现,到时候我会带大家手写一个BSM解析器。嗯,今天就到这里,有问题随时问我。