# Autocal 标定操作与数据格式草稿 状态:待评审,2026-10-11。用途:方案及操作指南。近期目标只针对 finger 传感器跑通多测点法向采集、保存和离线重算;下列操作是首版目标流程,尚非全部可执行的软件说明。 ## 范围与软件现状 | 项目 | 当前约定 | |---|---| | 标定范围 | 多测点法向力,暂定 0–30 N;剪切及组合载荷后续再做 | | 传感器 | 首版固定为 finger;其余类型须另行验证几何、采集和处理契约 | | 压头 | 直径 6 mm、球面半径 3 mm 的半球压头 | | 参考 | 砝码或 50 N/2 N·m FT sensor,首版先接通一种 | | 图像 | 一个完整测试事件一个连续视频,档位间不切段 | | 调试输入 | 先用已有视频接通 finger 采集链;实时相机随后复用同一个 worker 和 `SdkPacket` 消费路径 | | 交付 | 单个 session 能重新打开、追溯参考载荷并离线重算 | [LF606 规格书](references/lf606-d40-h18-4x-spec.pdf)量程表包含 50 N/2 N·m 档位,但图签为 200 N/8 N·m;实机以铭牌及标定证书核对。 | 功能 | 源码现状 | 首版需要补齐 | |---|---|---| | 设备设置、轴操作、测点姿态预览 | Autocal 已有对应模块 | 与采集事件关联 | | `.oryseq` 导入导出 | 已有;见 [sequence-format.md](sequence-format.md) | 载荷循环由 trial 的 steps 表达,不假定旧序列已支持 | | 自动执行、传感器及标定点页面 | 运行入口提示未实现,相关页面占位 | 最小事件控制和采集入口 | | 图像、读数、事件记录 | Studio/shared 已有记录链 | 接入 Autocal,增加 trial/step、参考流及独立事件视频 | | 新格式回放、拟合及导出 | 本文定义目标契约 | 关联校验与最小离线处理 | ## 操作员逐步流程 设备操作沿用 [workflow.md](workflow.md) 的准备、运动边界及停机流程。以下不新增自动运动授权;尚未接通的步骤不能靠占位按钮完成。 | 步骤 | 操作员动作 | 软件记录/通过条件 | |---|---|---| | 1. 建立会话 | 填写传感器 SN、gel ID、实验台、压头和参考设备;选保存位置 | 创建唯一 `session_id`;保存身份和配置快照 | | 2. 检查设备 | 完成设备设置、回零及既定检查,核对相机和参考输入 | 状态可读;运动边界按既定流程确认 | | 3. 确认测点 | 在有效 UV 区域选点,核对三维位置和姿态 | 分配 `site_id`,UV→3D 映射有效 | | 4. 设置循环 | 选择载荷档位、保持时间及重复数;预览正反路径 | 保存 `load_levels_n`、`hold_s`、`repeats`;档位不超本次确认范围 | | 5. 建立基准 | 无接触时检查零载荷,保存参考图像和必要历史 | 保存归零/基准事件及 `baseline_id` | | 6. 开始事件 | 到达确认的测点姿态后,在加载前启动记录 | 新建 `trial_id` 和视频;确认视频与参考记录正常后加载 | | 7. 逐级加载 | 按路径到各目标档位并保持,标记实际到达时间 | 每档有 `step_id`、目标及实际参考力、分支和时间范围 | | 8. 逐级卸载 | 按相同档位下降到零,保留恢复过程 | 连续记录卸载分支;循环内不重新归零或重置图像基准 | | 9. 结束/重复 | 检查恢复与记录状态,停止事件;重复或移到下一点 | 完成写入后标记状态;每次重复使用新 trial 和视频 | | 10. 复核会话 | 重新打开文件,回放至少一个完整事件,检查档位对应关系 | 缺失、丢帧和中断可见;保留完整 trial 作独立验证 | 推荐路径为 `0 → F1 → F2 → Fmax → F2 → F1 → 0`,具体档位待定。逐级卸载提供与加载分支相同载荷的对照;各档采用相同保持规则。保持时间先支持 10–30 s 配置,人工选择分析窗口并记录原因;到时不自动等于稳定。异常时按既定流程停止,保留未完成记录,重测用新 trial。 ## 坐标与关联 | 对象 | 保存内容 | 约定 | |---|---|---| | 测点 | `uv_xy`、`position_sensor_mm` | UV 单位 pixel,可为亚像素值;直接映射到 mesh 的 mm 位置 | | UV 定义 | `uv_origin_px`、图像尺寸、轴正方向 | 原点在有效 mask 内底部中间;允许负 Y | | 几何 | `geometry_id`、mesh/mask/映射文件及哈希 | 固定映射版本,二维与三维值可相互核对 | | 姿态 | `T_platform_from_sensor`、`pose_source`、激励方向 | 记录传感器→平台变换,区分实测和指令;normal 不必单独保存 | | 关联层级 | `session → site → trial → step → samples` | trial 是完整循环,step 是循环内档位;帧与参考流按时间关联 | ## 文件及内部参数 以下为新格式建议,不是现有共享记录器文件的原样清单。`sites`、`trials` 和 `steps` 先内嵌于 `session.json`。 | 文件 | 主要字段/数据 | 写入时机 | |---|---|---| | `session.json` | `format_version`、`session_id`、`sensor_type`、`input_source`、身份、配置快照、坐标定义、文件清单、sites、trials、状态 | 会话建立、事件完成及结束时 | | `sequence.oryseq` | 实际使用的测点计划;遵循现有格式 | 开始采集前保存快照 | | `video/.` | 算法入口图像、完整循环及恢复 | 每 trial 开始至结束 | | `frames.csv` | `session_id`、`trial_id`、`frame_id`、`t_rel_s`、视频路径、段内帧号、丢帧标记 | 每帧 | | `baseline/` | 基准图像、初始状态或预录引用、`baseline_id` | 建立/重置基准时 | | `reference.csv` | `trial_id`、`t_rel_s`、`clock_id`、实测力分量、有效性 | FT 自身采样频率;砝码方式可不生成此流 | | `motion.csv` | 时间、目标/反馈位姿、有效性 | 有实际反馈时保存;缺少反馈须注明 | | `events.csv` | 时间、trial/step、事件类型、原因 | 到档、阶段切换、归零、异常及中断 | | `derived//` | 对齐样本、特征、拟合结果、验证指标和处理配置 | 离线处理;不覆盖原始文件 | | 参数归属 | 主要参数 | 单位/填写来源 | |---|---|---| | session 身份 | `sensor_sn`、`gel_id`、`bench_id`、`indenter_id`、`reference_source` | 操作员填写或设备读取 | | session 采集 | 分辨率、像素格式、编码、版本、滤波与归零配置 | 软件快照;编码待实测确认 | | 输入来源 | `input_source.kind` 为 `video` 或 `camera`;`value` 分别为视频路径或相机整数编号;视频另存文件哈希 | 传给同一 `FingerAcquisitionWorker.start`;来源文件与 trial 输出视频不可混淆 | | session 时间 | 各流 `clock_id`、时间戳含义、偏移及同步误差 | 软件记录;不能按行号配对 | | site | `site_id`、UV、三维位置、几何关联 | pixel/mm;软件映射 | | trial | `trial_id`、`site_id`、重复编号、姿态、`baseline_id`、视频、起止时间、状态 | 软件分配并记录实际执行 | | trial 计划 | `load_levels_n`、`hold_s`、`repeats` | N/s/次数;操作员设置 | | step | `step_id`、`target_load_n`、`branch`、起止时间、`analysis_window_s` | N/会话相对秒;branch 为 load/unload/zero | | step 砝码参考 | 质量、重力加速度、传力方向、有效时段及 `reference_load_n` | kg/m/s²/N;仅在传力条件成立时使用 m×g | | 质量 | `valid`、`invalid_reason`、丢帧/中断状态 | 未知不补零;算法失败不等于图像不可用 | 视频输入的现有 `SdkPacket.mono_t` 由帧号和配置帧率推算;相机输入使用采集期间的单调时钟。已检查的 DD02 示例视频约 20 fps,而配置为 30 fps;因此现有视频时间不能直接用于物理保持时长或 FT 对齐。P1 须读取来源视频的实际时间基准,核对配置帧率,并在不一致时拒绝时间对齐或明确标记失效。 两种输入都输出 `frame_id` 和 `raw_frame`,但不能把不同来源的时间戳当成同一物理时钟。离线视频若无同步的 FT/运动记录,只能验证图像链和文件关联。manifest 须保留来源路径、哈希、配置身份、配置/实际帧率及时间基准;正式会话还应保存现场取得的设备身份。 P0 事件边界如下。`events.csv` 每行至少保存 `event_id`、`trial_id`、可为空的 `step_id`、`event_type`、`t_rel_s`、`clock_id` 和 `reason`。事件只记录已发生的事实,不以 UI 按钮时间冒充到档或写盘完成。P1/P2 用同一 `trial_id` 将视频帧、参考值和事件相连。 | 事件 | 触发与状态 | |---|---| | `trial_started` | 首帧可用且输出已打开后,trial 进入 `recording` | | `step_reached` | 操作员确认到档或有效反馈确认;记录实际时刻和参考有效性 | | `step_ended` | 本档保持及分析窗口结束,保留实际持续时间 | | `trial_finished` | 视频与索引排空并通过完整性检查后,trial 进入 `complete` | | `trial_aborted` | 输入、写入或操作异常;trial 进入 `incomplete`,保留已写数据及原因 | `session` 在所有 trial 完成并检查文件后才进入 `complete`;任何缺失必须保留 `incomplete` 与原因。每次重试使用新的 `trial_id`,不覆盖旧视频。 以下是目标 `session.json` 的最小示意,供 P1/P2 共用字段;`video/` 是本次 trial 的输出,不是 `input_source` 原文件。例子不代表写入器已经实现。 ```json { "format_version": "0.1-draft", "session_id": "session-001", "sensor_type": "finger", "input_source": { "kind": "video", "value": "D:/samples/finger-input.mp4", "sha256": "<待采集时计算>", "clock_id": "video_frame_rate", "configured_fps": 30.0, "source_fps": 30.0 }, "config_ref": "config/sensors/finger/sensor.json", "status": "incomplete", "sites": [{"site_id": "site-001", "uv_xy": [120.5, -4.0], "position_sensor_mm": [1.2, 0.8, 3.4]}], "trials": [{ "trial_id": "trial-001", "site_id": "site-001", "baseline_id": "baseline-001", "video": "video/trial-001.mp4", "status": "incomplete", "steps": [ {"step_id": "step-001", "branch": "load", "target_load_n": 5.0}, {"step_id": "step-002", "branch": "unload", "target_load_n": 0.0} ] }] } ``` ## 软件数据流与责任 ### 当前实际链路 | 链路 | 代码位置/输出 | 对 Autocal 的含义 | |---|---|---| | 运行请求 → 未实现提示 | [window.py](../src/orisys_autocal/ui/window.py) 的 `_on_run_requested` | 尚无自动采集循环 | | 页面装配 → 占位页面 | [workspace.py](../src/orisys_autocal/ui/workspace.py) | 传感器、表面和标定点页尚未接通 | | Studio 采集包 → 记录通道 | [recording.py](../../studio/src/orisys_studio/recording.py) 的 `RecordingChannel.on_packet` | 将采集包分发给会话存储、标定采样器及文件记录器 | | 采集包 → 有界队列 → 写入线程 | [experiment.py](../../../shared/src/orisys_app_shared/record/experiment.py) | 当前写 session、forces、frames、events、分段 MP4 或 PNG;不能直接视为新格式已完成 | ### 首版待接通链路 | 顺序 | 输入 → 处理 → 输出 | 负责模块 | |---|---|---| | 1 | 操作员设置 + `.oryseq` → sites/载荷路径 → session 快照 | Autocal 会话与事件控制 | | 2 | UV + 固定映射 → mesh 位置 + 平台姿态 → site/trial | 几何及现有姿态计算能力 | | 3 | 视频路径优先、相机编号随后 → 同一 `FingerAcquisitionWorker` → `SdkPacket` → trial 视频、帧索引 | 复用 shared 采集能力;Autocal 不导入 Studio 的 UI 或控制器 | | 4 | FT/砝码 + 平台反馈 + 档位事件 → 带时间的数据流 | Autocal 参考输入及事件控制;与图像并行 | | 5 | 事件结束 → 完成写入 + 完整性检查 → trial 状态 | 文件记录器及会话控制 | | 6 | 视频解码 + 基准/配置 → SDK 特征重算;时间对齐参考 → 拟合/验证 | 离线处理,结果存 derived | 保留现有算法通道值时可沿用 `forces.csv`,但它不是独立参考力。业务层组织试验,SDK 负责图像算法,共享记录器负责文件写入;不让 SDK 依赖 Autocal UI。 ## 首版验收与待定事项 | 验收 | 通过条件 | |---|---| | 数据关联 | 每个视频可追溯到测点、姿态、基准、加载/卸载档位及参考力 | | 可回放 | 重新打开后能解码完整 trial,恢复处理状态并重算选定窗口 | | 有效性 | 丢帧、参考缺失、中断及失败显式可见;原始记录不被重处理覆盖 | | 最小验证 | 至少留出完整 trial,分别比较加载/卸载的法向误差;阈值待定 | 开跑前仍须确定载荷档位、轴方向及精确原点、参考采集与同步、视频编码和恢复窗口。先实测单 trial 的容量及丢帧,再估算整场存储。视频空档不承诺连续回放。空间模型、实时集成及长期可靠性验证后续再做;本流程不证明剪切或多接触精度。