cd D:\orisys_ws\orisys-app

git add apps/studio/config/locales/zh_CN.json `
        apps/studio/config/locales/en_US.json `
        apps/studio/tests/test_locales.py `
        apps/studio/tools/ui_check.py `
        apps/studio/tests/test_ui_smoke.py `
        apps/studio/src/orisys_studio/app_window.py `
        apps/studio/src/orisys_studio/ui/cal_panel.py `
        apps/studio/src/orisys_studio/ui/playback_dialog.py `
        apps/studio/src/orisys_studio/ui/force_plots.py `
        apps/studio/docs/record-channel.md `
        shared/src/orisys_app_shared/force/calibration_recorder.py `
        shared/src/orisys_app_shared/record/__init__.py `
        shared/src/orisys_app_shared/record/playback.py `
        shared/src/orisys_app_shared/record/depth.py `
        shared/tests/test_record_channel.py `
        shared/tests/test_playback.py
This commit is contained in:
ykcheungab
2026-09-13 14:01:24 +08:00
parent 92da51217c
commit 9354d7be1a
14 changed files with 1689 additions and 35 deletions
+54 -5
View File
@@ -166,10 +166,59 @@ outputs/recordings/<UTC 时间戳>_session<NNNN>/
---
## 7. 尚未完成(第二阶段及以后)
## 7. 同步回放与深度重算
**决定:不保存深度。** 回放时按录像与配置**离线重算**。
理由是体积:30 Hz、320×240 的 float32 深度每帧约 300 KB,一小时就是 ~16 GB;
即使降频到 1 Hz 也要百兆级。所以 `session.json` 里明确写:
```json
"depth": {
"stored": false,
"replay": "recompute",
"quantity": "relative deformation / algorithm response, not a calibrated length",
"method": "re-run the SDK over raw_*.mp4 with this config_ref",
"config_sha256": "...",
"sdk_version": "..."
}
```
代价是重算要 SDK 能复现同样结果,因此 `RecordingReader.replay_warnings()` 会主动
比对**当前配置文件哈希**与录制时的哈希、以及 SDK 版本,回放窗口顶部把这些提示出来:
| 提示 | 含义 |
|---|---|
| `depth_recomputed` | 深度来自离线重算,不是当时保存的数据(始终提示) |
| `config_changed` | 配置文件已变,重算结果可能与当时不同 |
| `sdk_changed` | SDK 版本已变,重算结果可能不同 |
| `config_missing` | 缺少配置哈希,无法校验一致性 |
| `rows_skipped` | 有无法解析的 CSV 行被跳过 |
### 回放界面
`ui/playback_dialog.py`,入口在「文件 → 打开录制回放…/回放最近一次录制」。
- **一个游标驱动三处**:移动位置同时更新视频帧、深度面板与三张曲线的游标线;
并且通过 `cursor_moved` 信号同步到主界面的曲线面板。
- 单位可切换(raw/N),数据直接来自录制目录的 `forces.csv`。
- 帧未被写入视频时(记录队列曾溢出)明确提示,而不是显示上一帧冒充当前帧。
- **深度重算在守护线程上执行**,UI 线程立即返回。实测 `_on_recompute_depth` 返回耗时
0.001 s,而 SDK 调用仍在后台跑。
两个必须知晓的边界:
1. SDK 打开视频逐帧步进**可能长时间阻塞**,且无法取消。因此用守护线程:窗口能关、
进程能退,但那个线程会一直挂到进程结束。用线程池(非守护)会让**整个进程无法退出**,
这是实测踩到的。
2. 重算失败一律显示原因(SDK 不可用/未记录配置/配置路径不存在/无视频分段/
帧不在视频中),**绝不用其它图像顶替**。
---
## 8. 尚未完成(第三阶段及以后)
- CSV 的「导出选中时间段」(整段导出已随录制落盘;区间导出待做)。
- 全程曲线浏览(跟随/历史、框选缩放、降采样保峰值)。
- 标定诊断扩展:稳定后采样、异常点排除/恢复、拟合残差、独立验证点。当前
`CalibrationPoint` 已记录三轴均值/标准差/有效样本数、方向、轮次与实际采样时长。
- PyOpenGL 三维显示(`mesh3d_panel.py` 目前仍是占位符,不是已有实现)。
- CSV 的「导出选中时间段」(整段导出已随录制落盘;区间导出待做)。
- 标定的稳定后采样(当前按固定时长采样,稳定性以 σ 呈现)。