完善 Autocal 多测点标定流程及会话复核

统一测点坐标、保持窗口和试验目录,补齐逐点初步分析。定向测试与真实视频闭环通过;两项轮询失败在修改前版本同样复现。
This commit is contained in:
ykcheungab
2026-10-11 17:43:16 +08:00
parent 7828bc1fe9
commit 04adf17f60
17 changed files with 1347 additions and 403 deletions
+72 -20
View File
@@ -271,25 +271,24 @@
"uv": "U / V (px)",
"position": "Mesh position",
"levels": "Load levels (N)",
"hold": "Planned hold",
"hold_tip": "The planned hold time is saved; levels and recording do not advance automatically.",
"hold": "Hold per level",
"hold_tip": "Count down after arrival confirmation. End the hold window and prompt the next level; video continues. Time alone does not verify stability.",
"reference": "Manual reference force (N)",
"start": "Record this site",
"start_tip": "Create one trial folder for this site and continuously record images and sensor output. This does not move the platform. One load-unload cycle uses this folder.",
"confirm": "Mark load reached",
"confirm_tip": "After reaching the target and entering the manual reference force, mark this level's start and begin its hold timer. Images are already recording.",
"finish": "Stop and complete",
"finish_tip": "After all levels are marked, stop recording, flush the files, and check this trial.",
"abort": "Abort this recording",
"abort_tip": "Stop recording, keep this folder, and mark it incomplete. Starting again creates a new folder; it does not resume this one.",
"start": "Start this trial",
"start_tip": "Create a trial in this calibration session. Record initial zero, loading, unloading and recovery continuously; no platform motion is issued.",
"confirm": "Target reached: start hold",
"confirm_tip": "Reach the current target and enter the actual reference load. Keep the load unchanged until the countdown ends.",
"finish": "Complete this trial",
"finish_tip": "After initial zero and every loading/unloading hold, stop recording, check and save the trial.",
"abort": "End early (keep incomplete data)",
"abort_tip": "End this trial immediately and keep its incomplete data. A retry creates a new trial in the same calibration session.",
"load": "Load",
"unload": "Unload",
"next_step": "Next: {branch} to {load:g} N",
"before_start": "Select a site and start the input, then begin recording",
"ready_to_finish": "All levels marked; recording can be stopped",
"next_step": "{branch} to {load:g} N; enter actual reference load and start hold",
"before_start": "Select a site and start input, then start the trial with initial zero",
"ready_to_finish": "All hold windows complete; complete this trial",
"no_step": "No step pending",
"progress": "Progress {done}/{total} · {status}",
"held": " · Current level held {seconds:.1f} s",
"source_state": "Input: {status} · frame {frame} · capture drops {dropped}",
"replay_note": "Video replay is for debugging; manual reference loads cannot be synced to the original experiment.",
"idle": "Idle",
@@ -303,7 +302,17 @@
"invalid_site": "Select a valid UV site first",
"start_input": "Start camera or video input first",
"reference_required": "Enter the actual reference load",
"output_required": "Choose an output directory"
"output_required": "Choose an output directory",
"zero": "Initial zero",
"holding": "Hold {branch} {load:g} N · {seconds:.1f} s remaining; do not change load",
"close_session": "Finish calibration session",
"close_session_tip": "Close the session containing multiple sites and trial attempts. Incomplete trials keep the session incomplete. The next trial creates a new session.",
"session_none": "No calibration session yet; the first trial creates it.",
"session_active": "Calibration session: {sites} sites · {trials} attempts\n{path}",
"session_closed": "Calibration session closed ({status}): {path}",
"close_before_mapping": "Finish the calibration session before changing UV mapping or bundle",
"path": "Trial path (N): {path}",
"invalid_levels": "Enter strictly increasing levels greater than 0 and at most 30 N"
},
"finger": {
"title": "Finger calibration-point debug",
@@ -362,13 +371,28 @@
"preview_no_gl": "No OpenGL context: {error}",
"preview_draw_failed": "Drawing failed: {error}",
"preview_solve_failed": "Solve failed: {error}",
"col_x": "x", "col_y": "y", "col_z": "z",
"col_nx": "nx", "col_ny": "ny", "col_nz": "nz",
"col_X": "X", "col_Y": "Y", "col_Z": "Z",
"col_yaw": "yaw", "col_pitch": "pitch", "col_residual": "residual(°)",
"col_x": "x",
"col_y": "y",
"col_z": "z",
"col_nx": "nx",
"col_ny": "ny",
"col_nz": "nz",
"col_X": "X",
"col_Y": "Y",
"col_Z": "Z",
"col_yaw": "yaw",
"col_pitch": "pitch",
"col_residual": "residual(°)",
"loaded": "Bundle loaded: {vertices} vertices · {triangles} triangles · {extent} mm · {scale} mm per unit",
"load_failed": "Load failed: {error}",
"picked": "Picked: residual {residual}° · yaw {yaw}° · pitch {pitch}°"
"picked": "Picked: residual {residual}° · yaw {yaw}° · pitch {pitch}°",
"export_sites": "Export operator site list…",
"export_sites_tip": "Export all points in displayed order, with UV pixels and sensor/platform millimetres. UV origin matches calibration.",
"export_no_points": "Pick UV sites first",
"export_edited_point": "Point {order} was edited in 3D and no longer matches its UV pixel; pick it again before exporting",
"sites_exported": "Operator site list exported: {path}",
"col_u_px": "U (px)",
"col_v_px": "V (px)"
},
"sequence": {
"title": "Test sequence design",
@@ -446,5 +470,33 @@
"bas_loaded": "BAS loaded",
"yes": "Yes",
"no": "No"
},
"review": {
"open": "Review calibration data…",
"title": "Exploratory calibration review",
"notice": "Inspection only: manual hold windows have not been verified stable. Replay does not establish original experiment timing. Fits are exploratory and never written to sensor configuration.",
"save": "Save new review",
"no_sites": "No sites in this session",
"candidate": "Candidate window",
"insufficient_samples": "Insufficient valid samples",
"replay": "Replay debug",
"unverified": "Stability unverified",
"fit": "Exploratory loading fit: sensitivity {sensitivity_raw_per_n:.6g} raw/N; gain {gain_n_per_raw:.6g} N/raw; offset {offset_n:.6g} N; fit RMSE {rmse_n:.4g} N (not independent validation error)",
"no_fit": "Insufficient load levels or raw-signal variation for a fit.",
"fit_line": "Exploratory loading fit",
"raw_axis": "Raw normal signal (raw)",
"force_axis": "Manual reference force (N)",
"chart_title": "Hold-window means: loading vs unloading",
"uv_title": "Site sensitivity: blue→red {low:.4g}→{high:.4g} raw/N; grey has no fit",
"issues": "Skipped {count} incomplete trials; complete holds still require stability review.",
"saved": "Saved new review: {path}",
"col_trial": "Trial",
"col_branch": "Phase",
"col_load": "Reference (N)",
"col_samples": "Valid samples",
"col_mean": "Raw mean",
"col_std": "Raw std",
"col_duration": "Hold (s)",
"col_quality": "Quality"
}
}
+72 -20
View File
@@ -271,25 +271,24 @@
"uv": "U / V (px)",
"position": "网格坐标",
"levels": "加载档位 (N)",
"hold": "计划保持",
"hold_tip": "仅保存计划保持时间;不会自动切换档位或结束录制。",
"hold": "每档保持时间",
"hold_tip": "到达目标力并确认后倒计时;到时结束该档保持窗口并提示下一档,录像持续。计时不代表已验证稳定。",
"reference": "人工参考力 (N)",
"start": "开始本测点录制",
"start_tip": "为当前测点新建试验目录,持续录制图像与传感器输出;不会移动平台。一次加载—卸载循环共用此目录。",
"confirm": "标记到档时刻",
"confirm_tip": "达到目标载荷并填写人工参考力后点击;记录本档起点并开始保持计时。图像此前已开始持续录制。",
"finish": "结束录制并完成",
"finish_tip": "全部档位标记后停止录制、完成写盘并检查本次试验。",
"abort": "中止本次录制",
"abort_tip": "停止录制并保留当前目录,标记为未完成;再次开始会创建新目录,不会续录。",
"start": "开始本次试验",
"start_tip": "在本场标定下新建一次测点试验,连续记录初始零载、加载、卸载和恢复。不会移动平台。",
"confirm": "已到目标力,开始保持",
"confirm_tip": "达到当前目标并填写实际参考力后点击。保持期间不要换档;倒计时结束后再按提示调整。",
"finish": "完成本次试验",
"finish_tip": "初始零载及全部加载、卸载保持完成后停止录像,检查并保存本次结果。",
"abort": "提前结束(保留未完成数据)",
"abort_tip": "立即结束本次试验并保留未完成数据。重试创建新的 trial,仍归入本场标定。",
"load": "加载",
"unload": "卸载",
"next_step": "下一档:{branch}至 {load:g} N",
"before_start": "先选测点并启动输入,再开始录制",
"ready_to_finish": "全部档位已标记,可结束录制",
"next_step": "当前目标:{branch} {load:g} N;到达后填写实际参考力并开始保持",
"before_start": "先选测点并启动输入,再开始试验;先记录初始零载",
"ready_to_finish": "所有保持窗口已完成,请完成本次试验",
"no_step": "无待确认档位",
"progress": "进度 {done}/{total} · {status}",
"held": " · 当前档已保持 {seconds:.1f} s",
"source_state": "输入:{status} · 帧 {frame} · 采集丢帧 {dropped}",
"replay_note": "视频重放仅用于调试;本次人工参考力不能与原实验时间同步。",
"idle": "未开始",
@@ -303,7 +302,17 @@
"invalid_site": "请先选择有效的 UV 测点",
"start_input": "请先启动相机或视频输入",
"reference_required": "请输入实际参考力",
"output_required": "请选择保存目录"
"output_required": "请选择保存目录",
"zero": "初始零载",
"holding": "正在保持:{branch} {load:g} N · 剩余 {seconds:.1f} s;请勿换档",
"close_session": "结束本场标定",
"close_session_tip": "关闭包含多个测点和重复试验的会话;有未完成试验则保留未完成状态。之后开始试验会新建一场。",
"session_none": "尚未建立本场标定;首次开始试验时创建。",
"session_active": "本场标定:{sites} 个测点 · {trials} 次试验\n{path}",
"session_closed": "本场标定已结束({status}):{path}",
"close_before_mapping": "请先结束本场标定,再更换 UV 映射或导出包",
"path": "本次路径 (N):{path}",
"invalid_levels": "请输入严格递增的加载档位,每档大于 0 且不超过 30 N"
},
"finger": {
"title": "手指标定点调试",
@@ -362,13 +371,28 @@
"preview_no_gl": "无 OpenGL 上下文:{error}",
"preview_draw_failed": "绘制失败:{error}",
"preview_solve_failed": "求解失败:{error}",
"col_x": "x", "col_y": "y", "col_z": "z",
"col_nx": "nx", "col_ny": "ny", "col_nz": "nz",
"col_X": "X", "col_Y": "Y", "col_Z": "Z",
"col_yaw": "yaw", "col_pitch": "pitch", "col_residual": "残差(°)",
"col_x": "x",
"col_y": "y",
"col_z": "z",
"col_nx": "nx",
"col_ny": "ny",
"col_nz": "nz",
"col_X": "X",
"col_Y": "Y",
"col_Z": "Z",
"col_yaw": "yaw",
"col_pitch": "pitch",
"col_residual": "残差(°)",
"loaded": "已载入导出包:{vertices} 顶点 · {triangles} 三角面 · {extent} mm · 每单位 {scale} mm",
"load_failed": "载入失败: {error}",
"picked": "已选点:残差 {residual}° · yaw {yaw}° · pitch {pitch}°"
"picked": "已选点:残差 {residual}° · yaw {yaw}° · pitch {pitch}°",
"export_sites": "导出测点操作表…",
"export_sites_tip": "按当前列表顺序导出全部测点的 U/V 像素、传感器与平台毫米坐标;与标定页共用 UV 原点。",
"export_no_points": "请先在 UV 图上选择测点",
"export_edited_point": "第 {order} 点的三维位置已改动,与原 UV 像素不一致;请重新在图上选点后导出",
"sites_exported": "已导出测点操作表:{path}",
"col_u_px": "U (px)",
"col_v_px": "V (px)"
},
"sequence": {
"title": "测试序列设计",
@@ -446,5 +470,33 @@
"bas_loaded": "BAS 已加载",
"yes": "是",
"no": "否"
},
"review": {
"open": "查看标定数据…",
"title": "标定数据初步分析",
"notice": "仅供检查:人工参考保持窗口尚未复核稳定性。视频重放不能证明原实验的时间同步;以下拟合不是正式标定系数,不会写入传感器配置。",
"save": "另存分析结果",
"no_sites": "会话没有测点",
"candidate": "候选窗口",
"insufficient_samples": "有效样本不足",
"replay": "视频调试",
"unverified": "稳定性未复核",
"fit": "加载分支初步拟合:灵敏度 {sensitivity_raw_per_n:.6g} raw/N;增益 {gain_n_per_raw:.6g} N/raw;偏置 {offset_n:.6g} N;拟合 RMSE {rmse_n:.4g} N(不是独立验证误差)",
"no_fit": "有效载荷或原始信号变化不足,无法拟合。",
"fit_line": "加载初步拟合",
"raw_axis": "原始法向信号 (raw)",
"force_axis": "人工参考力 (N)",
"chart_title": "各保持窗口均值:加载/卸载对照",
"uv_title": "测点初步灵敏度:蓝→红 {low:.4g}→{high:.4g} raw/N;灰色无拟合",
"issues": "已跳过 {count} 个未完成 trial;完整保持窗口仍须复核稳定性。",
"saved": "已另存:{path}",
"col_trial": "试验",
"col_branch": "阶段",
"col_load": "参考力 (N)",
"col_samples": "有效样本",
"col_mean": "原始均值",
"col_std": "原始标准差",
"col_duration": "保持 (s)",
"col_quality": "质量说明"
}
}