重构 Autocal 采集页:单一队列与控制器驱动的主按钮
选点、对准、加载与录像分散在两个面板,状态靠隐藏相位判断。现改由不依赖 Qt 的采集控制器驱动,并加入录像选项、汇总平铺副本、保持到时自动结束、会话结束回到空闲,以及无设备时的模拟采集。已运行 Autocal 非 Qt 测试并通过范围内门禁;界面测试待 Windows 复核,未做实机验收。
This commit is contained in:
@@ -15,7 +15,7 @@
|
||||
| 映射身份 | 保存原点、栅格尺寸和 `mapping_sha256`;哈希覆盖实际位置查找表及有效掩膜 |
|
||||
| 层级 | `session → site → trial → step → samples`;同点重复及中止重试均创建新 trial |
|
||||
|
||||
[LF606 规格书](references/lf606-d40-h18-4x-spec.pdf)量程表包含 50 N/2 N·m 档位,但图签为 200 N/8 N·m;实机以铭牌及标定证书核对。设备准备、运动边界和停机沿用 [workflow.md](workflow.md)。本页不会自动移动平台。
|
||||
[LF606 规格书](references/lf606-d40-h18-4x-spec.pdf)量程表包含 50 N/2 N·m 档位,但图签为 200 N/8 N·m;实机以铭牌及标定证书核对。设备准备、运动边界和停机沿用 [workflow.md](workflow.md);本页不自动移动平台。
|
||||
|
||||
## 操作员逐步流程
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
| 1. 准备 | 填型号、SN、保存位置,载入 finger 导出包和配置 | 首次开始试验时建立本场 session;型号、SN、配置和映射在本场固定 |
|
||||
| 2. 预览 | 选视频或相机编号,启动输入并检查二维 UV 图像 | 两种来源共用 finger worker;输入预览可贯穿多个 trial |
|
||||
| 3. 选点 | 点击 UV 粗选,再修改 U/V 到精确像素 | 显示传感器三维位置;拒绝掩膜外点 |
|
||||
| 4. 设循环 | 输入严格递增的正载荷档位及每档 10–30 s 保持 | 展示完整路径;如 `0 → 5 → 10 → 20 → 30 → 20 → 10 → 5 → 0 N` |
|
||||
| 4. 设循环 | 输入严格递增的正载荷档位及每档 10–30 s 保持 | 展示完整加载与卸载路径,顺序即记录顺序 |
|
||||
| 5. 开始 | 无载时点击“开始本次试验” | 新建 trial 并连续录像;先提示初始零载 |
|
||||
| 6. 保持 | 到目标后输入实际参考力,点击“已到目标力,开始保持” | 当前目标不变,倒计时期间禁止再次确认或完成试验 |
|
||||
| 7. 换档 | 倒计时结束后按提示手动调整至下一档 | 自动结束本档窗口;换档继续录像,但不沿用上一档恒定参考力 |
|
||||
@@ -36,19 +36,19 @@
|
||||
|
||||
倒计时只结束档位窗口,完成或提前结束才停录像。到时不等于稳定;`stability_verified=0`,仍须复核。初始和最终零载保持时间相同,后续按恢复实测调整。
|
||||
|
||||
## 模拟页与操作表
|
||||
## 操作表导出
|
||||
|
||||
模拟页和标定页共用 UV 映射。选点、排序后“导出测点操作表…”得到 UTF-8 CSV;操作员按 U/V 手动复现,不自动执行序列。三维位置与原像素不一致时拒绝导出,须重新选点。
|
||||
模拟页和采集页共用 UV 映射。在采集页队列点“导出测点操作表…”得到 UTF-8 CSV;操作员按 U/V 手动复现,不自动执行。缺 UV、缺已记录姿态,或三维位置与原像素不一致时拒绝导出,须重新选点。
|
||||
|
||||
| 操作表字段 | 含义 |
|
||||
|---|---|
|
||||
| `order`、`site_id` | 表内顺序及测点编号;采集会话按首次实测顺序另行分配 site_id,以 U/V 和映射身份核对 |
|
||||
| `order`、`site_id` | 表内顺序及测点编号;会话另行分配 site_id,以 U/V 与映射身份核对 |
|
||||
| `u_px`、`v_px` | 与标定页相同原点、方向和单位 |
|
||||
| `x_sensor_mm`/`y_sensor_mm`/`z_sensor_mm` | 传感器三维位置 |
|
||||
| `x_platform_mm`/`y_platform_mm`/`z_platform_mm`、`yaw_deg`、`pitch_deg` | 当前模拟安装设置下的平台目标及角度 |
|
||||
| `origin_raster_x_px`/`origin_raster_y_px`、栅格宽高、轴方向、`mapping_sha256` | 像素坐标复现所需的映射身份 |
|
||||
| `x_platform_mm`/`y_platform_mm`/`z_platform_mm`、`yaw_deg`、`pitch_deg` | 该点已记录姿态给出的平台目标及角度 |
|
||||
| `origin_raster_x_px`/`origin_raster_y_px`、`raster_width_px`/`raster_height_px`、`u_positive`/`v_positive`、`mapping_sha256` | 像素坐标复现所需的映射身份 |
|
||||
|
||||
序列页的 [`.oryseq`](sequence-format.md)仍为平台毫米坐标的几何/运动计划;它与模拟页操作表分别导出,不代表已接通载荷执行。
|
||||
列定义只有 `ui/site_export.py` 一处。序列页的 [`.oryseq`](sequence-format.md)仍为平台毫米坐标的几何/运动计划;它与操作表分别导出,不代表已接通载荷执行。
|
||||
|
||||
## 目录与文件
|
||||
|
||||
@@ -73,7 +73,7 @@ finger_F001_<时间>_<标识>/
|
||||
|
||||
| 文件 | 内容及写入时机 |
|
||||
|---|---|
|
||||
| 根 `session.json` | `format_version=autocal-session-1.0`、session_id、型号/SN、配置快照及哈希、UV 定义和 uv_outline、sites、trials、状态;开始、保持结束、trial 结束和整场关闭时更新 |
|
||||
| 根 `session.json` | `format_version=autocal-session-1.0`、session_id、型号/SN、配置快照及哈希、UV 定义和 uv_outline、sites、trials、状态、`recording` 块(`video`/`codec`/`lossless_frames`,建立时写一次,旧会话缺块按 `video=true` 读);开始、保持结束、trial 结束和关闭时更新 |
|
||||
| trial `session.json` | 共享录像元数据;另有 `calibration_session_id`、`trial_id`、`site_id`、`repeat_index`、site、plan、来源、配置、`trial_status`、`trial_reason`、`capture_status`、`capture_reason`、`capture_report`、steps;采集 session_id 是独立的整数编号 |
|
||||
| `raw_0001.mp4` | 保存每个已交付图像帧;容器帧率仅供播放,实际时序用 frames.csv;不等于来源视频 |
|
||||
| `frames.csv` | 帧身份、电脑采集时间、视频位置及丢帧状态;每帧写入 |
|
||||
@@ -82,7 +82,7 @@ finger_F001_<时间>_<标识>/
|
||||
| `derived/review_<时间>_<标识>/review.json` | 另存初步分析,包含窗口均值、标准差、拟合和质量说明;不覆盖采集数据 |
|
||||
| 同目录 `overview.json` | 总览版本、session_id、计划 CSV 内容及来源哈希、测点覆盖和拟合摘要;载入时按原始数据及复核窗口重算 |
|
||||
| `derived/summary_*/`、`summary-latest.json` | 汇总四件文件与最后成功发布的指针;字段见[多点格式](multipoint-data-format.zh.md) |
|
||||
| `derived/review_<时间>_<标识>/baseline_<trial>.png` | 已确认初始零载窗口的第一张有效录像帧;作为检查基准,不是跟踪器内部参考状态;无视频时在分析结果中标记 unavailable |
|
||||
| `derived/review_<时间>_<标识>/baseline_<trial>.png` | 已确认初始零载窗口的第一张有效录像帧;作为检查基准,非内部参考状态;无视频时在分析结果中标记 unavailable |
|
||||
| `events.csv` | `trial_started`、`step_reached`、`hold_started`、`hold_ended`、`trial_finished`/`trial_aborted`;保存电脑事件时间及 step 信息 |
|
||||
|
||||
| 参数/字段 | 定义 |
|
||||
@@ -138,7 +138,7 @@ finger_F001_<时间>_<标识>/
|
||||
|
||||
采集页显示 FN/FX/FY raw 及最近 60 秒曲线,已标定轴另显示 N;无效帧断开,停止或超过 1 秒无新帧时提示。人工参考力不是实时 FT。
|
||||
|
||||
实时 UV 图可切换真实背景、位移箭头与深度;深度按当前帧有效范围自适应,单位不是毫米;跨帧同色不代表同值,缺失或过期字段不绘制。显示不改变录像及坐标。
|
||||
实时 UV 图可切换真实背景、位移箭头与深度;深度按当前帧有效范围自适应,单位不是毫米;跨帧同色不代表同值,缺失或过期字段不绘制。
|
||||
|
||||
检查保持段曲线、样本数、标准差和漂移;起止以保持开始为零,只能在原段内调整。勾选“已检查稳定”后重算并保存。至少两个不同载荷的已确认零载/加载窗口才有确认拟合;确认稳定不代表精度合格。
|
||||
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
# Autocal 标定采集页重构实施计划
|
||||
|
||||
状态:2026-10-18 计划,未实施。目标是把“选点 → 对准 → 逐档加载 → 记录”收成一条流程:一个测点队列、一个不依赖 Qt 的状态控制器、一个随步骤变化的主按钮;同时加入录像选项、打开文件夹和平铺汇总。执行分工见[任务分工](capture-workflow-tasks.zh.md)。本计划不改变运动安全规则、不自动加载、不写回 SDK 系数。
|
||||
状态:2026-10-18 计划,P0–P6 已实施并通过独立验收复核。**仅软件验证**:V10 实机验收未执行,需用户指定设备、运动与载荷范围及停机条件;各项检查的实际口径见文末[实施结果](#实施结果2026-10-18)。目标是把“选点 → 对准 → 逐档加载 → 记录”收成一条流程:一个测点队列、一个不依赖 Qt 的状态控制器、一个随步骤变化的主按钮;同时加入录像选项、打开文件夹和平铺汇总。执行分工见[任务分工](capture-workflow-tasks.zh.md)。本计划不改变运动安全规则、不自动加载、不写回 SDK 系数。
|
||||
|
||||
## 基线与问题
|
||||
|
||||
调查基线:app `main`、HEAD `7607653`;工作树已有 `motion/service.py`、`record_diagnostics.py` 改动,实施时不得覆盖。结论来自源码、界面截图和 `D:/orisys_ws/data/dd02-gl`,未运行程序或硬件。
|
||||
调查基线:app `main`、HEAD `7607653`(实施时实际 HEAD 为 `7b5ffa7`,以 `.scratch/autocal-capture-workflow/baseline.md` 为准);工作树已有 `motion/service.py`、`record_diagnostics.py` 改动,实施时不得覆盖。结论来自源码、界面截图和 `D:/orisys_ws/data/dd02-gl`,未运行程序或硬件。
|
||||
|
||||
| 位置(相对 `apps/autocal/src/orisys_autocal/`) | 问题 |
|
||||
|---|---|
|
||||
@@ -116,3 +116,30 @@
|
||||
| V10 | 实机验收 | 全部完成后 | 需指定设备、运动与载荷范围、停机条件;代理不执行 |
|
||||
|
||||
V1–V9 是软件证据,不代表实机可用;V10 未执行前状态只能写“仅软件验证”。
|
||||
|
||||
## 实施结果(2026-10-18)
|
||||
|
||||
证据都在 `D:\orisys_ws\orisys-app\.scratch\autocal-capture-workflow\`:
|
||||
|
||||
| 阶段 | 结果 | 证据 |
|
||||
|---|---|---|
|
||||
| P0 | 基线 572 项测试通过;`panel_check` 2/260 既有失败 | `baseline.md` |
|
||||
| P1、P2 | 打开文件夹、会话根 `summary/` 副本、录像选项与 `recording` 块 | `a/handoff-patches.zh.md`、`a/logs/` |
|
||||
| P2b | 逐帧口径三轴均超 5% 门槛;保持窗口口径 FN、FX 基本在门槛内、FY 不在;本机 `cv2` 写不了 H.264 | `d/p2b-codec-equivalence.zh.md` |
|
||||
| P3 | 控制器:队列、六项 Ready、单一主动作带原因、重测/跳过/停止 | `b/notes.md` |
|
||||
| P4 | 新采集页只经控制器渲染,`ui/` 中 `campaign.phase` 零命中 | `c/verification.md`、`c/screens/` |
|
||||
| P5 | 「几何与安装」页去掉测点表,操作表迁到队列;`panel_check` 由 2/260 失败变为 260 全过 | `c/verification-p5.md` |
|
||||
| P6 | 三份格式/契约文档、`workflow.md`、README | 本目录各文档 |
|
||||
| 验收 | 无阻断;2 项重要 + 1 项次要,修复后复核全部 PASS | `v/acceptance-report.zh.md` |
|
||||
|
||||
当前 `pytest apps/autocal/tests` 668 项全过,`panel_check.py` 260 项全过,被改文档的 `doc_lint` 为 clean。
|
||||
|
||||
各检查的实际口径:V2、V4、V5、V7 通过;V3 只在本任务范围内 clean,全仓门禁另有并行外部会话引入的 findings;
|
||||
V6 不适用(未改 `shared/`);V8 截图已备、待人工确认;V9 报告已交,是否切换默认编码待用户按 D2 决定。
|
||||
|
||||
## 验收后修正(2026-10-18,审查 F1、F3、F5)
|
||||
|
||||
- 会话结束(完成或停止)后,主按钮“结束会话”把页面带回空闲:队列可编辑、可开始新会话,已记录的文件不变。
|
||||
- 保持时间到点由控制器 `poll()` 自动结束,参考窗口为计划时长(`t_end - t_start = 保持秒数`),与点击或计时器迟到多久无关。
|
||||
- 勾选“模拟”后不需要平台、总线、相机、标定包,也不需要先对准;没有标定包时,U、V 直接作为点的 X、Y,位姿标为 `simulated`。有平台时仍须先对准。
|
||||
- 仅软件验证:控制器与 Campaign 的新增测试已运行;界面测试(含新增的离线模拟用例)在本机因缺 libEGL 未能运行,须在 Windows 上补跑。
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# 标定采集页重构:DeepSeek 代理执行清单
|
||||
|
||||
状态:2026-10-18 计划,未实施。阶段定义、入口与出口条件、统一验证见[主计划](capture-workflow-plan.zh.md);本页只规定由谁执行、按什么顺序执行、交付什么。复选框记录实际完成情况。
|
||||
状态:2026-10-18 计划,W0–W4 已完成(P0–P6 全部实施)。**仅软件验证**:独立验收无阻断,2 项重要 + 1 项次要已修复并复核通过;V10 实机验收未执行。阶段定义、入口与出口条件、统一验证见[主计划](capture-workflow-plan.zh.md);本页只规定由谁执行、按什么顺序执行、交付什么。复选框记录实际完成情况。
|
||||
|
||||
## 主代理指令
|
||||
|
||||
@@ -45,36 +45,36 @@ W4 V: 独立验收 → 主代理修复 → V 复核修复项
|
||||
|
||||
### W0 主代理
|
||||
|
||||
- [ ] P0 基线:记录 HEAD、工作树状态和基线测试结果到 `scratch/baseline.md`。
|
||||
- [ ] 冻结接口,写入 `scratch/interfaces.md`:`readiness()`、`primary_action()`、`perform()`、`secondary_actions()`、`poll()` 的签名、返回结构和动作键清单;`RecordingOptions` 的字段与 `session.json` 中 `recording` 块的结构。
|
||||
- [x] P0 基线:记录 HEAD、工作树状态和基线测试结果到 `scratch/baseline.md`。
|
||||
- [x] 冻结接口,写入 `scratch/interfaces.md`:`readiness()`、`primary_action()`、`perform()`、`secondary_actions()`、`poll()` 的签名、返回结构和动作键清单;`RecordingOptions` 的字段与 `session.json` 中 `recording` 块的结构。(实施中按缺口三次修订:1.4.1 对准阶梯、1.8/1.10 队列字段与编辑、1.11 补口。)
|
||||
|
||||
### A 数据与文件
|
||||
|
||||
交接提示:你负责让用户能找到数据、能控制视频体积。不得改变原始目录结构、不得删除或移动已有录像;summary 副本只是方便查看,指针仍是唯一权威。
|
||||
|
||||
- [ ] P1:`reveal` 提取与三个按钮(按钮的布局由 C 在 P4 完成;A 在 P1 先接到现有会话行),`summary/` 平铺副本及失败处理。测试:`test_summary_export.py` 增加副本一致性、副本失败两项,新增 `test_reveal.py`。
|
||||
- [ ] P2:录像选项、工厂函数、`recording` 块、`video_expected` 判定、编码探测、体积估算。测试:`test_multipoint_recording.py` 增加关视频完成、编码不可用两项;`test_summary.py` 增加关视频行 eligible、旧会话不变两项;`test_preferences_isolation.py` 覆盖新的偏好键。
|
||||
- [x] P1:`reveal` 提取与三个按钮(按钮的布局由 C 在 P4 完成;A 在 P1 先接到现有会话行),`summary/` 平铺副本及失败处理。测试:`test_summary_export.py` 增加副本一致性、副本失败两项,新增 `test_reveal.py`。
|
||||
- [x] P2:录像选项、工厂函数、`recording` 块、`video_expected` 判定、编码探测、体积估算。测试:`test_multipoint_recording.py` 增加关视频完成、编码不可用两项;`test_summary.py` 增加关视频行 eligible、旧会话不变两项;`test_preferences_isolation.py` 覆盖新的偏好键。(体积估算与探测界面由 C 在 P4 实现。)
|
||||
|
||||
### B 控制器
|
||||
|
||||
交接提示:你负责把流程判断从界面中移出。控制器不得发出运动命令、不得导入 Qt;对准只发出请求。每个禁用的动作必须带原因,原因文字通过 locale 键给出。
|
||||
|
||||
- [ ] P3:实现控制器及表驱动测试;用同一组输入比较“直接驱动 `Campaign`”与“经由控制器”写出的文件结构。
|
||||
- [x] P3:实现控制器及表驱动测试;用同一组输入比较“直接驱动 `Campaign`”与“经由控制器”写出的文件结构。
|
||||
|
||||
### C 界面
|
||||
|
||||
交接提示:你负责重排界面,依据是设计稿与主计划 P4、P5。界面只渲染控制器的输出;不得在 `ui/` 中判断 `campaign.phase`。实时图与 UV 图必须能同时看到。
|
||||
|
||||
- [ ] P4:新布局、更改输入对话框、队列表模型、当前点卡片、消息行;在模拟模式下用界面测试走完两点;截图存 scratch。
|
||||
- [ ] P5:Finger debug 改名并瘦身,测点表迁移,安装偏置变化后重新求解。
|
||||
- [x] P4:新布局、更改输入对话框、队列表模型、当前点卡片、消息行;在模拟模式下用界面测试走完两点;截图存 scratch。
|
||||
- [x] P5:Finger debug 改名并瘦身,测点表迁移,安装偏置变化后重新求解。
|
||||
|
||||
### D 编码验证
|
||||
|
||||
- [ ] P2b:按主计划完成对比并写报告,内容包括输入文件、编码参数、逐帧差值统计和窗口均值差占 1 N 阶跃的比例。不给结论性推荐,由用户决定。
|
||||
- [x] P2b:按主计划完成对比并写报告,内容包括输入文件、编码参数、逐帧差值统计和窗口均值差占 1 N 阶跃的比例。不给结论性推荐,由用户决定。
|
||||
|
||||
### V 验收
|
||||
|
||||
- [ ] 用新进程跑完主计划 V1–V8;按严重度列出发现,每条附复现步骤;不修改代码。
|
||||
- [x] 用新进程跑完主计划 V1–V8;按严重度列出发现,每条附复现步骤;不修改代码。
|
||||
|
||||
## 子代理交付格式
|
||||
|
||||
@@ -89,6 +89,17 @@ W4 V: 独立验收 → 主代理修复 → V 复核修复项
|
||||
|
||||
## 主代理最终交接
|
||||
|
||||
- [ ] 所有改动保持未暂存;每个改动过的仓库各写 `.scratch/autocal-capture-workflow/commit-message.txt`,按 AGENTS 第 7 条给出单行的 `git add` 和 `git commit -F` 命令。
|
||||
- [ ] 列出需要排除的既有改动。
|
||||
- [ ] 状态写为“仅软件验证,待实机验收”;V10 实机验收需要用户指定设备、运动与载荷范围以及停机条件。
|
||||
- [x] 所有改动保持未暂存;每个改动过的仓库各写 `.scratch/autocal-capture-workflow/commit-message.txt`,按 AGENTS 第 7 条给出单行的 `git add` 和 `git commit -F` 命令。(本任务只改 `orisys-app`。)
|
||||
- [x] 列出需要排除的既有改动。
|
||||
- [x] 状态写为“仅软件验证,待实机验收”;V10 实机验收需要用户指定设备、运动与载荷范围以及停机条件。
|
||||
|
||||
## 需要排除的既有改动(不属于本任务)
|
||||
|
||||
`orisys-app` 工作树里这些改动在任务开始前就存在,提交时必须排除:`apps/autocal/src/orisys_autocal/motion/service.py`、
|
||||
`apps/autocal/src/orisys_autocal/record_diagnostics.py`;未跟踪的 `LZ.*.zip`、`LZ.LigMaster V1.7.0/`、
|
||||
`LZ.Devpack_L826(六维力非标设备包)(1)/`、`docs/test-execution-plan.zh.md`。
|
||||
|
||||
任务运行期间还有并行会话改了工作区其他部分,同样不属于本任务:`apps/studio/**` 与
|
||||
`shared/src/orisys_app_shared/theme/qss.py`(另一个 Studio 评审会话)、工作区根的 `docs/README.md` 与
|
||||
`docs/inventory.json`、`orisys-sdk` 的 `HEAD`(`f7f4682` → `ff7614a`,只改 `calibration.py`)。因此全仓
|
||||
`lint_gate` 的 `status: FINDINGS` 来自这些外部改动,本任务范围内的文件是 `status: clean`。
|
||||
|
||||
@@ -23,6 +23,7 @@ sites/<site_id>/repeat-00N/
|
||||
| 文件 | 内容 |
|
||||
|---|---|
|
||||
| 根 `session.json` | `format_version=autocal-multipoint-1.0`、session_id、型号/SN、`coordinate_frame`、`force_to_tool_rotation`、`normal_projection`、力范围、`sync`、sites、trials、`completion`、`status`/`reason`;`platform_motion` 与 `automatic_force_control` 均为 false |
|
||||
| 根 `session.json` 的 `recording` 块 | `video`、`codec`、`lossless_frames`;建立会话时写入并锁定,后续 repeat 不改写;缺该块的旧会话按 `video=true` 读取 |
|
||||
| site 记录 | `site_id`、`position`/`position_frame`、`normal_sensor`、`pose`、`uv_px`、`levels_n`、`hold_s`、`repeats`;`pose` 为空或 `in_range=false` 的点只保存、不下发 |
|
||||
| repeat `session.json` | `trial_id`、site、`pose`、`uv_px`、`steps[{step_index, branch, target_load_n}]`、`sync`、`images`、`status`;录像收尾后另有 `capture_status`、`capture_reason`、`capture_report`(共享记录的统计与问题清单) |
|
||||
| `reference.csv` | 每个实际开始的保持窗口一行:`step_index`、`branch`、`target_load_n`、`t_start_host_mono_ns`、`t_end_host_mono_ns`、`F_ref_normal_N`、site 坐标与坐标系、`repeat_index`/`repeat_count`、`hold_complete`、`reference_source`、`fx_N`/`fy_N`/`fz_N`、力到工具的旋转、`nx`/`ny`/`nz`、`pose_*`、`normal_aligned_to` |
|
||||
@@ -80,6 +81,8 @@ unknown,不把 `images.captured=true` 当成录像已验证。
|
||||
`summary-latest.json`(相对路径、`summary_id`、输入与文件哈希)。采集终态自动发布候选汇总;人工
|
||||
复核保存后再发布已复核汇总;失败保留旧指针并可重试,采集结果不变。
|
||||
|
||||
指针替换成功后,同一份四件文件镜像到会话根 `summary/`:先写临时目录再替换目录;副本失败只在界面/日志报告,指针仍指向 `derived/` 中的已发布版本,采集结果不变。
|
||||
|
||||
两张表都带 `schema_version`、`summary_id` 与来源文件:
|
||||
|
||||
| 表 | 行单位 | 关键字段 |
|
||||
|
||||
@@ -34,6 +34,11 @@
|
||||
summary.html
|
||||
baseline_load_data.csv
|
||||
sensitivity_values.csv
|
||||
summary/ # 最近一次发布的可读副本(四件文件),非权威
|
||||
summary.json
|
||||
summary.html
|
||||
baseline_load_data.csv
|
||||
sensitivity_values.csv
|
||||
summary-latest.json # 最后成功发布的相对路径指针
|
||||
```
|
||||
|
||||
@@ -41,6 +46,8 @@
|
||||
|
||||
导出先在唯一临时目录写齐并验证,再发布同盘目录,最后原子替换指针。失败保留旧指针,报告导出失败,不回滚采集状态。指针使用相对路径、summary_id 和内容哈希;并发发布由会话级单一任务串行化,取消后的旧任务不能更新指针(取消由调用方传入,界面暂未提供取消按钮)。原始文件、历史 review 和已发布 summary 均不覆盖。
|
||||
|
||||
指针替换后镜像同一份四件文件到根 `summary/`(先写临时目录再替换);副本失败只报告,不回滚指针、不改采集结果。
|
||||
|
||||
## 录像身份、时间和生命周期
|
||||
|
||||
逻辑身份使用 `(calibration_session_id, trial_id, capture_session_id, frame_id)`;保持窗口再加 `step_index`。共享 recorder 的整数 session_id 不等于标定 session_id。同试验来源重启不得静默复用 frame_id;中止并新建 trial。重复身份、行数不符或缺关联必须报错/排除,不能退回按行号拼接。
|
||||
|
||||
@@ -4,8 +4,14 @@
|
||||
|
||||
图中原有模块归属的源码引用固定在 `19426c3c4a648ca7f4d3785e2e11b1bf124a8e31`。本次五项修复尚未提交:写线程失败时中止、候选与确认结果分别汇总、按所选区间回放、允许已关闭失败记录诊断,以及取消全部解码图像的累积缓存。当前实现以[工作树快照清单](diagrams/recording-20261017-110144/snapshot.json)及其同目录补丁为依据,不将工作树字节冒充 HEAD 源码。
|
||||
|
||||
每 trial 连续保存零载、换档、加载和卸载画面,MP4 为有损输入录像。保持窗口依靠主机采集时间与帧身份关联,不能用容器 FPS 推算实验同步。操作员手动确认参考载荷;该流程不自动加载,也不证明 FT 物理同步。
|
||||
每 trial 连续保存零载、换档、加载和卸载画面,MP4 为有损输入录像。保持窗口依靠主机采集时间与帧身份关联,不能用容器 FPS 推算实验同步。操作员手动确认参考载荷;该流程不自动加载,也不证明 FT 物理同步。界面上的实时曲线与实时 UV 图只显示已有数据,不改变录像与坐标。
|
||||
|
||||
原始文件继续使用[单次](calibration-data-format.zh.md)与[多点](multipoint-data-format.zh.md)目录。保持段不拆成新视频,复核与汇总另存版本;字段及计算方法见[汇总契约](recording-summary-contract.zh.md)。
|
||||
|
||||
## 录像选项与关闭视频
|
||||
|
||||
录像选项(`video`、`codec`、`lossless_frames`)在建立会话前选定,写入根 `session.json` 的 `recording` 块并锁定;会话建立后再改不生效。可用编码在启动时用 3 帧探测,写不出来的编码在界面上禁用并写明原因,绝不静默回退到别的编码。本机 `cv2` 目前只能写 `mp4v`,H.264 需要另定编码器来源(未验证,见 `.scratch/autocal-capture-workflow/d/p2b-codec-equivalence.zh.md`)。
|
||||
|
||||
关闭视频时 `capture_verdict` 跳过视频类判定,只保留数据类判定(帧与力的写入、来源会话未变等),因此关视频的 trial 仍可 complete、汇总行仍 eligible;复核界面按 `recording` 块显示「按设置未录视频」。缺该块的旧会话按 `video=true` 读取,结果与以前一致。体积按码率与计划时长估算,与磁盘剩余一并显示,不足两倍估算时警告。
|
||||
|
||||
验证:五个回归用例在修复前失败;修复后的相关 45 项测试和 Autocal 全量 572 项测试通过。Archify 的 showcase 校验、产物检查及真实浏览器检查通过,并检查了截图。未操作真实相机、平台或载荷。
|
||||
|
||||
@@ -236,7 +236,8 @@ measured time per point.
|
||||
**Gate:** the operator has seen the path and a dry run has completed without a
|
||||
guard violation.
|
||||
|
||||
**The single-point dry run is built**, in the finger debug screen: 执行动作 sends the
|
||||
**The single-point dry run is built**, in the geometry & mounting screen (几何与安装,
|
||||
which no longer carries a point table): 执行动作 sends the
|
||||
selected point's *solved pose* to the platform — the stages together with the table
|
||||
X/Y, and the press axis only once its zero is calibrated (设备设置 → 压轴); until then
|
||||
it is held, so the move cannot reach the sensor by accident. The order follows the
|
||||
@@ -282,6 +283,22 @@ data stays valid.
|
||||
**Existing code:** the motion layer has the guards and the poller; the step
|
||||
machine, the contact detection and the acquisition binding are new.
|
||||
|
||||
**As built today** (manual, through the capture page): the operator keeps one
|
||||
queue of points — a single point is a queue with one row. `Ready` must be all
|
||||
green before the first point. The page shows one primary button whose label is
|
||||
the next step (align → start → at the target → hold finished → confirm liftoff →
|
||||
finish) and states the reason whenever it is disabled. Alignment only requests a
|
||||
guarded pose move, and a capture may not start until that move has completed, so
|
||||
a repeat can never be recorded on a pose nobody confirmed. Remeasure, skip and
|
||||
stop are the secondary actions. What the button says is derived from the campaign
|
||||
state by `capture_controller.py`, never by the widgets.
|
||||
|
||||
Changing the mounting offset, the tool XY or the travel limits re-solves every
|
||||
queued pose: while the queue is still editable the new solution is stored, and a
|
||||
point the stage can no longer reach is marked and refused for alignment. The
|
||||
exported operation table comes from the same queue (queue → 导出测点操作表…), so
|
||||
the table and the run cannot describe different points.
|
||||
|
||||
---
|
||||
|
||||
## P8 — Store raw
|
||||
|
||||
Reference in New Issue
Block a user