Skip to content

V2X 通信协议

V2X 技术概述

V2X(Vehicle to Everything)是车辆与外界通信的总称,包括 V2V、V2I、V2N、V2P 四种场景。

V2X 通信技术路线

技术标准频段时延覆盖状态
DSRC(C-V2X 前身)IEEE 802.11p5.9GHz< 10ms300-1000m逐步退出
C-V2X PC5(LTE-V2X)3GPP Release 145.9GHz< 20ms300-500m国内主流
C-V2X PC5(NR-V2X)3GPP Release 165.9GHz< 5ms300-500m逐步推进
C-V2X Uu(蜂窝)4G/5G蜂窝频段50-100ms全网覆盖已商用

国内 V2X 政策

频谱分配:
  工信部分配 5905-5925MHz(20MHz)用于 LTE-V2X
  
标准体系:
  T/CSAE 53-2020:合作式智能运输系统 V2X 通信技术要求
  GB/T 37376-2019:交通运输 数字证书格式
  
推进情况:
  2021年:多个城市开展 V2X 试点
  2023年:部分城市开始规模化部署
  2025年:目标实现主要城市 V2X 覆盖

LTE-V2X(PC5 直连通信)

PC5 接口特点

PC5 是 V2X 设备间的直连通信接口(不经过基站):
  - 通信距离:300-500m(视线内)
  - 时延:< 20ms(端到端)
  - 频段:5.9GHz(5905-5925MHz)
  - 调制:QPSK / 16QAM
  - 信道带宽:10MHz
  
工作模式:
  Mode 3:基站调度(有网络覆盖时)
  Mode 4:自主调度(无网络覆盖时,分布式)

V2X 消息类型

BSM(Basic Safety Message,基本安全消息):
  - 发送频率:10Hz
  - 内容:位置、速度、航向、加速度、刹车状态
  - 用途:碰撞预警、协同驾驶

RSM(Road Side Message,路侧消息):
  - 来源:路侧单元(RSU)
  - 内容:交通信号、道路状况、施工信息
  - 用途:信号灯协同、危险预警

MAP(Map Data,地图数据):
  - 来源:RSU
  - 内容:路口几何信息、车道信息
  - 用途:精确路口导航

SPAT(Signal Phase and Timing,信号相位与配时):
  - 来源:RSU(连接交通信号控制机)
  - 内容:信号灯当前状态、剩余时间
  - 用途:绿波车速引导、闯红灯预警

BSM 消息格式(ASN.1)

BasicSafetyMessage ::= SEQUENCE {
    msgCnt    MsgCount,           -- 消息计数(0-127)
    id        TemporaryID,        -- 临时 ID(4字节,定期更换)
    secMark   DSecond,            -- 毫秒时间戳
    pos       Position3D,         -- 位置(经纬度+高程)
    accuracy  PositionalAccuracy, -- 位置精度
    transmission TransmissionState, -- 档位状态
    speed     Speed,              -- 速度(0.02 m/s 分辨率)
    heading   Heading,            -- 航向(0.0125° 分辨率)
    angle     SteeringWheelAngle, -- 方向盘转角
    accelSet  AccelerationSet4Way, -- 加速度集合
    brakes    BrakeSystemStatus,  -- 刹车状态
    size      VehicleSize         -- 车辆尺寸
}

C-V2X 模组集成

移远 V2X 方案

移远与合作伙伴提供完整的 C-V2X 解决方案:

硬件方案:
  蜂窝模组(RG520N,5G Uu 接口)
  + V2X 模组(PC5 直连通信)
  + GNSS 模组(LC29H,高精度定位)
  + 主控 SoC(处理 V2X 消息)

软件方案:
  V2X 协议栈(BSM/RSM/MAP/SPAT 消息处理)
  安全认证(V2X 证书管理)
  应用层(碰撞预警、信号灯协同等)

V2X 应用开发示例

c
// V2X BSM 消息发送
#include "v2x_api.h"

// 初始化 V2X
void v2x_init(void) {
    V2XConfig config = {
        .channel = V2X_CHANNEL_172,  // 5.9GHz 信道 172
        .tx_power = 23,              // 发射功率 23dBm
        .data_rate = V2X_RATE_6M,    // 6Mbps
        .mode = V2X_MODE_CONTINUOUS  // 连续发送
    };
    
    v2x_open(&config);
}

// 构建并发送 BSM
void send_bsm(GNSSData *gnss, VehicleData *vehicle) {
    BSM bsm = {0};
    
    // 填充 BSM 字段
    bsm.msgCnt = (bsm.msgCnt + 1) % 128;
    bsm.secMark = get_millisecond_of_minute();
    
    bsm.pos.lat = (int32_t)(gnss->latitude * 1e7);
    bsm.pos.lon = (int32_t)(gnss->longitude * 1e7);
    bsm.pos.elevation = (int32_t)(gnss->altitude * 10);
    
    bsm.speed = (uint16_t)(gnss->speed / 0.02f);  // 0.02 m/s 分辨率
    bsm.heading = (uint16_t)(gnss->heading / 0.0125f);
    
    bsm.accelSet.Long = (int16_t)(vehicle->accel_x / 0.01f);
    bsm.accelSet.Lat = (int16_t)(vehicle->accel_y / 0.01f);
    
    bsm.brakes.wheelBrakes = vehicle->brake_applied ? 0x0F : 0x00;
    
    bsm.size.width = vehicle->width;
    bsm.size.length = vehicle->length;
    
    // 编码并发送
    uint8_t encoded[256];
    int len = bsm_encode(&bsm, encoded, sizeof(encoded));
    v2x_send(encoded, len);
}

// 接收并处理 BSM
void on_bsm_received(uint8_t *data, int len, int rssi) {
    BSM bsm;
    if (bsm_decode(data, len, &bsm) != 0) return;
    
    // 碰撞预警检测
    check_collision_warning(&bsm, rssi);
}

// 碰撞预警算法
void check_collision_warning(BSM *remote_bsm, int rssi) {
    // 获取本车状态
    GNSSData my_gnss;
    get_my_gnss(&my_gnss);
    
    // 计算两车距离
    double distance = calculate_distance(
        my_gnss.latitude, my_gnss.longitude,
        remote_bsm->pos.lat / 1e7, remote_bsm->pos.lon / 1e7
    );
    
    // 计算碰撞时间(TTC)
    float my_speed = my_gnss.speed;
    float remote_speed = remote_bsm->speed * 0.02f;
    
    // 简化的 TTC 计算
    float relative_speed = my_speed - remote_speed;
    float ttc = (relative_speed > 0) ? distance / relative_speed : 999.0f;
    
    // 预警判断
    if (distance < 50.0 && ttc < 3.0) {
        trigger_collision_warning(distance, ttc);
    }
}

褚成志的笔记