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; // 消息ID
TimeStamp 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; // 消息ID
TimeStamp 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; // 参与者ID
Position3D position; // 位置信息
MotionState motion; // 运动状态
VehicleSize size; // 尺寸信息
};
struct RSM {
uint32_t msgId; // 消息ID
TimeStamp 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; // 信号灯ID
uint8_t currentState; // 当前状态 (红、绿、黄等)
uint16_t remainingTime; // 剩余时间,单位:秒
uint16_t nextState; // 下一个状态
uint16_t nextTime; // 下一个状态的持续时间
};
struct SPAT {
uint32_t msgId; // 消息ID
TimeStamp timestamp; // 时间戳
uint32_t intersectionId; // 交叉路口ID
std::vector<PhaseState> phases; // 相位状态列表
uint8_t timeSyncStatus; // 时间同步状态
};
// 5. MAP (Map Data) 地图消息
struct Lane {
uint16_t laneId; // 车道ID
uint8_t laneType; // 车道类型
uint8_t laneDirection; // 车道方向
std::vector<PositionOffset> points; // 车道边界点
};
struct Connection {
uint16_t incomingLane; // 进入车道ID
uint16_t connectingLane; // 连接车道ID
uint8_t maneuver; // 机动类型
};
struct MAP {
uint32_t msgId; // 消息ID
TimeStamp timestamp; // 时间戳
uint32_t intersectionId; // 交叉路口ID
Position3D 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; // 站点ID
TimeStamp 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; // 管理ID
TimeStamp detectionTime; // 检测时间
TimeStamp referenceTime; // 参考时间
Position3D eventPosition; // 事件位置
uint16_t eventRadius; // 事件半径
uint8_t eventType; // 事件类型
uint8_t eventPriority; // 事件优先级
uint16_t validityDuration; // 有效时长
std::string description; // 事件描述
};
这些数据结构为V2X通信提供了标准化的信息交换格式,确保了不同厂商设备间的互操作性。实际应用中,这些消息会通过ASN.1编码进行序列化传输,以提高传输效率和兼容性。