标签: GM

  • GM panda safety:三个参数位切换拓扑,白名单不等于字段认证

    结论:GM panda safety 按 HW_CAM、HW_CAM_LONG、EV 三个参数位切换硬件拓扑与 TX 表,三者的使能与转发策略互不相同:ASCM 分支 disable_forwarding=true 完全禁转发、由按钮沿使能;相机原车纵向跟随 PCM;相机自控纵向仅在调试构建且 HW_CAM_LONG 置位时才把 gm_pcm_cruise 改为假。白名单只控制 CAN 地址、总线、长度,不代表所有字段都经安全认证。

    本文基于固定源码快照逐函数静态解析 opendbc/safety/modes/gm.h,结合通用 safety 分发与本机原版 GM 测试。未编译目标固件或接入车辆;这里的总线号、编码和阈值仅适用于该源码快照及匹配车型,不能直接当作新硬件配置。

    RX:来源、使能与完整性缺口

    GM_COMMON_RX_CHECKS 监视总线 0 的 0x184 驾驶员扭矩、0x34A 后轮速度、0x1E1 按钮、0xBE 踏板、0x1C4 油门/巡航和 0xC9 制动状态;0xBE 允许三种长度以适配不同车型。各项暂以 10 Hz 标称检查,且显式忽略校验和、计数器、质量位——源码 TODO 指出这不是完整报文完整性校验。EV 参数位另把 0xBD 再生制动消息纳入 RX 表,频率配置为 40 Hz。

    报文 用途 完整性处理
    0x184 驾驶员扭矩(11 位有符号,进共享采样窗口) 忽略校验和/计数器/质量位
    0x34A 后轮双速;两轮原始速度均不超过 10 判静止 停车判据,不是完整车速估计
    0x1E1 按钮沿使能(ASCM 用 SET 松开沿或 RESUME 按下沿) 忽略完整性字段
    0xBE ASCM 刹车(字节阈值);允许三种长度 与相机刹车帧 0xC9 不是同义来源
    0x1C4 相机原车纵向读取巡航接合状态 走 pcm_cruise_check()
    0xC9 相机刹车(bit 40) 与 0xBE 不能互换
    0xBD EV 再生制动,仅 EV 参数位置位时入 RX 表 配置为 40 Hz

    safety_rx_hook() 只在检查通过、命中表后调用 gm_rx_hook(),因此再生制动分支并非在非 EV 模式下无条件接收。ASCM 以 0x1E1 的 SET 松开沿或 RESUME 按下沿使能,CANCEL 按下退出;相机原车纵向则从 0x1C4 读取巡航接合状态。

    TX 与模式矩阵

    GM 自控纵向时 gm_pcm_cruise=false;相机原车纵向时为 true。相机自控纵向仅在调试构建且 HW_CAM_LONG 位置位时把它改为假。这决定使能来自按钮沿还是 PCM,影响告警与执行权限,不只是 TX 白名单的变化。

    模式 纵向 TX 转发与使能
    ASCM,HW_CAM=0 0x2CB 位于总线 0,0x315 位于总线 2;另有观测/keepalive 帧 disable_forwarding=true,由按钮沿使能
    相机,默认或 release 无 0x2CB/0x315;0x1E1 总线 2 仅允许取消 跟随 PCM 巡航接合,仍可发横向 0x180
    相机,ALLOW_DEBUG 且 HW_CAM_LONG=1 0x2CB/0x315 总线 0 改用按钮沿,禁原车 0x1E1 TX
    上述模式叠加 EV 不改变所选 TX 表 仅增加 0xBD 再生制动 RX

    gm_tx_hook() 对 0x180 调用共享扭矩安全检查,含 300 原始单位上限、变化率、驾驶员扭矩与实时增量限制。0x315 的 12 位原始编码先反转为非负制动量,再用 longitudinal_brake_checks() 限制到 max_brake=400 且未使能时必须为零。0x2CB 将油门/再生制动信号偏移到整数域后分别按 ASCM/相机限值检查,apply 位在 controls_allowed=false 时禁止。相机原车纵向的 0x1E1 只有原车巡航已接合且按钮编码为 CANCEL 时放行。

    白名单不等于字段认证

    并非所有 GM 白名单帧都有逐信号检查:例如 ASCM 的 keepalive/观测帧和相机的 0x184 状态帧,在 gm_tx_hook() 中没有对应载荷分支。白名单控制的是 CAN 地址、总线、长度。

    转发层面同样分层:相机模式中 0x184 总线 2 的 check_relay=true 会使共享转发逻辑阻断来自总线 0、目标为总线 2 的同地址帧;ASCM 则完全禁转发。应把「是否允许发」「是否阻断原车转发」「是否检测原车 ECU」分别建模。

    验证范围与插件边界

    test_gm.py 有 ASCM、相机、EV、相机自控纵向测试类,包含按钮、踏板、扭矩/纵向限值和点火用例。本机运行原版 GM 模块测试为 Ran 192 tests、OK (skipped=19),即 173 项执行且通过,19 项未执行。跳过项来自无 _user_regen_msg 的通用再生制动用例、无第二车速消息的通用检查,以及四个抽象基类的 setUpClass,不能计入通过。

    测试调用 libsafety_py._build_libsafety() 默认加 ALLOW_DEBUG,因此相机自控纵向用例不能证明 release 固件接受 HW_CAM_LONG。本机另用严格警告把测试库 safety.c 分别编译为不含/含 ALLOW_DEBUG 的目标文件,只在后者找到 GM_CAM_LONG_TX_MSGS——这核对的是本机编译分支,不是 STM32 固件或运行时许可。实板转发、实际 CAN 来源和目标 ECU 响应仍未测试。

    • 自制硬件的 GM 插件契约应固定车型/DBC、ASCM 或相机接线、EV 位、总线号、固件构建类型和 safetyParam。
    • 只读采集和回放先验证 0xBE 长度变体、0xC9 刹车、0xBD 再生制动、按钮沿、PCM 巡航及 0x184 驾驶员扭矩。
    • 台架再做丢帧、重放、错总线、故障继电器和 release/debug 差异。
    • 普通插件只产生候选控制,不能设置安全钩子或绕过板端 TX/转发判定。

    常见问题

    GM 白名单里的帧都经过字段级安全检查吗?

    不是。白名单只控制 CAN 地址、总线、长度;ASCM 的 keepalive/观测帧和相机的 0x184 状态帧在 gm_tx_hook() 中没有对应载荷分支,不能据此声称所有字段都经过安全认证。

    相机自控纵向在 release 固件里能用吗?

    测试不能证明。相机自控纵向仅在调试构建且 HW_CAM_LONG 位置位时把 gm_pcm_cruise 改为假;而测试默认加 ALLOW_DEBUG,本机只在含该宏的目标文件里找到 GM_CAM_LONG_TX_MSGS,这核对的是编译分支而非运行时许可。

    ASCM 和相机的刹车帧可以互换吗?

    不能。ASCM 的刹车取 0xBE 字节阈值,相机刹车取 0xC9 的 bit 40,切换拓扑时不能把两种刹车帧视为同义来源;0xBE 还允许三种长度以适配不同车型。

    GM 的 RX 完整性与校验和有关系吗?

    没有做完整校验。各项暂以 10 Hz 标称检查,且显式忽略校验和、计数器、质量位;源码 TODO 指出这不是完整报文完整性校验。所以「命中 RX 表」不等于「报文完整可信」。

    延伸阅读

    参考资料

    • 项目 02 —— openpilot-research/GM_PANDA_SAFETY_MODE_DEEP_DIVE.md(取用了 GM 三参数位模式矩阵、RX/TX 与转发边界、白名单不等于字段认证,以及本机测试计数)。
    • 项目 02 —— openpilot-research/ACTUATION_GATE_CHAIN_DEEP_DIVE.md(仅用于确认执行链分层语义,未取用其未公开内容)。

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

    更新记录

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

  • Ford 与 GM:曲率、ASCM 网关与双车速检查的三道安全边界

    结论:Ford 与 GM 都以「软件控制器只生成候选 CAN 帧、panda 固件独立放行」为前提,但两者路径不同:Ford 走角度/曲率式横向控制并用 ABS 车速与 PCM 第二车速交叉核验;GM 分 ASCM/OBD-II 网关与相机 ACC 两条接法,部分车型用 sigmoid 加线性拟合做横向映射。无论哪种,alpha_long、safetyParam、ALLOW_DEBUG 与 dashcamOnly 必须同时核对,不能单看软件发送代码推断硬件可执行。本文为源码静态分析,不是接线图、适配声明或实车安全验证。

    Ford:曲率控制与双车速检查

    CarInterface._get_params() 使用角度/曲率式横向控制,按 CAN FD、雷达 DBC、EPS 固件和指纹设置 ford 安全模式与总线。非 CAN FD 通过 EPS 固件配置排除缺少 TJA/LCA API 的车辆;CAN FD 的 16 字节 SecOC 控制报文未支持时标记 dashcamOnly;手动车型设最低使能车速。get_pid_accel_limits() 在临近巡航目标速度时降低 PID 正加速度上限以防积分饱和——参数层在 alpha_long 或雷达可用路径写入纵向安全参数,但这不是固件已放行的充分证据,CAN FD 纵向白名单还受编译门限制。

    输出侧,CarController.update() 以 20 Hz 曲率命令工作,部分车型先用 anti_overshoot() 平滑,随后限测量曲率误差和变化率;CAN FD 与经典 CAN 分别调用不同 lateral 构帧函数,其它未验证的曲率率、路径角和偏移信号保持 inactive。纵向由 apply_creep_compensation() 及 CarController.update() 根据低速蠕行、目标加速度下降率和坡度影响生成 ACC 的油门、减速度及制动预充请求。

    层 关键入口 已核对行为
    参数 _get_params() 角度/曲率式横向;按 CAN FD、雷达 DBC、EPS 固件设置安全模式;SecOC 未支持标 dashcamOnly
    横向输出 CarController.update() 20 Hz 曲率;可先 anti_overshoot() 平滑;限曲率误差与变化率
    纵向输出 apply_creep_compensation() 按蠕行、目标加速度下降率与坡度生成油门、减速度及制动预充
    雷达 RadarInterface.update() 按 DBC 区分 Delphi ESR 与 MRR;MRR 检查扫描序列、覆盖范围及临时不可用
    固件 RX ford_rx_hook() ABS 车速与 PCM 第二车速交叉核验;用 yaw rate 估算曲率
    固件 TX ford_tx_hook() 不允许 Lane_Assist_Data1 承载执行转向;不允许设置阻止原车 AEB 的位
    模式选择 ford_init() CAN FD 自控纵向仅在 ALLOW_DEBUG 且安全参数启用时添加 ACCDATA

    两个细节需要单独记住:Ford 固件 TX 对两种横向报文都要求额外路径信号为 inactive;RX 对部分 PCM 第二车速帧忽略计数器/校验和,但仍检查质量位。因此把多条总线合并为无来源的 VehicleSpeed 会损失安全判据。

    GM:ASCM 网关与相机 ACC

    CarInterface._get_params() 在 ASCM/OBD-II 网关路径默认自控纵向,在相机 ACC 路径默认原车纵向,实验纵向由 alpha_long 和安全参数选择;EV、无雷达、替代 ACC、SDGM 分支另有限制,无雷达或缺少测试覆盖可标记 dashcamOnly。alphaLongitudinalAvailable 只是能力提示,不能代替检查 openpilotLongitudinalControl 与固件模式。

    横向映射上,部分车型用 get_lataccel_torque_siglin() 与 torque_from_lateral_accel() 以 sigmoid 加线性拟合横向加速度与扭矩并提供逆向插值,其余走基础线性映射——此调校是车型特定控制模型,不可作为新硬件通用执行器标定。输出侧 CarController.update() 按驾驶员扭矩限幅;相机接法需对齐相机计数器,回环确认距上次发送不足 15 ms 时跳过以避免 EPS 故障,活跃/非活跃横向采用不同节拍。

    层 关键入口 已核对行为
    参数 _get_params() ASCM/OBD-II 网关默认自控纵向;相机 ACC 默认原车纵向;EV/无雷达等另有限制
    横向映射 get_lataccel_torque_siglin() / torque_from_lateral_accel() 部分车型 sigmoid + 线性拟合与逆向插值;其余基础线性映射
    横向输出 CarController.update() 相机接法对齐相机计数器;回环确认不足 15 ms 时跳过
    纵向输出 同上 自控纵向按 25 Hz 生成油门/再生制动与摩擦制动;网关接法发 ADAS keepalive
    雷达 create_radar_can_parser() / RadarInterface.update() ASCM 路径解析 Continental LRR 头与目标槽,检查故障、CAN 有效性与目标生命周期
    固件 RX gm_rx_hook() 从驾驶员扭矩、后轮速度、巡航按钮或原车 ACC 决定 controls_allowed
    固件 TX gm_tx_hook() 检查扭矩、摩擦制动、油门/再生制动及 apply 位;原车纵向仅允许取消语义按钮
    模式选择 gm_init() 相机自控纵向仅在 ALLOW_DEBUG 中添加白名单;ASCM 模式关闭固件转发

    需要指出的是,GM 的公共 RX 检查仍有校验和/计数器 TODO,不能称为完整协议完整性验证;ASCM 模式则关闭固件转发,与相机接法的行为不同。原车纵向仅发送延迟后的取消按钮,以降低用户踩刹车时的 ECM 故障风险。

    对车载硬件和插件接口的结论

    1. 车型插件应声明精确平台、DBC、总线拓扑、雷达来源、纵向模式、编译能力和 safetyParam。Ford CAN FD SecOC 不支持、GM 相机自控纵向需调试固件的限制,必须在装车前阻止执行模式。
    2. Ford 的双车速与 yaw 质量位、GM 的回环计数器/时间间隔需要在硬件接口中保留来源与时间戳;把多条总线合并为无来源字段会损失安全判据。
    3. 软件控制器只生成候选 CAN 帧。panda 的 RX/TX/转发规则仍是独立硬件边界;未知平台、无法确认固件、错误总线或诊断失败时保持被动。
    4. 后续目标车型需完成 DBC 解析/打包、丢帧/错校验/双车速失配、回环时序、AEB 干预、断电与失联的 SIL/HIL,再做封闭场地验证。这里没有实车结论。

    常见问题

    alphaLongitudinalAvailable 为真,是否就能启用纵向控制?

    不能。GM 侧源文档明确 alphaLongitudinalAvailable 只是能力提示,不能代替检查 openpilotLongitudinalControl 与固件模式;Ford 侧参数层即使写入纵向安全参数,也不是固件已放行的充分证据,CAN FD 纵向白名单还受编译门限制。

    Ford 的转向命令能否走 Lane_Assist_Data1?

    不能。ford_tx_hook() 明确不允许 Lane_Assist_Data1 承载执行转向,也不允许设置阻止原车 AEB 的位;固件还会对曲率及测量误差、ACC 油门/制动、按钮权限分别检查,并要求两种横向报文的额外路径信号为 inactive。

    GM 的横向映射能不能直接照搬到新硬件?

    不能。部分车型使用的 sigmoid 加线性拟合与逆向插值属于车型特定控制模型,源文档明确它不可作为新硬件通用执行器标定;其余车型走基础线性映射,两者不能混用。

    为什么不能把多条总线合并成一个 VehicleSpeed?

    因为会损失安全判据。Ford 用 ABS 车速与 PCM 第二车速交叉核验、GM 依赖回环计数器/时间间隔,这些来源与时间戳本身就是判据;源文档要求硬件接口保留来源与时间戳,未知平台或无法确认固件时保持被动。

    延伸阅读

    参考资料

    • 项目 02 —— openpilot-research/FORD_GM_DEEP_DIVE.md(取用了 Ford 曲率控制与双车速检查、GM ASCM/相机两条接法、固件 RX/TX 边界与插件结论)。
    • 项目 02 —— openpilot-research/CAR_PROTOCOL_IMPLEMENTATIONS.md(仅用于确认 Ford/GM 品牌目录与跨品牌流程的总体位置)。

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

    更新记录

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