结论:车辆参数在线学习是一台九维卡尔曼滤波器,但九个状态里只有横向速度与偏航率两个有显式微分方程,其余七个在状态转移中保持不变。学习被三道门约束:车速 >1 m/s、转向角绝对值 <45°、且非倒挡;此外偏航率与路面滚转观测只在「位姿有效」时才写入。它的输出是在线估计值,不是车辆认证参数,也不能替代独立的执行器安全限制。
九维状态与两条微分方程
滤波器状态依次为:轮胎刚度因子、转向比、慢零偏、快零偏、二维车速(纵向/横向)、偏航率、转向角与路面滚转。动力学按线性化单轨横向模型生成:每步用一阶欧拉积分 x_next = x + dt·x_dot 推进,而代码只给横向速度与偏航率指定了导数,其余七个状态只是保持原值。
| 状态 | 含义 | 是否有显式微分方程 |
|---|---|---|
STIFFNESS |
轮胎侧偏刚度因子 | 否 |
STEER_RATIO |
转向比 | 否(出现在动力学分母) |
慢 / 快 ANGLE_OFFSET |
转向零偏(慢、快两档) | 否(慢零偏无直接观测方程) |
VELOCITY(二维) |
纵向 / 横向车速 | 仅横向速度有方程 |
YAW_RATE |
偏航率 | 是 |
STEER_ANGLE |
转向角 | 否 |
ROAD_ROLL |
路面滚转 | 否 |
横向速度与偏航率的导数中,纵向速度与转向比都出现在分母;而学习门只在外部输入层面检查车速与转角,并未对滤波内部状态每次预测时的分母做形式化保证。实现也没有把车身侧倾、路面超高、轮胎非线性或高阶积分显式放进这套方程,因此不能把它外推为全工况动力学模型。
什么条件下才允许学习
只有在车辆运动且转向不极端时才启用学习:车速大于 1 m/s、转向角绝对值小于 45°、且不在倒挡。偏航率观测要求角速度有效、标准差在 0 到 10 rad/s 之间、偏航率绝对值小于 1 rad/s,否则以 0 和 10 度标准差替代;滚转观测要求标准差小于 1.5°、数值严格落在 ±10° 内且传感器状态正常,否则同样回退,并在进入滤波器前受单步限速。若「位姿有效」为假,则偏航率与滚转观测不写入,但快零偏以及刚度/转向比的弱约束观测仍会继续。
| 输入 | 启用条件 | 不满足时 |
|---|---|---|
| 车况(学习使能) | vEgo > 1 m/s、|转向角| < 45°、非倒挡 |
暂停学习,设置滤波时间 |
| 偏航率观测 | 角速度有效、0 < std < 10 rad/s、|yaw| < 1 rad/s |
以 0 与 10° 标准差替代 |
| 滚转观测 | 标准差 < 1.5°、数值严格在 ±10° 内、传感器正常 | 以 0 与 10° 标准差替代 |
| 位姿门 | 位姿有效为真 | 不写偏航率/滚转观测,弱约束仍执行 |
观测码与噪声:默认表不等于实际传入
滤波器为每个观测码准备了默认噪声,但调用方可以显式覆盖。例如偏航率与横向速度的默认项本身「未定义」,由运行时代码显式传入方差;滚转的默认项也会被显式覆盖。这意味着「默认表」只是兜底,实际噪声要按调用点判断。
| 观测码 | 直接观测的状态 | 默认噪声项 |
|---|---|---|
ROAD_FRAME_YAW_RATE |
偏航率 | 未定义,由调用方显式传方差 |
ROAD_FRAME_X_SPEED |
纵向车速 | 0.1² |
STEER_ANGLE |
转向角 | rad(0.05)² |
ANGLE_OFFSET_FAST |
快零偏 | rad(10)² |
STEER_RATIO |
转向比 | 5² |
STIFFNESS |
刚度因子 | 0.5² |
ROAD_ROLL |
路面滚转 | rad(1)²(调用时显式覆盖) |
有效位分层:一个「healthy」不够用
这套输出的有效位是分层的,不能折叠成一个布尔值:顶层「消息有效」直接采用输入的通信检查结果;内层「参数有效」是慢/总零偏、滚转范围与标准差、刚度及转向比范围的合取;「传感器有效」只在活动且车速大于 10 m/s 时检查车速与偏航率差的量级是否小于 4 m/s²,且不进入内层有效的合取;「位姿有效」在本快照恒为真,因此不能当作上游位姿状态的透传。输出值还对角度与滚转各做每帧 1° 的限速。
下游消费同样要注意边界:控制侧直接读取刚度、转向比、零偏与滚转,其中前两者仅以「与 0.1 取较大值」设下限后更新车辆模型,并没有用内层有效位包住这次更新。安全效果依赖上层状态机、通信故障处理与独立网关的组合,不能把某一个有效位当成单点安全证明。
持久化与插件边界
正常运行会周期性写入持久缓存,并另有一个由车型流程写入的「上一行程车型参数」键用于车型核对。恢复时要求两个键都存在,且只明确校验车型指纹相同、历史转向比落在相对范围内;缺任一键就回退默认值且不清除另一个键,车型不符或越界时只删除估计缓存键、保留车型键。写缓存的节拍按帧号取模,「约一分钟」取决于循环节拍,不是墙上计时保证。插件化时,估计器可作为单写者、版本化、可回放的候选,但应先做影子输出比对,不直接抢占正式主题;输入契约须固定时间戳、坐标系、角度单位、车型参数版本与噪声标准差,输出契约要保留顶层通信有效位、内层参数有效位、分项有效位与数据年龄。
常见问题
在线估计出的车辆参数能当认证参数用吗?
不能。它是在线估计值,依赖行驶激励与观测门;低速、倒挡或转向极端时学习会暂停,慢零偏甚至没有直接观测方程。它不能替代车辆认证参数,也不能替代独立的执行器安全限制。
停车时滤波器还在更新吗?
不会照常更新。车况门要求车速大于 1 m/s 且转角绝对值小于 45° 才启用学习,停车后不再产生新的学习观测,并会停止协方差的时间增长与回绕。
为什么同一个参数会有好几个「有效位」?
因为它们语义不同:顶层有效位来自输入通信检查,内层有效位是参数范围与不确定度的合取,传感器有效位只做横向一致性检查且不参与内层合取,位姿有效位在本快照恒为真。折叠成一个 healthy 会丢掉这些区别。
倒车时会参与参数学习吗?
不会。学习门明确排除倒挡:只有车速大于 1 m/s、转向角绝对值小于 45° 且非倒挡时才启用学习。
延伸阅读
- 标定状态的持久化:重启之后哪些结果还在 —— 同样是「缓存恢复 + 车型绑定」的状态持久化问题。
- 同一个「转向灯」在三家车厂是三种实现:车辆状态归一化的坑 —— 说明输入信号语义差异如何影响参数估计。
- 车载信号为什么会说谎:TTL、源时间与 500 ms 新鲜度阈值 —— 输入新鲜度与源时间是估计可靠性的前提。
- 车型参数契约:哪些常量是估计的输入边界 —— 承接本文对车型动力学常量的依赖。
参考资料
- 项目 02 ——
openpilot-research/PARAMSD_VEHICLE_LEARNING_DEEP_DIVE.md(九维 EKF 方程、观测码与噪声、学习门、有效位分层、持久化与插件边界)
说明:本文为对固定源码快照的静态结构分析,未运行完整测试套件、未连接硬件、未验证目标车型的真实参数组合。文中所有状态维度、阈值与配置均出自源文档,标注为未验证的结论保留其原有边界;参数均为在线估计值,不代表任何车型的认证参数。
更新记录
首次发布 2026-10-11 最近核对:2026-10-11
发表回复