Skip to content

Add fiducial localization and explicit program camera sources - #56

Draft
Jepson2k wants to merge 22 commits into
feat/camera-calibration-datafrom
feat/vision-localization
Draft

Jepson2k wants to merge 22 commits into
feat/camera-calibration-datafrom
feat/vision-localization

Conversation

@Jepson2k

@Jepson2k Jepson2k commented Sep 7, 2026 •

Copy link
Copy Markdown
Owner

Programs can locate a printed ChArUco board from saved fixed or tool-camera calibration. locate_board returns a WRF pose, host receipt time, quality metrics, and typed found/missing/rejected outcomes. The pure localization function accepts an explicit image, checks calibration bindings, and rejects poor or ambiguous planar solutions using OpenCV IPPE. It does not command motion.

Launched Python programs use an explicit CommanderCameraSource to request fresh images from Commander's active camera through an authenticated loopback session. Each session ends with its process. Standalone programs can supply their own FrameSource; preview requires an explicit ImageFixture and never opens the live source. Tool cameras require stationary observations with matching tool/TCP transforms. The Skills panel inserts fixed calibration/setup snapshots and the explicit source; the program log reports detection outcomes.

Validation: image geometry/quality/preview and script-runner workflows passed (9 tests); the full camera-service, generated-program, isolated-fixture preview, and hardware-WebGL browser batch passed (6 tests, 1 platform skip). The PAR6 runtime workflow passed, including tool-camera localization and program-stop queue cancellation. Final populated-panel screenshot and all pre-commit checks passed. Tests use rendered board images, PAROL6 fake serial, and par6d --sim; they do not establish physical localization accuracy.

Stacked on #55. Requires waldoctl camera data #31. Matching feat/vision-localization dependency refs point at the existing camera-contract and backend heads; no additional backend changes are needed.

Program execution also keeps preview pose updates out of running or stepped programs. Programmatic slider updates no longer issue simulator teleports, and completion barriers do not mistake a wait timeout for command completion. Both regressions failed before their fixes. The native PAR6 long-delay/Stop/subsequent-command workflow and 17 affected stepping checks pass; pre-commit checks pass.

CI follow-up: the skill-form browser wait now tolerates tooltip removal during visibility checks. A Windows 3.12 collision refusal remains under investigation; the complete local collision-world, control-lease, jogging, and capture/recorded-insertion sequence passes all 52 checks. Failed joint-limit motion now includes full controller error, collision pairs, world, tool, and joint context in the test report. CI for the updated head is pending.

Vision skill arguments share the compact setup selector, with optional per-argument overrides and concise camera guidance.

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 — Locate board form with a saved camera calibration fixture.

PAROL6 — Locate board form with a saved camera calibration fixture.

PAR6 — Locate board form with a saved camera calibration fixture.

PAR6 — Locate board form with a saved camera calibration fixture.

Jepson2k and others added 19 commits September 8, 2026 06:06
# Conflicts:
#	waldo_commander/components/skill_library.py
…served

The skill passed the calibration's own backend into localize_board, so
validate's 'robot backend changed; recalibrate' check compared the
calibration against itself and could never fire. It passes the backend the
client advertises now.

A tool camera's localization brackets its capture with arm observations --
two status frames each way plus two transform reads -- and those ran on the
image-acquisition budget. A documented-legal short timeout therefore failed
every tool-camera localization with a message blaming the operator's arm for
moving. They have their own budget.

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

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

# Conflicts:
#	waldo_commander/components/skill_library.py
isinstance against the DryRunClient protocol resolves members statically
and never matches the preview wrapper or the skill guard; is_dry_run asks
the way a call would.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N8zt66KjkzgZLtQuSfJd9r

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