Solid-state LiDAR physical collection runbook (future-only)¶
This is not the current project path. The supported scope is public-data-only evaluation. Keep this document as a future extension for users who can obtain independent metrology; no physical collection is required for the current benchmark.
This runbook turns the optional physical ground-truth gate into a repeatable data-collection task. Public recordings are useful for solver smoke tests and holdout behavior, but they normally do not contain an independently surveyed extrinsic and clock reference. They cannot, by themselves, support a physical accuracy claim.
The recommended first collection has four captures over two mechanical remounts: two captures before remounting and two after remounting. The packet keeps the reference for each session separate because the true transform can change when the sensor is removed and attached again.
1. Generate the collection packet¶
From the repository root, generate a schema-valid packet and report:
python tools/run_solid_state_metrology_evaluation.py \
--prepare-collection-plan \
--plan-sessions 4 \
--plan-remounts 2 \
--output outputs/solid-state-metrology/plan.yaml \
--markdown-output outputs/solid-state-metrology/plan.md
The generated packet is intentionally INCONCLUSIVE/review: it contains
placeholders, not measurements. Validate it before editing:
calibrex validate outputs/solid-state-metrology/plan.yaml \
--kind solid-state-metrology-evaluation
The session/remount layout is:
| Session | Remount | Capture | Independent reference | Solver estimate |
|---|---|---|---|---|
session-00 |
remount-1 |
before remount | required | required |
session-01 |
remount-2 |
after remount | required | required |
session-02 |
remount-1 |
repeat | required | required |
session-03 |
remount-2 |
repeat | required | required |
The minimum gate is three usable sessions across two remounts. Four sessions make the first collection easier to diagnose and leave one repeat per mount.
2. Collect the captures¶
Use the same static scene and sensor configuration for all four sessions. The scene should contain geometry across the overlapping field of view, depth, and orientation; a flat wall alone is a poor six-DoF calibration target. Move the rig through several poses while preserving enough overlap for the chosen solver. Record the exact sensor serials, firmware, temperature, frame names, recording start/stop times, and any dropped or rejected windows.
Run capture readiness on each candidate window before spending time on the solver. It checks motion excitation, geometry diversity, and a six-DoF observability proxy:
calibrex calibration-readiness path/to/config.yaml \
--output outputs/solid-state-metrology/readiness-session-00.yaml
Keep a RECAPTURE result as evidence of a failed collection attempt; do not
silently select a favorable window after inspecting calibration error.
3. Measure an independent reference for every session¶
For each session, fill sessions[*].reference with both parts of the physical
reference:
transform: the measured source-to-target extrinsic, using one declared frame convention;time_offset_sec: the measured clock relationship used by the capture.
Use a method that does not consume the solver estimate. Supported method names
are surveyed_rig, optical_tracker, robot_arm, calibration_target, and
mechanical_cad; supported clock methods are hardware_trigger, common_pps,
ptp, external_timebase, and timestamp_injection.
Record the uncertainty for rotation, translation, and time. Also set
independent_of_solver: true, set the transform provenance level to
independently_measured, and attach the survey/measurement file in
source_paths. The global reference record should describe the common
protocol and frame/time convention; the session reference is the value used
for that particular capture.
Do not copy one global transform into all sessions. A remount is precisely the condition that tests whether the calibration remains valid after mechanical reinstallation.
4. Preserve the evidence tree¶
Keep paths relative to plan.yaml so the packet can be moved and reviewed as
a unit. A practical layout is:
outputs/solid-state-metrology/
plan.yaml
plan.md
captures/
session-00.mcap
session-01.mcap
session-02.mcap
session-03.mcap
metrology/
reference-protocol.yaml
session-00-reference.yaml
session-01-reference.yaml
session-02-reference.yaml
session-03-reference.yaml
estimates/
session-00.yaml
session-01.yaml
session-02.yaml
session-03.yaml
holdout/
downstream-metric.yaml
Fill sessions[*].capture_sha256, each session reference's
source_sha256[path], and each estimate's source_sha256 only after the
files are finalized. For example:
sha256sum captures/session-00.mcap
sha256sum metrology/session-00-reference.yaml
sha256sum estimates/session-00.yaml
On PowerShell, use Get-FileHash -Algorithm SHA256 path\to\file.
5. Run the solver and keep a held-out check¶
Run the selected calibration method on the capture and write its transform and
time estimate into the matching estimates/session-XX.yaml. The estimate
source must be linked to exactly one session. Do not use the downstream metric,
the independent survey values, or the held-out recording to tune the solver.
The downstream metric must be declared before looking at the final result. It
can be a task-level camera/LiDAR alignment score, held-out map consistency, or
another physical-use metric, but it must have an explicit unit, threshold, and
held_out: true / independent_of_solver: true evidence.
6. Enforce the packet¶
After all references, estimates, and digests are filled, evaluate the packet:
python tools/run_solid_state_metrology_evaluation.py \
--input outputs/solid-state-metrology/plan.yaml \
--output outputs/solid-state-metrology/final.yaml \
--markdown-output outputs/solid-state-metrology/final.md \
--enforce
calibrex validate outputs/solid-state-metrology/final.yaml \
--kind solid-state-metrology-evaluation
--enforce verifies that every declared reference, capture, and estimate
source exists relative to the input packet and has the declared SHA-256. It
also checks unique IDs and estimate-to-session links. A missing, mismatched,
or structurally inconsistent source blocks a physical PASS; missing physical
measurements remain planned or inconclusive.
Before publishing, review final.md and the saved evidence_integrity block.
The result is only a physical claim when the numerical thresholds, uncertainty
limits, remount coverage, and held-out metric all pass together.