fix(V4B): 负variation铁块锁死修复 — 基线跟踪双向对称保护 (V4.20)
现场: 特殊铁块(磁导率主导)靠近 → variation负 → Origin被污染 → 离开时假进入 → 锁死不释放
根因: 基线跟踪单边保护(只挡dev>+4×dlt), 负偏差(CAPVD>Origin)照常更新Origin
FREEZE_TIMEOUT=10s后直接跳污染值更彻底
修复:
1. 偏差窗口对称 [-4×dlt, +4×dlt] — 负偏差也冻结基线
2. 负偏差只冻结、永不超时更新Origin(铁块停留多久不污染)
3. 正偏差保留FREEZE_TIMEOUT兜底(车辆长时间信号不丢)
4. 新增 EVT|neg_var_freeze 事件打印
单测: tests/test_neg_variation.c 6项全过(决策/超时/场景仿真)
文档: devlog V2.19
This commit is contained in:
@@ -4,6 +4,42 @@
|
||||
|
||||
---
|
||||
|
||||
## 2026-09-01 — 负variation铁块场景修复:基线跟踪双向对称保护(固件 V4.20)
|
||||
|
||||
> **固件版本:V4.20**。devlog 修订 V2.19。
|
||||
|
||||
### 现场现象(用户)
|
||||
|
||||
特殊形状铁块(磁导率主导)靠近线圈 → variation 为**负**(频率下降,CAPVD 高于 Origin):
|
||||
- 靠近过程无输出(正常——检测只认正 variation,物理限制)
|
||||
- 铁块慢慢离开时:有时一直无输出,有时**一旦输出就释放不了**(锁定)
|
||||
|
||||
### 根因(TaskLoop.c 基线跟踪单边保护)
|
||||
|
||||
```c
|
||||
// 修复前: 只挡 dev > +4×dlt —— 负variation(CAPVD>Origin) 时基线照常更新
|
||||
if (dev < (int32_t)(loop1_dlt_ORG * 4)) {
|
||||
update_moving_average(..., &loop1_Origin, loop1_CAPVD, ...); // Origin 被污染
|
||||
}
|
||||
```
|
||||
|
||||
污染链:铁块靠近 → CAPVD 升 Origin+500 → 基线跟踪"无车"照常更新(或 FREEZE_TIMEOUT=10s 后直接跳污染值)→ Origin 抬高 → 铁块离开 CAPVD 回落 → 跨过**抬高的进入线** → 假进入 → Origin 冻结(有车)→ 释放线 = 污染 Origin - dlt(高)→ CAPVD 永远够不到 → **锁死不释放**。
|
||||
|
||||
### 修复(双向对称保护)
|
||||
|
||||
1. **偏差窗口对称**:`-4×dlt ≤ dev ≤ +4×dlt` 才正常跟踪(负偏差也冻结)
|
||||
2. **负偏差(dev>0, CAPVD>Origin)只冻结、永不超时更新 Origin**——铁块停留多久都不污染
|
||||
3. **正偏差(dev<0, 疑似车)保留原 FREEZE_TIMEOUT 兜底**(车辆长时间信号不丢)
|
||||
4. 权衡:长时间负温漂基线不跟随(安全方向,正车检测仍正常)
|
||||
5. 新增 `EVT|neg_var_freeze` 事件打印:负偏差首中时输出 CAPVD/Origin/dev/dlt/频率
|
||||
|
||||
### 验证
|
||||
|
||||
- `tests/test_neg_variation.c` 回归单测 6 项全过:决策方向 / 负偏差超时不污染 / 正偏差兜底保留 / 完整场景仿真(铁块靠近→停留→离开:无假进入、无锁定)✓
|
||||
- 现有单测(方案A/B)不受影响
|
||||
|
||||
---
|
||||
|
||||
## 2026-09-01 — Debug 串口打印重组:频率/采样/基准全量输出(固件 V4.20)
|
||||
|
||||
> **固件版本:V4.20**。devlog 修订 V2.18。
|
||||
|
||||
Reference in New Issue
Block a user