标签: PID

  • 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 行业通识,未经本项目实测,仅供理解整数刻度之用。

  • OBD 零百加速计时:为什么手机测不准,仪表该怎么算

    结论:用 OBD 做 0–100 km/h 加速计时,唯一可信的输入是标准 OBD-II 车速 PID 0x0D。它按整数 km/h 上报,所以「0.5 km/h 起步阈值」根本无法实现;GPS 不参与计时、插值或丢包补偿,IMU 只负责记录 G 值。在实车标定完成之前,「±0.05 秒」「优于手机」都只是待验证目标,不是规格。

    为什么「看起来能测」和「真的能测」是两回事

    手机上随手装一个加速计时 App,看起来也能出成绩。但把同一套逻辑搬到车载仪表上,问题会立刻暴露:加速度计的噪声、GPS 的更新频率和延迟、以及车辆实际起步的抖动,都会让「0 秒」这个时刻的定义变得含糊。

    更关键的是,计时器报告的是它接收到的数据时刻,而不是车辆真实的物理时刻。如果这一点不说清楚,讨论「精度」就没有意义。

    计时输入的唯一性:只用 OBD 车速

    在 OBD 车速与 IMU、GPS 并存的设计里,必须明确一条边界:计时链路上只允许有一个数据源。

    • 唯一计时输入:OBD 车速。首选通过受保护的车载网关读取标准 OBD-II PID 0x0D;若车型使用专用车速信号,必须在车型配置中写清协议、单位和量化精度。
    • GPS 不参与计时、插值或丢包补偿。GPS 的更新率和定位漂移都不足以支撑零点几秒级的判定。
    • IMU(如 QMI8658)可以记录峰值 G 和 G 曲线,但不参与起点、60 km/h、终点的时间戳判定。

    把三条拆开看,逻辑就清楚了:IMU 回答「加速有多猛」,GPS 回答「路走了多远」,而只有 OBD 车速能回答「什么时候到 100」。混用会得到漂亮的数字,但那个数字不可复盘。

    状态机:五个状态按什么顺序判定

    状态 进入条件 动作
    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 不支持、响应超时、样本乱序或不可信 标记本次无效,保存原因,不显示成功成绩

    这套状态机刻意做得很「笨」:不猜、不补、不回头修。原因很直接——加速成绩的价值在于可信,而不在于好看。

    哪些情况必须判为无效

    「无效」不是异常处理,而是产品功能的一部分。至少要覆盖这六类场景:

    1. 缓慢起步——车辆长时间停留在 1 km/h 附近,起步时刻难以确定。
    2. 瞬时跳值——单帧车速突然从 0 跳到 60,超出物理可能性。
    3. 重复帧——同一时刻收到多条相同样本。
    4. 乱序——时间戳不单调递增。
    5. 超时——请求发出后长时间没有响应。
    6. 中途失联——网关在 RUNNING 期间断开。

    这些场景必须在离线注入测试中全部覆盖:把速度曲线喂给同一套解析与状态机,逐条核对状态切换与时间戳是否正确。

    为什么 0.5 km/h 的起步阈值做不到

    标准 PID 0x0D 返回的是整数 km/h,没有小数位。所以「车速大于 0.5 km/h 即视为起步」这种阈值在协议层面就无法表达——你只能看到 0 和 1。

    因此首版采用「首次收到大于 0 的有效样本」作为起步点,并且明确:

    • 不插值。是否用 0→1 与 99→100 两点插值,必须在记录了轮询周期、往返延迟和车型信号特性之后再决定。
    • 不借用 IMU 或 GPS 填补样本。填补会产生看似连续、实则虚构的曲线。
    • 连续 0 km/h 的判定需要多个有效样本。网关断连期间「保持」的旧值,不能算进那 1 秒。

    要留什么数据,才叫可复盘

    每条车速样本至少保存六项:原始响应、解码值、请求发出时间、响应接收时间、网关状态、单调时钟时间戳。

    这里有个容易被忽略的区分:界面刷新频率不等于车速采样频率。屏幕每秒刷 20 帧,不代表每秒拿到 20 个车速样本。把两者混为一谈,会让「数据很密」变成一种错觉。

    另外,上述所有时间戳都是 OBD 响应接收时刻,不是 ECU 的实际采样时刻。这是整条链路的固有偏差,只能披露,不能消除。

    关于精度的诚实表述

    「±0.05 秒」和「优于手机」是待验证目标。在完成以下三步之前,它们不应出现在任何宣传文案里:

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

    界面需要提供五种状态:待连接、待起步、计时中、成绩、无效记录。历史最佳只收录「有效且带车型 / 数据源元信息」的成绩——没有元信息的成绩无法复盘,也就不该进榜。

    常见问题

    用 GPS 测 0–100 会差多少?

    本文不给具体数字,因为差异取决于 GPS 模块的更新率、定位精度和遮挡情况,需要实测。但可以确定的是:GPS 的采样与延迟特性使它不适合作为零点几秒级判定的唯一依据,因此本方案把它排除在计时链路之外。

    IMU 能提高计时精度吗?

    不能用于提高计时精度。IMU 可以记录峰值 G 和 G 曲线,用于分析驾驶表现,但起点、60 km/h、终点三个时间戳只能来自 OBD 车速样本。

    为什么不做插值让曲线更平滑?

    因为插值会产生「看起来连续、实际不存在」的样本。首版选择保留原始离散点,等实车标定拿到轮询周期与延迟分布后,再评估插值是否值得引入。

    成绩为无效时,界面应该显示什么?

    显示无效原因,而不是一个成功成绩。无效判定的价值就在于:它让用户知道自己看到的数字是否可信。

    小结

    一个可信的 OBD 加速计时器,本质上是一套数据边界 + 状态机 + 无效判定的组合,而不是一个公式。先用整数 km/h 的现实约束定义清楚能做什么、不能做什么,再谈精度——这个顺序反了,后面全是返工。

    本文结论来自星核火花赛车科技内部车载仪表研究项目(2026-10 版)的《OBD 零百计时规格》与《五块赛道产品候选板硬件事实表》。文中精度指标均为待验证目标,实际数值以实车标定为准。