Skip to content

Add fixed camera calibration and named camera setup data - #55

Draft
Jepson2k wants to merge 20 commits into
feat/named-device-signalsfrom
feat/camera-calibration-data
Draft

Jepson2k wants to merge 20 commits into
feat/named-device-signalsfrom
feat/camera-calibration-data

Conversation

@Jepson2k

@Jepson2k Jepson2k commented Sep 7, 2026 •

Copy link
Copy Markdown
Owner

Camera calibration can now describe a camera on the tool or fixed in the workspace, and saves typed measurements into named setup snapshots for Python use. The panel provides explicit reload/check and snapshot export. Reload/check waits up to one second for a newly received frame within the active camera session, so a temporary capture gap does not mask the setup binding check. Existing per-tool hand-eye measurements can be imported after confirming and checking their camera/tool binding; the original measurements remain saved.

Capture pairs fresh host-received images with stationary controller observations. Samples cannot span camera sessions, tool/TCP changes or resolutions. Fixed-camera solving uses the existing OpenCV hand-eye solver with inverse robot poses. Stored calibration checks cover acquisition, tool/TCP and named reference-frame changes; scene overlays clear when the binding cannot be verified.

Camera source identity reflects the configured device and capture dimensions. Hardware exposure synchronization, swapping a physical camera at the same device index, lens changes and remounting are not automatically detected; those physical changes require recalibration.

Validation: a real capture-gap regression first failed with a stale-frame refusal, then the complete tool and fixed-camera workflows passed on both the calibration and recording branches. Shared-contract tests, rendered-board tool/fixed solves, full panel capture/save/load/export/import workflows, fresh/stale camera snapshots and automatic calibration/stop behavior. The populated Chromium browser check passed with hardware WebGL on the Raspberry Pi; existing WC ↔ PAR6 native integration passed (27.2s). Browser validation exposed and verified fixes for camera-route registration after app rebuild and clipped content in the resizable panel.

Latest CI passes all nine OS/Python combinations, lint, and the native PAR6 integration. Each primary suite contains 399 cases: Linux has 397 passes and two skips; macOS/Windows have 362 passes and 37 documented browser/platform skips. Both full manual calibration workflows pass on every platform.

Stacked on #54; contract companion waldoctl #31. Uses the existing PAROL6 and PAR6 client APIs without firmware or wire changes. Dependency release: waldoctl v0.17.0.

Camera calibration uses a narrower panel, concise labels and responsive fields, with a clear Save calibration action.

Screenshots — revised interface, PAROL6 and PAR6

Captured in Chromium on September 10 from the combined feature stack; shared panels may include later PRs. PAROL6 uses fake serial; PAR6 uses par6d --sim.

PAROL6 — saved fixed-camera calibration, solved from rendered ChArUco fixtures.

PAROL6 — saved fixed-camera calibration, solved from rendered ChArUco fixtures.

PAR6 — saved fixed-camera calibration, solved from rendered ChArUco fixtures.

PAR6 — saved fixed-camera calibration, solved from rendered ChArUco fixtures.

Jepson2k and others added 17 commits September 7, 2026 14:29
… Setup saves

Every page build restarted the camera on the same device, minting a new
capture session that refused all later captures as "camera changed" and
aborted a running auto-calibration on a reload. Transient acquisition
failures (a dropped frame, an arm still settling, a mid-capture tool
readback) were raised as fatal, so the auto run's retry loop never saw
them. The Setup panel saved its own in-memory copy over the whole file,
silently deleting a camera calibration the calibration panel had saved
since the Setup panel last loaded.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…era-calibration-data

# Conflicts:
#	tests/test_named_setup.py
The restart test compared a snapshot's JPEG with a holder it had just
assigned that JPEG to, which cannot fail. What the restart owes the caller
is fresh frames after the cache expired, so that is what it checks now.

The browser layout test says what it is: a layout check of the panel's
widest state, whose solve and save are the real ones and whose samples are
handed over rather than captured pose by pose -- the workflow itself is
covered by the integration test.

SKIP=ty: pre-existing DryRunRobotClient.skill_capabilities diagnostic.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants