大众四平台加斯巴鲁两代:一套安全模式为什么不能按品牌复用

作者:

在

结论:品牌名不是能力边界。同一家车厂的不同平台在安全模式、报文地址、校验方式和控制类型上差异很大:大众至少要分成 MQB、MEB、MLB、PQ 四套,斯巴鲁至少要分成 Global Gen1/Gen2 与 Preglobal;插件能力必须按平台 + 固件 + 接线位置 + 总线拓扑 + 控制类型声明,不能按品牌名继承。而且该快照把大众 MLB/PQ 与斯巴鲁 Preglobal 放在 ALLOW_DEBUG 条件下,不能因源码实现存在就认定发布固件支持执行。以下基于源码快照 c8fb906 与固定版本 opendbc_repo 的静态阅读,未接目标 ECU、未验证具体年款。

大众:四套平台不能合并

参数层 CarInterface._get_params() 会按 PQ、MLB、MEB、默认 MQB 选择安全模式;变速箱、网关/前相机接入、盲区监测等由指纹决定。MEB 使用曲率控制且配置自控纵向;非 MEB 的 alphaLongitudinalAvailable 与 alpha_long 路径须结合实际发布配置判断,不能只看能力字段放行。另外,若 PT bus 编号不在首组,还会前置 noOutput 安全配置。

层 关键组件 源码行为
输入 CarState.update() 分发到 update_mqb/pq/meb/mlb();update_hca_state() 与 update_acc_fault() 是故障状态收敛点。
控制 CarController.update() MEB 将目标曲率与测量曲率差补偿后限幅,控制转向功率逐步升降;其余平台按驾驶员扭矩限制目标扭矩。
MEB 停车 MebLongStateMachine.update() 协调 ACC 状态、保持/起步/释放坡道与退出斜坡,避免停车保持直接切到无请求;它不是通用纵向 PID。
雷达 RadarInterface.update() MEB 网关接法读取相机发布的过滤后轨迹,不是原始雷达点;校验消息、状态与重复 ID,维护目标生命周期。

大众固件模式差异

把四套平台的固件行为并排看,差异集中在校验、TX 白名单与纵向编译门上:

模式 初始化、RX、TX 必须保留的区别
MQB init()、rx()、tx() 原车 ACC 与自控纵向用不同 TX 白名单;纵向固件标志仅在 ALLOW_DEBUG 分支读取。RX 从 ESP、EPS、TSK、油门、刹车和按钮更新状态。
MEB init()、rx()、tx() Gen2 的替代 CRC 与消息长度单独选择;TX 校验曲率、转向功率、ACC 加速度,并限制停车保持与起步请求。
MLB init()、rx()、tx() TX 表只含转向、HUD 与原车 ACC 按钮,没有纵向加速/制动帧;六组 RX 全部显式忽略 checksum,但检查计数器。
PQ init()、rx()、tx() 使用不同地址、XOR 校验和与计数器位置;纵向标志同样有 ALLOW_DEBUG 编译门。

MLB 与 PQ 的细节很典型:MLB 的 TX 表根本不发纵向帧,且源码保留着校验 TODO,不能据「通用大众模式」推断它的校验能力;PQ 用 XOR 校验和与不同计数器位置,原车 ACC 与自控纵向的使能事件也不同。MEB 的停车保持即使 ACC 未激活仍可能影响车辆,因此必须维持独立固件门。

斯巴鲁:Global 与 Preglobal

参数层 CarInterface._get_params() 对 Preglobal 选 subaruPreglobal,其余选 subaru;Global Gen2 会写入安全参数。Preglobal、角度 LKAS、Hybrid 被标为 dashcamOnly,而此快照显式将 alphaLongitudinalAvailable=False,所以普通参数路径不会启用自控纵向——相关代码仍存在,不代表当前可用。

层 关键组件 源码行为
输入 CarState.update() 按 Gen2、Hybrid、Preglobal、角度 LKAS 改变刹车、轮速、巡航、转角来源;保留原车 EyeSight 报文副本供控制器改写。
输出 CarController.update() 软件侧按驾驶员扭矩限幅;STEER_RATE_LIMITED 时在高转向速率下周期性切断请求以避免 EPS 故障。
构帧 subarucan.py Global 与 Preglobal 的转向、EyeSight Distance、HUD 及校验和函数分开;不能把同名逻辑当作相同总线或相同编码。
Global 固件 subaru_init()、subaru_rx_hook()、subaru_tx_hook() Gen2 的车速/制动/巡航来自 alt bus,Gen1 来自主总线;ES_Distance 仅准许取消且油门值必须为 inactive。
Preglobal 固件 subaru_preglobal_init()、rx()、tx() 另一套报文地址与驾驶员扭矩符号,特定车型可反转扭矩方向;RX 对计数器/校验和的忽略有源码 TODO。

Global 的纵向限值常量虽然存在,但当前 TX 路径没有放行纵向控制;Preglobal 的 TX 白名单也含 ES_Distance,按钮行为需按平台测试核对。ECU 生命周期上,只有 DISABLE_EYESIGHT 标志才会执行 EyeSight 通信控制,这条分支不能当作默认运行路径。

对硬件与插件化的约束

  1. 插件能力必须按平台、固件、接线位置、总线拓扑与控制类型声明,不按品牌名继承。MEB 曲率控制、MQB/PQ/MLB 扭矩控制以及斯巴鲁 Global/Preglobal 不能共用一套执行器协议配置。
  2. 固件安全模式仍是独立硬件信任边界:插件可选择经审计的模式与参数,但不得改写 TX 白名单、CRC、转向/加速度限值,也不能以主机软件状态替代固件 RX 检查。
  3. 大众 MEB 的停车保持/起步是动作语义,不只是加速度数字;应在插件契约中显式建模,并用故障注入验证失联、错误 CRC、错误 bus、状态迁移及退出斜坡。
  4. 斯巴鲁 Hybrid、角度 LKAS、Preglobal 与大众 PQ/MLB 在源码中有待验证或发布限制,应保持被动,直到目标车的 DBC、帧重放、台架与封闭场地证据齐全。

常见问题

能不能写一套代码同时适配大众所有车型?

不能。大众至少分 MQB、MEB、MLB、PQ 四套平台,安全模式、TX 白名单、校验方式与控制类型都不同。参数层必须按平台选择,MEB 用曲率控制,其余用扭矩控制,不能合并。

源码里实现了某平台的纵向控制,就代表能用吗?

不代表。此快照把大众 MLB/PQ 与斯巴鲁 Preglobal 放在 ALLOW_DEBUG 条件下,斯巴鲁还显式将 alphaLongitudinalAvailable=False。源码实现存在不等于发布固件支持执行。

为什么 MLB 模式不能按「大众通用」假设校验能力?

因为 MLB 的六组 RX 全部显式忽略 checksum、只检查计数器,源码还保留着校验 TODO。不能据通用大众模式推断它具备同样的完整性校验。

斯巴鲁 Global 和 Preglobal 的报文可以复用吗?

不可以。两者的转向、EyeSight Distance、HUD 以及校验和函数分开实现,Preglobal 还使用另一套报文地址与驾驶员扭矩符号、特定车型可反转扭矩方向。

延伸阅读

参考资料

  • 项目 02 —— openpilot-research/VW_SUBARU_DEEP_DIVE.md(大众与斯巴鲁车型实现专题,含源码行号索引)
  • 项目 02 —— openpilot-research/VOLKSWAGEN_MEB_PANDA_SAFETY_DEEP_DIVE.md(源文档指向的 MEB 安全钩子逐函数专题)
  • 项目 02 —— openpilot-research/SUBARU_GLOBAL_PANDA_SAFETY_DEEP_DIVE.md(源文档指向的斯巴鲁 Global 安全专题)

说明:本文为对固定源码快照的静态结构分析,未运行完整测试套件、未连接硬件、未验证目标车型的真实参数组合。文中所有阈值、行号索引与配置均出自源文档,标注为未验证的结论保留其原有边界。

更新记录

首次发布 2026-10-11 最近核对:2026-10-11

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注