标签: 车速

  • OBD-II PID 入门:车速 0x0D 为什么是整数

    结论:OBD-II 标准 PID 0x0D(车速)返回的是整数 km/h,最小刻度就是 1 km/h,所以基于它做零百计时天然带约 1 km/h 的量化误差。真正决定成绩的不是界面刷新率,而是状态机在收到响应的那一刻锁定的时间戳——起点、60 km/h、100 km/h 三个点,都是「首次收到满足条件的样本」的接收时刻。

    为什么 0x0D 返回的是整数

    0x0D 是 OBD-II 的标准车速 PID,源文档口径明确写为「返回整数 km/h」。这意味着读回来的永远是整数,不会出现 60.5 km/h 这样的值。按 OBD-II 标准的通用定义,该 PID 为单字节量,以 1 km/h 为步长,值域覆盖 0–255 km/h(此值域属行业通识,非本项目实测数据)。

    整数输出带来的直接后果是:任何比 1 km/h 更细的门槛,都无法「直接读到」,只能靠推导。这一点决定了后面所有计时逻辑都要围绕「整数刻度」来设计,而不是围绕理想中的连续速度曲线。

    一次车速读数要走完的链路

    从主机发出请求,到拿到一个可用于计时的车速样本,中间要经过网关与总线,每一环都会给时间戳添上延迟。因此本项目要求每条车速样本保存六项元数据,缺一项就无法判断该样本是否可信。

    样本字段 用途
    原始响应 保留网关返回的原始字节,便于事后回溯
    解码值 把原始响应按协议换算成 km/h 后的数值
    请求发出时间 与接收时间一起算出单次请求的往返延迟
    响应接收时间 作为计时时间戳的基准
    网关状态 判断该样本是否来自可用、可信的链路
    单调时钟时间戳 避免系统时间被调整时影响计时差值

    必须强调:记录下的时间戳是 OBD 响应接收时刻,不是 ECU 的实际采样时刻。从 ECU 采样到主机收到响应之间,存在请求往返延迟和网关额外延迟,主机无从得知 ECU 精确的采样瞬间。所以计时精度首先受链路延迟约束,而不是受显示系统约束。

    数据源上还有一条硬边界:首选「经受保护车载网关读取标准 PID 0x0D」;若某车型使用专用车速信号,必须在车型配置里明确协议、单位与量化精度,不能默认它和 0x0D 一样。

    为什么「0.5 km/h 起步阈值」在 0x0D 上做不到

    因为 0x0D 只返回整数,没有 0.5 km/h 这个刻度,源文档因此直接写明:「0.5 km/h 起步阈值」无法直接实现。

    理论上可以用 0→1 与 99→100 两点插值,把整数跳变反推成更细的时间点。但插值是否成立,取决于轮询周期、请求往返延迟和车型信号特性——这三项必须先实测记录,才能评估误差量级。因此首版方案的结论是:不插值,也不用 IMU 或 GPS 去填补样本。起点判定只能落在「首次收到大于 0 km/h 的有效样本」上,其误差上限与实际有效更新率直接相关。

    计时状态机:两个锁存点,一次异常即作废

    状态机的作用是把「什么时候算开始、什么时候算结束」写成可复核的规则,避免用显示刷新或人为判断来计时。首版状态机如下:

    状态 触发条件 动作
    IDLE 收到连续有效的 0 km/h 样本,覆盖至少 1 秒 进入 ARMED
    ARMED 首次收到有效且大于 0 km/h 的车速 记该样本接收时刻为 t0,进入 RUNNING
    RUNNING 首次收到车速 ≥ 60 km/h 记 t60;继续计时
    RUNNING 首次收到车速 ≥ 100 km/h 记 t100,锁存 t100 − t0 与 t60 − t0,进入 COMPLETE
    任意计时状态 网关断连、PID 不支持、响应超时、样本乱序或不可信 标记本次无效,保存原因,不显示成功成绩

    只有 t100 出现时才锁存成绩;中途出现任何一种异常,本次都判为无效并记录原因,不会输出一个「看起来正常」的秒数。这样做的代价是弃权率升高,收益是每一条显示出来的成绩都能追溯到具体样本。

    还有一个容易踩的坑:「连续 0 km/h」必须由多个有效样本构成,不能把网关断连期间保持的旧值算进那 1 秒。否则车辆其实没动,也可能因为缓存值而被误判为已就绪。

    采样频率不等于刷新频率

    界面上数字跳得快,不代表车速采样得快。界面刷新频率只是渲染频率,车速采样频率由 PID 的轮询周期决定,两者不是一回事。把二者混为一谈,就会用「看起来很流畅」掩盖「样本其实很稀疏」的事实。

    显示层需要提供五种状态:待连接、待起步、计时中、成绩、无效记录。并且历史最佳只收录有效、且带车型与数据源元信息的成绩——否则一次异常样本就可能被当成纪录留存下来。相关界面形态可参考 圆屏还是方屏:车载仪表的显示形态该怎么选,其中说明了为什么 1.64 寸这类 280×456 竖屏适合做成计时器。

    验收前必须实测的三组数据

    在把任何精度写进规格之前,以下三组数据是硬前提,缺任何一组都无法声称精度:

    1. 注入测试:向同一套解析与状态机灌入速度曲线,覆盖缓慢起步、瞬时跳值、重复帧、乱序、超时和中途失联,逐项核对状态迁移与时间戳是否符合预期。
    2. 实车链路记录:在目标车型上记录 PID 支持情况、有效车速更新率、请求往返延迟分布、网关额外延迟,以及计时期间的丢包率。
    3. 独立参照比对:用独立参考设备同步采集多次 0–100 加速,统计偏差与离散程度。

    最后必须说清楚:源文档中 ±0.05s 与「优于手机」是待验证目标。在没有实测证据之前,它们既不能写成已达到的精度,也不能作为宣传文案。计时链路的原理与数据源约束,另见 OBD 零百加速计时:为什么手机测不准,仪表该怎么算;采集侧的实现可对照 SR-RaceBox 车载数据采集器。

    常见问题

    0x0D 能读出小数点后的车速吗?

    不能。0x0D 返回整数 km/h,最小刻度就是 1 km/h。更细的分辨率只能靠插值推导,而插值是否可用取决于轮询周期与链路延迟,首版方案不做插值。

    为什么不能用 GPS 或 IMU 辅助计时?

    本项目里 GPS 不参与计时、插值或丢包补偿;QMI8658 只记录峰值 G 和 G 曲线,不参与起点、60 km/h、终点的时间戳判定。计时输入唯一来自 OBD 车速,以保证每一条成绩都能追溯到具体数据源。

    为什么时间戳不是 ECU 采样时刻?

    因为记录的是 OBD 响应接收时刻。从 ECU 采样到主机收到响应之间有请求往返延迟和网关额外延迟,主机无法得知 ECU 精确的采样瞬间,所以计时精度先受链路延迟约束。

    一次零百成绩什么时候才算有效?

    要同时满足两点:状态机按顺序经过 IDLE → ARMED → RUNNING,并在收到 ≥ 100 km/h 的样本时锁存成绩;且全程没有出现网关断连、PID 不支持、响应超时、样本乱序或不可信。任一异常都判为无效并保存原因。

    本文数据来自星核火花赛车科技内部车载仪表研究项目的《1.64 寸 OBD 零百计时规格》(2026-10 版)。PID 0x0D 的精度、延迟与插值可行性均以实车标定为准;文中的 ±0.05s 与「优于手机」为源文档标注的待验证目标,非已达成的精度指标。文中 0–255 km/h 值域为 OBD-II 行业通识,未经本项目实测,仅供理解整数刻度之用。