重构 Autocal 采集页:单一队列与控制器驱动的主按钮

选点、对准、加载与录像分散在两个面板,状态靠隐藏相位判断。现改由不依赖 Qt 的采集控制器驱动,并加入录像选项、汇总平铺副本、保持到时自动结束、会话结束回到空闲,以及无设备时的模拟采集。已运行 Autocal 非 Qt 测试并通过范围内门禁;界面测试待 Windows 复核,未做实机验收。
This commit is contained in:
ykcheungab
2026-10-18 16:04:32 +08:00
parent 85d0b396e3
commit 06e06126ca
44 changed files with 7769 additions and 2218 deletions
+164 -34
View File
@@ -230,7 +230,7 @@
"workspace": {
"tab_axes": "Axis debug",
"tab_sequence": "Test sequence",
"tab_finger": "Finger debug",
"tab_finger": "Geometry & mounting",
"tab_sensor": "Calibration capture",
"tab_records": "Calibration records",
"not_built": "Not built yet",
@@ -338,7 +338,6 @@
"remove": "Delete selected",
"up": "Move up",
"down": "Move down",
"import_points": "Import from finger debug",
"align": "Align normal",
"reacquire": "Record selected again",
"source": "Reference source",
@@ -410,7 +409,7 @@
"capture_wait": "recording is not ready; the hold cannot be confirmed yet"
},
"finger": {
"title": "Finger calibration-point debug",
"title": "Geometry & mounting",
"bundle_path": "Export bundle",
"load": "Load bundle…",
"reset_view": "Reset view",
@@ -421,8 +420,7 @@
"flat_title": "Flat image (click to pick)",
"readout_title": "Readouts",
"preview_title": "3D preview",
"points_title": "Picked points",
"select_hint": "Click a point on the flat image to pick a calibration point.",
"select_hint": "Click a point on the flat map to try that point's pose.",
"no_bundle": "No export bundle loaded.",
"no_surface": "Pixel ({x}, {y}) is not on the sensing surface (UV gap).",
"row_sensor_point": "Sensor point (mm)",
@@ -453,14 +451,7 @@
"sensor_xy": "Sensor X / Y",
"sensor_zy": "Sensor Z / yaw",
"setup_hint": "How the sensor actually sits on the stack with the machine at zero: X/Y/Z translation and a yaw about Z. Z is the mounting-plate thickness. The plate on this bench is 8 mm.",
"clear_points": "Clear points",
"remove_selected": "Remove selected",
"move_up": "Move up",
"move_down": "Move down",
"selected_count": "{count} selected",
"table_hint": "Tick a row to select it, double-click a sensor coordinate or normal to edit it. The pose columns are solved from those, so they update themselves.",
"edit_not_a_number": "That cell needs a number; the previous value was kept.",
"point_count": "{count} points",
"residual_value": "{residual}° — {verdict}",
"reachable": "this normal can be aligned with Z",
"unreachable": "this normal cannot be aligned with Z (yaw travel limit)",
@@ -482,28 +473,9 @@
"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(°)",
"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}°",
"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)"
"picked": "Picked: residual {residual}° · yaw {yaw}° · pitch {pitch}°"
},
"sequence": {
"title": "Test sequence design",
@@ -671,7 +643,8 @@
"guide_incomplete": "1 Check identity → 2 Select site / trial → 3 Check stable windows → 4 Save\nNext: inspect the stop reason and recorded signal. Incomplete attempts are excluded from fitting.",
"guide_check": "1 Check identity → 2 Select site / trial → 3 Check stable windows → 4 Save\nNext: select a trial and Check hold windows; adjust the time interval if needed.",
"guide_save": "1 Check identity → 2 Select site / trial → 3 Check stable windows → 4 Save\nNext: inspect remaining holds or save current analysis.",
"video": "View recording"
"video": "View recording",
"video_not_recorded": "Video not recorded, per the session settings"
},
"quality": {
"open": "Repeatability and validation…",
@@ -780,6 +753,163 @@
"retry": "Publish summary again",
"done": "Summary published again: {path}",
"reason_hold_not_found": "This hold attempt is not in the record",
"reason_hold_not_complete": "This hold attempt was discarded by a remeasure"
"reason_hold_not_complete": "This hold attempt was discarded by a remeasure",
"copy_failed": "The summary was published, but the readable copy was not written: {detail}. The pointer still names the published summary and the recording is unchanged."
},
"cap": {
"check": {
"bundle": "Calibration bundle",
"frames": "Input frames",
"bus": "Bus and axis mapping",
"output": "Output folder writable",
"sn": "Sensor SN",
"max_force": "Maximum force"
},
"action": {
"start": "Start capture",
"align": "Align this point",
"confirm_target": "At the target — begin the hold",
"confirm_hold": "Hold finished — record this level",
"confirm_liftoff": "Confirm the probe has left the sensor",
"finish": "Finish the session",
"remeasure": "Measure this level again",
"skip": "Skip this point",
"stop": "Stop and keep the data",
"open_session": "Open session folder",
"open_summary": "Open summary",
"copy_path": "Copy path",
"settings": "Change input / bundle…"
},
"block": {
"closing": "Still writing to disk — wait for the close to finish",
"align_while_recording": "Recording: the platform cannot move to align another point",
"skip_live": "This level is already being recorded and cannot be skipped",
"no_directory": "There is no session folder yet",
"no_summary": "No summary has been published yet",
"not_ready": "Some checks are still unmet — see the Ready list above",
"no_sites": "The queue has no points yet",
"no_session": "The session settings are incomplete (output folder, model, SN, …)",
"no_solver": "No pose solver is connected, so the platform cannot be aligned",
"no_pose": "This point has no usable solved pose",
"hold_running": "The hold time has not elapsed",
"remeasure_unavailable": "No level can be measured again right now",
"stop_unavailable": "There is no running session to stop",
"finish_unavailable": "The session is not finished yet",
"skip_unavailable": "This build has no way to skip the current point, so it cannot be skipped",
"busy": "This action is not available in the current step",
"no_bundle": "No calibration bundle (export) is loaded",
"no_uv": "Click a position on the UV map first",
"no_output": "Choose the output directory first",
"no_sn": "Enter the sensor SN first",
"no_max_force": "Enter the maximum force (N) first",
"queue_busy": "The session is running; the point queue cannot be edited",
"bundle_busy": "The session is running; the calibration bundle cannot be changed",
"no_worker": "The input is not running, so recording cannot start",
"bad_levels": "Load levels must be strictly increasing, above zero and within the maximum force",
"bad_reference": "The measured reference force is not a valid number",
"align_running": "An alignment move is still running; wait for it to finish",
"pose_unreachable": "This point cannot be reached under the current mounting and travel, so aligning is disabled"
},
"session": {
"active": "Session: {sites} site(s) · {done}/{total} holds\n{path}",
"none": "No session yet. Align the first point, then press Start capture.",
"settings_hint": "Input source, bundle, session parameters and recording options are in \"Change input / bundle…\"; starting a capture does not switch pages."
},
"queue": {
"title": "Point queue",
"empty": "The queue is empty: click a position on the UV map, set the levels, then press Add current point.",
"add": "Add current point",
"update": "Update selected",
"remove": "Remove selected",
"up": "Move up",
"down": "Move down",
"site_id": "Site id",
"repeats": "Repeats",
"current_uv": "Current UV",
"col_id": "Site",
"col_position": "Sensor position (mm)",
"col_repeats": "Repeats",
"col_reachable": "Reachable",
"col_state": "State",
"reachable": "reachable",
"unreachable": "unreachable",
"state_pending": "pending",
"state_partial": "in progress",
"state_complete": "complete",
"state_skipped": "skipped",
"selected": "Selected: {site}",
"update_short": "Update",
"remove_short": "Remove",
"export": "Export point sheet…",
"export_tip": "Exports U/V, sensor coordinates, platform targets and the mapping identity in queue order; refuses when a coordinate no longer matches the mapping.",
"export_saved": "Point sheet exported: {path}",
"export_no_points": "The queue has no points yet",
"export_no_map": "No UV map is loaded, so the point sheet cannot be exported",
"export_missing_uv": "Point {order} has no UV coordinates, so the point sheet cannot be exported",
"export_no_pose": "Point {order} has no solved pose, so the point sheet cannot be exported",
"export_edited_point": "Point {order}'s sensor coordinates no longer match the current UV map; take the point again before exporting."
},
"card": {
"title": "Current point",
"no_point": "The queue is empty: add a point first.",
"no_progress": "Progress appears once the session starts.",
"next_site": "Next point: {site}"
},
"step": {
"align_point": "1. Align the current point",
"start_session": "2. Start capture",
"confirm_target": "3. Target reached - start the hold",
"confirm_hold": "4. Hold finished - record this step",
"confirm_liftoff": "5. Confirm liftoff, go to the next point",
"finish_session": "6. Finish the session",
"closing": "Writing to disk"
},
"hint": {
"align_point": "Align first: the primary button asks for the move plan; Start capture only appears after the move has been confirmed complete.",
"start_session": "This point is aligned. The primary button opens the session and records the first point step by step.",
"not_ready": "The ✗ checks must pass before starting; hover them to see why.",
"confirm_target": "Load to the current target, enter the measured reference force (or the six-axis components), then press the primary button.",
"confirm_hold": "Holding: {seconds:.1f} s left; do not change the load.",
"confirm_liftoff": "This repeat is recorded. Lift the indenter, confirm it has left the sensor, then press the primary button to go to the next point.",
"finish_session": "Every record is written. Press the primary button to finish the session and publish the summary.",
"closing": "Closing the recording and checking it; nothing else runs until it finishes."
},
"message": {
"aligning": "Alignment requested for {site}. Start capture stays unavailable until the move completes and is confirmed.",
"aligned": "Alignment confirmed: {site}",
"align_failed": "Alignment did not finish: {detail}. The platform is not confirmed in place; align again.",
"started": "Session started: {path}",
"attach_failed": "Could not start recording: {detail}",
"queue_added": "Point added: {site}",
"queue_removed": "Point removed: {site}",
"skipped": "Point skipped: {site}",
"stopped": "Stopped; the data already written is kept.",
"done": "Session finished: {path}"
},
"recording": {
"title": "Recording",
"video": "Record video",
"codec": "Video codec",
"lossless": "Also store lossless frames",
"unavailable": "{codec}: unavailable on this machine, disabled",
"probe_failed": "The codec probe did not run: {detail}",
"off": "Video off, per the session settings",
"estimate": "Estimated {size} ({seconds}); {free} free on disk",
"disk_short": "Less than twice the estimated size is free on disk",
"no_plan": "The queue is empty, so no size can be estimated yet",
"locked": "Recording options are locked once the session has started",
"summary": "Recording: {codec}"
},
"settings": {
"title": "Capture settings",
"input": "Input source",
"bundle": "Calibration bundle (export)",
"bundle_none": "not loaded",
"bundle_load": "Load export bundle…",
"session": "Session parameters",
"simulate": "Simulate (no camera, no platform motion)",
"close": "Close",
"max_required": "Required; the program does not assume a value"
}
}
}