滤波说明落到文档与 examples:三级位置/性质、四个预设、可追溯性清单 - What: 新增 docs/filters.md(json.load 不支持注释,故建议以"代码预设 + 文档 + 可复制配置"承载:三级滤波的作用位置与性质对照——flow_ema_alpha 在 compute_flow/HHD 之前、改变测量故两次录制不可比,中值与低通是读数滤波;取值规则:每级按值开关、非法值一律关、filters.enabled 仅作废弃别名、显式键优先于预设;FILTER_PRESETS 四个档位的延迟与用途表;configure()/filters_state() 用法;force_triplets() 两个 buffer 的语义与尖峰实测 10/999;可追溯性五条清单)与 examples/filters/README.md(off/low_latency/balanced/low_noise 四段可直接整块替换的 filters 配置、preset 等价写法、"从预设出发只改一个键"的写法、复制后用 filters_state() 核对生效值的片段)。 - Why: 用户提出"在 json 里加 comment 说明建议的滤波,或在 examples 里写",查证 configs.py 使用 json.load 且环境无 json5/commentjson,加注释会导致加载失败;因此把建议做成可执行预设并在文档与 examples 中给出可复制版本。 - Verification: 文档中的四个预设与 FILTER_PRESETS 逐值一致;示例片段与 sensors/*/sensor.json 的 filters 段结构一致;filters_state()/force_triplets() 的行为已用 external-frame 模式实测(预设解析结果与尖峰 10/999 对照)。 - Not in this change: 未生成四个独立的 sensor_<preset>.json 整机配置文件(README 里给的是整块 filters 段);calibration.py 指纹尚未改读 filters_state();venv 内 SDK 未升级;app 侧 wrapper/齿轮与 CSV 17 列未动。
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
# 滤波预设:可直接复制的 `filters` 段
|
||||
|
||||
`json.load` 不支持注释,所以这个目录就是"在配置里写说明"的替代品:**把下面任意一段整块替换**
|
||||
到 `sensors/<name>/sensor.json` 的 `"filters"` 段即可。原有的 `filters` 段请整段替换,
|
||||
不要只改其中一行(避免出现 `preset` 与数值混写的歧义——显式键优先于预设值,混写容易看错)。
|
||||
|
||||
背景、代价与可追溯性约定见 `docs/filters.md`;延迟/噪声实测见 `_perf/` 与
|
||||
`orisys-sdk-perf-plan.md`。
|
||||
|
||||
---
|
||||
|
||||
## `off` —— 原始读数(默认)
|
||||
|
||||
```json
|
||||
"filters": {
|
||||
"flow_ema_alpha": 1.0,
|
||||
"force_median_window": 1,
|
||||
"force_lowpass_cutoff_hz": 0.0,
|
||||
"force_lowpass_order": 2,
|
||||
"force_lowpass_sample_rate_hz": "auto"
|
||||
}
|
||||
```
|
||||
|
||||
## `low_latency` —— 只去尖峰(≈1 帧 @30fps)
|
||||
|
||||
```json
|
||||
"filters": {
|
||||
"flow_ema_alpha": 1.0,
|
||||
"force_median_window": 3,
|
||||
"force_lowpass_cutoff_hz": 0.0,
|
||||
"force_lowpass_order": 2,
|
||||
"force_lowpass_sample_rate_hz": "auto"
|
||||
}
|
||||
```
|
||||
|
||||
## `balanced` —— 建议默认(≈2 帧 @30fps)
|
||||
|
||||
```json
|
||||
"filters": {
|
||||
"flow_ema_alpha": 0.5,
|
||||
"force_median_window": 3,
|
||||
"force_lowpass_cutoff_hz": 0.0,
|
||||
"force_lowpass_order": 2,
|
||||
"force_lowpass_sample_rate_hz": "auto"
|
||||
}
|
||||
```
|
||||
|
||||
## `low_noise` —— 底噪优先(≈3 帧 @30fps)
|
||||
|
||||
```json
|
||||
"filters": {
|
||||
"flow_ema_alpha": 0.3,
|
||||
"force_median_window": 3,
|
||||
"force_lowpass_cutoff_hz": 10.0,
|
||||
"force_lowpass_order": 2,
|
||||
"force_lowpass_sample_rate_hz": "auto"
|
||||
}
|
||||
```
|
||||
|
||||
## 用预设名(等价写法,数值由代码展开)
|
||||
|
||||
```json
|
||||
"filters": { "preset": "balanced" }
|
||||
```
|
||||
|
||||
`off / low_latency / balanced / low_noise` 四个名字来自
|
||||
`src/orisys/sensor.py::FILTER_PRESETS`(单一真值);想从预设出发只改一个旋钮,就在同一段里写
|
||||
那一个键,例如:
|
||||
|
||||
```json
|
||||
"filters": { "preset": "balanced", "force_lowpass_cutoff_hz": 10.0 }
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 复制后请核对"实际生效值"
|
||||
|
||||
配置只是**意图**;`Sensor.configure()` 可以在运行时再改,所以审计与记录一律看生效值:
|
||||
|
||||
```python
|
||||
from orisys.sensor import Sensor
|
||||
s = Sensor("external", config_name="mini", verbose=False) # 无需硬件即可核对
|
||||
print(s.filters_state()["preset"], s.filters_state()["measurement"], s.filters_state()["readout"])
|
||||
```
|
||||
|
||||
`flow_ema_applied` / `force_median_applied` / `force_lowpass_applied` 三个布尔就是
|
||||
"这一级到底有没有在滤"的答案;`flow_ema_alpha` 属于 **measurement**(改变测量,
|
||||
不同值的两次录制不可比),中值与低通属于 **readout**(只影响读数呈现)。
|
||||
Reference in New Issue
Block a user