结论:横向执行延迟的在线估计,本质是「用一个 60 秒滑动窗、凑够 25 秒有效样本,再用 FFT 互相关找响应滞后」的过程。它默认在 dt=0.05 s 的离散点上搜索 0.15 秒到小于 0.65 秒的延迟,要求相关峰 ≥0.95、峰宽置信度 ≥0.7;只有攒够 5 个完整块、块间标准差 ≤0.1 秒,状态才标为已估计,否则回退车型初值。进度百分比只是「被接受的估计块数」的量度,不是传感器或控制器的安全认证。
采样窗与节拍:60 秒窗、25 秒门槛
采样用一个 60 秒滑动窗保存时间、目标横向加速度、实际横向加速度与「样本是否可用」的掩码。一个容易踩的细节是:窗口一创建就被零值预填满,队列长度从一开始就是满的,究竟有多少有效数据要看「有效样本计数」而不是队列长度。估计类初始延迟取车型转向执行延迟再加 0.2 秒,并以名义 4 Hz 的节拍对外发布。
估计用的两个量分别是目标横向加速度(目标曲率乘车速平方)与实际横向加速度(校准偏航率乘车速)。只有实际横向加速度有足够动态跨度(不小于 0.5 m/s²)且自上次估计后有新的有效点时,才允许提交新估计。
| 参数 | 取值 | 说明 |
|---|---|---|
| 滑动窗长度 | 60 秒 | 创建即被零值与无效掩码预填 |
| 有效样本门槛 | 25 秒 | 不足则即使执行拟合并算相关也不提交 |
| 动态跨度门槛 | ≥0.5 m/s² | 实际横向加速度跨度 |
| 分块粒度 | 每 100 次接受汇成 1 块,最多 50 块 | 区分「已完整块」与「含当前未满块的预览值」 |
采样资格:一组门的组合
每个样本要同时满足多项条件才被标记为可用:横向控制处于激活、驾驶员未介入方向盘、控制未饱和、车速高于 50 mph、偏航率绝对值达到默认门、外参已标定、位姿有效且偏航率与其标准差都小于 1、实际横向加速度不超过 2、目标与实际横向加速度之差不超过 0.6 m/s²。激活中断、驾驶员覆盖、饱和或姿态/加速度非法之后,还需要连续恢复至少 2 秒。
| 门 | 阈值 | 备注 |
|---|---|---|
| 车速 | >50 mph | 严格大于 |
| 偏航率及其标准差 | 两者均 <1 | 姿态有效才参与 |
| 实际横向加速度 | ≤2 | 超限不入窗 |
| 目标与实际之差 | ≤0.6 m/s² | — |
| 恢复时间 | 连续 ≥2 秒 | 覆盖、饱和、姿态非法后重新计时 |
有一个反直觉的边界:默认的偏航率绝对值门是 0,因此零偏航率也能通过这道门,静态直道并不会被它筛掉——真正限制静态样本的是拟合阶段对动态跨度的要求。
相关性拟合:互相关与「置信度」
拟合先用长度为 5、标准差为 1 的高斯权重对有效样本做掩码平滑(无有效邻域时输出无效值),再用 FFT 做带掩码的归一化互相关来搜索响应延迟,峰位置做抛物线插值。FFT 长度由一组只含 2、3、5、7、11 因子的「下一个合适尺寸」决定。这里的「置信度」来自高相关候选连续区间的宽度,不是统计置信区间,因此不能按统计意义解读。
还有两个数值层面的坑需要说明:其一,全常量信号在部分位移处会出现接近 1 的数值伪峰,所以不能只凭单个高相关值就认定存在有效动态证据(完整流程另有动态跨度门);其二,互相关实现可能原地修改调用方传入的浮点数组,这是实现细节层面的副作用,而非估计语义。
状态与回退:estimated 需要 5 个完整块
估计状态分三种:未估计、已估计、无效。只有至少 5 个完整块、块均值与标准差都不是无效值、且标准差不超过 0.1 秒,才会给出「已估计」;此时生效的延迟会被夹在 0.15 到 0.65 秒之间。未估计或块间离散度过大时,生效延迟回退为车型初值,但仍会把单独的估计值与标准差填进消息供观察。
| 状态 | 条件 | 生效延迟 |
|---|---|---|
| unestimated | 有效样本或完整块不足 | 车型初值(转向执行延迟 + 0.2 秒) |
| estimated | ≥5 个完整块、标准差 ≤0.1 秒 | 估计均值,夹到 [0.15, 0.65] 秒 |
| invalid | 块间离散度过大等异常 | 回退车型初值 |
下游消费与缓存恢复的坑
控制侧直接读取生效延迟并叠加一个平滑量传给横向控制器,在使用点没有显式检查这条消息的顶层有效位或内层状态;而另一个消费者在整体输入检查失败时则不处理输入。两者对同一条消息的消费门并不相同,因此插件化时不能只给一个泛化的 healthy 字段。
缓存恢复还有两个必须知道的边界:其一,恢复的是缓存里的「估计值」与「块数」,而不是生效延迟,恢复校验既不检查估计值是否有限、是否落在搜索区间内,也不要求状态为已估计;其二,块数字段是有符号整数且只检查上界,负数可以通过,从而在界面上产生负的进度百分比。此外,一个标为「未估计」但已携带 5 个块的缓存,在恢复后可能直接让下一次输出报告为「已估计」,即使本次启动并未接受任何新的估计——这是缓存状态与重新计算结果之间的差异,不等于真实延迟已被重新标定。
插件化边界
延迟估计器适合先作为影子主题与原有输出比对,保留输入时间域、掩码、相关度与置信度、块数、状态、回退初值与缓存版本。权威源必须只有一个;异常或过期数据应有独立的消费门与保守回退,且插件不得改变安全策略。上述结论均来自固定源码快照的静态与合成数值分析,合成测试不能证明真实的时序对齐、乱序多主题消息或实车延迟稳定性。
常见问题
相关度达到 0.95 就算估计成功了吗?
不是。0.95 只是相关峰的门槛,还要峰宽置信度 ≥0.7、样本门通过,并攒够 5 个完整块且块间标准差 ≤0.1 秒,状态才会标为已估计;任一条件不满足都不会提交新估计。
为什么估计进度到 100% 也不能当安全认证?
因为进度百分比是「被接受的估计块数」的量度,反映的是估计成熟度,与传感器健康、控制器安全性没有直接关系。估计值随时可能因离散度过大而回退车型初值。
从缓存恢复的延迟一定是本次重新标定的吗?
不一定。恢复的是缓存里的估计值与块数,校验既不要求状态为已估计,也不检查数值是否落在搜索区间;一个标为未估计但已带 5 个块的缓存,甚至可能让下一次输出直接报告为已估计。
车辆一直直线行驶,能估出延迟吗?
不能单靠直道。默认偏航率门虽然允许零偏航率通过,但拟合阶段另要求实际横向加速度有足够动态跨度(不小于 0.5 m/s²),因此持续静态行驶无法形成有效估计。
延伸阅读
- 8 个扭矩桶、4000 点门槛:横向扭矩响应的在线估计 —— 同一族横向学习里对扭矩响应的估计,与延迟估计互补。
- 横向限值的插件契约:估计值怎么进入横向控制 —— 承接本文「估计值被控制侧直接消费」的边界。
- OBD 零百计时的链路标定:轮询周期、往返延迟与丢包率怎么测 —— 同样是「延迟怎么测、测到什么」的链路视角。
- 车载信号为什么会说谎:TTL、源时间与 500 ms 新鲜度阈值 —— 输入新鲜度决定了延迟估计是否有意义。
参考资料
- 项目 02 ——
openpilot-research/LAGD_LATERAL_DELAY_ESTIMATION_DEEP_DIVE.md(采样窗与门、FFT 互相关与置信度、状态与回退、下游消费与缓存恢复)
说明:本文为对固定源码快照的静态结构分析,未运行完整测试套件、未连接硬件、未验证目标车型的真实参数组合。文中所有阈值、窗口与配置均出自源文档,标注为未验证的结论保留其原有边界;合成数值验证不代表实车时序结果。
更新记录
首次发布 2026-10-11 最近核对:2026-10-11
发表回复