结论:「转向灯亮了」在代码里不是一个布尔值,而是一套按更新次数计数的状态机——而且同一件事在三家车厂有三种实现:有的从灯泡信号推算、有的从拨杆信号读取、有的直接解枚举。所以做跨车型信号适配时,不能假设「同一个信号名 = 同一种行为」。
从 CAN 帧到车辆状态:一条固定链路
不管什么车型,车辆状态都走同一条主干(本文基线为源码快照 c8fb906):
| 阶段 | 做什么 | 产出 |
|---|---|---|
| CAN 接受 | 等待并取出 CAN 批次 | 原始帧按总线分组 |
| 接口更新 | 逐个更新各总线的解析器,再调车型状态 | 解析后的信号值 |
| 品牌状态 | 按车型规则解信号含义 | 车型语义层 |
| 共同处理 | 统一滤波、去抖、迟滞 | 可消费的车辆状态 |
| 发布 | 写入车辆状态消息 | 下游各进程消费 |
关键点在于:健康位是解析器级与总线级的汇总,而不是每个字段各自带有效性和年龄。也就是说,「CAN 有效」不代表「转向灯字段可信」。动态注册、失效累计和空解析器的边界,是理解这个汇总的前提。
同一个「转向灯」的三种实现
这是跨车型适配里最容易踩的坑:
| 车厂 | 来源 | 保持方式 | 方向盘去抖 |
|---|---|---|---|
| 现代系列 | 灯泡类信号 | 保持计数 50 次 | 扭矩阈值加 5 次迟滞去抖 |
| 本田 | 拨杆信号 | 保持计数 250 次 | 直接用车型阈值,无共同去抖 |
| 丰田 | 直接解枚举 | 不做灯泡式计数 | 直接解扭矩阈值 |
更要注意两个陷阱。第一,保持计数是「更新次数」,不是时间。代码里的保持值既不是毫秒也不是设备时间戳——如果自制设备以不同频率送 CAN,所有计数保持和滤波动态都要重新标定。第二,灯泡法与拨杆法不等价:前者靠亮灯刷新计数、熄灯逐循环递减,方向快速切换时允许短暂双灯为真;后者靠拨杆上升沿设保持,看到反方向拨杆才清对侧计数。
速度:三个数不能混成一个数
车辆状态里同时存在三个速度量,用途完全不同:
| 量 | 怎么来 | 用途与限制 |
|---|---|---|
| 原始速度 | 四轮轮速算术平均,乘单位系数与轮速系数 | 四轮平均不是鲁棒估计,单轮故障或打滑会直接污染结果 |
| 滤波速度 | 一维状态滤波,同时输出速度与加速度 | 原始值与滤波位置差超过 2 m/s 时把加速度重置为零;这是代码策略,不等于该帧测量真实 |
| 仪表速度 | 先由滤波速度回填,之后应用迟滞并做低速置零 | 显示与控制的取数口径不同,不能互换 |
滤波的采样周期假设是 10 毫秒。自制设备若以其它频率送帧,滤波动态与计数保持会同时失真。
定速按键与档位:必须按车型核验
按键生效的判定是「松开沿」而不是「按下」:在非特定巡航模式下,定速加/减按钮的松开瞬间置一个单帧启用请求。但这条共同默认规则会被部分车厂整支覆写——所以「按下按钮」在 A 车生效、在 B 车可能完全无效。档位解析同理:空值或未知枚举会被统一映射为「未知」,而这个映射必须与驾驶许可条件保持一致,否则可能出现「档位未知但被认为可行驶」。
盲区信号:缺失不等于无障碍
盲区输入在三家车厂都受配置开关控制——没有对应配置时,字段连赋值都不会发生。这意味着布尔字段的默认值不能解释为「盲区已被验证为空」,它只是「这项没被检查」。盲区信号会进入变道意图门、车道偏离预警的冷却期判定,以及驾驶员介入判断,因此把「未配置」当成「无障碍」是会直接影响行为的误读。
自制信号适配插件该暴露什么
如果要接自己的传感器或车型,插件至少应逐项暴露:来源、单位、符号、采样/接收时间、年龄上限、缺失与故障状态。仲裁层再把它映射到既有的车辆状态语义。特别是盲区这类输入,缺失必须显式传播,不能静默塌缩成「无障碍」。车型安全策略、刹车与取消接管、硬件收发检查应留在受信任边界内。
可复用的交叉验证入口是项目自带的回放测试——它会比较部分车辆状态字段与硬件安全状态(原始车速、刹车、巡航、方向盘角度),但它不是每个信号的穷尽测试。
常见问题
「CAN 有效」能代表转向灯字段可信吗?
不能。有效位是解析器与总线级的汇总,按报文判定,不给每个字段单独的年龄与可信度。要判断具体字段,得看它所在报文的时间戳与超时状态。
为什么不同车型的转向灯逻辑不能共用一套阈值?
因为来源就不同:有的从灯泡推算、有的读拨杆、有的解枚举;保持计数分别是 50 次和 250 次,去抖机制也不同。共用阈值在某一车型上就是错的。
四轮平均速度可以直接当车速用吗?
不能直接当鲁棒车速。它是算术平均,不是异常值剔除估计,单轮打滑或故障会污染结果。这也是为什么后面还要接一层滤波与迟滞。
盲区提示没亮,能说明侧后方没车吗?
不能。没有对应车型配置时该字段根本不会被赋值,默认值表示「未检查」而不是「检查结果为空」。缺失必须单独传播。
延伸阅读
- CAN 报文解析的「健康位」在说什么 —— 有效位到底保证什么
- 车载信号为什么会说谎:TTL、源时间与新鲜度阈值 —— 字段级新鲜度怎么定义
- 赛道库 · 上海国际赛车场 —— 本站赛道数据样例
参考资料
- 项目 02 —— NAS
谭健强/openpilot-research/CAR_STATE_NORMALIZATION_DEEP_DIVE.md(车辆状态归一化,含源码行号索引) - 项目 02 ——
openpilot-research/CAN_PARSER_HEALTH_DEEP_DIVE.md(解析健康与失效累计) - 项目 02 ——
openpilot-research/ACTUATION_GATE_CHAIN_DEEP_DIVE.md(下游门控与失效矩阵)
说明:本文为对固定源码快照的静态分析,未运行回放测试、未连接实板、未按车型/年款核验具体信号含义与失效值。共同辅助函数不是所有车型的必经路径。
更新记录
首次发布 2026-10-11 最近核对:2026-10-11
发表回复