V2X通信标准与消息数据结构详解
V2X (Vehicle to Everything) 通信标准主要包括国标、欧标、美标和日标。下面我将详细介绍中国国家标准中的五种核心消息类型(BSM、RSI、RSM、SPAT、MAP)的数据结构,并提供相应的C++代码实现。
消息类型概述
- BSM:基础安全消息,包含车辆的速度、方向、加速度、刹车状态、转向灯状态以及位置等信息。
- RSI:路侧信息,通常由路侧单元(RSU)发布,用于通知附近车辆关于道路施工、限速标志等信息。
- RSM:路侧安全消息,主要用于报告交通事故或异常情况,如车辆碰撞、异物闯入等。
- SPAT:交通灯相位与时序消息,提供给车辆当前路口的红绿灯状态及其剩余时间,以便进行车速引导和绿波推送。
- MAP:地图消息,描述了特定路口的详细布局,包括各车道的信息及其连接关系。
C++数据结构实现
以下是这五种消息的C++数据结构实现:
#include <vector>
#include <string>
#include <cstdint>// 通用基础类型
struct Position3D {double latitude; // 纬度,单位:度double longitude; // 经度,单位:度double elevation; // 高程,单位:米
};struct PositionOffset {int32_t offsetX; // X轴偏移量,单位:厘米int32_t offsetY; // Y轴偏移量,单位:厘米
};struct TimeStamp {uint32_t year; // 年uint8_t month; // 月uint8_t day; // 日uint8_t hour; // 时uint8_t minute; // 分uint8_t second; // 秒
};// 1. BSM (Basic Safety Message) 基础安全消息
struct VehicleSize {uint16_t width; // 车辆宽度,单位:厘米uint16_t length; // 车辆长度,单位:厘米uint16_t height; // 车辆高度,单位:厘米
};struct MotionState {int16_t speed; // 速度,单位:0.02米/秒int16_t acceleration; // 加速度,单位:0.1米/秒²int16_t steeringAngle; // 方向盘转角,单位:1.5度uint8_t brakeStatus; // 刹车状态,0-未制动,1-制动uint8_t turnSignal; // 转向灯状态,0-关闭,1-左转,2-右转,3-紧急双闪
};struct BSM {uint32_t msgId; // 消息IDTimeStamp timestamp; // 时间戳Position3D position; // 车辆位置MotionState motion; // 运动状态VehicleSize size; // 车辆尺寸uint8_t vehicleClass; // 车辆类型uint8_t vehicleState; // 车辆状态std::string plateNo; // 车牌号
};// 2. RSI (Road Side Information) 路侧信息
struct EventPoint {Position3D position; // 事件位置uint16_t eventRadius; // 事件影响半径,单位:米
};struct RSI {uint32_t msgId; // 消息IDTimeStamp timestamp; // 时间戳EventPoint eventPoint; // 事件位置信息uint8_t eventType; // 事件类型uint8_t eventPriority; // 事件优先级uint16_t validDuration; // 有效时长,单位:秒std::string description; // 事件描述
};// 3. RSM (Road Safety Message) 路侧安全消息
struct ParticipantData {uint8_t participantType; // 参与者类型uint16_t participantId; // 参与者IDPosition3D position; // 位置信息MotionState motion; // 运动状态VehicleSize size; // 尺寸信息
};struct RSM {uint32_t msgId; // 消息IDTimeStamp timestamp; // 时间戳Position3D rsuPosition; // RSU位置std::vector<ParticipantData> participants; // 参与者列表uint8_t eventType; // 事件类型uint8_t confidence; // 置信度
};// 4. SPAT (Signal Phase and Timing) 交通灯相位与时序消息
struct PhaseState {uint8_t lightId; // 信号灯IDuint8_t currentState; // 当前状态 (红、绿、黄等)uint16_t remainingTime; // 剩余时间,单位:秒uint16_t nextState; // 下一个状态uint16_t nextTime; // 下一个状态的持续时间
};struct SPAT {uint32_t msgId; // 消息IDTimeStamp timestamp; // 时间戳uint32_t intersectionId; // 交叉路口IDstd::vector<PhaseState> phases; // 相位状态列表uint8_t timeSyncStatus; // 时间同步状态
};// 5. MAP (Map Data) 地图消息
struct Lane {uint16_t laneId; // 车道IDuint8_t laneType; // 车道类型uint8_t laneDirection; // 车道方向std::vector<PositionOffset> points; // 车道边界点
};struct Connection {uint16_t incomingLane; // 进入车道IDuint16_t connectingLane; // 连接车道IDuint8_t maneuver; // 机动类型
};struct MAP {uint32_t msgId; // 消息IDTimeStamp timestamp; // 时间戳uint32_t intersectionId; // 交叉路口IDPosition3D referencePoint; // 参考点std::vector<Lane> lanes; // 车道列表std::vector<Connection> connections; // 连接关系std::vector<uint16_t> spatIds; // 关联的SPAT ID列表
};
消息应用场景说明
BSM消息:
主要用于V2V场景,如变道预警、盲区预警、交叉路口碰撞预警等
包含车辆实时运动状态和基本信息
典型发送频率: 10Hz (每100ms发送一次)
RSI消息:
主要用于V2I场景,如道路施工、限速标志、超速预警等
由路侧单元(RSU)发送给车辆
包含静态或半静态的道路事件信息
RSM消息:
主要用于V2I场景,识别道路异常事件
包含检测到的交通参与者信息和异常事件
用于车辆事故、异常停车、异物闯入等场景
SPAT消息:
与MAP消息配合使用,提供交通信号灯状态
用于车速引导、绿波推送等场景
包含信号灯当前状态和剩余时间
MAP消息:
描述路口拓扑结构
包含车道信息和连接关系
与SPAT消息配合实现精确的车路协同
欧标消息补充(CAM/DENM)
欧标ETSI定义的两种主要消息类型:
// CAM (Cooperative Awareness Message) 合作感知信息
struct CAM {uint32_t stationId; // 站点IDTimeStamp timestamp; // 时间戳Position3D position; // 位置信息MotionState motion; // 运动状态VehicleSize size; // 车辆尺寸uint8_t vehicleClass; // 车辆类型uint8_t vehicleRole; // 车辆角色uint8_t exteriorLights; // 外部灯光状态
};// DENM (Decentralized Environmental Notification Message) 分散环境通知信息
struct DENM {uint32_t managementId; // 管理IDTimeStamp detectionTime; // 检测时间TimeStamp referenceTime; // 参考时间Position3D eventPosition; // 事件位置uint16_t eventRadius; // 事件半径uint8_t eventType; // 事件类型uint8_t eventPriority; // 事件优先级uint16_t validityDuration; // 有效时长std::string description; // 事件描述
};
这些数据结构为V2X通信提供了标准化的信息交换格式,确保了不同厂商设备间的互操作性。实际应用中,这些消息会通过ASN.1编码进行序列化传输,以提高传输效率和兼容性。