From fe7a7de5874ffbc4ba290e97aae6a863205dd4f0 Mon Sep 17 00:00:00 2001 From: cc Date: Thu, 4 Jun 2026 13:41:32 -0700 Subject: [PATCH 01/57] spec: openspec init --- .gitignore | 2 + docs/coding-agents/index.md | 1 + docs/development/openspec.md | 102 ++++++++++++++ docs/docs.json | 1 + openspec/config.yaml | 45 ++++++ openspec/schemas/dimos-capability/schema.yaml | 128 ++++++++++++++++++ .../dimos-capability/templates/design.md | 35 +++++ .../dimos-capability/templates/docs.md | 19 +++ .../dimos-capability/templates/proposal.md | 32 +++++ .../dimos-capability/templates/spec.md | 16 +++ .../dimos-capability/templates/tasks.md | 15 ++ 11 files changed, 396 insertions(+) create mode 100644 docs/development/openspec.md create mode 100644 openspec/config.yaml create mode 100644 openspec/schemas/dimos-capability/schema.yaml create mode 100644 openspec/schemas/dimos-capability/templates/design.md create mode 100644 openspec/schemas/dimos-capability/templates/docs.md create mode 100644 openspec/schemas/dimos-capability/templates/proposal.md create mode 100644 openspec/schemas/dimos-capability/templates/spec.md create mode 100644 openspec/schemas/dimos-capability/templates/tasks.md diff --git a/.gitignore b/.gitignore index 42bdddfa45..787163e787 100644 --- a/.gitignore +++ b/.gitignore @@ -63,8 +63,10 @@ yolo11n.pt # symlink one of .envrc.* if you'd like to use .envrc .claude +.opencode/ **/CLAUDE.md .direnv/ +.omo/ /logs diff --git a/docs/coding-agents/index.md b/docs/coding-agents/index.md index ff778ac5cf..5ac7c854a7 100644 --- a/docs/coding-agents/index.md +++ b/docs/coding-agents/index.md @@ -3,6 +3,7 @@ ├── worktrees.md (creating provisioned worktrees with `bin/worktree`) ├── style.md (code style guidelines for dimos) ├── testing.md (docs about writing tests) +├── ../development/openspec.md (OpenSpec behavior-spec workflow) ├── docs (these are docs about writing docs) │   ├── codeblocks.md │   ├── doclinks.md diff --git a/docs/development/openspec.md b/docs/development/openspec.md new file mode 100644 index 0000000000..280eb0f57e --- /dev/null +++ b/docs/development/openspec.md @@ -0,0 +1,102 @@ +# OpenSpec Workflow + +DimOS uses OpenSpec as the checked-in planning layer for behavior changes. OpenSpec artifacts live under `openspec/` and should describe what the system is supposed to do, why it is changing, and how contributors or agents should validate the work. + +## Terminology + +Keep these two meanings separate: + +- **OpenSpec capability spec**: Markdown requirements under `openspec/specs//spec.md`. These describe observable behavior and acceptance scenarios. +- **DimOS Spec**: Python Protocol/RPC contracts in files like `dimos/navigation/navigation_spec.py` or `dimos/manipulation/control/arm_driver_spec.py`. These describe module interfaces for code wiring. + +Use "OpenSpec capability spec" in prose when there is any chance of confusion. + +## Schema + +The project uses the `dimos-capability` schema configured in `openspec/config.yaml`. + +The artifact flow is: + +```text +proposal + ├── specs + ├── design + └── docs + └── tasks +``` + +| Artifact | Purpose | +|---|---| +| `proposal.md` | Intent, scope, affected DimOS surfaces, and capability impact. | +| `specs//spec.md` | Behavior-first requirements and scenarios. | +| `design.md` | Module, stream, blueprint, skill/MCP, safety, and rollout decisions. | +| `docs.md` | Documentation impact and doc validation plan. | +| `tasks.md` | Implementation, docs, verification, and manual QA checklist. | + +## When to create a change + +Create an OpenSpec change when work changes observable behavior, public CLI/API/MCP behavior, robot behavior, hardware/simulation/replay workflows, docs that users rely on, or cross-module architecture. + +Do not create a change for a purely mechanical refactor, typo fix, or internal cleanup unless it changes behavior or needs cross-session planning context. + +## Writing specs + +OpenSpec capability specs are behavior contracts, not implementation plans. + +Good spec content: + +- User- or developer-visible behavior. +- Public CLI/API/MCP tool behavior. +- Stream or message behavior that downstream modules rely on. +- Robot safety constraints and hardware/simulation/replay expectations. +- Scenarios that can be tested or manually verified. + +Avoid in specs: + +- Private class/function names. +- Generated-file mechanics. +- Library choices and wiring details. +- Step-by-step implementation tasks. + +Put those details in `design.md` or `tasks.md`. + +## Capability names + +Prefer behavior-domain names over code names. Useful starting points: + +- `module-system` +- `blueprint-composition` +- `cli-lifecycle` +- `agent-skills-mcp` +- `configuration` +- `navigation-stack` +- `manipulation-stack` +- `hardware-adapters` +- `simulation-replay` +- `documentation-system` + +Add specs progressively as changes need them. Do not try to backfill the whole project at once. + +## Validation + +Use OpenSpec validation before implementation and before archiving: + +```bash skip +openspec schema validate dimos-capability +openspec validate +openspec templates --json +``` + +For documentation changes, also run the relevant doc checks from [Writing Docs](/docs/development/writing_docs.md): + +```bash skip +md-babel-py run +``` + +When a change touches blueprint names, module-level blueprint variables, or module registry inputs, run: + +```bash skip +pytest dimos/robot/test_all_blueprints_generation.py +``` + +Then run focused tests for the changed code and manually QA through the actual surface: CLI command, MCP tool, HTTP API, simulation/replay blueprint, hardware procedure, or library driver. diff --git a/docs/docs.json b/docs/docs.json index 58da2ff6a1..f0064c9ab9 100644 --- a/docs/docs.json +++ b/docs/docs.json @@ -144,6 +144,7 @@ "group": "Development", "pages": [ "development/conventions", + "development/openspec", "development/testing", "development/docker", "development/grid_testing", diff --git a/openspec/config.yaml b/openspec/config.yaml new file mode 100644 index 0000000000..62a72bba63 --- /dev/null +++ b/openspec/config.yaml @@ -0,0 +1,45 @@ +schema: dimos-capability + +context: | + DimOS is a robotics operating system for generalist robots. Modules communicate + through typed streams (`In[T]`, `Out[T]`) over LCM, SHM, ROS, DDS, or other + transports. Blueprints compose modules into runnable robot stacks. Skills are + `@skill`-annotated RPC methods exposed to agents and MCP clients. + + Terminology boundary: + - "OpenSpec spec" means a behavior specification under `openspec/specs/`. + - "DimOS Spec" means a Python Protocol/RPC contract in `*_spec.py` files, + usually inheriting `dimos.spec.utils.Spec` and `typing.Protocol`. + Keep these separate. OpenSpec specs describe observable behavior; DimOS Specs + describe code-level module interfaces. + + OpenSpec specs should capture current behavior, user/developer-visible + outcomes, public CLI/API/tool surfaces, robot safety constraints, and testable + scenarios. Put implementation choices, class names, module wiring, generated + registry updates, and rollout details in `design.md` or `tasks.md`. + + Documentation lives in: + - `docs/usage/` for user-facing concepts and APIs. + - `docs/capabilities/` for capability and platform guides. + - `docs/development/` for contributor process. + - `docs/coding-agents/` and `AGENTS.md` for coding-agent guidance. + +rules: + proposal: + - "Identify affected DimOS surfaces: modules, streams, blueprints, CLI, skills/MCP, docs, hardware, simulation, replay, or generated registries." + - Use capability names that match behavior domains, not Python class names. + - Mark hardware safety or public API/CLI changes explicitly. + specs: + - Write behavior-first requirements; avoid implementation detail unless it is externally observable. + - Every requirement must include at least one `#### Scenario:` block with concrete observable outcomes. + - Use "OpenSpec capability spec" when prose might otherwise be confused with DimOS Python `Spec` Protocols. + design: + - Call out DimOS `Spec` Protocols, adapter Protocols, blueprint composition, stream names/types, and skill/MCP exposure when relevant. + - Mention generated files and required regeneration commands, especially `pytest dimos/robot/test_all_blueprints_generation.py` for blueprint registry changes. + - Include hardware/simulation/replay assumptions and safety constraints for robot-facing work. + docs: + - List user-facing docs, contributor docs, coding-agent docs, and AGENTS.md updates required by the change. + - Include documentation validation commands for changed docs, such as `doclinks` and `md-babel-py run ` where applicable. + tasks: + - Include verification tasks for OpenSpec validation, relevant pytest targets, type checks when needed, and manual QA through the user-facing surface. + - Add registry generation tasks when blueprint names, module classes, or generated registry inputs change. diff --git a/openspec/schemas/dimos-capability/schema.yaml b/openspec/schemas/dimos-capability/schema.yaml new file mode 100644 index 0000000000..fedb7964ee --- /dev/null +++ b/openspec/schemas/dimos-capability/schema.yaml @@ -0,0 +1,128 @@ +name: dimos-capability +version: 1 +description: DimOS capability workflow - proposal → specs/design/docs → tasks +artifacts: + - id: proposal + generates: proposal.md + description: DimOS change proposal covering intent, scope, capability impact, and affected robot/software surfaces + template: proposal.md + instruction: | + Create the proposal document that establishes WHY this change is needed and what DimOS behavior it affects. + + Sections: + - **Why**: 1-2 concise paragraphs on the problem or opportunity. Explain why the change matters now. + - **What Changes**: Bullet list of added, modified, or removed behavior. Mark public API/CLI or hardware-safety breaking changes with **BREAKING**. + - **Affected DimOS Surfaces**: Identify modules, streams, blueprints, CLI commands, skills/MCP tools, docs, hardware, simulation, replay, generated registries, or external protocols touched by the change. + - **Capabilities**: Identify which OpenSpec capability specs will be created or modified: + - **New Capabilities**: List behavior domains introduced by the change. Each becomes `specs//spec.md`. Use kebab-case names (for example, `agent-skills-mcp`, `blueprint-composition`, `manipulation-stack`). + - **Modified Capabilities**: List existing `openspec/specs//` entries whose requirements change. Only include spec-level behavior changes, not implementation-only refactors. + - **Impact**: Summarize user/developer impact, compatibility risks, dependency changes, documentation updates, and test/QA scope. + + Keep proposals concise. Do not include line-by-line implementation details; put architecture and rollout decisions in `design.md`. + requires: [] + - id: specs + generates: specs/**/*.md + description: Behavior-first OpenSpec capability delta specifications + template: spec.md + instruction: | + Create OpenSpec capability specs that define WHAT DimOS should do, not how it is implemented. + + Create one delta spec file per capability listed in proposal.md: + - New capabilities: use `specs//spec.md` with the exact kebab-case name from the proposal. + - Modified capabilities: use the existing folder from `openspec/specs//`. + + Use these delta sections as `##` headers: + - **ADDED Requirements**: New externally observable behavior. + - **MODIFIED Requirements**: Changed behavior. Include the full updated requirement block, not a partial patch. + - **REMOVED Requirements**: Deprecated behavior. Include **Reason** and **Migration**. + - **RENAMED Requirements**: Name-only changes. Use FROM:/TO: format. + + Requirement format: + - Use `### Requirement: `. + - Use SHALL/MUST for normative requirements. + - Include at least one `#### Scenario: ` per requirement. Scenario headings MUST use exactly four `#` characters. + - Prefer `- **GIVEN**`, `- **WHEN**`, `- **THEN**`, and `- **AND**` bullets. + - Cover happy path plus meaningful edge/error/safety cases. + + DimOS-specific guidance: + - Specify user/developer-visible behavior, robot outcomes, CLI behavior, skill/MCP tool behavior, stream contracts, safety constraints, and compatibility expectations. + - Avoid Python class names, private module internals, transport implementation choices, and generated-file details unless those details are observable API contracts. + - Use "OpenSpec capability spec" in prose when needed to avoid confusion with DimOS Python `Spec` Protocols. + - If the behavior only changes implementation and not observable requirements, do not create a spec delta. + requires: + - proposal + - id: design + generates: design.md + description: DimOS technical design and architecture decisions + template: design.md + instruction: | + Create the design document that explains HOW the change should be implemented in DimOS. + + Include design.md for cross-module changes, new robot/hardware integration, new public interfaces, new dependencies, safety-sensitive behavior, generated registry changes, or unclear architecture. + + Sections: + - **Context**: Current state, relevant modules/blueprints/docs, and constraints. + - **Goals / Non-Goals**: What the design achieves and explicitly excludes. + - **DimOS Architecture**: Modules, streams, transports, blueprints, RPC/module refs, DimOS `Spec` Protocols, adapter Protocols, skills/MCP exposure, CLI entry points, and generated registries involved. + - **Decisions**: Key choices with rationale and alternatives considered. + - **Safety / Simulation / Replay**: Hardware assumptions, sim/replay behavior, safety constraints, and manual QA surface. + - **Risks / Trade-offs**: Known risks and mitigations. + - **Migration / Rollout**: Compatibility, generated files, docs, and deployment steps. + - **Open Questions**: Outstanding decisions or unknowns. + + Reference proposal.md for intent and specs for behavior. Keep line-by-line work in tasks.md. + requires: + - proposal + - id: docs + generates: docs.md + description: Documentation impact plan for user, contributor, and coding-agent docs + template: docs.md + instruction: | + Create the documentation impact plan for the change. + + Sections: + - **User-Facing Docs**: Updates under `docs/usage/`, `docs/capabilities/`, `docs/platforms/`, or README files. + - **Contributor Docs**: Updates under `docs/development/`. + - **Coding-Agent Docs**: Updates under `docs/coding-agents/` or `AGENTS.md`. + - **Doc Validation**: Commands needed for changed docs, such as `doclinks`, `md-babel-py run `, and `bin/gen-diagrams`. + - **No Docs Needed**: If no docs are needed, explain why. + + Match `docs/development/writing_docs.md`: contributor-only docs belong in `docs/development`; user-facing behavior belongs in `docs/usage` or `docs/capabilities`. + requires: + - proposal + - id: tasks + generates: tasks.md + description: Implementation, validation, docs, and manual-QA checklist + template: tasks.md + instruction: | + Create the implementation checklist. The apply phase parses checkbox format, so every actionable task MUST use `- [ ]`. + + Guidelines: + - Group tasks under numbered `##` headings. + - Each task must be `- [ ] X.Y Task description`. + - Keep tasks small enough to complete in one focused session. + - Order tasks by dependency. + - Include docs and validation tasks from docs.md. + - Include generated registry tasks when blueprints or module registry inputs change. + - Include manual QA through the actual user surface: CLI, TUI, HTTP API, MCP tool, simulation/replay blueprint, hardware procedure, or library driver. + + Typical DimOS validation tasks: + - Run `openspec validate `. + - Run focused pytest targets for changed modules. + - Run `pytest dimos/robot/test_all_blueprints_generation.py` when blueprint registry output may change. + - Run docs validation commands for changed docs. + - Run lints/types when the touched area requires them. + + Reference specs for WHAT, design for HOW, and docs.md for documentation work. + requires: + - specs + - design + - docs +apply: + requires: + - tasks + tracks: tasks.md + instruction: | + Read proposal.md, specs, design.md, docs.md, and tasks.md before editing code. + Work through pending tasks, mark checkboxes complete as they finish, and keep artifacts current when implementation changes the plan. + Verify with OpenSpec validation, focused tests, docs checks, and manual QA through the relevant DimOS surface. diff --git a/openspec/schemas/dimos-capability/templates/design.md b/openspec/schemas/dimos-capability/templates/design.md new file mode 100644 index 0000000000..25031ceb8b --- /dev/null +++ b/openspec/schemas/dimos-capability/templates/design.md @@ -0,0 +1,35 @@ +## Context + + + +## Goals / Non-Goals + +**Goals:** + + +**Non-Goals:** + + +## DimOS Architecture + + + +## Decisions + + + +## Safety / Simulation / Replay + + + +## Risks / Trade-offs + + + +## Migration / Rollout + + + +## Open Questions + + diff --git a/openspec/schemas/dimos-capability/templates/docs.md b/openspec/schemas/dimos-capability/templates/docs.md new file mode 100644 index 0000000000..d274aed653 --- /dev/null +++ b/openspec/schemas/dimos-capability/templates/docs.md @@ -0,0 +1,19 @@ +## User-Facing Docs + + + +## Contributor Docs + + + +## Coding-Agent Docs + + + +## Doc Validation + + + +## No Docs Needed + + diff --git a/openspec/schemas/dimos-capability/templates/proposal.md b/openspec/schemas/dimos-capability/templates/proposal.md new file mode 100644 index 0000000000..98d409e8de --- /dev/null +++ b/openspec/schemas/dimos-capability/templates/proposal.md @@ -0,0 +1,32 @@ +## Why + + + +## What Changes + + + +## Affected DimOS Surfaces + + +- Modules/streams: +- Blueprints/CLI: +- Skills/MCP: +- Hardware/simulation/replay: +- Docs/generated registries: + +## Capabilities + +### New Capabilities + +- ``: + +### Modified Capabilities + +- ``: + +## Impact + + diff --git a/openspec/schemas/dimos-capability/templates/spec.md b/openspec/schemas/dimos-capability/templates/spec.md new file mode 100644 index 0000000000..afc0c1ff58 --- /dev/null +++ b/openspec/schemas/dimos-capability/templates/spec.md @@ -0,0 +1,16 @@ +## ADDED Requirements + +### Requirement: + + +#### Scenario: +- **GIVEN** +- **WHEN** +- **THEN** +- **AND** + + diff --git a/openspec/schemas/dimos-capability/templates/tasks.md b/openspec/schemas/dimos-capability/templates/tasks.md new file mode 100644 index 0000000000..b38fcdfabb --- /dev/null +++ b/openspec/schemas/dimos-capability/templates/tasks.md @@ -0,0 +1,15 @@ +## 1. Implementation + +- [ ] 1.1 +- [ ] 1.2 + +## 2. Documentation + +- [ ] 2.1 + +## 3. Verification + +- [ ] 3.1 Run `openspec validate ` +- [ ] 3.2 Run focused tests for changed code +- [ ] 3.3 Run docs validation commands for changed docs +- [ ] 3.4 Manually QA through the relevant DimOS surface (CLI, MCP, simulation/replay, hardware procedure, HTTP API, or library driver) From 76158b261a9a4c3f0509bc7a218db7cfe1010e44 Mon Sep 17 00:00:00 2001 From: cc Date: Mon, 8 Jun 2026 16:20:39 -0700 Subject: [PATCH 02/57] chore: revert change to doc folder --- docs/coding-agents/index.md | 1 - docs/development/openspec.md | 102 ----------------------------------- docs/docs.json | 1 - 3 files changed, 104 deletions(-) delete mode 100644 docs/development/openspec.md diff --git a/docs/coding-agents/index.md b/docs/coding-agents/index.md index 5ac7c854a7..ff778ac5cf 100644 --- a/docs/coding-agents/index.md +++ b/docs/coding-agents/index.md @@ -3,7 +3,6 @@ ├── worktrees.md (creating provisioned worktrees with `bin/worktree`) ├── style.md (code style guidelines for dimos) ├── testing.md (docs about writing tests) -├── ../development/openspec.md (OpenSpec behavior-spec workflow) ├── docs (these are docs about writing docs) │   ├── codeblocks.md │   ├── doclinks.md diff --git a/docs/development/openspec.md b/docs/development/openspec.md deleted file mode 100644 index 280eb0f57e..0000000000 --- a/docs/development/openspec.md +++ /dev/null @@ -1,102 +0,0 @@ -# OpenSpec Workflow - -DimOS uses OpenSpec as the checked-in planning layer for behavior changes. OpenSpec artifacts live under `openspec/` and should describe what the system is supposed to do, why it is changing, and how contributors or agents should validate the work. - -## Terminology - -Keep these two meanings separate: - -- **OpenSpec capability spec**: Markdown requirements under `openspec/specs//spec.md`. These describe observable behavior and acceptance scenarios. -- **DimOS Spec**: Python Protocol/RPC contracts in files like `dimos/navigation/navigation_spec.py` or `dimos/manipulation/control/arm_driver_spec.py`. These describe module interfaces for code wiring. - -Use "OpenSpec capability spec" in prose when there is any chance of confusion. - -## Schema - -The project uses the `dimos-capability` schema configured in `openspec/config.yaml`. - -The artifact flow is: - -```text -proposal - ├── specs - ├── design - └── docs - └── tasks -``` - -| Artifact | Purpose | -|---|---| -| `proposal.md` | Intent, scope, affected DimOS surfaces, and capability impact. | -| `specs//spec.md` | Behavior-first requirements and scenarios. | -| `design.md` | Module, stream, blueprint, skill/MCP, safety, and rollout decisions. | -| `docs.md` | Documentation impact and doc validation plan. | -| `tasks.md` | Implementation, docs, verification, and manual QA checklist. | - -## When to create a change - -Create an OpenSpec change when work changes observable behavior, public CLI/API/MCP behavior, robot behavior, hardware/simulation/replay workflows, docs that users rely on, or cross-module architecture. - -Do not create a change for a purely mechanical refactor, typo fix, or internal cleanup unless it changes behavior or needs cross-session planning context. - -## Writing specs - -OpenSpec capability specs are behavior contracts, not implementation plans. - -Good spec content: - -- User- or developer-visible behavior. -- Public CLI/API/MCP tool behavior. -- Stream or message behavior that downstream modules rely on. -- Robot safety constraints and hardware/simulation/replay expectations. -- Scenarios that can be tested or manually verified. - -Avoid in specs: - -- Private class/function names. -- Generated-file mechanics. -- Library choices and wiring details. -- Step-by-step implementation tasks. - -Put those details in `design.md` or `tasks.md`. - -## Capability names - -Prefer behavior-domain names over code names. Useful starting points: - -- `module-system` -- `blueprint-composition` -- `cli-lifecycle` -- `agent-skills-mcp` -- `configuration` -- `navigation-stack` -- `manipulation-stack` -- `hardware-adapters` -- `simulation-replay` -- `documentation-system` - -Add specs progressively as changes need them. Do not try to backfill the whole project at once. - -## Validation - -Use OpenSpec validation before implementation and before archiving: - -```bash skip -openspec schema validate dimos-capability -openspec validate -openspec templates --json -``` - -For documentation changes, also run the relevant doc checks from [Writing Docs](/docs/development/writing_docs.md): - -```bash skip -md-babel-py run -``` - -When a change touches blueprint names, module-level blueprint variables, or module registry inputs, run: - -```bash skip -pytest dimos/robot/test_all_blueprints_generation.py -``` - -Then run focused tests for the changed code and manually QA through the actual surface: CLI command, MCP tool, HTTP API, simulation/replay blueprint, hardware procedure, or library driver. diff --git a/docs/docs.json b/docs/docs.json index f0064c9ab9..58da2ff6a1 100644 --- a/docs/docs.json +++ b/docs/docs.json @@ -144,7 +144,6 @@ "group": "Development", "pages": [ "development/conventions", - "development/openspec", "development/testing", "development/docker", "development/grid_testing", From 4e25297e72a260e5dcba0365941aceaee3a72993 Mon Sep 17 00:00:00 2001 From: cc Date: Sun, 19 Jul 2026 22:44:26 -0700 Subject: [PATCH 03/57] add mattskill --- docs/agents/domain.md | 60 ++++++++++++++++++++++++++++++++++ docs/agents/issue-tracker.md | 62 ++++++++++++++++++++++++++++++++++++ 2 files changed, 122 insertions(+) create mode 100644 docs/agents/domain.md create mode 100644 docs/agents/issue-tracker.md diff --git a/docs/agents/domain.md b/docs/agents/domain.md new file mode 100644 index 0000000000..e1de27973a --- /dev/null +++ b/docs/agents/domain.md @@ -0,0 +1,60 @@ +# DimOS agent domain context + +## Context loading + +Before working on a change, load the repository context in this order: + +1. Read `AGENTS.md` and follow its applicable instructions. +2. Read `openspec/config.yaml` for the OpenSpec schema, terminology, and rules. +3. Read the relevant files under `openspec/specs/`. +4. Read the root `CONTEXT.md` if it exists. +5. Read relevant records under `docs/adr/` if that directory exists. + +`CONTEXT.md` and `docs/adr/` are optional. If either is absent, continue +silently; do not report the absence as an error. Select specs and ADRs based on +the affected behavior and implementation surface rather than reading +unrelated material. + +## Two meanings of “spec” + +Keep these terms separate: + +- An **OpenSpec spec** is a behavior specification under `openspec/specs/`. + It describes observable behavior, user or developer outcomes, public + interfaces, safety constraints, and testable scenarios. +- A **DimOS Python Spec Protocol** is a code-level interface contract, usually + a `Protocol` inheriting from `dimos.spec.utils.Spec`, often found in a + `*_spec.py` file. It describes module RPCs and injected interfaces. + +An OpenSpec spec is not a Python Protocol, and a Python Protocol does not +replace an OpenSpec behavioral requirement. Keep implementation details such as +class names, module wiring, stream types, generated registries, and rollout +steps in the OpenSpec change design or tasks unless they are externally +observable. + +## Work layout + +Organize work through this chain: + +```text +Linear issue -> OpenSpec change -> implementation tasks -> pull request +``` + +Linear provides intake and tracking. The OpenSpec change is the source of truth +for the behavioral change, design, and tasks. The pull request implements and +reviews those tasks. Keep the identifiers and links aligned across all three +artifacts; any Linear link edit requires user confirmation before it is made. + +When a task affects behavior, update the relevant OpenSpec change and, where +appropriate, the corresponding spec under `openspec/specs/`. Include concrete +scenarios for behavioral requirements. Call out DimOS Python Spec Protocols, +blueprint composition, streams, skills/MCP exposure, generated files, and +hardware, simulation, or replay assumptions in design and task material when +they are relevant. + +## Conflicting guidance + +Surface conflicts between an ADR and an OpenSpec spec explicitly. Do not +silently reconcile, overwrite, or guess which decision applies. Report the +conflict, identify the affected behavior or implementation, and ask for the +decision or update the authoritative document only when instructed. diff --git a/docs/agents/issue-tracker.md b/docs/agents/issue-tracker.md new file mode 100644 index 0000000000..c0db692d0f --- /dev/null +++ b/docs/agents/issue-tracker.md @@ -0,0 +1,62 @@ +# Issue tracking with Linear + +## Workspace + +DimOS work is tracked in the **DIM** team in Linear: + + + +Access Linear through the configured Linear MCP. Do not assume that a local +copy, an unconfigured client, or a direct API call is an alternative source of +truth. + +## Confirmation policy + +User confirmation is required immediately before **every** Linear edit. This +includes, without limitation: + +- creating an issue; +- changing any issue field, including title, description, assignee, priority, + project, or due date; +- adding, removing, or changing labels; +- posting comments; +- changing state or making any other state transition; and +- adding, removing, or changing links. + +Reading Linear is not an edit. Before an edit, state exactly what will change +and wait for explicit user confirmation. One confirmation does not authorize +later edits, even when they concern the same issue or change. + +## Linking convention + +Keep the work chain navigable: + +```text +Linear issue <-> openspec/changes/ <-> pull request +``` + +Use the OpenSpec change ID as the stable identifier in the relationship. Link +the Linear issue to the relevant OpenSpec change and link the pull request to +both when the tools support those links. If a link must be created or changed, +it is a Linear edit and requires confirmation under the policy above. + +## Source of truth and workflow + +Linear is the intake and tracking system. It records requests, ownership, +status, discussion, and delivery progress. OpenSpec is the source of truth for +the behavioral change, its design, and its implementation tasks. The pull +request is the review and delivery vehicle. + +Use this sequence: + +1. Capture or find the Linear issue in the DIM team. +2. Create or update `openspec/changes//` for the proposed behavior, + design, and tasks. +3. Implement the tasks and keep the OpenSpec change current. +4. Open the pull request and connect it to the issue and OpenSpec change. +5. Reflect progress in Linear only after confirming each requested edit. + +Do not use a Linear description, comment, or state as a substitute for an +OpenSpec requirement, design decision, or task. If Linear and OpenSpec +disagree about behavior, treat OpenSpec as authoritative and surface the +discrepancy to the user rather than silently choosing a version. From 8d84764d4e33e6abd42cfbae86d56c72872ff2a8 Mon Sep 17 00:00:00 2001 From: Nabla7 Date: Wed, 19 Aug 2026 18:48:30 +0200 Subject: [PATCH 04/57] feat(g1): SONIC whole-body controller as a coordinator task GEAR-SONIC planner+encoder+decoder ported from the Matrix parity reimplementation into a ControlTask claiming all 29 joints. All 27 locomotion modes RPC-reachable via task_invoke; twist via the standard duck-typed hook; upper-body targets are encoder hints only (never post-decoder overrides). Armature-derived SONIC PD gains carried over exactly, including the doubled ankle/waist entries. Blueprint unitree-g1-sonic-wbc with the standard sim/real dual backend. Verified standalone against raw MuJoCo: 40 s continuous choreography (walk 4 m, squat, boxing, dance) with zero falls and zero NaN at 0.23 ms/step policy latency on CPU onnxruntime. --- .../tasks/g1_sonic_wbc_task/__init__.py | 13 + .../tasks/g1_sonic_wbc_task/_registry.py | 37 + .../g1_sonic_wbc_task/g1_sonic_wbc_task.py | 508 +++++++++++ .../tasks/g1_sonic_wbc_task/sonic_pipeline.py | 834 ++++++++++++++++++ dimos/robot/all_blueprints.py | 1 + .../blueprints/basic/unitree_g1_sonic_wbc.py | 194 ++++ .../navigation/assets/reloc_and_nav_to.webp | Bin 132 -> 1014488 bytes 7 files changed, 1587 insertions(+) create mode 100644 dimos/control/tasks/g1_sonic_wbc_task/__init__.py create mode 100644 dimos/control/tasks/g1_sonic_wbc_task/_registry.py create mode 100644 dimos/control/tasks/g1_sonic_wbc_task/g1_sonic_wbc_task.py create mode 100644 dimos/control/tasks/g1_sonic_wbc_task/sonic_pipeline.py create mode 100644 dimos/robot/unitree/g1/blueprints/basic/unitree_g1_sonic_wbc.py diff --git a/dimos/control/tasks/g1_sonic_wbc_task/__init__.py b/dimos/control/tasks/g1_sonic_wbc_task/__init__.py new file mode 100644 index 0000000000..bc1a2ce5cc --- /dev/null +++ b/dimos/control/tasks/g1_sonic_wbc_task/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2025-2026 Dimensional Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/dimos/control/tasks/g1_sonic_wbc_task/_registry.py b/dimos/control/tasks/g1_sonic_wbc_task/_registry.py new file mode 100644 index 0000000000..00aca23f37 --- /dev/null +++ b/dimos/control/tasks/g1_sonic_wbc_task/_registry.py @@ -0,0 +1,37 @@ +# Copyright 2025-2026 Dimensional Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +TASK_FACTORIES = { + "g1_sonic_wbc": "dimos.control.tasks.g1_sonic_wbc_task.g1_sonic_wbc_task:create_task", +} + +TASK_CONSUMES: dict[str, dict[str, tuple[str, str]]] = { + "g1_sonic_wbc": {"twist_command": ("on_twist_command", "broadcast")}, +} + +TASK_EXPOSES: dict[str, list[str]] = { + "g1_sonic_wbc": [ + "arm", + "disarm", + "set_dry_run", + "reset_runtime_state", + "start", + "set_locomotion_mode", + "list_locomotion_modes", + "set_base_height", + "set_upper_body", + "clear_upper_body", + "state_snapshot", + ], +} diff --git a/dimos/control/tasks/g1_sonic_wbc_task/g1_sonic_wbc_task.py b/dimos/control/tasks/g1_sonic_wbc_task/g1_sonic_wbc_task.py new file mode 100644 index 0000000000..32a04eb17a --- /dev/null +++ b/dimos/control/tasks/g1_sonic_wbc_task/g1_sonic_wbc_task.py @@ -0,0 +1,508 @@ +# Copyright 2025-2026 Dimensional Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""SONIC whole-body-control task for the Unitree G1 humanoid. + +Runs the GEAR-SONIC planner+encoder+decoder pipeline inside the +coordinator tick loop. Unlike the GR00T decoupled task, SONIC is a +UNIFIED policy: it claims all 29 joints at WBC priority. Precise arm +servoing is not this task's job (upper-body targets are encoder hints, +per sonic-notebook DECISIONS.md D3) - pair with the decoupled task and +hot-swap when manipulation accuracy matters. + +Locomotion modes (the 27 GEAR modes: squat, kneel, crawl, boxing, dances, +carrying, jump...) are RPC-reachable via coordinator.task_invoke: + + task_invoke("sonic_wbc", "set_locomotion_mode", {"mode": "HAPPY_DANCE_WALK"}) + task_invoke("sonic_wbc", "set_locomotion_mode", {"mode": None}) # speed-auto +""" + +from __future__ import annotations + +from dataclasses import dataclass +from pathlib import Path +import threading +from typing import TYPE_CHECKING, Any + +import numpy as np +from numpy.typing import NDArray + +from dimos.control.hardware_interface import ConnectedWholeBody +from dimos.control.task import ( + BaseControlTask, + ControlMode, + CoordinatorState, + JointCommandOutput, + ResourceClaim, +) +from dimos.control.tasks.g1_sonic_wbc_task.sonic_pipeline import ( + DEFAULT_ANGLES_DDS, + LOCOMOTION_MODES, + NUM_JOINTS, + SonicPipeline, +) +from dimos.protocol.service.spec import BaseConfig +from dimos.utils.logging_config import setup_logger + +if TYPE_CHECKING: + from dimos.hardware.whole_body.spec import WholeBodyAdapter + from dimos.msgs.geometry_msgs.Twist import Twist + +logger = setup_logger() + + +@dataclass +class G1SonicWBCTaskConfig: + """Configuration for the SONIC WBC task. + + joint_names must be all 29 G1 coordinator joint names in DDS order - + SONIC is a unified whole-body policy and claims every joint. + """ + + encoder_onnx: str | Path + decoder_onnx: str | Path + planner_onnx: str | Path + joint_names: list[str] + priority: int = 50 + decimation: int = 1 + timeout: float = 1.0 + auto_arm: bool = False + auto_dry_run: bool = False + default_ramp_seconds: float = 10.0 + + +class G1SonicWBCTask(BaseControlTask): + """GEAR-SONIC unified 29-DOF whole-body policy as a coordinator task. + + State machine, caches, and safety semantics mirror G1GrootWBCTask: + active-but-unarmed echoes measured positions (pure damping), arm() + ramps to the SONIC default pose, dry-run computes without emitting. + """ + + def __init__( + self, + name: str, + config: G1SonicWBCTaskConfig, + adapter: WholeBodyAdapter, + ) -> None: + if len(config.joint_names) != NUM_JOINTS: + raise ValueError( + f"G1SonicWBCTask '{name}' requires exactly {NUM_JOINTS} joint " + f"names (unified whole-body policy), got {len(config.joint_names)}" + ) + if config.decimation < 1: + raise ValueError(f"G1SonicWBCTask '{name}' requires decimation >= 1") + + self._name = name + self._config = config + self._adapter = adapter + self._joint_names_list = list(config.joint_names) + self._joint_names_set = frozenset(config.joint_names) + + self._pipeline = SonicPipeline( + encoder_path=config.encoder_onnx, + decoder_path=config.decoder_onnx, + planner_path=config.planner_onnx, + ) + + self._default_29 = DEFAULT_ANGLES_DDS.copy() + + self._tick_count = 0 + self._last_targets: list[float] | None = None + + # Last-known-good caches; same missing-joint policy as the GR00T + # task - never substitute 0.0, a zero pose reads as "legs straight" + # and provokes a snap-back. + self._cached_q_29 = self._default_29.copy() + self._cached_dq_29 = np.zeros(NUM_JOINTS, dtype=np.float32) + self._state_seen = False + + self._active = False + self._armed = False + self._arming = False + self._arm_pending = False + self._dry_run = bool(config.auto_dry_run) + self._arming_duration = 0.0 + self._arming_start_t = 0.0 + self._ramp_start: NDArray[np.float32] | None = None + self._last_dry_run_log_t = 0.0 + self._last_diag_log_t = 0.0 + + self._cmd_lock = threading.Lock() + self._cmd = np.zeros(3, dtype=np.float32) + self._last_cmd_time = 0.0 + + # -- ControlTask protocol ---------------------------------------------- + + def claim(self) -> ResourceClaim: + return ResourceClaim( + joints=self._joint_names_set, + priority=self._config.priority, + mode=ControlMode.SERVO_POSITION, + ) + + def is_active(self) -> bool: + return self._active + + def _refresh_state_caches(self, state: CoordinatorState) -> bool: + all_present = True + for i, jname in enumerate(self._joint_names_list): + pos = state.joints.get_position(jname) + vel = state.joints.get_velocity(jname) + if pos is None: + all_present = False + else: + self._cached_q_29[i] = pos + if vel is None: + all_present = False + else: + self._cached_dq_29[i] = vel + if all_present: + self._state_seen = True + return all_present + + def compute(self, state: CoordinatorState) -> JointCommandOutput | None: + if not self._active: + return None + + fresh = self._refresh_state_caches(state) + if not self._state_seen and not fresh: + return None + + current_29 = self._cached_q_29.copy() + + if self._arm_pending: + self._ramp_start = current_29.copy() + self._arming_start_t = state.t_now + if self._arming_duration > 0.0: + self._arming = True + self._armed = False + logger.info( + "G1SonicWBCTask arming: ramp to SONIC default pose", + task=self._name, + ramp_seconds=self._arming_duration, + ) + else: + self._arming = False + self._armed = True + self._reset_policy_state() + logger.info("G1SonicWBCTask armed (no ramp)", task=self._name) + self._arm_pending = False + + if not self._armed and not self._arming: + self._last_targets = current_29.tolist() + return JointCommandOutput( + joint_names=self._joint_names_list, + positions=self._last_targets, + mode=ControlMode.SERVO_POSITION, + ) + + if self._arming: + assert self._ramp_start is not None + elapsed = state.t_now - self._arming_start_t + alpha = ( + 1.0 if self._arming_duration <= 0.0 else min(1.0, elapsed / self._arming_duration) + ) + target = self._ramp_start + alpha * (self._default_29 - self._ramp_start) + self._last_targets = target.tolist() + if alpha >= 1.0: + self._arming = False + self._armed = True + self._reset_policy_state() + logger.info( + "G1SonicWBCTask ramp complete - policy armed", + task=self._name, + mode="dry-run" if self._dry_run else "live", + ) + return JointCommandOutput( + joint_names=self._joint_names_list, + positions=self._last_targets, + mode=ControlMode.SERVO_POSITION, + ) + + # Armed: run the pipeline at the decimated rate. + self._tick_count += 1 + if self._tick_count % self._config.decimation != 0: + if self._dry_run or self._last_targets is None: + return None + return JointCommandOutput( + joint_names=self._joint_names_list, + positions=self._last_targets, + mode=ControlMode.SERVO_POSITION, + ) + + q_29 = self._cached_q_29.copy() + dq_29 = self._cached_dq_29.copy() + + if state.imu: + imu = next(iter(state.imu.values())) + else: + imu = self._adapter.read_imu() + gyro = np.asarray(imu.gyroscope, dtype=np.float32) + quat = np.asarray(imu.quaternion, dtype=np.float64) + gravity = self._projected_gravity(imu.quaternion) + + with self._cmd_lock: + if ( + self._config.timeout > 0.0 + and self._last_cmd_time > 0.0 + and (state.t_now - self._last_cmd_time) > self._config.timeout + ): + cmd = np.zeros(3, dtype=np.float32) + else: + cmd = self._cmd.copy() + self._pipeline.set_velocity(float(cmd[0]), float(cmd[1]), float(cmd[2])) + + targets_29 = self._pipeline.step( + q_dds=q_29, + dq_dds=dq_29, + base_quat_wxyz=quat, + gyro_body=gyro, + gravity_body=gravity, + ) + self._last_targets = targets_29.tolist() + + if (state.t_now - self._last_diag_log_t) >= 5.0: + logger.info("G1SonicWBCTask", task=self._name, **self._pipeline.snapshot()) + self._last_diag_log_t = state.t_now + + if self._dry_run: + if (state.t_now - self._last_dry_run_log_t) >= 1.0: + max_delta = float(np.max(np.abs(targets_29 - current_29))) + logger.info( + "G1SonicWBCTask DRY-RUN", + task=self._name, + max_dq_rad=max_delta, + ) + self._last_dry_run_log_t = state.t_now + return None + + return JointCommandOutput( + joint_names=self._joint_names_list, + positions=self._last_targets, + mode=ControlMode.SERVO_POSITION, + ) + + def on_preempted(self, by_task: str, joints: frozenset[str]) -> None: + if joints & self._joint_names_set: + logger.warning( + "G1SonicWBCTask preempted", + task=self._name, + by_task=by_task, + joints=joints, + ) + + # -- command inputs ------------------------------------------------------ + + def set_velocity_command(self, vx: float, vy: float, yaw_rate: float, t_now: float) -> None: + with self._cmd_lock: + self._cmd[:] = [vx, vy, yaw_rate] + self._last_cmd_time = t_now + + def on_twist_command(self, msg: Twist, t_now: float) -> None: + self.set_velocity_command( + float(msg.linear.x), float(msg.linear.y), float(msg.angular.z), t_now + ) + + def set_locomotion_mode(self, mode: int | str | None) -> dict[str, Any]: + """Force one of the 27 GEAR locomotion modes; None = speed-auto.""" + applied = self._pipeline.set_mode(mode) + logger.info( + "G1SonicWBCTask locomotion mode", + task=self._name, + requested=mode, + applied=applied, + ) + return {"mode_override": applied} + + def list_locomotion_modes(self) -> dict[str, int]: + return dict(LOCOMOTION_MODES) + + def set_base_height(self, height: float) -> None: + self._pipeline.set_base_height(float(height)) + + def set_upper_body(self, positions: list[float]) -> bool: + """14 arm-joint encoder hints, DDS order (indices 15-28).""" + if len(positions) != 14: + raise ValueError(f"set_upper_body expects 14 values, got {len(positions)}") + self._pipeline.set_upper_body(np.asarray(positions, dtype=np.float32)) + return True + + def clear_upper_body(self) -> None: + self._pipeline.set_upper_body(DEFAULT_ANGLES_DDS[15:].copy()) + + # -- lifecycle ----------------------------------------------------------- + + def start(self) -> None: + self._active = True + self._armed = False + self._arming = False + self._arm_pending = False + self._dry_run = bool(self._config.auto_dry_run) + self._last_targets = None + self._reset_policy_state() + with self._cmd_lock: + self._cmd[:] = 0.0 + self._last_cmd_time = 0.0 + logger.info( + "G1SonicWBCTask started", + task=self._name, + armed=False, + dry_run=self._dry_run, + ) + if self._config.auto_arm: + self.arm(self._config.default_ramp_seconds) + + def stop(self) -> None: + self._active = False + self._armed = False + self._arming = False + self._arm_pending = False + self._last_targets = None + logger.info("G1SonicWBCTask stopped", task=self._name) + + def arm(self, ramp_seconds: float | None = None) -> bool: + if not self._active: + logger.warning("G1SonicWBCTask arm() before start(); ignoring", task=self._name) + return False + if self._armed or self._arming or self._arm_pending: + return False + ramp = ramp_seconds if ramp_seconds is not None else self._config.default_ramp_seconds + self._arming_duration = max(0.0, float(ramp)) + self._arm_pending = True + logger.info( + "G1SonicWBCTask arm requested", + task=self._name, + ramp_seconds=self._arming_duration, + ) + return True + + def disarm(self) -> bool: + if not self._armed and not self._arming and not self._arm_pending: + return False + self._armed = False + self._arming = False + self._arm_pending = False + self._ramp_start = None + self._reset_policy_state() + logger.info("G1SonicWBCTask disarmed (holding current pose)", task=self._name) + return True + + def reset_runtime_state(self, reactivate: bool | None = None) -> bool: + was_armed = self._armed or self._arming or self._arm_pending + should_reactivate = was_armed if reactivate is None else bool(reactivate) + + self._armed = False + self._arming = False + self._arm_pending = False + self._ramp_start = None + self._arming_start_t = 0.0 + self._last_targets = None + self._state_seen = False + self._cached_q_29[:] = self._default_29 + self._cached_dq_29[:] = 0.0 + self._reset_policy_state() + with self._cmd_lock: + self._cmd[:] = 0.0 + self._last_cmd_time = 0.0 + + if self._active and should_reactivate: + self._arming_duration = 0.0 + self._arm_pending = True + + logger.info( + "G1SonicWBCTask runtime state reset", + task=self._name, + reactivate=should_reactivate, + ) + return True + + def set_dry_run(self, enabled: bool) -> None: + new_val = bool(enabled) + if new_val == self._dry_run: + return + self._dry_run = new_val + self._last_dry_run_log_t = 0.0 + logger.info("G1SonicWBCTask dry_run changed", task=self._name, dry_run=new_val) + + def state_snapshot(self) -> dict[str, Any]: + snap = { + "active": self._active, + "armed": self._armed, + "arming": self._arming, + "arm_pending": self._arm_pending, + "dry_run": self._dry_run, + "arming_duration": self._arming_duration, + } + snap.update(self._pipeline.snapshot()) + return snap + + # -- internal ------------------------------------------------------------ + + def _reset_policy_state(self) -> None: + self._pipeline.reset() + self._tick_count = 0 + + @staticmethod + def _projected_gravity(quaternion: tuple[float, ...]) -> NDArray[np.float32]: + w, x, y, z = quaternion + gx = 2.0 * (-x * z + w * y) + gy = 2.0 * (-y * z - w * x) + gz = -(w * w - x * x - y * y + z * z) + return np.array([gx, gy, gz], dtype=np.float32) + + +class G1SonicWBCTaskParams(BaseConfig): + encoder_onnx: str | Path + decoder_onnx: str | Path + planner_onnx: str | Path + hardware_id: str + auto_arm: bool = False + auto_dry_run: bool = False + default_ramp_seconds: float = 10.0 + decimation: int | None = None + + +def create_task(cfg: Any, hardware: Any) -> G1SonicWBCTask: + params = G1SonicWBCTaskParams.model_validate(cfg.params) + hw = hardware.get(params.hardware_id) if hardware else None + if hw is None: + raise ValueError( + f"G1SonicWBCTask {cfg.name!r} references unknown hardware " + f"{params.hardware_id!r}. Declare the hardware before the task " + f"in the blueprint config." + ) + if not isinstance(hw, ConnectedWholeBody): + raise TypeError( + f"G1SonicWBCTask {cfg.name!r} requires a WHOLE_BODY hardware " + f"component for {params.hardware_id!r}, got {type(hw).__name__}." + ) + + kwargs: dict[str, Any] = dict( + encoder_onnx=params.encoder_onnx, + decoder_onnx=params.decoder_onnx, + planner_onnx=params.planner_onnx, + joint_names=cfg.joint_names, + priority=cfg.priority, + auto_arm=params.auto_arm, + auto_dry_run=params.auto_dry_run, + default_ramp_seconds=params.default_ramp_seconds, + ) + if params.decimation is not None: + kwargs["decimation"] = params.decimation + return G1SonicWBCTask( + cfg.name, + G1SonicWBCTaskConfig(**kwargs), + adapter=hw.adapter, + ) diff --git a/dimos/control/tasks/g1_sonic_wbc_task/sonic_pipeline.py b/dimos/control/tasks/g1_sonic_wbc_task/sonic_pipeline.py new file mode 100644 index 0000000000..f1a75da995 --- /dev/null +++ b/dimos/control/tasks/g1_sonic_wbc_task/sonic_pipeline.py @@ -0,0 +1,834 @@ +# Copyright 2025-2026 Dimensional Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""SONIC (GEAR-SONIC) inference pipeline, simulator-agnostic. + +Planner (10 Hz, background thread) -> Encoder (50 Hz) -> Decoder (50 Hz) +producing 29 joint position targets. Ported from the Matrix project's +parity-verified reimplementation of NVIDIA's C++ reference +(GR00T-WholeBodyControl/gear_sonic_deploy/.../g1_deploy_onnx_ref.cpp); +all observation layouts, joint orderings, gains, and the encoder-injection +rule match that reference. See sonic-notebook/DECISIONS.md D3: upper-body +targets enter ONLY through the encoder observation - never override the +decoder's output. + +This module has no DimOS or simulator dependencies: callers feed joint +state (DDS/MuJoCo order), an IMU quaternion (w,x,y,z), and body-frame +angular velocity; ``step()`` returns 29 position targets in DDS order. +""" + +from __future__ import annotations + +from concurrent.futures import Future, ThreadPoolExecutor +import math +from pathlib import Path + +import numpy as np +from numpy.typing import NDArray +import onnxruntime as ort # type: ignore[import-untyped] + +from dimos.utils.logging_config import setup_logger + +logger = setup_logger() + +# --------------------------------------------------------------------------- +# Motor constants (policy_parameters.hpp) +# --------------------------------------------------------------------------- + +ARMATURE_5020 = 0.003609725 +ARMATURE_7520_14 = 0.010177520 +ARMATURE_7520_22 = 0.025101925 +ARMATURE_4010 = 0.00425 + +NATURAL_FREQ = 10 * 2 * math.pi +DAMPING_RATIO = 2.0 + +STIFFNESS_5020 = ARMATURE_5020 * NATURAL_FREQ**2 +STIFFNESS_7520_14 = ARMATURE_7520_14 * NATURAL_FREQ**2 +STIFFNESS_7520_22 = ARMATURE_7520_22 * NATURAL_FREQ**2 +STIFFNESS_4010 = ARMATURE_4010 * NATURAL_FREQ**2 + +DAMPING_5020 = 2.0 * DAMPING_RATIO * ARMATURE_5020 * NATURAL_FREQ +DAMPING_7520_14 = 2.0 * DAMPING_RATIO * ARMATURE_7520_14 * NATURAL_FREQ +DAMPING_7520_22 = 2.0 * DAMPING_RATIO * ARMATURE_7520_22 * NATURAL_FREQ +DAMPING_4010 = 2.0 * DAMPING_RATIO * ARMATURE_4010 * NATURAL_FREQ + +EFFORT_5020 = 25.0 +EFFORT_7520_14 = 88.0 +EFFORT_7520_22 = 139.0 +EFFORT_4010 = 5.0 + +# PD gains in DDS/MuJoCo joint order, matching the C++ kps/kds arrays +# exactly - including the x2 on ankles and waist roll/pitch. The policy +# was trained against these; the blueprint must pass them as wb_config. +_KP_LEG = [ + STIFFNESS_7520_22, + STIFFNESS_7520_22, + STIFFNESS_7520_14, + STIFFNESS_7520_22, + 2.0 * STIFFNESS_5020, + 2.0 * STIFFNESS_5020, +] +_KD_LEG = [ + DAMPING_7520_22, + DAMPING_7520_22, + DAMPING_7520_14, + DAMPING_7520_22, + 2.0 * DAMPING_5020, + 2.0 * DAMPING_5020, +] +_KP_ARM = [ + STIFFNESS_5020, + STIFFNESS_5020, + STIFFNESS_5020, + STIFFNESS_5020, + STIFFNESS_5020, + STIFFNESS_4010, + STIFFNESS_4010, +] +_KD_ARM = [ + DAMPING_5020, + DAMPING_5020, + DAMPING_5020, + DAMPING_5020, + DAMPING_5020, + DAMPING_4010, + DAMPING_4010, +] +SONIC_KP: list[float] = [ + *_KP_LEG, + *_KP_LEG, + STIFFNESS_7520_14, + 2.0 * STIFFNESS_5020, + 2.0 * STIFFNESS_5020, # waist + *_KP_ARM, + *_KP_ARM, +] +SONIC_KD: list[float] = [ + *_KD_LEG, + *_KD_LEG, + DAMPING_7520_14, + 2.0 * DAMPING_5020, + 2.0 * DAMPING_5020, # waist + *_KD_ARM, + *_KD_ARM, +] + +# --------------------------------------------------------------------------- +# Joint orderings. "DDS order" here equals the MuJoCo order used across +# DimOS G1 code (legs L/R, waist, arms L/R). "ONNX order" is SONIC's +# interleaved left/right BFS training order. +# --------------------------------------------------------------------------- + +NUM_JOINTS = 29 +HISTORY_LEN = 10 + +# ONNX index -> DDS index (isaaclab_to_mujoco in the C++) +ONNX_TO_DDS = np.array( + [ + 0, + 6, + 12, + 1, + 7, + 13, + 2, + 8, + 14, + 3, + 9, + 15, + 22, + 4, + 10, + 16, + 23, + 5, + 11, + 17, + 24, + 18, + 25, + 19, + 26, + 20, + 27, + 21, + 28, + ], + dtype=np.intp, +) +# DDS index -> ONNX index (mujoco_to_isaaclab in the C++) +DDS_TO_ONNX = np.array( + [ + 0, + 3, + 6, + 9, + 13, + 17, + 1, + 4, + 7, + 10, + 14, + 18, + 2, + 5, + 8, + 11, + 15, + 19, + 21, + 23, + 25, + 27, + 12, + 16, + 20, + 22, + 24, + 26, + 28, + ], + dtype=np.intp, +) + +DEFAULT_ANGLES_DDS = np.array( + [ + -0.312, + 0.0, + 0.0, + 0.669, + -0.363, + 0.0, + -0.312, + 0.0, + 0.0, + 0.669, + -0.363, + 0.0, + 0.0, + 0.0, + 0.0, + 0.2, + 0.2, + 0.0, + 0.6, + 0.0, + 0.0, + 0.0, + 0.2, + -0.2, + 0.0, + 0.6, + 0.0, + 0.0, + 0.0, + ], + dtype=np.float32, +) + +_SCALE_LEG = [ + 0.25 * EFFORT_7520_22 / STIFFNESS_7520_22, + 0.25 * EFFORT_7520_22 / STIFFNESS_7520_22, + 0.25 * EFFORT_7520_14 / STIFFNESS_7520_14, + 0.25 * EFFORT_7520_22 / STIFFNESS_7520_22, + 0.25 * EFFORT_5020 / STIFFNESS_5020, + 0.25 * EFFORT_5020 / STIFFNESS_5020, +] +_SCALE_ARM = [ + 0.25 * EFFORT_5020 / STIFFNESS_5020, + 0.25 * EFFORT_5020 / STIFFNESS_5020, + 0.25 * EFFORT_5020 / STIFFNESS_5020, + 0.25 * EFFORT_5020 / STIFFNESS_5020, + 0.25 * EFFORT_5020 / STIFFNESS_5020, + 0.25 * EFFORT_4010 / STIFFNESS_4010, + 0.25 * EFFORT_4010 / STIFFNESS_4010, +] +ACTION_SCALE_DDS = np.array( + [ + *_SCALE_LEG, + *_SCALE_LEG, + 0.25 * EFFORT_7520_14 / STIFFNESS_7520_14, + 0.25 * EFFORT_5020 / STIFFNESS_5020, + 0.25 * EFFORT_5020 / STIFFNESS_5020, + *_SCALE_ARM, + *_SCALE_ARM, + ], + dtype=np.float32, +) + +DEFAULT_ANGLES_ONNX = DEFAULT_ANGLES_DDS[ONNX_TO_DDS] +ACTION_SCALE_ONNX = ACTION_SCALE_DDS[ONNX_TO_DDS] + +# 17 upper-body joints (waist + arms) in ONNX-order indices, matching the +# C++ upper_body_joint_isaaclab_order_in_isaaclab_index. +UPPER_BODY_ONNX_INDICES = np.array( + [2, 5, 8, 11, 12, 15, 16, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28], + dtype=np.intp, +) + +# --------------------------------------------------------------------------- +# Observation dimensions (observation_config.yaml; offsets verified against +# the C++ observation registry) +# --------------------------------------------------------------------------- + +ENCODER_OBS_DIM = 1762 +ENCODER_TOKEN_DIM = 64 +DECODER_OBS_DIM = 994 + +DEFAULT_HEIGHT = 0.788740 +POLICY_DT = 0.02 +REPLAN_INTERVAL_DEFAULT = 1.0 +REPLAN_INTERVAL_RUNNING = 0.1 +BLEND_FRAMES = 8 +LOOK_AHEAD_FRAMES = 2 + +_IDENTITY_6D = np.array([1.0, 0.0, 0.0, 1.0, 0.0, 0.0], dtype=np.float32) + +# LocomotionMode (localmotion_kplanner.hpp) - the full 27. +LOCOMOTION_MODES: dict[str, int] = { + "IDLE": 0, + "SLOW_WALK": 1, + "WALK": 2, + "RUN": 3, + "IDEL_SQUAT": 4, + "IDEL_KNEEL_TWO_LEGS": 5, + "IDEL_KNEEL": 6, + "IDEL_LYING_FACE_DOWN": 7, + "CRAWLING": 8, + "IDEL_BOXING": 9, + "WALK_BOXING": 10, + "LEFT_PUNCH": 11, + "RIGHT_PUNCH": 12, + "RANDOM_PUNCH": 13, + "ELBOW_CRAWLING": 14, + "LEFT_HOOK": 15, + "RIGHT_HOOK": 16, + "FORWARD_JUMP": 17, + "STEALTH_WALK": 18, + "INJURED_WALK": 19, + "LEDGE_WALKING": 20, + "OBJECT_CARRYING": 21, + "STEALTH_WALK_2": 22, + "HAPPY_DANCE_WALK": 23, + "ZOMBIE_WALK": 24, + "GUN_WALK": 25, + "SCARE_WALK": 26, +} +STATIC_MODES = {0, 4, 5, 6, 7, 9} + + +# --------------------------------------------------------------------------- +# Quaternion helpers ([w, x, y, z] convention throughout) +# --------------------------------------------------------------------------- + + +def _quat_conjugate(q: NDArray) -> NDArray: + return np.array([q[0], -q[1], -q[2], -q[3]], dtype=np.float64) + + +def _quat_multiply(q1: NDArray, q2: NDArray) -> NDArray: + w1, x1, y1, z1 = q1 + w2, x2, y2, z2 = q2 + return np.array( + [ + w1 * w2 - x1 * x2 - y1 * y2 - z1 * z2, + w1 * x2 + x1 * w2 + y1 * z2 - z1 * y2, + w1 * y2 - x1 * z2 + y1 * w2 + z1 * x2, + w1 * z2 + x1 * y2 - y1 * x2 + z1 * w2, + ], + dtype=np.float64, + ) + + +def _quat_to_rotmat(q: NDArray) -> NDArray: + w, x, y, z = np.asarray(q, dtype=np.float64) + n = math.sqrt(w * w + x * x + y * y + z * z) + if n > 1e-10: + w, x, y, z = w / n, x / n, y / n, z / n + return np.array( + [ + [1 - 2 * (y * y + z * z), 2 * (x * y - w * z), 2 * (x * z + w * y)], + [2 * (x * y + w * z), 1 - 2 * (x * x + z * z), 2 * (y * z - w * x)], + [2 * (x * z - w * y), 2 * (y * z + w * x), 1 - 2 * (x * x + y * y)], + ], + dtype=np.float64, + ) + + +def _rotmat_to_6d(rot: NDArray) -> NDArray: + return np.array( + [rot[0, 0], rot[0, 1], rot[1, 0], rot[1, 1], rot[2, 0], rot[2, 1]], + dtype=np.float32, + ) + + +def _quat_lerp(q0: NDArray, q1: NDArray, t: float) -> NDArray: + q0 = np.asarray(q0, dtype=np.float64) + q1 = np.asarray(q1, dtype=np.float64) + if np.dot(q0, q1) < 0: + q1 = -q1 + q = (1.0 - t) * q0 + t * q1 + n = np.linalg.norm(q) + return (q / n if n > 1e-10 else q0).astype(np.float32) + + +def _yaw_from_quat(q: NDArray) -> float: + w, x, y, z = q + return math.atan2(2.0 * (w * z + x * y), 1.0 - 2.0 * (y * y + z * z)) + + +def _calc_heading_quat(q: NDArray) -> NDArray: + half = _yaw_from_quat(q) / 2.0 + return np.array([math.cos(half), 0.0, 0.0, math.sin(half)], dtype=np.float64) + + +def _calc_heading_quat_inv(q: NDArray) -> NDArray: + half = -_yaw_from_quat(q) / 2.0 + return np.array([math.cos(half), 0.0, 0.0, math.sin(half)], dtype=np.float64) + + +class _Trajectory: + """50 Hz reference motion (joint data stored in ONNX order).""" + + __slots__ = ("joint_pos", "joint_vel", "num_frames", "root_pos", "root_quat") + + def __init__(self, max_frames: int) -> None: + self.joint_pos = np.zeros((max_frames, NUM_JOINTS), dtype=np.float32) + self.joint_vel = np.zeros((max_frames, NUM_JOINTS), dtype=np.float32) + self.root_pos = np.zeros((max_frames, 3), dtype=np.float32) + self.root_quat = np.zeros((max_frames, 4), dtype=np.float32) + self.root_quat[:, 0] = 1.0 + self.num_frames = 0 + + +class SonicPipeline: + """Planner -> encoder -> decoder pipeline over ONNX Runtime. + + Callers drive it at 50 Hz via :meth:`step`. The planner runs on a + single background worker so ``step()`` never blocks on the 774 MB + planner model. + """ + + def __init__( + self, + encoder_path: str | Path, + decoder_path: str | Path, + planner_path: str | Path, + providers: list[str] | None = None, + ) -> None: + cpu = ["CPUExecutionProvider"] + fast = providers or ["CUDAExecutionProvider", "CPUExecutionProvider"] + + self._encoder = ort.InferenceSession(str(encoder_path), providers=fast) + self._decoder = ort.InferenceSession(str(decoder_path), providers=fast) + try: + self._planner = ort.InferenceSession(str(planner_path), providers=fast) + except Exception: + self._planner = ort.InferenceSession(str(planner_path), providers=cpu) + self._encoder_input = self._encoder.get_inputs()[0].name + self._decoder_input = self._decoder.get_inputs()[0].name + logger.info( + "SonicPipeline models loaded", + encoder_providers=self._encoder.get_providers(), + planner_providers=self._planner.get_providers(), + ) + + self._standing_token = self._build_standing_token() + + self._his_ang_vel = np.zeros((HISTORY_LEN, 3), dtype=np.float32) + self._his_joint_pos = np.zeros((HISTORY_LEN, NUM_JOINTS), dtype=np.float32) + self._his_joint_vel = np.zeros((HISTORY_LEN, NUM_JOINTS), dtype=np.float32) + self._his_action = np.zeros((HISTORY_LEN, NUM_JOINTS), dtype=np.float32) + self._his_gravity = np.zeros((HISTORY_LEN, 3), dtype=np.float32) + self._history_ptr = 0 + self._last_action = np.zeros(NUM_JOINTS, dtype=np.float32) + self._obs_buffer = np.zeros(DECODER_OBS_DIM, dtype=np.float32) + + self._trajectory: _Trajectory | None = None + self._traj_frame = 0 + self._heading_delta_quat = np.array([1, 0, 0, 0], dtype=np.float64) + self._heading_initialized = False + + self._planner_executor = ThreadPoolExecutor( + max_workers=1, thread_name_prefix="sonic-planner" + ) + self._planner_future: Future | None = None + self._replan_timer = 0.0 + self._needs_replan = True + self._step_count = 0 + + # Commands + self._vx = 0.0 + self._vy = 0.0 + self._yaw_rate = 0.0 + self._height_cmd = -1.0 # -1 = mode default + self._mode_override: int | None = None + self._upper_targets_dds = DEFAULT_ANGLES_DDS[15:].copy() + + # Latest robot state fed by step() (for planner input building) + self._cur_quat = np.array([1, 0, 0, 0], dtype=np.float64) + self._cur_q_dds = DEFAULT_ANGLES_DDS.copy() + + # -- commands --------------------------------------------------------- + + def set_velocity(self, vx: float, vy: float, wz: float) -> None: + if abs(vx - self._vx) > 0.05 or abs(vy - self._vy) > 0.05 or abs(wz - self._yaw_rate) > 0.1: + self._needs_replan = True + self._vx, self._vy, self._yaw_rate = vx, vy, wz + + def set_mode(self, mode: int | str | None) -> int | None: + """Force a LocomotionMode (int or name); None returns to speed-auto.""" + if isinstance(mode, str): + mode = LOCOMOTION_MODES[mode.upper()] + if mode is not None and not 0 <= int(mode) <= 26: + raise ValueError(f"locomotion mode out of range: {mode}") + if mode != self._mode_override: + self._needs_replan = True + self._mode_override = None if mode is None else int(mode) + return self._mode_override + + def set_base_height(self, height: float) -> None: + if abs(height - self._height_cmd) > 0.01: + self._needs_replan = True + self._height_cmd = float(height) + + def set_upper_body(self, targets_dds_14: NDArray) -> None: + self._upper_targets_dds = np.asarray(targets_dds_14, dtype=np.float32).flatten()[:14] + + def reset(self) -> None: + self._his_ang_vel[:] = 0.0 + self._his_joint_pos[:] = 0.0 + self._his_joint_vel[:] = 0.0 + self._his_action[:] = 0.0 + self._his_gravity[:] = 0.0 + self._history_ptr = 0 + self._last_action[:] = 0.0 + self._obs_buffer[:] = 0.0 + self._trajectory = None + self._traj_frame = 0 + self._replan_timer = 0.0 + self._step_count = 0 + self._needs_replan = True + self._heading_delta_quat = np.array([1, 0, 0, 0], dtype=np.float64) + self._heading_initialized = False + if self._planner_future is not None and not self._planner_future.done(): + self._planner_future.cancel() + self._planner_future = None + self._upper_targets_dds = DEFAULT_ANGLES_DDS[15:].copy() + self._mode_override = None + + # -- encoder ---------------------------------------------------------- + + def _build_standing_token(self) -> NDArray: + enc_obs = np.zeros(ENCODER_OBS_DIM, dtype=np.float32) + for i in range(10): + enc_obs[4 + i * NUM_JOINTS : 4 + (i + 1) * NUM_JOINTS] = DEFAULT_ANGLES_ONNX + enc_obs[601 + i * 6 : 601 + (i + 1) * 6] = _IDENTITY_6D + out = self._encoder.run(None, {self._encoder_input: enc_obs.reshape(1, -1)}) + return out[0].squeeze().astype(np.float32) + + def _has_upper_body_targets(self) -> bool: + return not np.allclose(self._upper_targets_dds, DEFAULT_ANGLES_DDS[15:], atol=1e-6) + + def _upper_body_17_onnx(self) -> NDArray: + full = DEFAULT_ANGLES_ONNX.copy() + for dds_i in range(15, 29): + full[DDS_TO_ONNX[dds_i]] = self._upper_targets_dds[dds_i - 15] + return full[UPPER_BODY_ONNX_INDICES] + + def _inject_upper_body(self, enc_obs: NDArray) -> None: + """Encoder-observation injection (D3): positions replaced, velocities + zeroed for the 17 upper-body joints across all 10 frames.""" + upper_vals = self._upper_body_17_onnx() + for i in range(10): + pos = 4 + i * NUM_JOINTS + vel = 294 + i * NUM_JOINTS + for k, idx in enumerate(UPPER_BODY_ONNX_INDICES): + enc_obs[pos + idx] = upper_vals[k] + enc_obs[vel + idx] = 0.0 + + def _build_encoder_obs(self, base_quat: NDArray) -> NDArray: + enc_obs = np.zeros(ENCODER_OBS_DIM, dtype=np.float32) + traj = self._trajectory + assert traj is not None + f_curr = min(self._traj_frame, traj.num_frames - 1) + + for i in range(10): + f = min(f_curr + i * 5, traj.num_frames - 1) + enc_obs[4 + i * NUM_JOINTS : 4 + (i + 1) * NUM_JOINTS] = traj.joint_pos[f] + enc_obs[294 + i * NUM_JOINTS : 294 + (i + 1) * NUM_JOINTS] = traj.joint_vel[f] + + if self._has_upper_body_targets(): + self._inject_upper_body(enc_obs) + + q_base_inv = _quat_conjugate(base_quat) + for i in range(10): + f = min(f_curr + i * 5, traj.num_frames - 1) + q_aligned = _quat_multiply( + self._heading_delta_quat, traj.root_quat[f].astype(np.float64) + ) + q_rel = _quat_multiply(q_base_inv, q_aligned) + enc_obs[601 + i * 6 : 601 + (i + 1) * 6] = _rotmat_to_6d(_quat_to_rotmat(q_rel)) + return enc_obs + + # -- planner ---------------------------------------------------------- + + def _auto_mode(self, speed: float) -> int: + if speed < 0.05: + return 0 + if speed < 0.4: + return 1 + if speed < 1.2: + return 2 + return 3 + + def _build_planner_context(self) -> NDArray: + context = np.zeros((4, 36), dtype=np.float32) + if self._trajectory is not None and self._trajectory.num_frames > 4: + traj = self._trajectory + start = min(self._traj_frame + LOOK_AHEAD_FRAMES, traj.num_frames - 1) + for n in range(4): + f = min(round(start + n * (50.0 / 30.0)), traj.num_frames - 1) + context[n, 0:3] = traj.root_pos[f] + context[n, 3:7] = traj.root_quat[f] + context[n, 7:36] = traj.joint_pos[f][DDS_TO_ONNX] + else: + root_pos = np.array([0.0, 0.0, DEFAULT_HEIGHT], dtype=np.float32) + for n in range(4): + context[n, 0:3] = root_pos + context[n, 3:7] = self._cur_quat + context[n, 7:36] = self._cur_q_dds + return context + + def _build_planner_inputs(self) -> dict: + speed = math.hypot(self._vx, self._vy) + yaw = _yaw_from_quat(self._cur_quat) + cos_h, sin_h = math.cos(yaw), math.sin(yaw) + world_vx = self._vx * cos_h - self._vy * sin_h + world_vy = self._vx * sin_h + self._vy * cos_h + + mode = self._mode_override if self._mode_override is not None else self._auto_mode(speed) + + if speed > 0.05 and mode not in STATIC_MODES: + move_dir = np.array([world_vx / speed, world_vy / speed, 0.0], dtype=np.float32) + else: + move_dir = np.zeros(3, dtype=np.float32) + + target_yaw = yaw + self._yaw_rate * 1.0 + face_dir = np.array([math.cos(target_yaw), math.sin(target_yaw), 0.0], dtype=np.float32) + + if mode == 1: + target_vel = max(0.2, min(speed, 0.8)) + elif mode == 3: + target_vel = max(1.5, min(speed, 3.0)) + else: + target_vel = -1.0 + + return { + "context_mujoco_qpos": self._build_planner_context().reshape(1, 4, 36), + "target_vel": np.array([target_vel], dtype=np.float32), + "mode": np.array([mode], dtype=np.int64), + "movement_direction": move_dir.reshape(1, 3), + "facing_direction": face_dir.reshape(1, 3), + "random_seed": np.array([42], dtype=np.int64), + "has_specific_target": np.zeros((1, 1), dtype=np.int64), + "specific_target_positions": np.zeros((1, 4, 3), dtype=np.float32), + "specific_target_headings": np.zeros((1, 4), dtype=np.float32), + "allowed_pred_num_tokens": np.array( + [[1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]], dtype=np.int64 + ), + "height": np.array([self._height_cmd], dtype=np.float32), + } + + def _submit_planner(self) -> None: + if self._planner_future is not None and not self._planner_future.done(): + return + try: + inputs = self._build_planner_inputs() + except Exception as exc: + logger.warning("SonicPipeline planner input build failed", error=repr(exc)) + return + self._planner_future = self._planner_executor.submit(self._planner.run, None, inputs) + + def _check_planner_result(self) -> None: + if self._planner_future is None or not self._planner_future.done(): + return + try: + self._apply_planner_result(self._planner_future.result()) + except Exception as exc: + logger.warning("SonicPipeline planner inference failed", error=repr(exc)) + self._planner_future = None + + def _apply_planner_result(self, result: list) -> None: + qpos_30hz = result[0].squeeze() + num_frames = int(result[1].item()) + if num_frames < 2: + return + new_traj = self._resample_to_50hz(qpos_30hz, num_frames) + + if self._trajectory is not None and self._trajectory.num_frames > 0: + old, old_f = self._trajectory, self._traj_frame + blend = min(BLEND_FRAMES, new_traj.num_frames) + for f in range(blend): + of = min(old_f + f, old.num_frames - 1) + w_new = (f + 1) / (blend + 1) + w_old = 1.0 - w_new + new_traj.joint_pos[f] = w_old * old.joint_pos[of] + w_new * new_traj.joint_pos[f] + new_traj.root_pos[f] = w_old * old.root_pos[of] + w_new * new_traj.root_pos[f] + new_traj.root_quat[f] = _quat_lerp(old.root_quat[of], new_traj.root_quat[f], w_new) + for f in range(min(blend, new_traj.num_frames - 1)): + new_traj.joint_vel[f] = (new_traj.joint_pos[f + 1] - new_traj.joint_pos[f]) * 50.0 + + if not self._heading_initialized and new_traj.num_frames > 0: + init_heading = _calc_heading_quat(self._cur_quat) + init_ref_inv = _calc_heading_quat_inv(new_traj.root_quat[0]) + self._heading_delta_quat = _quat_multiply(init_heading, init_ref_inv) + self._heading_initialized = True + + self._trajectory = new_traj + self._traj_frame = 0 + + def _resample_to_50hz(self, qpos_30hz: NDArray, n30: int) -> _Trajectory: + n50 = max(2, int(n30 / 30.0 * 50.0)) + traj = _Trajectory(n50) + for f in range(n50): + f30 = f / 50.0 * 30.0 + f0 = min(int(f30), n30 - 1) + f1 = min(f0 + 1, n30 - 1) + alpha = (f30 - f0) if f0 < n30 - 1 else 0.0 + traj.root_pos[f] = (1 - alpha) * qpos_30hz[f0, 0:3] + alpha * qpos_30hz[f1, 0:3] + traj.root_quat[f] = _quat_lerp(qpos_30hz[f0, 3:7], qpos_30hz[f1, 3:7], alpha) + raw = (1 - alpha) * qpos_30hz[f0, 7:36] + alpha * qpos_30hz[f1, 7:36] + traj.joint_pos[f] = raw[ONNX_TO_DDS] + for f in range(n50 - 1): + traj.joint_vel[f] = (traj.joint_pos[f + 1] - traj.joint_pos[f]) * 50.0 + if n50 > 1: + traj.joint_vel[-1] = traj.joint_vel[-2] + traj.num_frames = n50 + return traj + + # -- step ------------------------------------------------------------- + + def step( + self, + q_dds: NDArray, + dq_dds: NDArray, + base_quat_wxyz: NDArray, + gyro_body: NDArray, + gravity_body: NDArray, + ) -> NDArray: + """One 50 Hz policy step. Returns 29 position targets, DDS order.""" + self._step_count += 1 + self._cur_quat = np.asarray(base_quat_wxyz, dtype=np.float64) + self._cur_q_dds = np.asarray(q_dds, dtype=np.float32) + + self._check_planner_result() + + self._replan_timer += POLICY_DT + speed = math.hypot(self._vx, self._vy) + mode = self._mode_override if self._mode_override is not None else self._auto_mode(speed) + moving = speed > 0.05 or (self._mode_override is not None and mode not in STATIC_MODES) + interval = REPLAN_INTERVAL_RUNNING if speed >= 1.2 else REPLAN_INTERVAL_DEFAULT + traj_low = ( + self._trajectory is not None + and self._traj_frame > self._trajectory.num_frames - 20 + and moving + ) + # A forced non-static mode needs planner output even at zero twist. + mode_needs_traj = ( + self._mode_override is not None + and mode not in STATIC_MODES + and self._replan_timer >= interval + ) + if ( + self._needs_replan + or (self._replan_timer >= interval and moving) + or traj_low + or mode_needs_traj + ): + self._submit_planner() + self._replan_timer = 0.0 + self._needs_replan = False + + # Encoder token + if self._trajectory is not None and self._trajectory.num_frames > 0: + token = self._run_encoder(self._build_encoder_obs(self._cur_quat)) + elif self._has_upper_body_targets(): + enc_obs = np.zeros(ENCODER_OBS_DIM, dtype=np.float32) + for i in range(10): + enc_obs[4 + i * NUM_JOINTS : 4 + (i + 1) * NUM_JOINTS] = DEFAULT_ANGLES_ONNX + enc_obs[601 + i * 6 : 601 + (i + 1) * 6] = _IDENTITY_6D + self._inject_upper_body(enc_obs) + token = self._run_encoder(enc_obs) + else: + token = self._standing_token + + # Proprio history (ONNX order) + q_onnx = self._cur_q_dds[ONNX_TO_DDS] + dq_onnx = np.asarray(dq_dds, dtype=np.float32)[ONNX_TO_DDS] + ptr = self._history_ptr + self._his_ang_vel[ptr] = np.asarray(gyro_body, dtype=np.float32) + self._his_joint_pos[ptr] = q_onnx - DEFAULT_ANGLES_ONNX + self._his_joint_vel[ptr] = dq_onnx + self._his_action[ptr] = self._last_action + self._his_gravity[ptr] = np.asarray(gravity_body, dtype=np.float32) + self._history_ptr = (ptr + 1) % HISTORY_LEN + + obs = self._obs_buffer + obs[0:ENCODER_TOKEN_DIM] = token + order = np.array( + [(self._history_ptr + j) % HISTORY_LEN for j in range(HISTORY_LEN)], + dtype=np.intp, + ) + obs[64:94] = self._his_ang_vel[order].ravel() + obs[94:384] = self._his_joint_pos[order].ravel() + obs[384:674] = self._his_joint_vel[order].ravel() + obs[674:964] = self._his_action[order].ravel() + obs[964:994] = self._his_gravity[order].ravel() + + out = self._decoder.run(None, {self._decoder_input: obs.reshape(1, -1)}) + actions = out[0].squeeze()[:NUM_JOINTS].astype(np.float32) + self._last_action = actions.copy() + + # All 29 decoder actions applied directly - no post-decoder override + # (D3; matches C++ CreatePolicyCommand). + targets_onnx = DEFAULT_ANGLES_ONNX + actions * ACTION_SCALE_ONNX + + if self._trajectory is not None: + self._traj_frame = min(self._traj_frame + 1, self._trajectory.num_frames - 1) + + return targets_onnx[DDS_TO_ONNX] + + def _run_encoder(self, enc_obs: NDArray) -> NDArray: + out = self._encoder.run(None, {self._encoder_input: enc_obs.reshape(1, -1)}) + return out[0].squeeze().astype(np.float32) + + # -- telemetry -------------------------------------------------------- + + def snapshot(self) -> dict: + speed = math.hypot(self._vx, self._vy) + mode = self._mode_override if self._mode_override is not None else self._auto_mode(speed) + return { + "mode": mode, + "mode_override": self._mode_override, + "speed": speed, + "trajectory": self._trajectory is not None, + "traj_frame": self._traj_frame, + "traj_frames_total": (self._trajectory.num_frames if self._trajectory else 0), + "action_norm": float(np.linalg.norm(self._last_action)), + "upper_body_active": self._has_upper_body_targets(), + } diff --git a/dimos/robot/all_blueprints.py b/dimos/robot/all_blueprints.py index 03a4ddc2b8..4b4cf5af7c 100644 --- a/dimos/robot/all_blueprints.py +++ b/dimos/robot/all_blueprints.py @@ -117,6 +117,7 @@ "unitree-g1-detection": "dimos.robot.unitree.g1.blueprints.perceptive.unitree_g1_detection:unitree_g1_detection", "unitree-g1-full": "dimos.robot.unitree.g1.blueprints.agentic.unitree_g1_full:unitree_g1_full", "unitree-g1-groot-wbc": "dimos.robot.unitree.g1.blueprints.basic.unitree_g1_groot_wbc:unitree_g1_groot_wbc", + "unitree-g1-sonic-wbc": "dimos.robot.unitree.g1.blueprints.basic.unitree_g1_sonic_wbc:unitree_g1_sonic_wbc", "unitree-g1-joystick": "dimos.robot.unitree.g1.blueprints.basic.unitree_g1_joystick:unitree_g1_joystick", "unitree-g1-nav-onboard": "dimos.robot.unitree.g1.blueprints.navigation.unitree_g1_nav_onboard:unitree_g1_nav_onboard", "unitree-g1-nav-sim": "dimos.robot.unitree.g1.blueprints.navigation.unitree_g1_nav_sim:unitree_g1_nav_sim", diff --git a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_sonic_wbc.py b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_sonic_wbc.py new file mode 100644 index 0000000000..934207514d --- /dev/null +++ b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_sonic_wbc.py @@ -0,0 +1,194 @@ +# Copyright 2025-2026 Dimensional Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Unitree G1 SONIC (GEAR-SONIC) whole-body-control blueprint. + +Unified 29-DOF policy: planner + encoder + decoder. All 27 GEAR locomotion +modes are reachable at runtime through the coordinator RPC surface: + + coordinator.task_invoke("sonic_wbc", "set_locomotion_mode", + {"mode": "HAPPY_DANCE_WALK"}) + +Usage: + dimos --simulation mujoco run unitree-g1-sonic-wbc # sim + dimos run unitree-g1-sonic-wbc # real hardware + +Real hardware note: SONIC uses armature-derived PD gains (SONIC_KP/KD), +NOT the GR00T gain table. Never run this blueprint while the C++ +g1_deploy_onnx_ref binary owns rt/lowcmd. +""" + +from __future__ import annotations + +import os +from pathlib import Path +from typing import Any, cast + +from dimos.control.components import HardwareComponent, HardwareType +from dimos.control.coordinator import ControlCoordinator, TaskConfig +from dimos.control.tasks.g1_groot_wbc_task.g1_groot_wbc_task import g1_joints +from dimos.control.tasks.g1_sonic_wbc_task.sonic_pipeline import SONIC_KD, SONIC_KP +from dimos.core.coordination.blueprints import autoconnect +from dimos.core.global_config import global_config +from dimos.core.stream import Out +from dimos.core.transport import LCMTransport +from dimos.hardware.whole_body.spec import WholeBodyConfig +from dimos.msgs.geometry_msgs.Twist import Twist +from dimos.msgs.sensor_msgs.Imu import Imu +from dimos.msgs.sensor_msgs.JointState import JointState +from dimos.msgs.sensor_msgs.MotorCommandArray import MotorCommandArray +from dimos.utils.data import LfsPath +from dimos.visualization.vis_module import vis_module + +# SONIC model files. Default to the local GR00T-WholeBodyControl checkout; +# override with SONIC_MODEL_DIR / SONIC_PLANNER_PATH for other machines. +_SONIC_RELEASE_DIR = Path( + os.environ.get( + "SONIC_MODEL_DIR", + Path.home() / "Desktop/GR00T-WholeBodyControl/gear_sonic_deploy/policy/release", + ) +) +_SONIC_PLANNER_PATH = Path( + os.environ.get( + "SONIC_PLANNER_PATH", + Path.home() + / "Desktop/GR00T-WholeBodyControl/gear_sonic_deploy/planner/target_vel/V2/planner_sonic.onnx", + ) +) + +_MJCF_PATH = LfsPath("mujoco_sim/g1_gear_wbc.xml") +_G1_NUM_MOTORS = len(g1_joints) +_cmd_vel_topic = "/cmd_vel" if global_config.simulation else "/g1/cmd_vel" + +_adapter_address: str | Path + +if global_config.simulation and global_config.simulation != "mujoco": + raise ValueError("unitree-g1-sonic-wbc only supports --simulation mujoco") + +if global_config.simulation == "mujoco": + from dimos.simulation.engines.mujoco_sim_module import MujocoSimModule + from dimos.simulation.engines.robot_sim_binding import ( + RobotSimSpec, + mjcf_joint_names_from_hardware, + ) + + _g1_sim_joints = tuple(g1_joints) + _g1_sim_spec = RobotSimSpec( + robot_id="g1", + hardware_joints=_g1_sim_joints, + root_body_names=("pelvis",), + root_joint_names=("floating_base_joint",), + require_floating_base=True, + model_joint_names=mjcf_joint_names_from_hardware(_g1_sim_joints), + imu_gyro_names=( + "imu-pelvis-angular-velocity", + "imu-torso-angular-velocity", + "imu-angular-velocity", + "gyro_pelvis", + "imu_gyro", + ), + imu_accel_names=( + "imu-pelvis-linear-acceleration", + "imu-torso-linear-acceleration", + "imu-linear-acceleration", + "accelerometer_pelvis", + "imu_accel", + ), + require_imu=True, + ) + + _backend = MujocoSimModule.blueprint( + address=_MJCF_PATH, + headless=True, + dof=_G1_NUM_MOTORS, + inject_legacy_assets=True, + robot_sim_spec=_g1_sim_spec, + ) + _adapter_type = "sim_mujoco_g1" + _adapter_address = _MJCF_PATH + _tick_rate = 50.0 + _auto_arm = True + _auto_dry_run = False + _default_ramp_seconds = 0.0 + _decimation = 1 + _n_workers = 2 +else: + from dimos.robot.unitree.g1.wholebody_connection import G1WholeBodyConnection + + _backend = G1WholeBodyConnection.blueprint(release_sport_mode=True) + _adapter_type = "transport_lcm" + _adapter_address = "" + _tick_rate = 100.0 + _auto_arm = False + _auto_dry_run = True + _default_ramp_seconds = 10.0 + _decimation = 2 # 100 Hz tick / 2 = 50 Hz policy + _n_workers = 10 + + +class _G1SonicCoordinator(ControlCoordinator): + g1_joints: Out[JointState] + + +_coordinator = _G1SonicCoordinator.blueprint( + instance_name="ControlCoordinator", + publish_robot_joint_states=True, + tick_rate=_tick_rate, + hardware=[ + HardwareComponent( + hardware_id="g1", + hardware_type=HardwareType.WHOLE_BODY, + joints=g1_joints, + adapter_type=_adapter_type, + address=_adapter_address, + wb_config=WholeBodyConfig(kp=tuple(SONIC_KP), kd=tuple(SONIC_KD)), + ), + ], + tasks=[ + TaskConfig( + name="sonic_wbc", + type="g1_sonic_wbc", + joint_names=g1_joints, + priority=50, + auto_start=True, + params={ + "encoder_onnx": str(_SONIC_RELEASE_DIR / "model_encoder.onnx"), + "decoder_onnx": str(_SONIC_RELEASE_DIR / "model_decoder.onnx"), + "planner_onnx": str(_SONIC_PLANNER_PATH), + "hardware_id": "g1", + "auto_arm": _auto_arm, + "auto_dry_run": _auto_dry_run, + "default_ramp_seconds": _default_ramp_seconds, + "decimation": _decimation, + }, + ), + ], +).transports( + { + ("joint_command", JointState): LCMTransport("/g1/joint_command", JointState), + ("g1_joints", JointState): LCMTransport("/g1/joints", JointState), + ("cmd_vel", Twist): LCMTransport(_cmd_vel_topic, Twist), + ("motor_states", JointState): LCMTransport("/g1/motor_states", JointState), + ("imu", Imu): LCMTransport("/g1/imu", Imu), + ("motor_command", MotorCommandArray): LCMTransport("/g1/motor_command", MotorCommandArray), + } +) + +_remappings = [(_G1SonicCoordinator, "twist_command", "cmd_vel")] + +unitree_g1_sonic_wbc = ( + autoconnect(_backend, _coordinator, vis_module(viewer_backend=global_config.viewer)) + .remappings(cast("Any", _remappings)) + .global_config(robot_model="unitree_g1", n_workers=_n_workers) +) diff --git a/docs/capabilities/navigation/assets/reloc_and_nav_to.webp b/docs/capabilities/navigation/assets/reloc_and_nav_to.webp index 65f9d43f766868f35e05dfe5ebf1ede36ff9836e..2619fa901912c4b0a07733ebd7fcac4c07db5d7e 100644 GIT binary patch literal 1014488 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%0A-JofB%v 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 z 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

vd+mk11sCvD|q z(oG6VQXmaW!MMm#r)-a5bxo=97((P!Z8g0a-)tY*Ob0fqBTcgh?*tIK#|@5?e&`6t z03*g%>&J}&b`!L7ZVCl_i*z)@6}!2>D6geyPJJkq@4)~+GehU-civ?oR9pLf8+y< znY0X@&GRHmE%rS~wocobaJh5TNt#E3#WsHR%l)&ew~Uc`0Lj^d3_@{sg%Kx3s1H1m zfv5qLWqp?XoyH_+ZN(?OQIUSFToND-+=)H1n3T$ zSm+_Fz~Ss#Gz9{{KrX`xZUQl-x-MoJ4gg22M1yIv1qdLzRPTyZ_tKD20Ix7iNxN`W zQTT(Gw3wV|r3~814Z_a1qZd=6E|S?%U|_}Ialk8vsv>bCW-L}?K)jMXlhw&_u|eBu zXR*v9|CrybZ_mDib;$i~>NGbHugzMEA$cOULp42@AL!)?d+X+pf;>I5D>6M~n07A; zxw?%Xc96_~6wvVpQ?UhMyko(N4J*D)&s;_-x09I{?`F@JtH@0hDRNX`del+G&`l4V zRFN<*Ig+vg#Gq(+6rsYx=cF0?Zmq4&Z(q0Hnsn7BUDH>@#bJRLdw|T);%RZzbeweqK!G~D*r;|6??ky!tS6Tm(_xhrM49ousHdSU z1{0s5_yz;wNpqABAp-Om>c9az&%%TwB4IH`o44Oqr;C5(1%2=1$A0|cx08?6MtN8x0l@Gp{(-a_H~j+zN?rx1WfTnf^^>zQUtB3G zezlt|R+{8VT=<1$#?SA!f6U)F7zD>;4{4bS@@+hfFSf)dWyo5Kp=+z zEELkUijUs$1qkWW*|#C+j)6AA#pCSIrsR5Hq5=4F-7zMSpoJ+Y`HGcX&pucJhVP_l zm`4T>ToQ!=u055C+_BJbo_+J&=an=%ND>PrALlowF&dmmMmx&zT}-Q{qw7X5NmELk zg~SA_TZ1dSf>PDU4wnyc1y`2rllAk+R51d44Z@Sv5t<_$ssv1nN`D72)o z%Ge{YL-K41QZL7~+@sIrD2Kr<2{&?g92)k|?Awk6HPlo4{K~jV* zKzLg1%uz24!aHVcxQX&VcbBu=s`+uMZ9(5fRj2?4!Es1|U~Z;BMiUKzkwa2b0tQ$Z zKx{S<8agHLB#ltmnZx(==|012E@{dgxcE4rMb6oSeIh$ZK4E=};XUY&*MnuOA|I7T|Kl9F@_ z`({UJ*u~=nOQ#ATVG@+W)~-n410%ls@}IxI|Nd+3=K%itpYjj=V($ub?;Z9n&7*lt z&l1_;nI1FE)%NnPeebKEw5Sw!H4WF3D1^+uV@l>o1Hpn zbI9xFbh|j=4DI&1?iT6OO~lVGr{U`B1eR8aHubR_#RRIG*fPn>Ck#?kD3m{+= zrT4FMzu*bf?C2Os^vr#JvXe{EQt!ARP7{S~*15)U9eyVj)@o*h1eB)%=uj5vI3KxC z1CI5&tI@KcF|-$MOdPOnm@(lnWC(71s_=%6Gd47AxM|?MI@PTNh?cJmBDE0&;VmB| zU3E5!9k&TSor@PRLF-N?z@7;EGayhsl@E?0_h+ z*$5;A1FVp8%W+aCf?PLya?xIy4 z(QxDL{w<63Xv`bcl$jf%+kFlTVv{0ZWOZFv@{Hj`>zo*Ad+y~*)w=hNZ4a$zcj*PKGr%PnlSpPUFn@G_?_4yN zUc}82d>J_=A3yrx&-=yqe*NyJ#l89=hXEv+x%eF?2zUO%KT$+xP|G8;rXvFrG(1g}>H83%Io<^&fL3|LSK#Q;2$Q{#ziXx`BWVel57qA#`* z>j4HOSd35?2^v)a?m6?@P-jbF(qcxJt6W+VP0|n!Dh>(*GgsCINcM{m)(iqbfaC=z z1OP)Mpe+F>T513R1Zrx6=+!nC7Fz|DcWfBr)2Y=VsZdZ1GVUlQ9*4NHQkWCDwDhRdy=r%b zWukc1?Al=~ry&4!87nBs5(y%>hQ}rvfF!VS?zkYyrfHI4*!i%*?U(?>ie~|c7`8#| ztJmAt0U1UshQ)hijt}?v6jz=TqgOw*X>Z{8Y*?{_fjS;AjReZnN?{DPEaeUk$aHVo z+{wwfFc#JJM(B8_DRyw;?ns{A=dd00uKu~byT|8#xARSVn2FaEm&_*?+pk9<#_|@s zxKQ+>)o#?pvSJZeb^w!M+5mIKJ%}9_&N@gd@u{fmNr~#WsCz8{)MksskAsQ<2nPqCS}xHxOSaI4Q8-ODHn$ zO||mL0d1xUHDk_Fn{PgZ-PW`qq&HMJ2~Wd!s9*H|_=^0mUsT|)cr^dOALRKu_i6;~ zro+CKX`XNl(gWPI(2?o#p^BM=NDn&r}-c-Ctk+kq|R9g#WeinYH-&tzRmNrCv3B2l7*>bg(4SO z7!q|Zb7W}I;E9Q{BGe^BfL=L$lnDYMPCDk|h#kALjcc$fPb+gbp`{vDu2p%EWSv~m zJ}*d3#f~MFjiU%Iyh3@{Zag_@B#CIhqP(5N6}gIO^Bb<09FBJoE*KRB8wB_J=7mN@=k^`9r&{LX)KP~O0}%_*e%fLL5eNpldAcOrG6gzFASwg- z>ElfzIX#hmCQ-S;?`jy6;~`aMBkiy696^D-m$%IcZ?#VCjEIT)mar8-8#@Sqi1BY!aovrCDZRq- z?s!RkVagU^Wl?yA;mA^QwXU$`k{X*NLV~)m6I65*4nxlwrAe*2R>?(cM%s7v?^L^- z07OTM@alX9b{Hg4O>1azm0olgs~2&xhpyh8AW5@Q?J^Eqz3)27ECf&E8Wccc&<3Oi z0Y$T+x^{|t%fQ=jB=AWZwhmMx+kVcC`GuD!6VTfXc5oWxs41lZU&fr;LWqOia zIoYvk<2h|&H4Dkn96Aqk>@>G&4iow}?Z=&N_j6+6voL*dxWYC#7Zn&SglV%|GJM)U3*>Gh~&>tS-pmn2}Jh z+cZY^s0i7vH)3&~&W#NKgG!%PU5(3uA|Gz$5(bbFm`*}0LjTWzM}D!5e7klGL}lkZL{uCx^-uo;W|Z08Nw}{0+m9-in+*Y6KXUI11)homvTO^ zPh<`8&pqsa_5<0^1N_ZD;ve|6enetQ$teJ!z}Y(CfawxyMnfr0C$-k-TK4j$`{Yy* zUkVpy^3Vdb) z1zr5XZs!_>j9S^KqLNnP%@F}YYFci&SFvyJIKTv_o!Iq1bw{|!Xr?C!qXB^Ch@d)X zRqNqB+9t*6=8NeUw)HgT`b=U_r<(;t;ITc6qKvJ{m^V#vF_OeS9{ZBqZKX^{w_7I| zvq>ygYwXUeP9=cJMA^+en+uJ9!SBMai*0>04>xd5mc=x#rNN+5D0O-%3=W+zH97$C z%3J`2=sCh%7o^MCo?IMUJ1aP6@eU9x&KaDQ2Z-2tdupF&2!WZIgz0@x<~E(hydWSr z+U5+6dioD*-thZ8{8IF_dc; zIJ}-bgv`o7YGgLCf(o(EpG_dI&&VgW9)vnzpuXy=W~zQtVZC; z+-8_{=tKn`pooZ(N&PGCsL4mGW^7h;%cICCV zqepCd4;R`J9~8`hk4P~w5)B~45p-4g+EMh4yYMVwsBw`Y@@DYmtKYu$)w!PwD?6j0 z5P&;>=AZb1()ckrPzg6U`N7a6#p(zTH>jL-f-skD3XNoRu#CTNo;7fC*TrlW81O@BiAcPvTk%|@oQks@U zQyJB8x-){UV@!;jYgfQ4nG7){H%P}Bql(@De+4@px)5;;3RaRR03irt1R!AsHn(I_ zU?etIG^9n(aMeFEzl=c$8R3d_R&=Gc8;E*2N}zdn?VU9gsxmLGq}Ekvi^nyz9A!N~ zkG#9=((YsjZn%rf&iqp7&@$1g_Qh8bl*&4Rno*PG0HUENxz(~e_3Bt^dDfA4$V=Xck3HW2bk5CyTXK|Wy+fo9IhGLE`I0a5~h^PpPVG!KN9^YW0 zWIN4oxjoG5zR^W5Kw@kjbD}eLmw-SK7Ag({O9IBnIc=BIXXNGrIKkYKAmcr!FL&6F zp;wSFQVtS^XGot|+YAC2805-T0gWf&iB4=S%XMsqj0OmLhe`&GE@it4$+9J8$$&}Y zCTjbV)#R26rJqRr|1aLh|MDe0|B6TR_x+(iKhCfB@&P@H0BK5;WLG$DO<~L{y4|I= z+qqh_-OVM`dU$u8gL#p)5laWAif|?-p*KU%Sdwb^#V?EJ;vF4fcg-PU4Mi|+*kN&0 z>_a?{h8Y1fIx-%-4+tq=@z&%5XbG&7!9?o3{^#*IpZK?TdC1AK+agi)Y<~I!)veX~ z)$L z0HoEbJw@xd?J+p4!U#K*AkB2sjRBIdrx7(l2B~h4&gD#GF48BUMp%$)-cWgJ(oWH1skHXIdC9xHTR+&=%> zsLV7pGB6wgb*n3KLeJv2s7qTXObAmZLOZ^42p7WuiNwjGkmiKLJ-SXO;kH?BnHsN+ z1Z1G3yRve5J4jxD0x6F;B6A~xJ`Z+KQ)OT@^nwMYP2IFu#>_KZN^v@bS%219it!<1 z^TT^|)XiGvF@v_XR$o6+fReod0HXQgpIFokvtolKG92yn6$lN~;4CyOkIG^$w{aCJ zQ4)>>_RK!o#?d_VSm)-Q=|(SZu6=5YF$IHX5k|lP0URy?l7o*jqf?2+(il_D@mH4ZsPg`Gn;(UcnyCN|q&r~P)P-GeS6I0M)1>>6r>ziu5RN;5>JtEpU67Q2c_5svNQ=W;#3SybO?MJ1JyWagA=iGHwmU>7$i8FU~Asxv~XDrOROe zI1nLG0%@ef1@llsAcLTIahvcd*Q?jnOe0y0(Hy|VZFn5zh9(OsfC0|fyk~-CFcs6) z8!}8w+gQ#yAuGB#L?{7%mr>2$r4E32u)>^uj7Ss^sVxbWz915|D&$1cBq9|!8%5Jc zRhO3K8k-%xC7Z4Y07Qr{RyC*XBAb+jc=63vgWMQ0x_4xk3RE zdei(~FwBB)8h^R?#6I2`=AlVC5{^T#Va0xK)O^5WLc-mOluls9jMPoV^4;#7zgU0%_x?YA`dfQ^|3BY-ny&s`cHZ4T-1543e|Rre%0@xO*zR{WFk@Mf z2+?3=BDPUcs4$t}@8HTjFXV37=Fvr;EkNx)M#XFv^ zhhI|COn3S;K%f@!O5L4%+YijA?d%}I_c}xQ_B&SxSJ_aPFO&lfr7V0#(+y?4c9F+-7%*JscOG}`p zT&abRl5K5Jz*q-zG09Uym0W|D7^94ZaxuDEcy?SZ?(%8yTFvZE$-E1-N7GJRSvX*; zNH`Wa6s)K?o_^S>Q#~d&&Ak#4l)3>71QW5MS(aIQ9enbf6*5h(2zLX*`~)K*945x3 zq@43e0>Ok%y=h#RY5JCZ8&}3(TZne2`svh?kKshz*#XCH;Dik*X?pls_T(bSVWx>a z5g)P%Ddl2TNf5L3&NpM6EShPj)>9Q4&%@80EeooK-s(Z_MJ);P*mGz z7NL|uBtAJnBnBryV5&M(tGJWMVwD*ekjvf2-~9T|{qpbqc=zEop{9jqThhglk%Ma3 zr_}uoQuWSp#e0>IE=9yH&4|vJi%mJOf3?@jg^!m~?6P1_BXpXcy771HAdSoT2^cBB zy@pK?7%(8OBB`5DgaUMx=Qk?=(P#SC)oJIz!y?2Q2Sb1nrK6}CO`7Jen$vp@{T*vU zAv0F#q(hgofe?boT$$=wR~%*AugpWCgxt}A4UkTm!&df{V||=i8Uv%clvo)i7AlHk zfRU&`HT`pC+PYfds0oMe(pvfL#$IL7q}83NnL&kiq6}h?ZGEqWC%2Oas0vbC#uAmp z!YidD^#W^*3y(RALPY_(=GM|$5tRUn)meNkyeNQ)hlRQOnjedzq*Zb)Nk-8E2tio1 z=p-u+8t%Eytlkw6l2JjoE2~Y{k!4#xW!3y+RsFlfjv{8ATR;^{Wru(o zKVELgPufsiSsKvTp#hR1nE~W5BZP!mU^JA><&MFK1}mtPMDucKWA$@#*`sCU(P1Av zGiP#>H6FNQ-y6wO&pe3@lVR{mb7Dc5&lgFXwdq{TRAf)%l0-H=oky!)`53C-$kZ z~0>-1vXC70DU{YA91la&3?R3ws>IuWlcVFN8dfxzk z^fvh*Aie=snXHtOBL)aFD~UoIz?@GFfCZ!MY26Ia5R&s<9WY=+D@_cFly0wc24=u; z8l6&EnFLWF!pO@3pYXBv*h{5GAKe~xEDCDSCd%AO%QQKi20$c?3MSx*3}#@)Z{R}N z;i*wNLBJ?;xoeAy*jbCd@H7-L$!0g_LJ|)MM=UiJdtQhD<#I}K#z?(3n2{#)PUMW@ z0NL;xgCH;vJQNv6!43-+PxU~tX|B8&-?*EJAgWrr`0n7r&84aqz(fEOhoi_(Oa_wp zIPxSS0Rs{y0X5$>J$rgLo&t;ZtsRzHFhzc0fbVb`qMZ{v*@wNw)AdDmHCTE|xrW?V zy zV|j#ZyWt4UIn`(6c5p65z45lZ5nPhaL2Q%l>jvn>yPxTJOofx z@wV)(tK63Wjh=L6NWB5XLHP)Y{h`J()5e5u0|-fD?&^FzqF~d!6cQ9*Oy;HWvae|; zrAKdM;+u<4P{vCVw6bK;r)?WAzEqZ+)N4q?BwaLsEoCPPvjK!~lwPRp0SMuec}+X1 zFaShb^S|qS>)(8x7!Fg*`Yyd8ZYZ=eYV(C9N`zWeNtss)dJ1^tik+W^dLs~Ppk_4rqKbftqr+8Jck7fxK88EexeD!c$1(U^pp zx$9wr!WVEW%!k(XVhO-1FQQ`C~rs&yU}I_V`&mCa?bb|K7asH}^T*ANFbc)%MYT zaHudL8ww3z&l-Z5oQ#Ap(^dmF0aZH)`C)-5eo@D;t1&S1nz!Hr@k|1&;Ycvo5_=NX zmvgv*RB9psoZQJ_x!=901y!o4r32>#oFsz@@Ka1|8Wjkqui;gOcJ&Squ+j7^cOabB zlI6-pIAICMlRZz&BjoCl`5Aj(>YPwJ!hkYVU*sZraJrIBs6#>N{qxCDsg1k|KO6C0Jk?n@r` zY5R?8*gQbN4J(pfxN*-ge5-}zEI{U=tdiV+n#y3aO;HGD3LKyf0)U3Qx&$+e(>r2Uw5uyzGQ8uPuXnGdRQso2 zVcSTp@m#0CxZ!3LR$PR!3>SorDJB&tW0tXHgtl2KaTD&waTDO+47ykphhDX}xwtkq zaWPP3hCUAavNnmPu^IOY$E)uo4l{Myft+PEtpu4l%PCp0$muMWdMu;XRG2DbiCkzDH02~c+ zP{*(~wH=Z|bVO4iM`DgyW6cDmmkV*1n*sD?H){$TUA#NH1@5Rm)y;eFjmb{iSoE&`>+r1<&yopwH2?TNh5!X*~TJ9xLnCL z#jCg>1evMLxxz$CWzvaP)Kz+TLWN9SvY3=Cqw)#!_BWYUq zCT$?;+u~0Yst_;zZoK5=XUk20&1|w1%*fAR&a@?E!B?1Qai%K7j9W}Z=C!g(Pbuyz zZ<24))U=yyz6QldBv4{gaWjr*ya<}>SB4YK;xW3-2h3g&Up^039O0oM7gNPxl zvB}xb^1os=FIdg<2{o22@npP1Ocj$I%LouvSn7%2QjN}u@8(S%)a*0UVXk3;4_x;? zJv}~qI(uyI{Z6KxJLkC1(K+mCPV7uy(@V$@RQ+;iZ-$%~CXx-IBy~J>Ribx@D>(Cq z7p9t5Kg9#j%hh4A5@hvdj(2^f-l8!6hHliW2v-&LNRCpr?(9)bMPG;*oV!sE>#(qe zThMN+O1Yi8Tmjg!S}c8ud>=`AY0ZIHgF&7rP&inviEma*nHYQpCK;ubnu;8KlMj-@C#B>^FkAr0Mh(d5aw zuu~u-Mi+Wn|}sI~dC_gw%<+>L*@B*oA?US;6M(8%`cx9*e!EMAK% z7DMVp4wL0%tYkq-X}pLtr8;AfUfz6q^B6Whdp>+bD_o%&36HyRUxg`V1c#N< zjSOlK)z%ajVg+Ua>3~utW$r37$w>l*QeX~PW0RmMAOkz~)ecsh)8;}NcCGGkyi@zU z&Q6d7iALW@6J;r@Jc6YOvSHm>I$Wmpn30K5XEz#v6bT5JXkK(JjoMj_W0GV~c5d$Rmv*U1Ek!D-xy)PjlAo)><%iItIU zWuLtb%ap+cBpP23()Volof}jB)V)Dn`HAc^jexO}#_~YQuJ0v2uO5z(IE7B^L?odB z6)NZxLZez&wK3_qv>7r(7C_tV&US9D>$3(S3`C-fX12H)K>`BS9a95$O!e)#av&VL z$11hYNE8?*Ott{|;2?`%;h-=?iT?tHGNK5+$zDL#Io4d0Qe7>=MyOtq$Nfc>e`=R-UAZ&mH6q5>v+a*T$x(Mg4& z^2{oO2EA9p2&kKe!V&AMpHgXtC1R9t!qpDd$?|}qrV+^#KQjXl^4O%Yl$D3tA44HP;H6O}-D3Ll0umtR5dVxid-XvdjL zwg}F=(oWRcY>5+nr&%zoV*;cPR7O<^&z_*2Db}5)P(cpxERK1=K@!$>x4<^LlTFrx z0T4wNpuz}>!^oP)V5ZU1W+N$7%vs{HstIt!F=pgK5+MsriO0rmOSM_<}-JeAg3cJh$OLedbqFfeEM)R zt90CpnPmr}wqkc!cdu{zeD4AI;pgNdRSJ%{8E-U1%$PMt79j~Z1{stL#2VZbFBiER zNqxwi=RG-11WaiN=X>B1=(T3W&|_*w*eocDblZTp`6=DqCC<<=E~b!DVr`zOr8JAi z;#sY+yQY~WjUWcvivaNGMKCw#BHCR6DLkCahKM0Tq&V zU-T$!IWrG`%Sfid0sxUzWFJy6)DtxZ%@+a%;pLu=>sqaPG(=qGjeJ*}x$5Gv1t_FM zw=sN24B0An7w=A<=v>sQ0E9*=Ku)4U0u0h9HrYW+8p(ILN#Q6K2l@X`WJG|RjF`TB9n}s#W4i6{eRfPp@(S`d2=EEX*_+AWo0 ze{GwV35CouwJIxD{Ejv@J7+8E8yQ7@JHjpWdB4DL3a6suYm65Zm8E1&2SSlt4YFPRv$_=x4yAGbN zlqt1k1*{=_cEXanBdMfmDzup-na&b{RH*=TbG&J=LnkaHFp*O;y-5MjJP|mNM(pf! zVN(FfG0P;WJ2tghn`+#wiQmfR-7riSv$kjP)4eD{*&)Nu#lT1koE9!EV{vLx!m88& z1mOH0yN4VnaJ|I;=MnzwJ&mXQdw%e|-1Ue5>+}A6;Ele+TE{JfzPVx6di8^_-B!4O zR2vH^s5Po;6{bjyM6C$QT9(z8*ZR%rJJEZE3w)aq27mQB+h)BmvD zrs?UTsU(}vt?a^@+V%-q>^?Eb2B%6jx#ihK9MVgp#B*<>{m`dMI2j#0KsQ5e=hC5M z+GM!CR@a~`H?KFJd}nn{p0itVbG~`pouBT>Q#NG4orShiG$yFQS`kQ<(ipV}1v;TZ zSk2UxX=Ece)o^%+!1|pE?iVIZ*Ty%FVrr>nh?ip8Ss7uNLkA8F!Zf>hnrF)41scwi z0wtn}%^DZ!pvSFgncxs|7D&>>a)|t0wpQWw}^;WE@V4bed9gJ37)e{$+%0|xBzB2LLm)=!s99|BoFE! zO(p>c!@xljfd-k1Q?V_RO^xRZJcgMcc8~~g;`P4&BTfdn^Kb_hu1Le+1qjo1MN+ac zfXC9f%dy@yFtZjof0ip@@erdO?c(=N_Jh4vduCKd>>nBu|{2$Mr~NI<2zO@fKt z5k_|BZn1;ayuLL8yqKQ(yZHlu;SJA5^Ai9<P7WO+r^HvfQ?Z59N_dE~q;2_%VWcX`o^EIHU8S*b{R$3YncfM5qwl9XLunS_i1_nlyx570dr+&xO?Bv;=5#u4xjpjezEgic*)f@(3#zZH+5BBx z84e!^NNqjUd{PV9{Qsq%kc(OB{bw*h+zGO~vI!_VESZLOEro?>8T52p1tC;e$TiOF z^i%RiPrQP7Bb9oP5~)DCQxX%}Qn`9M7n;ImMMt7wLQyP>T*elgXIq#GSDsXnDn}X)_X{8sPV*Sx^1f)uw0#dklO!mHmcbgbH3dZBK;P->VQpS?SxmC-w*0I< z%W8(cQpT+(VO&RhCcp=)B9ie*I(-w zFTDTJw$khO+6DYxPk{5?dgt?6A3L9yzRJb?*7U%n6V$00%vPM=n9f>E835;PUf+Xxls>no2LfEXXqC4HBL4Nu%`v8i^ZLi+Z!##O>c%NK@ zargS}bufSU2+O6=;H>$WsV-&p0-pSrjx}v=S!Raj!Kuy+aP>hgL!v-NigC-S_=rA8155&*vr%hm3!i3KbMQV$V& zfSY~(8=1 zaoDbsn(c5&R6-Czx!=GzK&pm=ORG)9k=~nolm;`GPl3vxlTBYI&0;}rQ#td%VgxK+ z7P`#5*4=D(tbK|*M%54}w|=NjX>5rI`Ftc#3*~{^ly`+wG&GYcF#LY@zm%}hiVg%G zLtNUSSsLB6G%-GQ!t&Z+m19;Cj|{;;0Sgn1OMn3YWI&t0!a25L2WeUDiZq%<9q!(= z6Nj1e6Hj~I?mVT>T>ZfA>#+O^O9t58~vRp-trizuEsPD9-lZUl% z=Ax?A_fmyS20XZ-#&KddheD*JI50-0Kxkp{Qf_)=)uu5qEmxpf3YdE6&aML+SGqv6 z$ap+)b@)Cs7%V$zTp z6%$b?qnCTkv-r&Y;*q*r$wDv5+4hBLGlCmWgQaF6A(Vdap5R=Cy`EADN6$H}$8cO|Ua!L2( z{o!ryIk_qCUhW>>e5&~ABWWapvtE7FVmd_uFzpo)0(CSDP+AT^Ofwu>lmzvZ0Mt8* zra8r-$2yS8!lmgVM%WZ7CrZJGNraJQ+PU_4fO3VbvN}&bZeLy91uep!Lh9n!R`tnc zeaTGML>5?MjG%xa{FZSV3yo}x0SgB~6YFVrG+-MOEbkDd>!~~0fS9ot+Ynk+o<^cO zxkV$SjD?ciu^Yr&*1FOg77a{9F$g^a>+=`4+;~Lp-is(LN+jPhzyTJv3bweOMkX|a zs@)JXYXgX;bF9YSPOTDsUhu~@eYT) zX9tgr2UKUSYYc)j;AM%cjH~zp$fvh>*SY`lJ{AADQ?P&X9Rm*{wj~j*vL<}`8N=3a?!p&qxc`p5lnk+Q77ytzZ0;{jQPdS!Sg~_)N zzIafT3#VR#e=NEe$L@_5gO0fI(Nyk*KDVMXSQ~lJw2jcAhkOy6-U&1 zLrq|2VUfjHi&km*tb(FNZ=G&<7%#QmBNQREa?(tB@k05Dec>- zAmAh^wnAtV6Bb_9u4QR3PE1d?xufzZlkP-%;9$ViLUouJsA2*T9EFV>#*ko0lU4d6 zD1uEaDmf)$jsg(@sT>tm`)DljRJNU+#NAmv;q*lUjQ8nJI0C=NW;WU;=BmnS!W5jW zg(=Lm6Q?A1GeesnwO?J=m9cO!C*&AbLBTc)VwYEKpt6aHBJ@5<9@NtvC{`x2j3iy< zx-HJ{U%2P{hleesJWnI$X#?-+M`eIpnL0E~A)wGk6RAPqgeLwj|Oy(?1 zL94Bg*x#97UHbL+uly@*8@PM)mv`rXsa^OD_RLdh&73xK!#A|(4%f6qo3x|@CqD@U}EIcVKtN#0Z0Ko13mAnaqQpBko;g!6(b7?g6-1hG)-@sa_xkyc`e)DOwx&*bCUm9d%9%wpKA#!VEQ3!iXG&XPtwZKES3S#t@XQS&p5&Gzlu`{chsNUB5k zJ!w)UlPU^~0zo%mIDiDzD9&M>&5I{)qee1{WkwDeXwH?<`uaj$a-VHC3PL0!nXIkdvaOplo)FC=iJPmdN0D2gK32PRanG{n7wPA&>5ofHMXd=>K_GVK#ZJ!F!w4`7**o;FmcF{)b zTAUc1E2_~=43=571iFQUZL%7nFzT^}__WQE-h`I-?hIs8QYPg(cXjW@6KbTFi_ugf zhS{2!8O~=uAVML403``TmyZo(xGJonCT0|$42jiia*D1dQ!u%x!b#23oG=0jc*7r5 z(D8|el`cr8hwGD?s%ckMp1@3Lx*pn9Ldq2@`)EJEcJ&0!ESWGi+QzxamLZrjbdm#! z@89@UE(GBovu`Lj)%}KU?oIuFKL0Q37pGK@aW@MN0wxz2%Vs*TgB;!`y9Zg=63)bv z;0!1+Dx^`NXb}x+@8z{HNwm}%J+dc=b3?D}o=onjH&xxZ43|#M{gZ#Pc%SyOrSBG+^}I@)8??9Ru$|t7A`Vm^M?ZY@ z+s)_FgcT=Ih_NC{%HVBTBZN+kqAs?pQc^R z#02x>JE2(cW=bR&BT0z$0dY#BqY~7fRZMC}Nv2q;a++0X~Zc#wN64In@f_@Dp)EQ7T!6wd<% z7-R`pgG*@?C)zCd04*k1CWz69hJs{@F{vC%8Ps6nSg#(Lv07&;rJ$K|(Qru@OjeHE${XA+rsk;iC+!I2~i91w5?Qdv-d(&F5EKG(X`1$WW|@%QZWGM}BDyT}Cpf?NtLr%LK`gy%s@XFw!}K zf!%v##M1CRT10@z1;xc;#xE&!#>F3+GZVcTh>{x>So8?aS4f4e!5}D7m{qgasG+?D z$p9+^$Q=c_v?G{BFTji5FIwWavaNxU80pb4OpK`xOJ2vYf8dv7koynUtnw>1G{uDH zpw5r!;do{i>O>>zBucme11k_T(O%rvrU2X#1puoSruJ!;;>BepAeNZAno1{=nF$P! zq!4s*8W-y>3oKD{!L*nvsv68mXPC)inUpSF%aeBI^LF!u&FIy#FYt= zp^(U?0xv?Ri}?h^P{|l#L;DU zta-bzvoR57)6Y+f(wy3aXvEws)x5a2aJ&%+OY=E$Z zz8q=BA$pim=t!3F`x*!iuSpEVO^;eKK~DJjsE?GVk(j1~v* zRe{b{Fcf1UW+HUa1G$=YBZLzW6bK`^QBX4<3jwVXDiO#>M-Ew}N#B~xBt^SoJ1qe+ zZtN(Ko&kmpkdOq7J|PinOQn_W+NIl|iJL9XZKEWFa7}$L{rHDo|IzP$=hGmcKK_S) z{qOvvv(L#>4Ww}p4Xa`~Oc&=wV)BVTX-Ec^Eo~CW*@P1_q|a)$t?+Ss+CQM%Zozo& zAJsdZFsTQb7HwHJ3ToKYkOUA0k|=QmlC0A^R#Aq&S@s+~t&Q1doxjj3_=thwiA>Ce zt4`8@QS8o59-KAN+?6D(7#fD0K1fWI(QXzdT=1DkQWzSx?P1czU`Y>tT$=N@iO=@G zDoJA6m)hdFx%!Kdvy`2%`qe(8OJ6xw8hynWnbzg)U;}~C(j|qD6{q!=ICt3K4ctw^ zrR700We`hE$g0O>2WT4a(au9IUU{vmk2tEL08G5jT0t3`I#nQy-T=3+2E}&*9!bGKkGPP`arYD)ESSHPo z1Uxn1lahN~JS)PRsJ?|hQUxW=sf~SQa%*db?rqB+Op)r zhILl#G^TP-#B|XaFUi>T$eWB_+U|pOf4HYhpVFhRasFib(FZfm+1>ujkncYEchVNz zt&flUIGq1f_cbq{`}E#-JKs&dNli1%=}t0FBR#I0XZH$mvQ|ywT2LsRD4@ooc9IRC zp!XJuxhjPe>6p`_(O5K{nRZCBusUUp4;`TDG`bgFblUv zhv%F3R9WC{bm(qfT0v@24(Ko;!Lo%A-{l#L)rkNF7Ay{1VFGu#Xlw7quba29yRPnG z&R1W%gx@xAvo05TCpBVFZa!h9lHo3L1w|fep@>lfh>6{-)qtP?U3YQF<==CfDrhg+sJsZ04g8=2rTHSSLf|&G&n}f-2R+dflw)Bm_U&j z7&WtK$cd<+2tbuwQJM%)LnGGmAp6NutoVMD3Y!i>6xwLlMU1n=GN&0KbJ?x_PCy7j zu9}3*P{<@!7T@pQG@;uBlKs|m-kQKUvsjX}JCtxj8_YKAi6gfONF<3c7@mZrjYc7_ zU3KqsANXo_m_ccbqt#H06?47$_#6I}&+i^}_y6^$f9s$BXaDMd`PXg=z!aeivJshT zxKo|?xwHzUS_Ya8txAdsB?f3Fr-2fbGK{GttKZGXTW%F!X33<99m{5klU4aBIE*$B z2apg21xSXdR+OdF@4o!quYc^vyAN+8IZZ1oFfUx-M5^V+m20(1+8@wc8L11s#qG!O zQ(zL%30yr`s3lf+d_Z@C?%Jk<3AQCYZ~^L$kiqBt|6Y$&Hs^|4v89O^CHm`ySIt`# zL6mXi@;Rj20I07XaOJ@ZF&pH_pn|ZoWwt%sDJwVML-wB=l!u&azMv&7; zkM9X@ARbYi-NNHntTEb^7uKvRA&D1a`6jp!xPq)?(+41M%~l}P5)LW|2$--5?WH|? zMH8DypF*-j4ncyE6vt}BfkE1E9OiObQltYjlCinSie?<*)!CKuWWxmEx%zabl)RxD z?7#u2bZ=JXw_eYFn#VkSbGW4%pb43jBEeLnun;6;$=MJP8!Xzi84RWqretD>c_|?l zn@XC8i+etE075?Vf6$B#U(~{BpS}J;r;M@sS-Mj&9RLy}1O)^LiKGBcdGWf~FFvdD z-PT|p?%hD-UQzqG#bH?`!@NQmIZ6Fh1^ zRQ=%hhID>TLWpLi1`I7tN2QGMUdD(_&Pff{Xyu*0X}j!DF$*E+CYq^2(jKX!aqVcK zvoh^sa-5W~vUn5+D?;#kxPJY3>0Xn^?Y%$P#qZX$kA2^K^TDmHc=%1}&wg<7cjD-W zY`b;z+B|2vb?&?s@7XuxllQQ_adjq^?%Hi)Dk`W+I_6x5Y%MpcbpUaT)Bu%|MMp?a zrLj~47!&K5FXPn{+8pz_h(pl%WmVJ*01ROigWB)H!&I5-lG3n=ks9^2BBv3Vu2z!bp5 zm1dP>F^Did*XJ2+a>gfh2qu;_6*5u*0fhqsRrg2>GTF&V1*3GC;%u!iJBT`xD+-Ql zDXVh|C>a@u_4{Y^{M>K<>=%FCufF=--V`}Z;iN75b{IZlKmv8(4GUoh#E?G+6!!+1 zqqme7Ps5AboiG?rfSa34iZdQQUVP?>98FU`u}ufW(td#=qtAu^*8LI_s7uVhrZrV5 zgN8zJbd_KH=UPT!S~6`+HLGU#%Im3nr58Z>3T{4`(He-yGvR7mfBrT5`o=wdeH{7@ zCj|`4(Q<^=OQQa@t$^dsTAuZVxu9e&4SS-`LWTquOhJK|!375{g@zU-i_{=rK}jlx z4T_fM&DQBZ>sOA_x^#|LC^kwV!U3H6^fb?z4vge^?d8l842y2*3+p&;V{nTZvgE)& zok_vsd?YwH3e8M8kQ0)bk%b5{vyyF}*nsdI!V(TN#1LxGxY+i*XVe4}i<+|2rU^i5 zC&dFB2DBiNYw?NIX?=wfz*weQb-J{)Wt3}YPL^g@cXQyGI$dwSamZZFiI&vjx=K@+ z!Z(-f;!UTV-Hilo_+)^r5}+bak|dMV1xtfs;vzm%x=|9jnjw5pYcNW3HfsJpnd%hX z_x$Eb{)sa;TCicGg*G*{{+Q3XaO%%~`XC@oM#hqWi~yvWnnZnb3b?yAr`czZ41KMJ z7Q(jJadZYn=qC`jV0DY-O4q|2cg#8OCx!kO@A-4yzEJ!v_Le1H%_cAC(e8(@?XUT0 zfBn;bYv)&k@0_=ZGksNBt0_T(7lajW<<6)&#|K5G?ZfR3LP9HSxz(gQ!x)1KTUjA9 zT?=jKIHhbP)8SUP0jU;`vSSbhA$|YCwYjsEPdlo7{@wl2Z+__fv43=#W$xbHQTIFD z$0CIwlQBE9Lp;b^^eKG9-iTklR)%%Lh?|P-;GrJbY;?T9VW zAY$f3j&6nv`wrHAe@{5A{oR8#E4ufG+0$Jp{!(>r5ngFGS;e$ zdJ3a}aAqPy2TmZ~Dv7naTB-GgVQ3XKrdFH6giv6>oQ0HQz3KTwkIR#<)wT7)lAZ3| zce1Tjwj7~mIS3BYBFAu8&GkDpCSK|R1xWfdn|mUBFB;QsUfth(Z}y9Kcu4W<7?zf% zN$Ien(43OEJL{TO$?oW8%`H`4SGsZ-6&)&Qlnc9nxr~07NKYB*Ie=Uo^F2E%d|<%6 z(5is|lz;*SU_ljhbg9W5U9VNIFVktbi#`S@(8J(7-0qlaLw>Pl_6m+twmUx`s}Z=<%gSqof#_ z?v1#TXcqhG%isOxb3b8vZ`!eQxs=rpGpoY<$OT3KnYpnlyIueXlX`!)6JCajT(qAR znA0ci;U+^YLexesZyfU|M9% zlq+tePMd>`KzKIxvYF9xEqb)omhdEn22c=Vmu=HUk2w zwH-l)sY%xhAXtRwU#NrxGsPq1EKh<>Hm7Ev3w71+F7QQtN7xOB`0!O+QKetb)ZY*M z{Z_&nKgvv`%w`yA3yu*+$9mBb6(PdIcJL0qvTo-Fi(ACN_&TgnasUF<4N+QlxDF4e zBIyf>fLXbEpte}IFy?ev>2?@ucH38k)7O@(V@%g6nY%iA3y+0?b2S^hK#hWA;J5Cl zeVR}BboPxS1fU4X2CF+IOp+35)(A>-OxC1|Y19mm64WS$#NqQF)}M;iuf=+>r+Oxt zxzR;7G%UQaxBtK_hFq3D+lI=;$hfEjB#};}kx3*6 z)lMsZ?l;twDObAGaCMIa_}-Lh^XDG^vp)Y!mIl?cfQR?x!7sh>TW|dJzVFP=;QOo@ zF(4MNopu{=rZQRDA)d*}7_aO@H)sH>2woow41yIc)Bwqf){bUcs9~I(tG4qtb;j;4 z-D>vKoIQBv?1R$RhmY@`?0oT$a<-OJ=;F`r?%n+GueJTF-@BZzD!kqmIkGQ$H(NzNK0Hjs75I;fUyVV2b5 zEJ~=VGDPR?P1hJT5k$`_2oa>@<`JNQm?8z5x2jRP?EK{Vi;kPfW-h&c^=DE{Fl41u z=bnPJwg8vZ=`9B?x0?(epppinaqF=?rDM0eoCe^VSF@q67cbM~aQ@Io&9r?QSPE7& zWRZBwI#4c@nCMEjXs7@Ya?~o&aJ%tth8-=Dp7Wa^*Kmsg8Wiw>0r%hwELZ|%kOv+J zKnymDpbumW9MGV1csShabkge=i_t__@xbUQ41ida3@|Y`6q%r~F6na%B}+AkzO`82 z)*CEPO=#66aSK-p0a zYxibwItD0ALqJ5amT%LtM20dZZ@$Ab+$NJ`x+4KbAISwZ3=1+l?tXYiW4)Yhy!~`P z`))tG_*QxV`$@x)taja<_=F%(Eq6AEU*ODDFV8Hp<)qD$WP-={#x_U7!T!Nq>+@zd zbk*c1;SpNPYeW=ppa#zr3r##YbDZSw)G?EF0fa;u?jnKrpi5~9q>l$z^B2Riv)~{A z&a$)Y_V#O3hrPTjd=KBfE&c%oeA;5B0(Uq zcI?t1k-1XA^j?p~9b`!b3}JIDv13#WjQx*6*|R2Jt~OH;7-42~$>d-jRDvCOqS7*L z7l44#W7M{f4J%awi(ZNfT%t$e(7>WVfd7BDad;`GD%pd{#n{DFFK!O^AY%azwX5<8 zYf(qzg$e_g(YJm?aa1PY^eBr!gUn#DdgPg(e}$iMDLAN`?smdgK3H zRT-0LQOh3qKATBj=m=VAwM_lQd3eE`P4_g@HMCjNuG+drs_Fm1ks_t3{+hfjqizK7kp6b3wfBxxz^yO!(l%M%RKYR#S^6ezx zQTgOK_7}VTmFTN#k6LI5=Q3_llVhlOOP$)M-KJ`@R=d}^(H&sQq$k8sMG6%JC}ngQ zW?E=ZM^q4rvGbUm41hb#vL(;9*wJ~sH1y;*diY~IJa23|ec4gX=fB!L`qRVFKmOf| z`*87}+MoRDv-_v)d;k3Jl^q226kiv6F_J^PvA5_we8awBm22RQ8bQggdnC5cQ$Blx71@I`GYhyY@b> zetq&C60YV70~Lm6`Uoa2()0}dwjXPKv!_{FY`iSEY@fX;!`;m=-A&m%=NIo^eTS^Z zYHZ3TU-d8UGmuuWK@PVCMnS<=vxil41%|bhyqy}*R=}ApV`>wm;RZr}M9m}2k&(#2 zjSKaWBMkw#H~gHv(Ew!-f(;)i5C8`(Sl#P(uOpu`1vU{2X-xxpm;gW``w9Ud3Njj; zWn^yL80!KnHENgA#jYt?S=Mr_I4n?Y)$hohd#kWxVv*ExB9DC7J+%rNN`udHwgHR; z*%uaXbFVQZF=AnmAlp#2+0&k?t)a+8#S$D#*JuCbXa7By=#vs!a(}CwGLk?=i2cqT zeLWKskTlJ72Ot}0g^kK@7;gN9-*E%+aQ`1a{?q=+zxRLrPk+yhzxMC{ll`~<;J^Hx zzjgN&5C}2K(Xg3R1Tel7!*!~(_8&N;Bmo2wlF4pEfD{tYecS~M5?PP{gbhnd4MC2A zN*$dZ9GbAseg1Ag`z5H;w zwd|GIM*gauVo15Xe6O&EsexE5ts(I2^PRUrDRy>Y_N@!>jK;eMNYaDclr z%nWKPXYpMYCt&Pwc*2Cfa{;n&WI!0GYd$s&8WVzyfQ`PzVsZ_b0W1(+nRxlvgQGJk z7F)anSm+!&;oxP1U%+Y879QcF_`2kXR#1@gm2!n}VW-Ip-aI^TkPC-sC>n=Pnh47S z3?LYk=M~^X&m~mikp&bX4Q=irn%tR^YuF7X$d^k<=oxZ5I6mCbHX`=!I3Rl8G0GK754635>+f(NdXxthN60yds zr?e(%%6XQ{TKMGN>4KZW+0gE#YhT@6&Tx+1Uy8m4<+OKum#D#G zkTFqZCt3AwqehnWodlydIhRs7F8Ph4GC?Wip-o$>HH|(}ll?vp?(~ea>atN^TJp zIKnr)Z*!l*@d?g=Ar?AP0V%OE9jH;0WozX@T1a6=w8%7Hz{G+aLUXM+bt0Js;!1-F zVh$=EK^Qp;U{JAOvJowL<+5NxFp`eT)TosPO_!UsRTc)VtD+s5o)OYQ2P6TZPy9!|8n;h=7W>8LcRagas)*4L-A?_weYL4Y(kUon@@@@nk*Yn6 zntKO{tfkR)4hRxS>Ox2_$617Ls#30U_i z`D7oAEeM7H7M9DDs8*d2i&c*Zq7t0X$P*UUDiMjewnqv&c!t>4GOZiAaCQ)sNy6BH zek+@u-0w9E@G^fZ6Dg?>w%9BTnW3gr%up_zuI2pZKHx$@5SC{PZ^Z z{5Sr?zu$lQkNYqGq5tx){JS6fqm9g6L>-^pL^H)JqC-R%sdy+~>fV!L$p%1;W*|3g zQUt)%O|TOpku*9;1r>!hB;5xP+1thE7vCsnEKvuuPr)d9?rd%V<;({-p2)(DHwcFn zl4igkG|-)s?%xlrt|mL}z7EH0>Dkow;rGEKQ@`HwK2=(;zVrNfJR6X02pK^ge0y#e zn&#yr&T&@>AVf9>ILrL+cKT{{ul&bO5J9{QDYbUStOec?h*&W+ zD01?fy%h&FXCjK)lZWpXgYrVp3dolhcmiJLNykJ@F47R8qntztRD^>nP=sigRvil* z8e`BP6p~PJ>U0W}DY=G^dveOxDwoDLWlM$4&yx>*?|lt3W#TZ?qo4;kjaxLArc_<5 zgqX}xRWsnOVZ_yG*6omDu;8dE=YR?@3Imdq4FF-&L{5rrSrJs^#FY!2IZ*%Q^Wmwe z`%8+p_)|f>W0(e!0RfO8x?$ohLBIrEsUZnTgXu66V=+&~7mD=it32H&eLhp7f3sBZ z9f^Qh+9A8G)uq+N7}90-W-1u|@&9BJBABXzZuT;kv%L>=L}#?3jE-nA(Cu~`Sow|Z zw0Mn{kefu*vpoSq#^M!nuUD&JNAFGca0QAK*5l#zz2hIskslxb@-w&p+V0_Z4;TK0 z$G*n#H%Z;zf4XeF7mbtat4pf;?fbJ|ZstVv`5&jte@h>sV1P9 zCru`yBqZP%my9f&L9>V|rY(vsjVZ~{Dr)Y~3R9FcMO#b}7Bo@ObYd!GsEk`u2@OvX zQHv%3R0$J0IeDc}6V!=;hA=;yXV=Rdp50T<>T7XV4+cdrLd%MP@v*p?Nj+rWnRc;1 z^~Rp7*VT2HzUy$6Yq6WpFfd>2D$kC^FlBeA2^YpJUv~ zT$JRFZUC8J8fscDg{TDK*b_L?GZEP)mPCjM_`n1AqVfI_5WoNdLZE;EO^~gh3n~qF z(Zdi+=uRY%Q%VVvB1>Kh=f`ViCg8Ud(WW?QaT!FBL26ksschw2hKPx^FzO|o1~W)$ zyM!W1XeA9z!nmj*=An=Ph$9R@H!6xnvq8iFg4U&FsL7O#Igu=L%X3MV4#{b7ISZ}%Vlt^epZ z{`zg7+^~uW-ef`Q&Pt@DZIW0RPhJjpOq;pQ*IyLU*$ij5sa#=lOOkTHh;DIdgiDF)xgDtSR`r7)^V;|*^&x!PGLIccQBbbRxvlz8otuRB(A6eKl&rn!2&juDU5er3OaCi_x zb#7-s6U8l|2t*jnK>-0(I!D<-(ABhwXnGb?2ZnYnPE1)ni(Ne7HeaR;tl_UVWoMm^1fAJ>1Kuw!)XkqpMXM6leV?RbZJ&wlA59~SS9Y{Wqx zt?$0!uX*xIZ~VZF-l9_^d1S>~=rXl4Kr*7G3Q{|QWy#5UQ^U-3l@%;BylPtymg~8> zH_IH^bhi(lKlj8x^NmM8+xE?G{q#?_lPk`D+fKfj9^Fk#`0*z_f0{e=^5~MI2OZuw z`~4~H_#5ekM}Pd*qd6(sHrutO#^GcKQ4*mbh0)uISTH7K6If*4u!yQ;P;1ppbpkp9 zQJ}zxPN_H{ORzxV=~YJ13`#^+@(=|Hm_RC1K|})Jx+gM05*J7%2rPgUk%Zjd3`vT? zm~%_97FMDrDuh7^2oNO%G_^7*L^UUsqX0nw697Uw-ILa2aWxm#j>*k7^F+8I!`a*s zIp%gaa7-v%7%H=eAq zc{U{0#O{cI8r49F?&Q{@s&=>q8Zpr&8W2X1OF>FNSXydEI!-?|vM^6G1p=^s zxp9lY13AzK1ZV>dG6@o}3>*NEt$R8|51S_oT-Nn3sGocH(nNB?4UPWuBvL)!c~|}Ac)cDKR^1CRDO=E=T^A8uWgHogys2k zdD#AZQG|L03k{ND}=)UyahJ$@c>N2p~295om@fC@hGm4 zPJCz~Z~@U(rHuu|N3nnr2(t(bzY}0?SS%+y+UBDVOBb2mD^oR_%nTJ;;D{)K42+n( zLW7G+zAQay0nq&aK*ZHwNIZm9UEQLK<|qGs%u-FJwlJR)yV`ts5hT|&eEnZ5?4vjK z`5t1K(6`5h-#~wO<1yB2zDThysFM3uN1SP6&CH*+MK2VFFXVY(-Xc80h?5yHC{DZ+ z*|Q1KijHE$GqTwzfC)sQX{#chXD?!~(3Nx`#DL-oENXzcOh-}*Ymku=VHO62sVS-5 zmJS#AnDH{66z>&eY@4_|CjcG*4hxP!ssvLOs@vQ#{$lLR0OR^x~%bSn{u`>kU1 zJkr=a=ahAh(sdFr#tdYLRuYm;4kI*9HG{J0W?Qy>wmxY>r45^X`Tm-1*Ttz0rCT5i z3{8q?HZ22?Nfs&N*7JbSaISQrLWtsUx{B$h-Ye1nz5ZKqgXlm{Olj7!bR`yIS<~@W zo*COglLHp!<|H`j@y1%;hrFTY4kiBU|w(SF;4HhsWs?6eJ zp#=piKu0Rp6NHiAsDu`1a7*#%stTbj*>3j1)!ggRy1D-K8@GRTJihzkgRFk2{OA>j zfunQts@;0w#NjiaJCU4T`NB8lyw;QX{_{W1d)%En2cV1U9;(71I#HKBBSp|BFl+?I z1T}DOf#M>o*%+THfmqHlLUh_*WjfiqRg;U$b}_gp<+bcwm|;cITLW#1&- zyLn_9R)(NUUO;*uex@_sq{p*a1zEG}&=2FqPqqP27e*w(i2_E<WWOjHDF932ec zsF)8h&x_BL6j-qSW)rS}5BfpIz}rO;%3P zL~;~ww+JfI0Yl3aF$|zYkSGD#)qbHNsET1G@`fkgMreYL8Z|N7hM?67DNhbqrd%xeh`Xy;Ry0;8)xy1AMq33FSskbL@vqq<8MPNJqI2JANhxd zkw@kgyafy#f#6AxYyh7Ae_-v# zFq%rXxH|PDm^O0B-2!Dey91U@!x0!13lqt<9ZU@@2owfO+Bug4HfTUm0b#-{Cc!Lj zRqk@@rc_LwYFMO+(W-!17*Nj5G>fxrm);F6CBxlabEDFC^`7+D*1}*6t_YWFO6t&Q z1uzK^tI@teXcuUAAep zQ>DwjXV;nMSchtEsun~!5MLD!dstuWuR{+)SVh^10TDPQN?SivM#cT!C-RPDlTu2n zE-8%S7)91F4^YMIcl0e*KKU@s+brCDY`D|<-1@%h2awT3PjxtV*sYBMAhaUoZ~{fp zMFfmeEu=)0q|K_rv}jS`6>AY;G0afymifAQHh^x=-tJCz)A##>UHk<<`k2ni>3G=I z!twXsQ#W*AUxfwpxyiac{er&py{#)Jn|tc8`LrCYCuT7E6voJfuu$W4Ad^{j2@n{a zGmyz+VYaed<=_xG=mTbDC_&dTh**M>%mhh9!76WRgep)0qBfC*Gmd(wh{(y|!lfIO z&uGG6UIz<;0GP~h3DO7+M=g{EiU{$odSFDImLwB4Sxc=o?eJi@v3Ty=cS)~o4*bYZ zx8kDOaw52~2}w{JiH&jK96=S|$)36(UJspZUb)YhHeLCzw>$S!G2m%;Rv>NbCBzwiw2LojgV4#KN zi7OxZrSz#fQ zC7~4)h^8q9B7};v_y`FaM=G$WVnPYpH-)fa8VwUu3&5H&Giu{Op{f*+eUk{MZKLC^ z+*dZEt8A6cSK7fcYO{YBL$i`mTB!$F>l<(4g zy5~-b{?F6&4N1;7Buz|8K?50V;4~bXfyoGx>85_~UuYi6o>{c}2!j<_tA&o*Cs7|f zjmz&w8-fBt8&DQ6P8kIY>&U3NSe)7`STM#)1)+_|DQ&(Xn@NGI^j=|+^tD&S-+1`V zcaQ(@{%}98<@guN=~WNn6o;>|&imxs&fT5Tv{yd+yz8wV-q#&fMYE}M=c+LhhLd7^ zinA<@2oec1X#fZe0wSvvPR>j&5@sviB4OTTe8yi6M$%(0xpXcxxMUPjBqyaTGNSA; z;TF(PX_^Wp<0qul6pb|sPN+kwRN4?IqSBy=6y8LvWMzf;u!`WCQY|Jj2Zjl7!lo@- zqq#0!w)<+PXY+AS_h@i>rzk?cJo30(}^*TdMhbK+XWc}q>M z$_W4vhX@_gWE+`)QUK0rJ~yrO?OG-&o09sLFw#H>!`097rRyM``%}6zfPR`kzK{Gq z?<8hC(VyD-@fwT>P?e&r0RP6{gOf>ZnRONDg|t8>hFn1>ivXDJNQ{NvO)(U!_zNnK zL+Q4PZbIrb7Y%x=iZ!d`PWuK;)S-zs>Wme@3Sq(U!fHTc08~J$ztmP(F=h~26kT41 z!_L&^VR#q15_C9{_D;wi_B&bS0<&=wn_b{6^KZW4{kQMT+pl&{`1R}AUBvFr_9S>2 zuZA`d;8xYEi~P(wk_};r6GHN(XyUmSRs%}U?O(@VfB4n%R=qZzIHg6IaHIl!9C}M6 z7&|`GqBO6^!kS7zW@+4^ftPW|&(ZQ+YS)5B1qwZm8W1}M6Kha`R{hoV1Jo2yY@qxS z*T{h^S_CB9S~R$r@wS!(&`LqzjR&#BNtcolpR71KicV5_^a^C$qSi9wMI(vgzW97}EpQv){B7MRiy(w0zD3JFOs zud&D5#Kw1cOKg}KP_*S!Af%$rq!Y#zyyQw(T7}Q@-eV@})w5|5EF%wkHVJw1Hq#~x zF)09dTBWjC;vu;~1aP~)(lZO2oG1W75nAF{84@G_#GI(0q>SxYdtWC^AAMByLzd|_ z)VX`uH@2;{^ZDrWq&W&;2Mb{oDiVVOB{JzTqKz2UT9uGx43iYsd6Pi^gcY%ABM=F1 zC$h;ywbt6&9bU9F?@%%)J7p+4{fWF~Z`1AxYF1<2R8n@jzSe`r3ZtM;VH`vZ0zl|M z8!a0nlZF+dP{9DEj%ddHm_!njieWJqR#}?!SPKwBWKB8L2aylWxIcuO< zac|==K!R8zmSw9cC>E* zPg$`s+;6uZ8A5Cid$g+nLm(Uq+t`AQ*yNad5Q*DTbfaOd022w1qozc9%CBsV z)f7M{#C6w2aU4KME&vKF>6k{MM+$U7OalF^Ia8^@=8HIQ$<&QFZ<4Pu2!p`c?){u9 zLs3YDj2Y|lTd&cjm?>2QHNeo6J6pZb=CLk-25<*cC*LAyAT86?E&WS}jz)o3mO&G9S6j_X2A|#5@joU#)Fx|Omw@<55P5jJr zgwccq?bp%ls!>*nhH)ZNE$dlXrF0Xfl&SZ-MfN-$T`w6B6UL&BjX;zt^}7}CMK0p6 zhSQ6Ix&bR~6Juda$?I&qF0Q9k-FK4})y zt0vbonolEdfFfhMvS>1sWFLRPQZ!c3a^hAXUX_Vve9~BQ(ax6T#rrT>-4YxX+`viz z?8(IxT8i25vG@+uUr}Wa8HTQ}_)A1M#-|-a+}3l21q?%rOa?|Co&}4b1hWw~eN+6) z(`8bW1WTQ)J0~JDszM@uOxNfQ#?v&zJ8SH>Bm&FK#6s?cPt+$BM}#ac)MNq0EYK(v z5Hh}ryDVEYE~9b0g&W&2m@$xiDg~{BXjDY@b>EatvR>! z{U6Qkf-|p>2?p!9>)1!!1vEYd_fLGu1~ytzj8KIG27pSj14@kO9yF+cC#T<_rS-6h zB8BE67-5I5`2>{NF`B68bxT}V@6~CWORgIynHX^$hb`4IEv7>T-M(!;tM{(I z`kq?2WLslF>tg#T1Ko?{u05>RrK!7b?@I~~90C7&6&jb`c4P8hy znObnuZ@Zhr`-M2*4pR=0k*k`(*?gD}X9H+jS4>T?Dd#7*f`IO4$4MO7IpKK2M}Fgg zj0b+KKXg)6pdX?)h!fAKsq){kA*EB;5Hs#@D5q60bIF*pw3%eB*dvd_SIso%2tgRb z5P&gg2V|1SxSQ1&>L{sD26(fGbC3JD`#N_;lcNlKAHP-H2Nqy)SE3*n%8}&iP9jRS zbvQOm&<+%U=UTmXX7@1K8y$32!V;g!$}{cR=b|&#z1|(i3_wUi21?AYqpWP~dh^SjrMdls00=KvUsx1Or^x7f=hd_Hwfa!?abc*v-kC{2_ma~w z$Rw=D-`wKLs5~@)ba{y)F3!NP;u`@UR5?((1PD{>C#@A|H!9VQQUl%emX4+3iC4bs zUXMIUK8nUvaN-4pj=@64jy)R}J?ORMx?lxMDFB}I$X7;%TZn_^PcBBA#poCakx_%g z)q&^~?!E)6k9zw4g-8#=EMWo5&P`Qg5x`Ku7^M9GP_>6{fG_TD&*1v6v>7GUi&FG>f{ZP07owIZwK1TX$sB5ZITbnBtoFhGwU{ z?e@D?p%{eZ-NQfysb+x_A)Lh$s8AfJL3*~iMw=~w(M$+{MCG1R{=WV5^_`!nQhw^I z)4XykplLBeC;}UnT=IHwt5}bReT^L-oKhhu2!ItJrYP15pnyrb7tq?OHHO=w#t)tO>3ubmJCV^-YT5S$TXu<*JQ zz(iyM6%mk23Rx&g@fcC00@N~hrl&vxrD@gHjBEz-%Cb*bv0>;=lQ&10=Lx3W?qf&i z6$OIU(YSD#p1yy0Yx~}By>;)W{e}sXnLGkXB@%E32{>FT z0ThcRM_M_#5-12!Ng}e6*aFO65 z&f9(wn2AKIJ47&I3YBwZq9gQXRt~CZ8Wmj7Ks~jUB#nr0`|fcpx_V5rsSkeVoi--? z&>!okRtN+KAxMuLHls5tIe`}0q*HQQl;I9VoK}sQOR||Hk?{g&+ubEpue$>+Cmjh2 zXDU;B7j(-kvyB&@t>&gk!M;JfzV-2aKm4s9-u<+_MD6BK8Utv7kt_9(v}T6#3)VPO zm;YC#6(JbUYQ|U~QmHkrf(IQw&laQr3fV7t5 z14cue9zd_FL~d*31|n9BWjbTr`BXPN6xcEQ>e|9E$d3monkJd(5KufxGLbBl626%w zh7~&ih<6j{LOWmy`l0g1RfkPLi>DshLaDIk`lTXKuelMoY7@Szp8W|AR1e6FwsiuwS~8+KP4 z#y|gs*?lzEb*GpCAh5|Mqlz5HBRkSUJF2do_b+{)H5gGS1~NcWtYHPFwwyu*a&Sdx zqgD$lTtxD^04M|sFoME%bU-phe4$Rxn0Q3aDk%{GZ&?`YraG)M7#4TK67pVM{!@n?`tlOG1fEd;cSObe0d|B zOuzEYCx^4grlpZ8y~at3OPz=`Z~?&ya7YDmBnf~_36h0DI@{q+D^+dM79<7>H{2}F z24>LqD+vJv(!~T2PCy}7awq#t13?OHi9Lf5g6u@AJ0M>N3PS*JME;Lq+y}Na9`?S2)o$-UtGSQxRSd zmfRB8H2=9$X$a?7Z=UAadc+`jnxF8KTF@YS<=a&IL%pugFjl8EW-18##(KT^-S_+D zU;N^W-_BlJJHv^F1RM-P#BzusUZMGaG^4VqUJNwjvh=V!x+X9Pmk81d z2d2Sz0!qRlA)&r_m#ku7qO<@=9t>OGWdf#YPbXMQuFQ@5%2LtpK=&mfK&W6kC1h?9 zhoJloKm|oAY?^e#m;$u773Nh)2w2&e#Q-o(W#=L|8jOk@AaNT&bfS3Jj{C z)F>)!K)|4!R)nC?&Ke}7rH)N*mPXo$ zBRD%Cp#;fHSO5`f{PYAE%HzswajQ%D^kX=$p~iX_gL9 z(s^LV=>SejaLE-Wh{@OOwe7WL%aADRT#aw6f?cm|7nJF%Iqtc5qy4sT(-K$-L23gu zYFLA?tr$SWuug8ab;AKe%CaYbOpI*X07C2tG!QQU_b~Fn8VqhuAOv}k0}24pAOUNS zzWEd2Kpq4j2N2wgSv6>Jyv-+0-;w*j_x0)FA6`9JEeBTnVkjOwS#Nzg`;9;M(D&}< z&tCo#pU!J7M^0#fxPS?WvlJ>ojNp_dz>I~GGlMY}bjwQjTtyBER4EI|LBq}BbmwNe zS@vucF=-E;lS&IBZP+}fkZBU^AfW78gFSeD>Bk@X z@#d@7$di%utblpCp^+#AmU;l8V}dva&$qg*EM6I$&(^W8GX%O+Si6ldvO|s!#x+*i)XP@4t;H3#-XNMoCZ$_X~WQbi4{? zO@WfLw2(%|_@GlD9p@W5%YsHzOu|5VXqqluNtqm+Q7X9+3^ly{SnFZ`^RMN1{UqS0 zzE^+DUrzh63!Rm-E}Ly$-FQ@PPvhr9W-_` zmZ-(BKyX1JQBeR8qe%fEf)7fjbepy4B(X;}r#uO1t2Z=iN)4O1N=vF?oePD%x`@&n zzxf6^IgDmz&D6C>L6Q!P(4AthWdeh0Aw&j764Ip$PXb=cdSw}Hl@r_$5vuXQBh6;I zJ3P$eFmrs)oQ{vr73Km4vmgzbk{Ah>Q~@5Dba(`CMNY^0%EB{N zJi&F^Lpu&0H~|6x4W7O@xI1FntG)7Ar4}ZOY*`k?^$1c z0X3kg5VJDMtV}1YqdRN1#VDe)R+|BBwp`WHKqLl6W}*%=ft;BS<{l?f0t5(v0$sS} z4}k}YAO}3az<>nwassCXEg(S=+?!bu00ZIj)zR}G|N2Y2_x#PnPd#_`dbw3Gj<&_e zK5hp;dGNCz-}wLjOV51mt@l6sv-e33PI^XG$pST*q$V+8fg%w>8UdjYH)%qtrA)9K zhD3^WxRDwzsa6FIn~=e2=K6x06g6JCtSoESDZIpP9B_s|NC<|$n7H9&%d+7elvE)g zZ55ud0$?Qk()g@DL8gEbO;R+KeCAV>MbuU2jY7jA9v*L+)ZLRB1QE!_P}Sx3OX3>W zyJ0j28VSRUU$t-bvp?dnY>Iir5YDvB6d|SbTH9<>Imr{A?!aWNskqz*?mqVhf&il< z7z_ccJwuGQC(qgCZ8RIJ5*iJVrk2vkN(%ceo`ZT3CKPe2gi6_a9geORapDvZ3xpE_ zCUW)E`g%Be+5SOoejtEoNe_BcZSLQISf#xj2FT&bs|6=10ErNm8l`oRS*pI(y*!(z z)0&0k$}EimgcR7LUp@drsA18Yty04Pd>jFTK_@VzorRqs(2{K(_DQUL2TK=mX#T z*UoDp28$rYDP)iYrHB9m1RN0H29Dv{O0wu>N|cmLS1Ej8Wh6POlFo&|M5>4t2{ zCeFGbsL{2lZa4v{uyDL(Sbo0AiXb>PZIm3&2wle@f;3tKfE*-Flc!lIQeaXcVNlJ4 z5mlaITv?8^X$EV0#DyuJK5^iYOE3Rrv6_V$CQCA%fZ;^M5tU7wXqbd7b5kRbKq$+c z%*CX+ZpA|B0}7Jh<11ENa5n6E;1#e8Xs9DN{SLc2HPL@^vqr6mX3++vot-i!F`Hbd87`*SZGoD5 z$nI(jV&H=Scpz&73sx1!k_S3VqpZi0^b0`%HrB0m{Jdg<77sr@=Bv?H?mYhK=WjiC z{#tdm^PS7HDcfK8zt_8ao8No&VtKjsvZW^&QY+(;Atcej!LhOyLF5#P8AAwwMCDN{ z8_`BuGt;G%!GI|TAv@e*DUE4mq1t9~k}H*vnNve#u1^q;mW@vbZcUsmo zhj~ec4bbSsnL~KwrsOvuQJ6HI>okQ;Qo)Tj3cwf{oDxa*L6RnQ*AU-j96Afdtl~2D z%5fM9Zia(Qge**LT89Gx2tYprQ+>UjX+W$hFqmB#K~jSV5ocpsreM;H2NRpBr~^!f zmW)7x4tc72M)6>aA92hiL}M17G@0r_gic7>1*QkR$!a)w*_d<+Aex5XcnIo-s68S$g9Mi!}~eafw;b zK9+cWPqW~X^M@NeiWoME7w|wTNLmUsEM1(Gm3m%TK0&-JMwb?n5mN=CK#Vc(YZM4B zZn47h;fmpWjCQdYokP$2b4XKDZ}UOU2MJ6bUMU%KV}XML6y*PB7Hs)79Vi}V5eqNS zW%G0LXWC;Qjk;<|&JI3S474M>_=X@UI4b~JOi?1P?YhE-3-6!`Pzr#p-clu1(hOI+%(awd8CHEuo5cb$M|`H`Lh4W)g@1 zo?%zfA#hmGyoAhhWr&hTy2=!=T8}vxqx2Yq^sI?mz;q2Ua+2JFur5!sF~q?r={TaZ z_`yZxI^SG)`yv17Kg{p`aloe^*3W!-+=B}pn{0BqcG(%lIGs2296c)U-o4*P>MiY5 zAS76U)@5SU*@&^?S5CP~B(Gz#&Hxsy&;Ug(h$GgNcxKK`av-tLdglf7xvHMprdI?J z(XX9n^ywBM2#Ac1O*8pzX2jAJrnG1s7lJV)L~wKV=|EEBK&>iGDmgcu*G(af8V;9P zBzVLnQse|DfN;7W0SJ(;0Fcg#N@A!2qec!bx+F>}IM6ohWDbDw!}q&*0#M=^j#o?& z!YdvH2XLMs6@Zw&mG)TbvanDgFLkeXfu2jF zECB}OK>#uZmVpE7Y_!Kj8B^I{iu<0}Xm#Py=W#Jt4|dt!1Z{Zi;qCv|zin~;=@T#9 zeb47U`ssJ=dlh2?rN<*#Nnt8ADx|QD6NFKOFea8pE~lbSCW7=7%%StPW9)Dv8S=&R zSpou0H%-#S9LuPK$)JWvG7P{9Kn3SX?KUeUsK!g~$J;N&K0GC169CwK{C zZ++I^$<-hcuDzs6t8=Hu0tKKL5swzy-Nqux2yINxy7>W{GV361yMx?9!a2%760Ddp z>#w?Bt5Zbprzph7PAtm8PAg$V8~_9$nMFQK$v{M@A2PJ#08=YgZ7;?NO)yc%HR=`7 z^J~7v@PzF~APF&iB`g&GLYx`L;36|rgl8G=FP5gqm9c-bM7ejAWfbnCm%m;1Ne(C+ zku_j}V@VHnivBwGzjx(-Z_a_I0wTnrHac*4j;ZKTpgi97}6&})~$Ys|D8x9>VHUbz7_i$ftFTp6l5R@%J zEV{I?1SW411qq8*KS-pJB^%PtFL=an{DNf2uhW~``OWBsYarh*2PMLiaytY?lXAOe zA0LV}3=}>>fh^QI(_Wx(CLZR1oq==aooFZ^bc+)4>!48pB2Wr71%lf zuQd@ivC@;W=`TD7hjOjykgoQK4AxAqW){I=tdid^DVmV7h>XW&!!3$PJmjkoj zl|SFcu|%%Wn+*K_@Q3pJi2&tq`tN!3QO-JrO*Xe^3kem9+FhURcI|3hZhD`zLLp;E zWYpQjq8k;Wwt^Tzr6zAC#YHw?KnfJnYHS?>U}R%*$cig~AZ>_p9ZmHW6%m#z;cZ7| z5+UG1D*}UQ#)LxAOfCQ;fFZ@nE00zN)3UWOs)828>?)$DQgKo`349WfAj#5^f+A@q zi4m2=G;?o*`Kp|%gDRo29^yqUB~3);jG#zzDzh|@A3{K(0`!8P01Uk1Kp`M>6mEZt zPT!~;c3Kq-7s8Z_wBTF~QO*=-OUg<8)z&0M-^=>6or{ya`f?G&Zh(|`7$tVr3>cu0 zSVh{|KqND9b?_u9XXb-x5f0qLh(HJ=2!RC=$b%9HfCLU$upUXy$Dj@Fmc=rI8pzg> zF5N~!%4#%nDo3)qbpJ!{?LK^X`}*5^+duKAWpeBG7kbYrWx;0zZ6g=nPogwNVFd|C;R=6K& zYLtXU#?Q5*PE61)?W9J`(z=+6+Fiq2S1G7}(4dt$CWXzsaBOAFx-J{Mv=Q8ZUT&v}> zE{z_sQNeaCml5=aDE9gyX#o%riTia{VeM`E=llG{boawopZ*}f@a6G0CtWfND5DBR zY+jAM)q91y_Das|K+$D_wN@ZxOGOwfj2GMjGRcTRktE1ijHqI~)@|X^AttN5oh=`l zR5{m8Wd!ej@`N}4dz2sPHYZOW=94mVpa;#nM0&H!bF zk#UT#w(Mb2F5K+qdA9PMhV9-*bc3jI7Fl3s2S8A^V)9Js7*L3-C&+th8a&&`#9iog z?k;~Shd=@b4kTcGgANZ1Y9Igw;DL?aC3ZYv8$B3LyyclqPz%={I=giCtbgz5^k8>( zv^$pVT!stxJ-YK7-#yt~e|hiVPH|fL+vV`_nFx=efI=0BE25linpxJeg-ZrgWPuuF zkz#04p?DwxSOXXxW5?idFEV81*3{D-#lskFZAoDfqLA!~28J#PfRO+dI*tQ$@_g*O zTqWF~Suwe~vw%vP(;a3GUdU!l7>O=`Pi@Z`yrbG z!K4U~=PX%wUyK+uaZPmR`nmoMX@*PsJ-}wIyBf(MTz(R$$*i()anFZQZ?ZB?T5ZXi zH2Vv0IUa7^buv(CK1{$N@7M#Avb?_lgyyXH&#M2S@mJ4}U-A6)xX@?a?xq=AzI-Ah3}mvcP=RR5nYwCJus2 zwz2b_)MH1@lG#NVa#Q!?!=eT38It>MqM92)FlEuS%8!t}ED42xU`xlMNw4?+`Y(QF z@o#48?cL)2!xx>H8^~!=*}BRCDqbP7JFHolN>(T;E87BtP%RxzGjN3QJlt2W1RDXO zCW;9t05oe`6l)hsnQ5lbhL6dj#?k}10u-ub8F?#}3fON#JI?s4bf#P9{O9of@-oD+h$^oyd%Y?o7UUgmyv(xpXPV|taOJj z`7{4m^(KpSrGSvdt>~$#ef4gm2XEOVlaWFgNS$659bQ0>CK^%%8IsK!T!B%zatITT zWM_+_Q_HH%)Xh>zOjG$3mvdzi0t}rmK_{MdBPPNe-@1`WmQ2D{wc-*|GvwoyCXG=P zno+QH1{}-BL1WG|o?BG92r4lFLy=^LC0Pm&grql3TEtZ#A(F)AXeeR1$}&eAM?#Fs z;(Uwsn6xliNib<5%LyvvCQq)0-(W%F6$d&G=>oX3*$Zw~ZCyn3x^%f1H7W*n`|CEd zwvfiv^;DZX22(OUyC#6u1h8>^b*{B*H*@z-_KSVS7IQDw(e>=>IO}5Jx_SKLeaf~b^LCMS+9U$B3gTqQ& zn^sGd)}d^M;u>=A$|r#Y2r!<7TH9W8u7uZRUtit5iM;bie$N+nmrsNm%feAjCfoPW z=13+NcI*GEXYgRG(UD|#(tE|9LLf&&HRDL>+!>{E*9kocF^@E?miE8MR>oh;{zp;b zcXLqermBxy`@MglcPGjIRMeS!m}26xf7k-dWZXF^E}bE5-WdafGVAzv1PB8G&&P0y z#MtDdqhaZlOTV6IgtMHp=I!kKll8qLujbEq9Cs(1wgJ{#Q#HC z;V??jn1$Igk{=IfDSta*rH)7!VJ+uR)S?!i!!pUjsNBsc3STsxmtW!HSJl6X@hW) zbuJ`XERNv9YqJa@mt!&P)C3Ne=Y{;+XC6D?kVXQ0rD-}iZ^pVq9W));LtqdkNZ*}O zGF?N^a)&gy;|4k;*9we4P*eh^o3L)mOI9B4$vmV?*<6-f*(fm!Xc0~uWMZhQm;$QJ zS(&!ccC~DByV!(_tyI7WOKQKLmz5jH6Izs;A%^s3j&lWWYz`)Opr6I3&GeEXf%BXc zFg-R6(l`shwO_|X!Po*24UukEkayX8HZut;$9L<$|J8Z-0?r@)h5E(+*>YMKvN9gD zVMo_z=Uebmd7m7EXD(tyj5r~{=mLV0jfiR$EKXHYuZ&_8kpgQ7ty0Kt5{*X6&FmXd zEiKj~#2NTRBkQ}-D~!Q(VsaSGk85zLs!C$Qq5`aFg$UA)o24048fPKN*kp~cF$Sp4 znAe~=TvITZ30P)QBm`NoK#Cl+Mnxj7IgGL9%p`%RGY$#O)4Z9|0S>2v8hDI~(6++T zBoGOe$FiJ0H%F4VStp+jUeQf+{Y=-x9-h^1c*21zn(N}#1Pep3IJC2HbdFIZ8ynn& zwl1LCfdUjDFDAk%e$#17;VWgctA6pZ=GYx~#k%hjH(;IKVIWOLlukBTw9iRd+u3R_ z5yavR$UU~n0R#eM1T1KRI#|El#%lopdEkRQ2*E7q?J5hQq%_QQ*3K1H&Crguowu+k zxAw2q&$cBGoT9p=J(a_YH~*lwb7yPSq(x&yDr&V2AgK>n$x=yT z60!h!4N0mwEGjFoAbXq%aB`70nMSOZ!z|*P#V6}wCYUbluHI&M>PFf48)#^OH1^}$ zFw9+B)z!h9m%(}WsP3ny>}X*H!QV!<5!nEw2F(#Ej|U5xyn$J%H+D-TW|Mwsa{^;Udj6f99X~D|=ji&S;vXEgY}` z5{4urAShc@=GbQWnxm5$K-=ADZVB&38-a@jr_vki&E0}7(yE+lKRB?efM_h8ax z57{#9#-E$eucadH(8xcAj$;ctQg$_==8tV${7--JwZzSq`YBMTmovd!eHqw}-ns1?3_qv=lTkI8H<@(%sIbYN@dRTT7DS*3iUhj_okj zgq131YbfJRJ;q-AzZ5gckEsEs>lRTz?B%JCNvw-~a^xyQypgoP3NePEesjK2C<3A> zmsG*lC@XF%?fXvCw>Xg&CkEud`TOhLdvR~myvpD9Usm-tOQR-Mw2C`pEBI>N#@+iQ z0>*-(0)WYanoC|JC?J9T%5@qL6*f_411izn7O_;Rt8R4DNlMZr3YRQzSMk&(im;kQM5Q4$cxim%s zARd6ENg-np0&tQ@auanI#$2|@AP{j(;PuQr!3Ng6rs)C#V`MRr9#D_6Vordt0vV90 zX{i9^3xBo~uX@GA6)!r>7x}_PWUtOEo85H9D)cfpg%uEX@7*T|#Yj0Ul_F7VJb@2+ zF9@t+Vk#zBBrp3#K3kt@$3E(S7D;rmu@)MS0YpS4ldNnEVM8qvHL7nN_#dcfaMVOb zR_pqK4;-)nKxV+b;A#>E%OC(HAVCpiRj@X8QBmSG&pKDU&N5j|&8Oq4IUI(W^iPVa zN7wS+&PiGy-Mn?Od-3Sb)d9wO<-xhZS?t~M^1Lh36kV6l3X>e9UXYNHHyQ#$L`bmU zplFv@jG&~#$(bMN}9$BQdw4tTP>N)kxCjy~Ck(P0Ca z{B%N(L?d>G2D7AOU4W~NQ}P;%V$j8Oz|8r~M;M4Tl_f(05)uuY)|%Ha;Aj!nD@Z*o zAGq9%9kic&&h+y+-d{(Z-p_F^eqNo0tAFuw{5$sBU7x(2ubuO)qkpFPrQ^%jd#5Wg zynz_Lavq;9#=$fouTJ4ivqR-7KNz zeE|r;A1tAYKTrA$WwQqZLzVj2a+{2?BA*+=x_3jlw(f6c%8Fv6hK6 zPuHu2IdY&{EEFTt63^ymM|kBcQm^=i7Z7G0;&6hHA)OaIo=x~-A%Vl^)lXWfaZwb^ z(m{aElo?nBmk)}@Sm-n%OiAc8Uw!93>{s+~VW+Vw4-#;Li#0n`M6m)3+_HOUd7vNUfB*(CNPq=CxHtKPW3U7YV8aJ%kLEPDu}Q4qt>StoC}bEr z8I7lRcjj_bubyoeE35Zgyc&)7mmeIxov#kg&oB9s`>r0R9`#rAy`#pPuHMy|^FlHS zg`t&QsEinaagsQ}0O^$m6$R@n5e4_+ks?cKD#M*NG9`zrDV2`0sHPQ~>;cRc)q&hy zcE8M>OmuTr)Es?&^E$cV>DJ9r9FwcMp1p+++bBEB^WyJ=&oF}m9NB>xM)L8fFT(_- zk_G43v}9IJB0)?PChwGq5%EBx|G;i_&*%P~PBtVAu_@oMhJRSJy6NS3gyZ3q^mKF5-hvNyklOu@gO;+)=8?O z7${vR_1{zyOswvo9aJ{shD~bx!&4M`v{!?zoS0xvHVgp)9Qpc=WCs^99mCF9SNXxB z#Dah@2W?%doLH~J>DslEoxSiMt-_-nzlVEbwVlI#?D9eWq}N5a=gY@m{+D~d`DFjU zcl-bD{^8~R>HI0%fAn#Ea(x-wf_w!nzLp`FCw7mg=J9y3!;SKDdWYT&#$N5R*gl>P z8f3++025}WXzYj<^}+!r2rNc=Htu3tnR|x`EoTJ!$rk_O@eV`kP^aa%6^;_nfL*mS zR&1+Kiy1Pv90U%YUPN$yzP`I7!*eaD14kG~67dRcsC}1Nf|EIdHE&NhAJy9|#jwgI z0itZWN)HRfh;&MlX{ONzQBI-glADMczw$;cG%B!U5&~-5%k2VGX;Y1E8WT$U zB(F1L5dw`!L7#$nDh0T9a(a>38H&Qlpb@IY4N4($0;1k22}sg}9Nnr*(8@HIjgs0a z^CT7H0BZm>NqV{JlgvU>0Pg0%)-$6$@D$MyUZo6=FmM#R^0O

6sj4G>b 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 &FZ%0l5HA_j_n1 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%0AX*RtwS^pUKurNeJy*4WD51nz~&D!W- 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 ngtH z!l-DNPKzfV>Kku%dpEbkcDTMbeDt#H%%^b~w%t4sx%8U~$PBYj3 zCMR+;i3}vAE>YPcOravnRuYva!6+Da^HuQ?W-CkT3&L+=cr=VoqOf=3t4vj#;xUsFQa#VQ8 zQFZ9TEF_l=EInyP#DoiWO!q^RZKyVdSa`A^Kujdrqyq{~G!RBo6vb6ka-uVNJpQp) zV+w>vtXw^Whil3%5v*C6cJsr}r&=tC(6EW51JhhNd4M}oB;^yMpK~Q0?lQ%UXIe4~5hauFF#^S(PX55~^$3=FBs@ zl^sO^gbaZ!?TQPHs(6}JGqRf95}HumG`O>~^p;;2Yj7OXJ3EKUl8LB!V^^*9-kPH$ z$Z0+Iqvq~gQBBZ*@I{~`*S8kQ*XF-Ae0A#OU)Ls)O29MW&bVnyBnmGU)(|m5;{szY z4GN9WH$ib_G?qlXyM%~@!J~q%z>G;__KInWj2o&mZEVR2$+>Zui$)+ks8mB0CQ4N7 z#ug%G7olU|Ok$}BE}_i?S8}5AYyq^L+JY8$$!~ywcU)qP1u_1J`v2cwxkHl?vq*;s z-8|OJOcSHegQbApa=fsVNZkfHLK_>eQI5g%jOkhQY|ac%OtQ)O>HwV&4XcW)Xjhz# zY?W4z;4d&@Axa$YWzLTH${84vK*`eHh$SkIFBYmpr4>oS7@)0;wos*A$q1?_K%%29 zVrJ%t+07hmm;IQn*dj}MEEprwn9EMilqH70KQILJUcfZH2Q}$E=}B0amN3z?;ECk+ESHjgCNGMawCZ zF5(o26_XkjF#x1cxveT$(23@Gk4b=-n2qj2yYI*+e1ec6gFCM>q-m&u0H{oE%4;D# z)qBihqS{hX;0ER}v_*A9FJHYl@!2%}_C?Nnc3CgY8c{1Ae+%5DP=l7D?NqOxW zqUvZmXzjlLfx%f6lljYekN9@GE(86D!GuF=yS+=$YH`YjgQeg|U=tlZI@=Un8LPka z-QEw+mEC_(eeXnd>6!I&ua}R1e|+-Kdmq_S{K;QfeER9>_2cRB8%IyHUXq0=kesme5r=vrb%O* znaSIW8ke4xV(Pax3Sh|y(-bB;iQ!dHlt^DW-`BO+f}L8p+Eu- zC6fjgOvIcZje|t6Aej}16M?7$OeC3+lU}n#$FYJ5D;0uCE1C#&tb{i(2TsrXyPX5H zy0E=r=pbsEN&#e6NP?@4T-+CnH#r|Z9S@uxJbG_`*B7(NlY4W2_P6gp5C47A$Z31i z`1cO!_JQVBE?s{`@4Pl1^@S|#>YE#>qZSLg3)rraC$a%KEG zV$rRI4V5Bit%kx_!$N|HcCsresyRe4=Ok%UO+y;RUKo}u(ab6Gh{9a+%X*Y20PF5g*Q5(&e zvEi~KWE7)5Og1k?@b@ zzEl7OY;(<(gl-Zdr+2FeL(_sLAOmFcWjuET9f}hR1BA*s!SPJYOtg~Ex0%G(3t^zt zXwLKiGi_w%j6u^zj@lTHEkMWsA0!g64BW`Na>@h{NtzduOIu4j(mM?Rvon#xDRb{Z zdZ9hU*BIWct-dzIR?SK4aUMEwdh(m~JlGewb-&7TdouJ!UO zekIVd4)6L#z_`u4N^*JCJuAMJHx7Ud>(p=cJ1>BilC%1jgd{S%_POv3Dhf?<%{{ZC zGl@hfWd_%~&%oUKHKH>=F3PXZ9RTB+Q%{Za4#H?fcZ;tyi{W1<-mdOE&^T)2QStmQ zd)yn#Ti=oZPHF zX%T4Ev%iK0=v*(oG+c385vInWqeIaWVrFJx#(IIw1aIo=4X*)tc4Cai-Ga>tbsc4i zvjU2`*k)h@b9?&+i}bbpFT-ev0Wl4F%8u5Jkv+uhd55hm7nR!#Ose8yyOLaAMC633 zDV>7?kB|>EsC1i#MUn1_`)L$t7zJoBAs4){2sW4aDNbhpmads0+6fFqkoPd)u{^8k zMZjTx3+o$}V&n8N;#X+$?NBW($u@>Re>yQ&Z*PCv$B9>1Y(O{Xwc1;#{#^!5e5_m6 zXU4IJ>1Fr!9+*rZJ_6tlowMtjx1 zA~0CEScuR745xt*&a+qurK`-Mjm;*fqzXQ~H%2ydB)g=`$|{S2o?=0R!IYsE(-uI& zVVo+KB?FPZpuFs&ZO-aPQhPCqg@_yo&Z&vHR)7mGCLr>O$l}l}QXbn`0-zuar?MnKDO7IVKUs#jWbe zUUel*@@7Fh6V29AH9J=?gJD3vrMz?jU-;w~?tkr*8$a=5*Z($LO#brrfBo^^|4`X3 z544=4Sko6~cg7dvR|m&zIsa5Q@BR6|4`2V8;`sKts|(vs*PeRz`Ju(;O8H=|sPjN` zD@1+zYnEH%3c)rqSLaQj4aH2S-OS#YqleD)>^Al;sw2D2Cm=_CLWog6$oQP!S9E|9x&wt?Z-IwldX1#I- zh={4xTDSy}^du383Nuh-g+df#k!2Z-Ih`CE7$9JpGm%z-5msf(OGakhC@`(5>hOka zr8oKR+dK1{*)_8&${1rjXtgkuGWqIstGA!VCl(2wg;7yu2(X*7NR` z|7%qiEI3trvLCfYOy-9R`Y}<={H;oLXEwxQ!+;PCePjThY&I~06JdfX|Fleya%nIy z<>Ym+2_OW7n6)Qe=`m;wBNjtPWMLv5EmZu8hT=(1m~!Hb0EtWtAb{nJ!XP+mOg969 z{o3~_FZ8T%*RW(qwyn;KO--xK*^4du{@oKh^POcN< zs4rfr7LSf!yZ^76{wYdExB|E;$l4}g2oP2WbfsOncPs!`*(b}Za=r2az!n={UbyRU zQH!HI+5p6yoYG%|SULf!U;u>`#}tHUS$kd_#D_wk(j%C>C@$8Z$x2Q$b#fC3l38nW zUdv-Z#A0t#)HN#;G*AQ)d*nI4o_$pF9DsDJ*I(BjH#8UlBPH$8uiOB{JI7x8o+;HsS3pGFZ=YCyT&Y@rlkM5f8-SJhPiTmrX^E>BzrjE5iDJby1`bTm(*ZD^P zaMAQo*1Is{bh|GnNDLMUiWMh<;G|FN#|Pd|>7jaaSh&&D;jzvEaigy+Xt)UjnXbdj zZR==zdm2KMIkM9=u&}M!MORC?sI?hAMMtA=BB6jdG1|egq)J&R3=O8l#I1@zi3vcd zZbG8$yAq4D*wjgAbHe7Xkz@3(eI8gNX2aUu8c}oV`;;IcC=voRXfEos6S=T%vP`D* z#nrKT7Tuh5=aM0Sr5sM!!K}Hs1{)<-Vmz$IHOY*FQ2>+xKm-6X1Rf{?1SzPNHr~HH z(ruPci+Dbo-(0SZeXT#*`)q69>Z{AVYe}ch-@ILDlfkgGKh0ief2JO7BH5Z2Mnhaq zU-%p6fAH$?=`W7Hn~kuLT0Oq+_x?Kk-v9c}w+!DszjN@l|NP(={@UyGwEd;4?QbXYYk z3g8lw2;`7yYEx9x)}{5iY)s8YXUtoQWqXSB!j+TO6edk56A(EAND{g7k^ApF^Yt6Q{f#)-otpCa=Z{~zb#=Tu zZ-oU&DqQ1OWKm%>Aqy&mp{~$H62*k*<+y-I1|lNN3^^pCxuyTF@F&GC(=e9Od9mfe zbjPz+DtztB7YsSVS~2jcR_MO=TIH!{!+e-tDLZkJG{bAk`24>4*)ym0@Qre|uiR>M zrjg^f>eg+wX3GFHFNb_M9a>0vI+(VbBG+pq>ry+9Q$H^$mL^|WD8f8>D>w@PC`+GM zQ*cS@rk0@7NU7791LDkto@pda16!+VRTrj-1I6CDz|vMa*|#t?VRC?SVq3CUg@#2kj zjs$}uj)?L}xtC^|zp0SFMxLfzzK<&A$>gp-jZDJa^` z20*po4rZhD0!>o@49mn!8v$zhXrd9cqFhai7Yr1{G13?-xgAv)fGbCZ7}Gg{?V|?5 zBvdx6gq&Cc|=J?6ttKXJ2;`PvRJ@W3)&t3J`UarNX z=D$1ifANhq8~`Cq6$ghZT;Vu7b=ivrAcVzorzzKj0ia?Z!8W{6=rauvg3uq*A_x8` z3Jg$}(hvY4Y_bY5P`jSEBvir`XX@)BZc86c%tjXh5qj3fJ%*AaBE7zHXiH#XjzUg> z;Q%0j;0wp2qw|+t)kD=p)v1?%8b%raJpa44v23^fRc28xt_x3qm^`oEd0l)E_uXcM zuDZ9^UzO|C=WAbj6KP(1o>48#nwvGAwfj}M-h21`Z<76oKVCvp&<32?W!mRIDW)|b zpgpfMOV9mh=7p$#4(!hEj_XOkUonXr1fVxilc=5~oWT3Dj>XeAzn)XkMMX4^|Lm7Y=? zrc3>DabG;J*g1TPx2Ij%VN;Juthm6J><%|ogv~`Xc(HLR2M(4MHR%jsF(3*m00EVp z4;u?iUBX0gg2^s$%;O%RDVSZ8J9^oTg>Ttuv}SQFZYZ+W0*FaKOJq%g2C5`E)ZyZY z23nZ-)osq^JiMey96I1>(`bO^q=Et{O(z<8jdugu`(5a3gK>i#4Ns-qBJ7L=0ulh&dAooN zfI}=%Zx4g905j3B5s%+9>-Z~|6sqme%;Vh2X8+vB*D=Fn)O57rhERk{N1QgO3ronj zJKMH&gU#a7Q1etL%fOaUGk}_*8_g&E?fOg?V0kdw4$e%WDUdJ)Oc(*u$z*3l1h}-M z0zk<)94`!4=XNjel-qZo`B?SMrw+&Ng;&07O#+BQpuVn97|vR?5fm|F>bC?g#Eclk ztlAGZXWrj+5Qv1W+?cs-&*Lxr%7kVAn>U7wy?x^xB#cL-Oy}9By=Uj)zn%R3sB=&3 zCp(VhgF!f{qYrhJgTE^CR0%?Wn6Jow;3%+D#@Zq}5tqUs z$z?7lyEHfGdTY6H-*R%ZfbDb^Z%gQCOvAdmm#QOsp6oYj{af$-{8zsC$khA+eK}H( zrc|pfTSan*2SBD1JkSpUkb*jhK@+6F1NZEDhl~+=D6v$!F~V645iujlc^Gp)t|N*n zIIK@PEr@|*AlzYmpoilVNR|o>?6Tygyh4fiff=`4ciE8e2F4rqY+|B{&FF%ln5;B| zSZ*5ylVN}WAsMN#h?m%JO&sbQ&4=r}2NF=M**10Km~Kc($sD74&mQ{U!Z#^RNwACq@~e8a%+dgD%QeMWbTSIT@!+Rjg&v?HKZyn? zlacZHTlFOBt!COMqhS7DH#0(3;#rx{G8zen#_nA*BQu}xNYyst)*^~Y!8R7^hg-He zA&h*!p4El`b6Bk3z~p88nZ`kDXmK+#v@f?upal*Kj02;OQ%YlehJ~d7nT4_dVm+3u zl)o5pTuBL%WwKpC!ZHRcJ_w3p)6iA6SUoLy-F3vF(C&ryHJVH*Ja+e7JA=s{tQ}2u zsy>~R14Kk*gi810(UWNskPVzokAhnoE1HUI7z{&NCR(oEfQD!YWF_fEgX##qT!Qj{{kZgT^bZTB2)LlYV}QBqg!4ezG_Ko5 z0tpihI6Ed0SP@t#F*#BD{kqsfXb_-DM~7h|Tt>FB(+};wwZ8q^x*x?tN=PVIEsxsM zr=B|I>r%E=t0Tn|S2ET^cvy$DId}xjckg%EF;6%W9@FDUm@rE>J9ZiDGF+|K&*qEU?R1WwIUcuvkCL=wTbfv;alv#^!U&}l zI51pkgni6bN+B7x&?Kay>>T7N6aXmUT*XXFCks&dI?9F|ZNTw|?G+CtDxCBTE)Rd3_qAO&qRbO@`H=o6EO1chHmLMGz!h{N>4mdQWOmTz} z60&qO-;)Z+fdoV#OFhdFk$nh5tLhxU%QTzK$o8s`=l)QJEa9m1FfU{OnX* z%+3rC28!C{_0_1{LxWXm)aiW zU;EngpE#i>{!aLrqumSrA=gpsXtOD%^S~C!*Y>_<^|B7G?QH8{1{P6hVjm(ZhTmnF;5d!O2p2cLvdFl1ahqq7C7|9}A z)fwu+4#$-YJLPtbWN2qBV1sxwjwZA5#mylmRa@QKqg=xTbS;BcH7JD{fCxncDinz^ zPGUbhXAD5429qXaHRg-yg-0jff9?F6um0FGk3aZRe{$#k%l!ZS`7^uYr|j&cwK8Iq zN}&WqPH-aWMI(n5;eiPhjFYs0GxUsIB(*MA0z@v~#7ke#M$gvXd}V8Sk}<*IEX5D~ z^2Ep@+5hXg*&@5r9$IRacCMHY?qB>5|J~cYq8y|-*xw$f$NICXo0aSOTe z0JG8TR{C>En>EwGZwmxUR6%5rj6^A+04b8dAj)B$q9MNS%ZM>?O2IZJhjLPO z-f#sIQ7k34BO7ITGxu`DOVyy%DKsAJg^39m(g7F@ao^X?Nsp<7l;Uem?M;M7Sur-M4%3qz#u4r5NuQdfb3o|jHqCV=JF45 z1|=MZgb@}tb1N{>p{R@-$90`0LxH@oS{`;32gYsdm_j87$9TsZ9IpJPyZ`|Z{2PB@ zK|sPD3Sb0Vu>p(AZ~*qJjh(yYGBGwsyI5M4nbIS9g!`sD>6`PV0e8VVmWr0tplvTf;kZwCcZI-3pQ0>A)r zZCtX|hMU0vqOrm&zb>!---MxyEsEaNv|D;pz%b`afEWn5xrn7Kk9ct8dhuQ)Ir=bLN6AmM; zs*#B^0cjyCMHeEW*e2#`Ly6AlSTyv4_fa z!uJQy-XR$bf;s+^us(3pJg0vrwaaW+7#Os`QuXS^l+qX@Om(M=!HRzt{Xw!M;40&l zRyuDIzR87Oq(ipaSqi!+lNx#SBMn8*9k}ktC+6!GSw?b>7wRfXcfunG$K%`4i)WBWmOx!@E|g$*`b76+7wLlYGSZ>;|%Q@mK8TL}=^-z?jfscDD=sDNhB(UG4&%`gEt zAe~G&Con)ByrhJdPycNAQy=~2x9>i1?&5d;{qOwX+Re+iUbwP*>JLBKfAQw)!}MV) zL>&`@NVq7BP$$xcicBs+Bv=rL92WFA7ma!s$LiAMs@=m6USpItmWu}0I)kL|69rQ`|aoJ z-?`k~bwSURnz51;aXz65>L3A4Pz4b{K;X_{1PNBaJ!`n~6(YI?p_T$?(T5 zVtE`=AR|Xz&IyI2gOXHz$%f10SgfO}KxjP`y#o^kEE`Sh$t~XrHw-ztEX-x7YxdY4ZT;DRWSYhGivtGcsu`^?LEe#*S9O;z zG>oTFO97mxo1Cx`Rdd=){3mM`1sDXiidO0)q2I8|=N2}zGGCdAqZ3d7v)T@4;xS^# zpdD+a67~0BlbPJi*?&wFc4RX5hKMIwA?D6w$Q*#})O%zp4Q0=ZEd#M_xiIO5WCns} zl>X*mNj{QD=gu2mwKksly~1fK0j{-TaOx0q(H{Izb4>7c->Dy7nDh4iw~XBDmI&QO zsGE-+0CBnu?B&~4DV@!Ci^&x^CMX-nf3Y5bDK)8H}3=7p# zi-rlX0Wo93gK1pk@dw6+6@?0}(#^`})`w%-7r!0p7EeaNYW7BWD=sohdSI;h~ADX@N-tWD1Dypsw zpKKg?vbVBvb|r<8jprV?_J^N+_3!WB{>jg5{?dixci!jUyUJfIrAn>HP3M9#jk~ zRbvg7%m8DRro_gY8V(gw-`*n#g2P!i$cb2JEw4LWl^hPf+PHY~OFgSUeC2O?@brV#`pn*qgRg#Tb$L^Ey-imm zB!SLA1R^OE>JpO{1TRTs!79NR$YD4h>m*AFp4$}wQ0WQhgP9_0vYU9&H#h(6PtTpc zI{5Mz*M9#yZ~PyBa?)MQ-!6u63MBYlJQuW8XN78jg3e>848)XDEwXimK_Ta;AxB6c zC}&BpNQy8LlCU&D@S_nyWS|HlgQ5rkAc!VW2ThWiOp{@=rV>-2Eg27CK7~?<5_DTA zZc!;GF|cVmn9H<5v6g%X$lw9uAaV^8#hEVf|9YqLdtdnanf6DYIoNsiE7j@WJGAMu*L9&YWm3b?3_H4p3Im1_x_{+t|nJiCWbHFpd>0cPdGzL z2grojyrt)L>6CS1SFW&VvFe6{xz1r2+=awk|@o1n6Ru0+#5(7o%g=1IiTmAtEpT4cX z)0%OQH2?&FM0mNdyvb;(m%M2EWk5HB#w z077j@Vnr0EYYGg7(Ik!mhZ+C`6`tr|OfZ{dBq$5Gq7_DsYd(1Gd3nHyaArrd`Gtrd zx{$=xNVee~9v^_ajt?MN&Ib@4enKN|2m=x?yV(F3*c1&h30_Em;}4irV3XwCI0cEMJKE*;HjMy^acLYGQKFbXz)b8*Q+R1rL6Qb; zNipIr1Ji71u%xM+ybS^|SX|mD2tahJHmUb(7ucIZM1W|*YNlwA5p@drIPB_T{C!-3JL+^GG%QyXa*;vgPGDVnSkZAeg4GLX&M0t`r|j<vtY z_=waK05M8uGFZu#qQP7q5Ky?@2^=6jX98E)(3k~sO*bf4@`DL567(hsNQZqK3|pU! z*rc+$WME38;v2?=u^a)zY)hJz!=So~A6bKEwt+U22J0Lw%(E;d6xy=d>>Df`O^{1q zQ0803=HaM}Z@iB6xx!4@dx43uUR}x@=w|=6`NgFCxVv&f(pQ|_KTJ*}k%m$OBy!T) zZ)dcS<{YdkgY~|6iu{M~gm?A&N8Zx$#8alA@{Lnch1%@&4wU;u7R-Z|Fa44%#NfkY zU==apcs{qJx)yCS2nBK10A_EEVFMBZ1V8{Xp)C~E9gohKdW;{Ka7Dg0Y~1o0ZCFg( z>-5aEbnDAUGwu=}(DPw1iqe$FD-EkIPI|r(FykzwrU76LORk%iAwiVF9NofVu?iGT zT}pc-3tF8qT^H{bS`JrgH=M3fhbxTKjTJ2#2aSnB@yuQS$dg?e7v8x(zIoMd&oi?xu8%F(9)5WEY_GU_^whK0fARV8ryuBj z@z3x4m)+I3H^qY!-9PSItZ!ZH-5M^pQjRh@<)+R=hjWXE4zwFjEnYs?U-p+#vkK5a zXK;c)QL_|Wi>Z_Xu?#r?h(R?P2^RJ67I8q>$0V60Sd~7d(^Obc!nTeGuo79(NmUD~pg)Stg@oObFH4jSbd$ zwB(5MR6`D1O5HKWtRN!b@>$9%r)HCy(#BnP3hpWxDs#(HGu7`{;uc7xvzuRNRVd&Bhih2f`m*-lpJC z%4po$#uUOhzuaHW4$6N!6XxaHMGTx zvN_8Q;dWQP=)3#%Myg4C0~kZQO$^=fB_M_#(3IKR*g8u$u}A& zUb_96AGa5;RWJPh+{3R-D`$I`d~EZj?Wi`nra`VJpf1eg9on%TFM^I?^XNUh;l%)q z5_3HFJ)A=ijuSuql3_07#+gK89bydMz;Q&7nJ-uf6$&M(++FgsR0tX#u9r-Pf8hsq z3fQ&EYK%~bCzS}0O%Em_8V)`yLxA~OcQjS)pPtD~4$FUee)|m~O=?!gNutgTi6WKA zz(bHEl3)Z7dGV|G%sZ}qlU>?EvSCFeXi5Mi0|80uXu44bC$ijWyrHhlQcfyFh&{T4 zed2|MI}3Gy(xd1hTseq%ywjt}Kobz?`Gg=6u^It7;hF>oOuIFuKrOM2kf*LKtM z&eylDltLuZS7`k;^fYvr-)3Fra&Jc--^L~V0yHVh{xz_jd=`CK@NAb?$HrJeOaX9W z2C530nPDATOHRfY&xJX)0%TkXcR``ZMDRI3)}*)P-x=W3rEUOyl-~!$ek(3Z{(ADm zZZG~i=6s@A{rUR01x`6K03za^*sHjMk(T%* z0kHrKK(qi3{_$@zfo2Q<6m#>7zt_8JRr8#D8}2^b_s4fX{Due`J~dmg9M}`Xo?&lq zp`#(GU-qT-GA`3i;kSUnqlcAM90p|py&jde;`w(c!^~nV-h8DiEtoJ1$Y|sI9Os(J zg-qfF2x#DCL~a4&TNMlxr^q_ZT8x=FtWA-X#*i&B%%G(WcG1C?2 z2x*aJo4YPRzuP{4>(SedXwbeh1n3K$D`bJw)qzhAT3}RJw@q=1DsM| z^+ZIG7HMT7r*vrqg_KsDe~>BOWJP8qJ@kQWG^vW2<+cV&3w|7ek#*fU8!*_~3Zf57 zoI=1N+rmXC9oc>J0>li6KrH?;!dn{ua*z&XjiOT6&sPRoB#-wPZAGbJrg$vkQ+TcC znYP?W9J5K#e2-!anO-#hfY6zO1UnNG7>+7cLma;gWrB#7*m@5*@hH!!!~DA+g){c{ zM=o<%R^Mq3(z$qYdJ!|>;dijWYW6=o8t~;D2mfw=@Kp^39%IH+9LuC>HP&R$pp^@@ zymG2K5RTZoX+skOrsjzL0%5|8fG-#Tgm;`!aYjbPiVFcnTo!{7L+#-`n3`zI#V;Y$ zf>b0!C`H&)wlL+8#WuS*ztv)haHhzinpwpcON!|tg?)umiv;Oi+e9g?dgvSs--I^r z#n0Rvu91BnUBkWYY;Cip>1ASkSOE*rioQkEBtnQoj zPlZ$X+O=yq;X@5y&>E$O!b%FJ!JEHc1Qk#K5om!szR&^yGD19zKs<~hws=c03g7nX z>o@#Q|KjHEXO|W(A4yc%cmDS0&%PXIlg@6vw)(r@uk_ab|LiZ`@R}zp;fp`K{bvsL zer96ve?K{!%-3hXvh{sa1=>Z~@~EAL213QN8;gIm^Ii2a&Ns$o;)<}L&?v8rSAcu) zMQNQCZw*8xcnPY5A*6%=(MpPTgcmrX@R)cE9RV?Iw2rMQC0ieHkRgKJapRh_d!Pi$ zKtq`8IUvf-vORaYWo*ORwb&8q$HQ=MzPxeJmFsr#%*Rd-aDLUF1=3P~)`&W1FqmWNt~Nd)Fnh=sKVS9Z3Ocdp&tJ6c^i*=VwS$upn7cjK2o z{J*|=`@Wm|Uux`>YJpyAsol{51i;XF(rW~%F@q)o>|`F_SyGy*5|~yRjn@FLl{((s zxK>P3ri96*?%TJr#jBNpWBcPjI(uVJUwY-+&ElZHpJ`Kuz|lL?TB5e9U9%}Aq*$0u z)J5QA%Gk0yHgdr*Bq=~Zt?8@)NECsqY)KLsr~;BqlOO_RfJ4~GwX91QLo}QmMOn&` zUtlk`^xMzY=<^X+k1x{t$4>*G@ zFft4^R%kP%C$h>Tb3lCUH=Ln30t?3}LAko%j_HtbIxNb4e>_{eOa%YJpO}&0uxCuu zW!bdNAP%7t64(Od3W3=xCoq6bXE9c9P^a4MOg?J<%g^d|q0n_CH?xUMfmK+Zkg+%r zL=c4lCbBNx)iZkzP0a>TaVjvfAhx9gAQ=U=MWnKdGAAz5LplgmI@JyUTVz+~A{iM7 zJpMbUbx2Mi?;NyEBzXFEqO=&_&_i%|1~No&({n{(sAoJ^4l)XWfOPzX$Ho5>t^CR{ zCCG$3EUqf6hOM8F<~SruxYIzMU}V$8Ry@f@t4+4yaQ?mUla;#v_0?aqYVYm4E!h%t zYJ$r*&8l|KzgUYFK-HQU0?=fh1?{3*_3{s8V&O10v+^!U@g>0p5M8Z3+t$$a{!l`2 zp~!3%H+=vC2H=QLFz4)kYw2G8(HK{5@LhV#kIH};aK+T(zkBM#?!ELJe|+F9K1&Wj zUv%% z86kv-69spy(O{zRVl5+^8sL~e{W`R(dHN=)f~qj%IJOjsh3G2YHH8`r6D)$tVx}}& zF;hbC6|KImm6xkbc-Ui&Xy^nW*MU3lZr#Kk418r=)@##cK@R>x=qH^*LHo3kL&Tmx9|BlE_J8sx)DceV%}obTE#I>+zw0( z7|dS5fYOKPE)@YD3sx9r{J_nL+H6G!!U4$HT*hMI*vXz`aB;hc4?0QGa1`y66js3I$klb1%q9O`4rNRz$$X4dA(&7!I*CnR>u=ZJ+m(^6I|2d)+rfuv{$J zw&t8iSGXPAWg%!%9))R@sYW+U0K;VSawB%1hfs0VsRU>+Y2%A*QAUwN`bWOZ@g3{q zfUm0B5{DKAk-XWNWsrgkd%Cy5|{GUFKHT2#w+p|VpSqY!Z9h!`qLMTV3X zO$jN0aze4t72OY zZfx9qVf*YE*Yey2)AJ`6oE5Fl-M>v6fBE)m$ORFt49 z5;MiQa%YR^e7q(rh_qtsbiGs!2Sw%y^TWSB`}~KEFa1t2Gmie-UwiG;OS@rF8)qd~ z<|2RrN_39fP2G|Pkzr~4()gu#q6|cF)pmdcDFLy|kxLR}P#GX4B*dK>i!}KprS?&x+cpo1%}CvMWyu zY|(@4TV8a-X0f9S~uo9JXa=qB$~tUz!_!B$TCH`&&*l#e3M-2xC*m4;uj20 z!Kg{qMoNr8Hb9JE#EPMdZ_xq(60ra--k#nHYWH9helPVxZJ^aD;2I*s$rPR0`E3rAhH{pNpPEWL~Bnsu!^RXeBQ3(34!@l_ag0fg!_r7ijnAQTzb z#@lgq!4;s~%c=4|nE(ipNm+_c8HQ*+y`i{Y_H;&?*I}Lu9tp2b)$Lt z*U85R4nUv?nkjsMct9--i?iGHbN}CI0P9`ncH;wp08-Yh)-zXsTm5AK2+i5mKUSM@ z0T`iU(3h$MNO&5TQ$T_SDU2#E?KaM_x9wkQ5Iha*;!?A`Wmaz4hT`yVgDX7@(dk{M zSInTr+);F`*0uQ1gmwHi)&UbLXGDvi1JC_8O(6tYbaqE?i%&s(I`v#zbKAn`3Q$$i z_Yq_~!7!*#uHm2{<9YjIt{xiqA76)kP}ZI=7MF8gY&wP*4*M$X)pGmSiti?@ZZ?ZfC3ryrWQK+k_We6wYvEb?d zsx;l5Zu(HiDU`lg!_1bOogFK{Aa)E%1wMO-qTDC|9PSXz0G$0169%~M$LrDe=03MM*5SE+l z_KyGkuXLfs#~&UWT$YogN8`aq=8`#d@tN(-g)ff(@mz1D=fz;vsVxpp>0kAClf|<6 z{_cZMukEJUM3t$)L@8s#EyYzz8F?`3P%dSm#d0Rrpi)a&My2h{#S8$V3_40_DM^8} zG)j>$1oQx6oM;^^K?@PKN+ojYWAd_63@ic?K(G$TL^J?U!qr>CqJTY5gbl~JnX*v=y(`iwsZePtFy>}07Z$J9z`d7XgH}7;0U7l?hw2OJOoxiewcIyBCzyEH$ zwR`D1n@1SFEFuvH|KDbzRt4O%gddfDg6 z4{a~MPA(rYKqLVNV%k~IF1W+{e*RBscS?fmJ` zAAa3_OX<3`^9Lzr;7B!l_0O)?(&Mm(r*TCFfdvppHnsP62VQT!mK+ts9Q--I%PqG6 z)z-4kJ~n&ctEf@xUEBVSBJD~pfF;h<^v?d>;$C`<*A-(EFH8VIS#XX`BSowTYt?SF zA7g_-dB}Zr&Xf@btN;o~Idv&zI9XMT2F77zFdhmUyRSYuwd}~zTzopP4NBO5^@)rI zo;8P0J%3>u-Yl4_-MXNm%p|f>6IaV}*$6t=CkC0w*0ey2qLhb#4!c}$W#2|3EfXZZ zZ>1s(DEe#@QahPoI6)D0a=lD|SX~a=JN9@4GqDSyDAK(7%UZuM)GoJS2+OsAlK(AJ zD5n(#$(jubFapH%pGL7WNOn zXUTj5RkP~WjhJD`c)sxTivWh2Zp8EjjJJd071aO+ z^fk}8e%gW{ z1T6rdX;B8fb}7UJhJcBi4w<^J86C})#?GVOs!bMlFu$gj<$4(Hj_m4Yaem{T<7hRs zsH}qJJzJT1_@DcOS6{sAd*ezr?Pq?p{K455(|+N4j;v`C zGNg%2tZkPfMXH%((JlY(oe_iqOIkrRXbV6@E_a;u_Mh3U^Z0|kIYQc-)wf?Qay#9ids9NSqg>@hNc<==Py{8R*Mt^|ByO|)zt&_fAmVQtO@@Uz_v$*1lNX$!^-)5L zIm5qng;fSgC5#k7vUGtFsFo}5tX3=GO+W#wW}qt3!rqMyFT|Oamp&r+8*ezlV;7MO zf{jc-kUR%*%uEv%B@?0pj1A3S8l*{`CORosK`SlpfEyQQX5-=&0xf`@jZ;Q0YA}qC z9e0)m8PUuIBAAYg6fz3$iHl?P0wxevqhxDw4h#EHh3}{Qpz`f5kj*K6#_&|NAnZK=>{(Q7WGJJom17I<)7d zB0Xzw9lG!Ugcxea*DJs3*2_OMARc`x^3a#Q0CUYfdDgmq`HzXPfTCDyWUv4Nri}73 zOmy7&dG?>$zE@t%a20~FY}?fG4IpdJ;+$L8*3W()GpO>s+rM7;0YCsLZL8XWSJ!&! z7mbOnpVLpr0tjKa>+{E7HS4Vxy{Rh%QhKdxWewnJ?d^?U4fDUhECyJYyz=a>dlVz9 zgf{;id3OFFZu#8$kulDw?aKqxM*V9ud67LDcUT^wGX5U}g9(yboU<$phW$Zc)m>DP zj~ZBqCI;Ss7(HdH4u$nKkmx=FT6-Eksx-J(eS73Y=xi3m91 z>4R<)6~Gu(i&g^$$iWyu9orBf04K=(yb@WMVacXt!E|0bCop*i8R?;MxA<8Eydz+{NfjTPGfY=6o%ZmOmNmUzpR9X^RRB=^JxaTYJYi&PORk_uy16-Pt?DwZOIFd{)}NF&k|!~`426(GWIVFRNe zK^{GR{m%PG@A&w?_|ZRp@UFpEzP|YEuEt={|Mb)HvW9!pxyKzS;{=aZAL|j50WuEn z2pt>R8jv6ldMKUPmAE3Hhm#B#6C5I89d(k?toeQ`SR82to?9>(SV^1EKKhW z9U0{>3K^Sibw32x5wZa6sUl3I8if)W$4o>HL80h`aDpumlSZ2l?wEAjY;w0Z!1xYD zuvW2(&7sl-GDv0tFiK$*#s?J{fF!yOF++N{3ItKZCL|Dcors;fQ|d)EC4$UqN(Rz4 zdUPmkIKV(RgAW_3DavYO35t5BJDo+=rfoeDrU+p>rlvOO8+rlPCnE2BW@c5K*wLkw&7g_+`nj8_Mf{#RDSohrVdf{P{JH1dRjGu)mW24<-KZqnVC%+eWm4r|`0Mynvpfrzifmi@RbpHL zM8_k49sPCr@f20bY&q@$2zrkYTitd}Jyk1!p1Eh~+4a-5vO^U>%=N{;jy;vjJt8X7 zv*fC1Y5-E6$G)9>wTxc~8M(RgWCtK5*>3vU@zXQ{y7Ds~*L(TRd1Z|bjYuo2Pc~|xu4NM@2fs=9Y=W%Y z1t=ubN?iz-7dl%qBh&f-tM#Rf*er@#O6C}-p|{v185rqf7)w)Li_#jc%NVRj?ij2u zwQxk(bjoHBk#?GScT`s9W6SL9N0uH0v?*vJBsijTf7E#uCw1^k%vBg!X`Q>;3U&F| zb@T;;HMI&+_F_u$H;2k;8j?~Ud(y;@C!z9`^WQq9%#&SQIhB+UHK*uFtHQ*PabW@s za?@HQA%$etGAv1v5y1EY3`jE$Xr#@BxoS@YQ%2hCVrZ^p7fM@!Nt$66yh+*-t#vq) z;BwwbS@QwShv~z2$7o6vmq9R6cFdjQ$F1!DdQXu+_0C@KFwG1vvk|~?H!<; z|5RncgDLOM%-aXblhkUuXdxA$?k090ZfA1U(PoOOc@c^ip7YPQ*8l(#NOsWJq7dnB z3oOKb+aX}af{HH;WKrEawNArz+PXR2=>{;&s3{(vhnu!55QZ*7z_4^mNFy}sTuTKr z!LtaMeq+OeCm3Gb6^2}{wvQz!Mv!ne8ciw6ftQ&*%{JYH?(Q1Ay00#9_1?T86oQm3 ziUY~Z46ODF7%Es=u(VyCCdIVUIl&;cduV(K6X}$~1faDl3$l|1fG`3BFM14jR_Ao? zE`SKTd7ga47q6>325X&&!>E?CCQbZ~jz2t(TZ7hZLf~_1Kw|!65#?#Oo2qA_@Y+ zd`6rl2nrwrNCJQ`q7XHLBB52O-}&K1#vVfSPMS&*+ZaP+l1$-qa@N&Al1F^ZdN~Me z{K5ns0bID`O{7H`bZPLK3#Zt9MUvj|_}0n~$2dxzEKb|`x|v}^DOdGqnTN}?*(5JE z^1!~$!fMN^vM#L;O;}eDF-VsNuR$)F@N~UtoX2)!=eS%c>adN; z_9zY2cP%aQ;&>)b6W1MX?+#~Yij2q0`LEskg-fULna@6uXGfp;{H?$DtG{*S+#lb* zeevPtb~w0u^F|nhbf(i3E2%OKlEsPv0RmG8IDwV`f&)!bX>HKv&AJAF5KEyou?(I1 zjt~*3=?^W?=r&9m!JW3203O6C?p!f0$}(6C*awC&3)d?I30<(%t+bMU-4VML$L67 z{=i?cFjmRYj;kle%s5g%d6V2k1oLVBcBrIhkK%xO6vOQR^AO%*K)^64Z!qnbp0Sws zL+^j~XPtN%2hhJW{XeAtuW|p|7oRv{95-28`g!uhS-138f@3?t_&XQ#4huj??ecb% zaTfcn6ubW`h;xZ$+cYIDadC6c*YCNAU_@6GU--mC6y#sN0hliR)4vq>>bG^*mp=+U zCR^?J3gcWN#>n+1O#%TaQ5L&N*p^scECwQHHV>Vi!o)OR7tm&!;NTl0(zjmh zp{a=^MJ%l0Yeb+0i?ZhYWoT@PtpQ@r=`fn-obtvcyGz<2{cgdW))^!czE1BjchBIa z#RwOc5YUbmK?Fz`+7LY^>>2a2YIBuJhD=;E@C9Fek2z|OF=2fZY5)kz zX(~#0z3!N2*>PZ#-R3pAj(r!+xq z3<;MHmY`c2vXDqkLV>e1abQ@XMDCw_R_DoQinuyYKBlkkb9WuC1URsE>FxsnL0|$$ zX}?*Dw|Ac2h}-FOvHkkXC&s3Y58Xd?VSMY-*4r-D7y9;U`Btk-D$FhCK6{izRx88- z{hp0fQZUO5bnrG6K^YgyMq2dK?DOWbFyBe1C8Yp>(I|Qy%2GmH>__0ZG?)N~L8Z1ifUfIrCbj-x=PqYdOhwf+ z)M868qV=KfUQDC&Huh|6Syk$mrO?!b>LkNPUYjn^h$;^K^N6c*@pShe|D|DnuYPR2 zbM@Kw<<+@+J4e&q{PL}D?4;}QBxxGLSS*Dy(ak9{8j7{;Z|^kQ`RJwf>#uZw`s4M- ze{$~g|6Bhz{ymSsb>oreRu5cy!UK;cZ@pCSbz$!;xz=hkTnXjaLey>>io z^JZNGkRc$6BuKkRyN1jV5<-(AAp@gS8yQ4JgHogvu|NTcnFNp?ZLbXiDgZzx14<=l zJ1klKo()S80Wv@a`UU;SpwL`ZNRi~NUD`sdHR@mk(%L{K2P1RT7k9Q+n?ue1*h^pk z=H%Ydc5~|a+4Sb2vB8_kqwL_zS1%l%y77a$y}H`JaTJzgbdsWA^%QTQl~GGbaEx~H zhH@Tw;2w?h8VdBV4Tr+fH8{eWe0Y(7K_JP3Q+FGPtc-zh1i#Ra+FJeVf3lt#e*5T2-SVWyB0J#m(pe+Xhk?xgUNn4&gG9Q9~e zDg47~5!E4bP`0r^F|vZb{E28TnlWjp784Zzhz4(}Yo_=^m}=bu#<7?}nQ)1@K4X5gg5K-6{=p_ ziAa5nfbv6h$4$$&-#7nId!fETxrK`;i5BKkqiJ5&7Ru^{@|aQ4us2jpil=Qvt489L z$2(>qGFCJeWp=9K2oW}$*?cy)HN3iE4WF1{(@6l%<{|+Cs99QYx|j)J6ilKRY9ysa zgYc__UG#~DSNH2SYi7Zh4@Yxy_FyNx-6=`;;dSg%Uvx!{twAInj}J%i;N%mVJn11N zMcA4N)|#kcOcZ2phvq0SeAglnAz)$(RGk!nvoP1L!z!Vgo@3Xu&y&yQIZeavu2=W& z>gJr%!#Zbh21SEKh4qj(u0B2&E=Zjp!3k4A&<(jmsL6x zn?whJ93_gJBO`*<3CdGpN}NYYfPsSq)`$FDWrr-AxmKfl{T=djf{tlU42AY z=NqeyW&yXWt|pg0oR>ZL{a+a0y)_;0t}fo_F0Rzydega&o|+DP}O>!$M(`aB2Y$1Db zfK-a~srr|mn0)+GTR(f??cbdn&L8`iKN3G#+5GOyQ=cvAFV@w`wB^{}Tkbnw2nT_R z1aTGxQ9$1o6|=pwPvs4vW9!oZ668P#6j(#2g$a7t!T`s%3=s^)W?f0l7>4zs4Aw3w z0nZ*ZG69RCRs>WNa9D{HwQb_m5>{E2rH@ox#hQe%hY`t2YK%~hUW9A{q=YQO&NNb6 ztk$mcMVSzg+02*_W>d+8hLc%dks)b>Bp7Qsfk{fKJHiQ(2wIo~a*~?L&YX*gHXYPx z+coL)GI?m0YTX8i)6YJVA(EDi4xub(kC7;Y9^;qL5{ndS2+T4&nMI{hg(emzxQRLv zGP(z?w8R)RqdCS$0}C9DphJLo7H%AnhHs&146OiVe@4eINz*sa-&kwz4uC@eB1a)y zmS`S*n$j@%*UyUn=H17Q4m$t1klBLl4#}5SB}QroL~fhdNW~Ytwbz~Fj|;yP{0WQg z|MBnR1UWfvc1ua@<1c2PsYLYzIs4YSUijUzTat;@y)Lf6EKEV&0AIJQzIKlgnWs}% z*Ii0uU;_wj9|^Tvwxi`fY9 zOy(MtHW6}~p0Ew$7={8ZGR&VEC(qH;vLz82+4wdi0lpRZ!{bcKaQ8fs0HfN75Zm{8y*kyL_0 z=9*3vybVyZ5P4^O4-QSqOgrF|QHz=+&oh%MKoXtQ#;ALh7<-ehMK=|txJJ-vHW1N- zRTnk`B9k>VtOAB!D$iqRXiDl6lsC2$T+2Rc#DMe!Fq6|iU#u5Q+LyD5Kayb?8m#gL zpKKBAh0589Tl5$p}vwZ{$RujOc+vZ){aI@j)+vLPD)3 zX<}2U=@}*@46^_*N`))Oyl};{&x_ZNeMoN)A5=KqC-#_AW}3rmxUQ}QoXfh(LKA7} zhs1qO(73yrYt;riU8IClIJVLRK_O4ep;ZarG?6HzWgNH9?WOj$+e%Gr$p8khyS{jb zJs+>`tNU>6u39A@gL|4m8{l zYBu&^Qn~eV8d3V;`MkeshtpfhibKGjt)6w?s%H=}H7!@1e@1_0N3+5YcG`zCbT(e@ zCr4lV&aiXc&+jdYiR-uS@F|~q_QaceFAZ&q9x;YXD>;FwY1_0XQQ0;=zb-%a;kEtw z=zDkX|MFY&=kI;@X#C)dH$Qk^{;+qJ_pYyH@}0AujGYBd1o1U+ZpCZ`{vDv6MTUo< zB4|p_q!b`i(IK5DF$1k!1|bPb0gwoe0fSOfAbDrg6CBVWm9AvDGm#MF_RjWD(+9V` z*-nlii1`vSfW$P}xFb+FJ0P?8R%^Uy@*&OlOeL0u!X3Q)?8xTZja}Y;dA9J&oyM$v zF*7M*w;#ur?{c7_lhoz8qEqiLd^MW9H6oW_k~zM0HyLie89TDeFWs zzLU1}uYzO2gc*h%toH{o8i3K3YD^R=tiui`v!XBVYOcoMkXy01zh-T__h7=f*{w~xGDt5sCm9E(6D3#? z4(>yMAflzLNrzC6sr$oXjWCv-gB2|iB*$1I%l!?&q6?xqRiP~IQ77X?ur#ESqZh1+ z`$}ecB|Cqo7C%nLteE7?Dos}W0H`!nkV0y#>W!2}Depa&~bl_Yl! zjNXdfbv>YjmHdC+zHsTtJ^9|vnG-Lz4qqfg)0sG~ zkBknyKohpw>A>P#SuM7Dp%}CZ1w@&ez`68Eu<$9QTtLVG*h!R8AB7sIuEy}g|~_;I$CY9hO?N=B*7ZaUW6%7$XMixvYjfbvV((AtOkW(`xp;j zeY@{@7CQ|$uEd`{7@k+$dgI*RI3jy@2DSn=PSsJq>(jRSV@w@3BO5?83Le0g$TmhS|b|KDE1CfPBa4{kbWyC&I1zWn-(kG zA~5il39bt&{)~>j=tY%ku!DP?2JYKx*{-FR6Vjt2P3M&yGiEW_7+l(9h$f5N1ky-= zK_UZ(Kn8L%B&KX4ki=;c1PCA*2m^Vu7cQRJJvj{*tFu6wt1>Fh7B=+I>1v}%tn!MA za5GId#DGO1RBlmFf~F!JRH%Xhsi0!ZEpf1$xs+=*lQ|^Dqh}>AatrSSj=85R1*Pa2 ziDXW%!ard($)w&uHi5*DSR4m7m26O+hQYt`pHS@|RMd3(TKX%GH1DJ*OLKeUis`gK zyN)p+U^ppI1)n|MvkgfruVLder+x0zum&dx!a!P;Hb+r>xDrg01`06=wsk`I|2Yn40#_Au7WXmCj$OkRp|3yb*u+ zO|^;n%_D#Q0n~z{3h^Vpi@_HZ|IXO&%jUYY@0i|IcA=6E!O1PXdnH-sVtOY9rK7g# ztIdfd&qQ&=ISD>%+r04B?~>SnncyOu2_ue<(!xB_r0jYJh*gmO>AAypxqZ7Dsd>Ey zAU9X3#O)xoDd-Y~ZqGB?U80*7Am@T+1Do60907>BF(M}Hm-{P3l86Ao1>gQ4;?<(& zgdRSUMLTVBt*(3?K5yFP@6 ztj_8Q&y>TpyNB6*4ddE8i??Al&m|<0V{m9$5P-gWVGZ8pOkciCztLNzb~`9w+G8i% z1nF#MakXwP078=6jHGZgZg+N0TLX#JNdo8MY@Wptf9pF1NO|#^^67nO2^!BRpt+UZ z`>e6FUH#xXg9ZnV?-b|58<*b|H0HqBsR11_)!Qr;iZ6vLZMsxeYbApsr4YFw-~wfH zjtXwX>a_x#kPnQ5ma_~*WneNWzzbdkPYO~c07jgxL)gjPy=&n1Pt8qJ);C+4A=8N~RpHe0#eY zCvTio*&W#1c793@ry~<+ee*C>o44s~T3?J07YbMH-ZCD1wpmZdcW+MzXTE*ww7kSe z`5?XI=+XiBVr5m(?tTc0fdf{^*pQ?F4TOjRG^At5 zm>`095h4hHj1lWd#e(ET@FZ^?^#UPDv*rV9mK7thc%m~*9L*I6=c=uh!bOp}wP)a< z7X<~AX|fW9DkdcFRYiU<=^O6$)f-_Uq(Y@i>(S%G2fh9em(SdMM4qfZ`0+jOd2adB zo&Ld5Zw{{GQrp|Hx#_l1A5`o2nhR}*MNb6#6lV#D5s+jM0=nu(S_0%ig_Tw@Dr^D( zLyMWaon>r#DA5@jIM$WKtVsl$MXDKk&M*Rwi9A4-16D|d7NA{-vqtT5T>=b}ehVf9 z?5#qK4LZ0-&{VamYA#nIy-%*u2_iO-jaI2rF^h3pm_aB&NR}|bxOp&xLS6~$%IZzcR2*X*br3X< zQ>g+I4T`jwq6=ESBWU6!Y~i|#r#yI}Sxw5(1P%i^=%!jm1O`oyWdzAM`YY-Sz@5MF zPi$)L4nV*lNZLf?z*5RoVk@U%@ZJ>p9JA|#i0=X?x_t8L(wTSCH4&+xjfSJ$svO^- z%Xc`W4Py1RP-JDpO&~H*Y7ief+oab$w~vT?^9xEb2yPiVMyMvJF0|T-RN4sLXn+7#>7XmPA z6Ag?Q5I@N;wXouAm_Y&6{7rX{V$-HMci& zo`{*ijHpM%PsGxFWsP`|m8>Yt>HYUdDV@BV5EEQrOoA4vcv$42 zCXv{!gd>@)k=wz!p-Skq)L>Q|s^)X|27U1m#R zny;APaqMj90ueERVYt~hh8+M-JP;~CNJdI5=)gu5TWSE0)*JQ3?K!tY&)x?EI19Nd zEVv=5A{m7&q@AmqCezCtTHg=L+*Je#Ae<+kW`V1FH@o|A9d5JDo^HjEMT1SqQRkRC zL6y88O=!Z%O}8U#PiULvHn$O&b~-r~9834&t8I)>)RJ^ECZWJ7bPOG+EpXZ}0;lW6 zvpS}`>%6+BY#t)zoj%K~1Hw$@G#R$)JhVbH2(RZux&OhS;!~>i!?AHCzh!M4-sHHI zW?fOyRjDI|AcHy?3@T#aP{szh;25i1Sq{@?(zpWv5xo}!sgOZY$_PX2c-64hs3Tv= z5;#D_iV_fkUvJMY*td{Xot0(B#|Qu*5P*q6aLgYyye@Jg)<8hl+xC~vN5smhml{x* z^t*kSTf^>IvXNO%m2pN}<4{=@+u9f%?UrlnnN8YVpFa3>v$yiS`64VmuNvl-FNXf! zsGXXvB4oso*E~=O6~(zGU=qePCxfaV9$fm`3;UnG7+>z04{mi|efi8U-TT&a9}d6o z6T^!Y4+S- zS6^P#fJY%wP!<9kQm>#1tayFQMbsm=nt`lz4NU?@?j5MrlZq=V$M>yWJ&5EC(yNtK zwzIWa&hgsmi5Ck2iz1vpR_-$C3A3b;q)#I#)!WGUm!r21ayDihv5)4k?rQnR1!L z5esYui@~6*@OgJjOn>`Uy*vunvVwNcIFBuB%l>rZyqgQq3Qyf(MU48flSiDL1xnb zQBsUbXwcw>im*Ut6MJ%$iB4hx8~68{xUxu=Hff|o0T>|4Fc<_ARR$=;2pyI*$%0eM z#muWjVYMk@B1SSEAcZoGjRuex2PY^%#sp?sG5M;A!KA|sKokfu6$!R);`ZD1WFquT1Se@cwl-wD2Xx7WF8E92Z$c5l~a@okYR}#aabn-%NqagV?l%vg91tff{Z$_ zK9tttB?4F&1}k=iJ%`>Q!jN!dwTK~E4QbKx00bt>q-}>C5EIbIxt-H28 zVmYC*t`ysu*)ngp@UcONu8wZ#{;)iBs!1WMUV#ca!-JxekQ&=s)Sy}*3qnQ(#={VT zzyXJ|_?7;V$?*f5I8)GGM7c!#lYjc!mihRd8`ZbpJn{M~_wRW=e1Kz0iuMU`=skIe zh6CDatN;|uy0>se0th!4Sm00q0K04?5kpAk0D~@7|JP&b{PnhWCPR)LwEJ+E=~0c7 zEmt7l@)(3^g{r-82)O&KBpz9#6J5hp*m!3e$bEVt4)0C+kEH;dVaG!e0KfH@-KYjZ#=2@&+P8MMQ^VWUdZ z8Dea73nJk#V4{HGbmT^`Fq`Cxb9X`rs%jUNW205PuG0)}R;64PlWNP_zIT?txjwO}-BQ%bsjgl)vv~jOb>ROlbE&+mg4G4{^iW~!p&2Fymh&3>S zY-tjXXaemaM+&nLtmuIl%Yb39O`V)CT1pF;6ts^hZNtT0{k%3T4QXGKS5+wvfi%la zBv|$eNJ_iB9DrL>B!ZBi&SzV6^r57`2Q!!a*8Nt))Vyfsr{ZLqqNgt+k~V7!C`|!=({##G8~p1C;jOi87K|V6evH zSeSVsV6oG8nPuR4y=lD-DWD0(%@832ONJ}fx%{{pO$Pl0-LmBB8i0vH7*lSL=T9y?Ifr{k0Fh~n}dA+G$h*p zvcrjXqc|KFVIAsNyFJ$K#Dj}{yUaf1F^=B$d%2Sx^Y_;#3{Mv9)boUwoN}ROduC5U z40wH2LbkZaOg4V74Y5^etN+w1~#3(v|s)*E)?L{V@$+6f; zyasC6D09Zj3I-Vh5)c3cjR;#n2B-WAU@S%is1JukgDhUQ9bGP9U6ioY3VSdsnu-Ca zVk@G+koaw9<0QZLwspC-H>7|e!YmL%)pRf%GYf5^QUn~0f-#V52vGnLHY{ij5!cRz zcxh~o9KU$r;#X#yO|yLZ{Eej-nH75u}uf2=7oL0*h5-u+9RI8~_l0t-TYBI#fUe+4@g0ef0~jU84(;5&;mb z-R@oydXBnULJ)h@loKmhkP-mcXtZZG&lbcgH0sMPr-k()0ju@ie7)rgms`)u)_S$* zM*ShvCGxHHux#s43!LGAmV(t{5EU3e9f~*vjA3XMQI431kweelTKeNZmGj2OKY#8w zzWx5G?Y5t@3FiV8(3z>A2|xgdaNS_hh$(7;03JlJ+SLd$f&d)Kz@iQSL_h#RH=hKw z>sSu3*W!^as>#UB{p=qtwpY4%hK=}iemWbn)5o5E^BtcwO3)^feap(ql{AfV`|MoU zUTmz+d~Gs6eDlS2=U_hBd%ReELi)2G`{^=|rW4&Mboy$kh-JW)*+r5ZD!l(&CX_9k_>dUNFB&!&jOmtc(Ns@TJXJe`-2-M?* z+dApS)TL+Zy7Khdqa|s6e7W&i*$)h=08@1ox%}|sg>PS99pMxMMFR!|Co=v=9suRx zn+f%gL{0_c-BiF5m+HK+vjC;l^s=oQ7d@Hc>1DNP8OWqUcdiye1BoD8Xv!uGBvE*B zd8HAudQv!hE-jlSD{V5FQ=TYAYf^Bgw3=)t#SEqJNa?}=JCzm7GtNqKFDgp$ob;++ z33f63L`C9T1T%l*_k7PlfYSivD3E3&BZxuKLwN_;#GgiZNW$1KzLpCC=6l3NLS4|{ z_#e1(9?moyKB<{jQ^r{1{Z5$>kdJBO;}Q@f*~g;K77mPzITu_qg4vqKez&wh@xmx= zOU3sP=N!_&8{+fg@&fTxhvrd1M8(E!6Uo9)^-M zZ;Y6Q00GWp%lb{25rOQb56p;3Cg>p{OiQ@Jg51p*lCfMUpHuL%YUzWXOhATYP;aHj zX`iWRl3;^kVaD3(<|HapHiL2=$n5*0iAPDztyQdYZ&xJ2Ag!Ga5r8(umrp0^>h1NL zJy4PnFm_zkC0UH=CH%`_DRjiRB!Y8hviQNGyPxsamfNWp7_64Gi5@|Q> z8UTa{7=p9sT@?*e+yMl=xLrHgWK9ZzDo`umj3i%Z0z!=p^yKdd3Pd6TFtCUv7{D;8 zwcQ`&^1;}Az4&|(_y2-gl`_XSt9C0-gIt7bY`$o1`QYTt;Yw}8%$(P+?XI~ZhRj0Q z_eZ;46pm40Mj&_?v~{vZ)*@^&L_#mmc5whuf*Y9w>%pEo95_Xm-QI<52( zb9?rcufJcIM6l8nb$}5<30eQdK%*M~Bt*E15I~4v!-34A>kv2*j4(0^6x z=5ZW~t(8%z5r8aPF(;0qRw5cj7BeY=Gd%(%!FjP+#1`TS5Ez_;G9ad*W6p4T)IvTv zmFoV}_nnSvI8w=4h!`@~Uw;17h1+lK)gU6k5@Va8bqIDc;|ne%kO=9LSX+Ibo#Np>TZGFLsleFPozFUv03t|44%LTMzCBgOkd&s|y09iDuP~Cg zl`u&~HK|ugv@L~OsI@sT7a}B^w8er{;yKy-rz$QI>&dB`U#8&|xyZQSh0&=7YdAxocrk9@<7RDL;)c zGC7&pd}NEHiQ^g&W`blm!uqjcj`(rDz98zbzQ`wy*M%T;c>7pLMM~vjzLzw8`f}pN zkFS5YgX^H-7}{GclN_aMt24iqZPi-epSAL3=fiptmNg;Pk?%MdyxY~o=-8DdpPmaH zlt>+!a4X4=9?V*p#~m?+Nx+z^O> z1P!Wz1Be<|uI~KB=u8gJKDKrFEw>tOO6R=U{s+tZuW$MsArPE12lMOtQh&EK$f56= zWy!HNG+g&!er~+ZbBNKABQiu5>nwl*4hUIKf!6^7+4=}u834$pufr5v)#mpAWDM5X zX5ScfQd~}=x?l+cfD&bd)@;`0?cJTy+z-b@#&WUOYqwHvnxU&Q2Hil45Jc9@&8#1w zseqZH1|>)~gaDc#F)pP5N<vA9)OxtYBM;eb|1sufHGLPP{42yp$e&lEK%feb`87<4h^06_#@c5lrY z&DyyW&h2b|xOaPR-mc7!_it`hmp0g)6RO?O#q&$I?tl23cRu^jgYQ3Z@s}?D@aW!h z@9xW8IvVnvGBr@em;fquPhqMj2yz8v=ush z{&E*b6@?A!(q;DL^N&BA+4AS#zRuPK%sA9<;sny8=;6E(*o+=g00GOE{Khzqh6)@d z&ULmWpjbl3bWy~~aff@hELXLR01Elm|E|;r#WE%W&_uG?1FO;^lbjRHQIi6A<%)Jw zVchs8WikCn2Bp%(2;1e{O-gc_W<(arPY!3jX1N!M>)BJxzfIy<*K`Cvu;GHg@h|+1 zHEBwDSR;X>sM0HnhnKD~v&7X};wa!~hAc$_8Gc#isv@>W6ilVkbR!E^1tln*EVweW ze9F*_Ez}}s3ZadIkHwsfF57q@QbO*TfXG=Zxn!c*yZJJpZs$h3e7*j~!O2EI-DVMl%VAQk3a z09Y(=;6y;MB4FUonZP(0RVvgJA|ViIgE0V%(O@P8L;~oh>t2eM;fVPlMHMwjglI79 z+j&D74Kq;_C$}gB>mGaA-Ekd4po(rqn-U>G1yDtV02n%e6)pJuhY-?z}Cg)Z5+j?2{|o_b0HlAdb^?(eMjDGroMSwL>YX^g@y*gFRv}X>hs5 zhiezw08#9!Rg_}c76^c6eCMis&&kexsmuu=YY%wGBmpTZc-Ityb#7^*n3vDE^?3Q( z#tkrpyo5xIR-KRrZS+b=;)6oxJtlEfms*kpdun00G~QZdXP5}EsTrXLFpvl#0yVI$ z(mDrugbpzXJ4VuD*FRKD?oju9$Y{^e*QU1Lab@@X(7~O7bTuhAC$ByH>X$!IIUl~j zeGFxiq1h}8)1w_1RA3MwM6mu<&43hjfPgR^$^Za?Ri+3a$kxe_NvOaG+w_816;i1k z5|qX~n4R37E#Qf-4gcUrA3po^voTTbC}+}`PK_H~XzgVkroo3}wvG(L88bR`$2*i; z71P){@r11#$C}gjz`{QNr_cW3cOLrs_dZ{J(QSQkT+NQ#gVomhZVq8m*b=B9ikuv^ z<}@!bq}V?sc%g?8S)tRCk;LqAh;WcGj>+o<-uLPD&iJ6@e)!Oby)OoKf^dt{@v@w5LTp+arYraW+ullCw401dx&l`mo%bba8wWU8bZY zq8n=+VL}k3Q7R4#DgZP{&U2TsDN;9KLR7daT!1BVQZ%W978Ff^RM%vC!W3vkW6ao= zE)oUtoG;nD+_r}6H;>G}@D!Z!6NxKxWG?t4U)ab;v=UEC!hw<)XBe=o0Bp;~h2kiT zHh4ic(XL(zYx)f?oZL82iBFZoWU~p7A{yy_`+)yCaK?hHB8?Uf0X8OmEHYB2JQA}O zGVYZK7%`TaFd){StF8hNRG5J>k_-Y9Dtpnz2t@Xb=xZW|No_VjW{^M*;{r^Z0V^5e zmc^C8(tJ)B7?f6k_&{z+VTm$cF;XLC0i}}C$XIDTBO?w0a(Tvb^w9d)S(qCE295F< zz|x9zTq3WX)KtRaKroNoMYJIKqCe(hv^MoYAXvW1juAT&iFV7zvWq@ImI=BF$XXDt zuj$qhcq1l8YC0npSx+Fq3W*1UF&1F(G?QhqX8&R+Y#0zJ4OkdWi}F}7RI-254XQKO zVBnygYa9WCu}+6TFU*7-!_YL4g)mt|t$~QeX0(wlnn#S8ELj#C_03X{FoD_aY%G&T z+>BM(n!nuwhCxgLt)Sbtuo%d4aZy(#rwNGJ$t=v}5MZqZInTRUY1b(U3gcBBskIv* zXb|A3wW=Y2U}=M3vzmn`EpQqTr@|${17m*wo5?eguy_Q!tEA|$cM}L6M%NcE^T!An z>mF@$ZLOyH4qHdt4J_&=Sjm#l)+*}^i7brl4_t+4ygM|+te5BC+o|R|)KE1|fjxv| z5?zSdFTP>|5fL^~C<$3YaTI2U;IOCTEERxett8@16bFQoF_~-QfJjCrKt?LnX}THF zz%&y%rWO)G{haqbs32NV8|^4`%h$7)-5u8vQed!fg^hz4YKSlak~dIRi;a#-*_n8{ zfIPzxPyt!A=GgMW3(x=O)xlH8x4&=u)63-Hcfa_~@#%@he($p%zwy8RE|#zKhTlKA zXIP!7`rwg@zS-Y&lCYPdqA=CtG7lXpZCA7|2F9_$I!6Ej$94{7&~s8GL$E%wXW#bE zO_!FX0KlRKb)dtN>%dB#U%u2o{P1vG0<-P!4kck=)d$FURZiO_mxiV|H!@@)4gw63 z$|l|ziNsvC!XTgvBxnj8fgu2b8wOYvK<*S6am1F$k_yE>{%XFzZ@u}C?)>)I;kgHo ze(D?7Tj%!P@tu3${a1hXpPzgD*{{C#0fvzc%-7^ zHyS>1LE?Ur)#;qWidvjl=umVhz5pmLqLy87)h}+#K^Y zi+t>IA+>Eb4GI)aIRov^kN~i0i_A={1&{VBOiGe{e19DV- zrx2l0#+@djMfBjg0<&)xCi~o?dmin{&z6?dBDb|RRWV?(Ir$BrUPPdB%~c_;a;PZ2 zD^>dHkDHi!;kS)wE}owx5{TVMeQ%*}D}lrfS_UR0-qo+KQkcotV!J~hZt!kVM3oAefTNTbRtq5U41jNVKKb-IyRTp`s8W8VwRzeWHjh z)-gNTnz=~rwudga9d!%=pcWJ&!S*KZ_Mr+ORK_ckg^_A$6AWOx4U8ugdFfsV1{RVr zh6UNs>Qbrw$=%1_yxPl;KH3Z0FTe4H^S}S?2WAJ$m#%dyJ5hVM+aG83X^=g-rcsQk z$p@%$QX#EGt;5i=X`RK&h1!nPDgqlKFr_7Q9!LEjK~$#50Px1ku34)9cT{LNpiu)X zaDY(+1lJJ-$CkO}Y~shM1`2Fdh!=QsPp3v(o(6YB~F*7k+eCzOsF> z`N55&=XxL5H1Gf9ga18$qdK;~x%V?kYy0}wmg<`mWtM4Ltc4B&$|%5lKs1UVBS-*H z2kx38fZ(1C#~@dKY*39NB#Z(GS7C21-D%TZJ@{C~ntqOCrk&Mex5oX0#gNz2Jk6L5 zvM#zZwH9qMD_kpbD%1STx=1G4iH~lzjEBDN$_JMoe>VNvMLC$adQ;wh;fZ*0&bmr> zcaByY+t+WMy*l)z^F?lNy+s`{O2(DPNK9dv-yO-C4ZM{A!z&sfP_xBfBT|9NkpPDn zzC?%4>TM4+ZYRtnf8p+M`swG3Ft7jo`{Z}1;fJVz3Q^B^44R&fzk?*|tAi1!1N+0Y zDcJsiC(@bUYz#_J=)_{DI(bS=PExp5(}dz&)%DNK5kqCufl6*U4H70sk_iZNwQCC! zCN$v27?di|OpvipE(Ki<0dVWo1{s*NvH}{pY@Mg4a6XdnZx-v6&Dry}YR6UIT}hae2}4Th~lh2TrryFLy& zBPxr#2^MHB$i5uEh3&h0|Rp1jp4BNKfm<9HmBohFZuCR!D@Q zHbo;Kl@zY@x160C4~d{gsEh2K`p zvCt&D$lbcpVLJm5c?35-?s6g*wCP3hR9_+G6K84?p|^Z|^c;^vhx`gImwMkN%E6F~ z4I7h6Ttn9EAN;w))35)wy8@c`6~QSfOl_PCf)kt{0bY285eZn{$%x8Af(;i%aVlID zK$8SWeYjwzJ*9^8x6>Fz~`sDoc+N^UDD!1!8ja49C6l&Ma}P+y_`!@Y(1 zmU9GxgMfrbCLq>w76GDBOI;+3G;W}U_3G#l<+@?tEFZ)xKfOLOqStme<^?&u&Em!xTFy^bRT*haa@Z=~q`HSw0wpo~&t*#n3lJ>6 zNL6#OD_@;|`zDL1nV2V2hEgW3(n%Pir;#JaoBe#?@8Abs_yb?D*WbS7UlrfOL|VGk z^uh|fR;bJP?OAu^EeEPZJ-5Y7Ic&bEnXQwgj?Ep$7L?nh#fM7Z_1`)0i>KC`3JiU{?aQ9mudGPF8uO4sp zU+F(u{+mA^468zsJM;#RMYG*#`%!umMG)`9mP?#yd^SJ(Ez-|G0Jeg zD=nkzBQ8K!xOoe@0s;m`SS6(e8LWpyA)D)umg@|&49t?HQC_e1hvt#3Tap+=XFAkY zz!v6=F4Uv4mh-fdP{^7TNRicjn!Ugg%80|DttGZf6((@0@Q5NXXqzIRuI+1o`cm(( zYq)d%%HVoGr++c&wMRey-~Z;{rIpjOO)~}nbW(|Ho?)<`JKePCs-ulLse{uE? zz3n}b7yzNi5C^&>lbG{<76=_rkSSkSGp1a$`j~b^9=mcQ)_K?TITg8@9h4Fx3x_0VHf2+o6jh(Q zsB?e9kIKhh8Acoop)lE|w`yJ~aS3eeFk+Igs2G?8GzWlU%H#kk=NuH-U_ywLNE8<= zp@2bh%b7$lLb?P!^L>~k2!h!`0%Yh_y(p~T_PGAvaKEoMB|flV#Rs0`_>6!o{v&E;5NCxeDsz0BYVAl2VJQ4*_k1cx96nhRcXGqYK1>kM3fjEG zBqxI+`f@a5jpY5sbGYfM{SaVM#4bz&nMm6{+!wqA<@(BHVVlDT8s$n6v`oePYu|Od zGr8i$f!ANkg_Oul^Qlrw*B26TE;3r9YCLjI8z$<)?D&3tYb z<`k2R=zy?XYUS0Znwf8M)n8JsY0R!bVz#v!;vptc0F(a2BqOh<&q>Savk6;N+6c^l zoN<`wWCl#$@PmwY-G50o5@&(QLUJwFmml;B@U-^a4T=~rJf0SI0+aPFpFh)K1 z*oSqT&XmCYmp)uDJ9PMRTBg}%Xl1manpL>FnkEq#&H$dsBj;{$R_*p6S_lJ#3PQ|8 zKn!3t+o;hXV7LtcQBq$-RE! zRzVh!4hgWmBP7K55KVwA0n~z+kP-}Jf>u=Roxi?!VrDChJde%z&ggLVi}OcDrq_Sz z$DjWFfARnKch5&R_hP@IH&Wd;ytXUUqcqkS#yVNBAxejHcn0@i3xlYD1lj7u9x?Hh z#Tn8XrhttEU{Q@4qto(t2>}5N=xLWdgK9OY7o$e)hF3M=W#=MntxRP;rzXS%$YKO= zV1`W<0jVT{RADN@B~c(nOk^<~5o96=96*b87)BVYh?ME$1Oy3N6Ur93#@(o&`s%3j zfG_>%>8&4r{^Ni9E5BP?XG5d=-+Ubp`T^e$7Zzu)_hlfrc5rWyivH97;rnv_*67N$ z!eibNqlILJ84|B^4hTpj2?B>Y0Due-*Q%e~bsEVm5d(u7feo-aV5F%KLV*wxAONz1 zxklHAho9-f$p$aHU0nAebu+!W6sx7eoNcBcLJPmF%TSqfp;bfKN|r;@e9&L)j1pD>0C|S zH3O^lf_Ch1lwjL)7o5HRTRRptb9MJ!P{||6NQa@GKs=F!Joe`R>5$&k@y1AzfZTFo z($r0^H}xyH+ns3->;K$Wmx^F5BqPt{bL+H4CYtF&F%prqqJT7v8Iod*larD&?VIx= zS#SY-LHSZ-CnIr6;28>%2oeZ@Aax12ocvu}W?b z^W=Qw%1lKDjv93Oy{<$N2%ctMosOZ?qtEQ#71O~$`E{-Ll&0nxJza5DIv_Z2C@oVP1h@xrcqgs+(8*myNj1hy@c# zd(VHQ`oaMrQmw37$xBb8iF`5~uS=B_z$G15v!swI&Jc?t>#)R0jLgfHtX;r*AsZ`Q z9z1DTon*G@bYsa|on~ah_bq|l{52K~wrnytjLqaLo(JyTAB2rIyhr;#!vC|mZJz>| zHpofCunN}8XG{=AX?vsR1w(;1$9Tm}?S&*;wj{~knwLoi(($)onVpS>^#`pCw_#wS z#AvPg3oBhn2#0bY%Ql&oreuTnUsmcIZx;3;$hF+?Yy$FHZ)y%A{t>)be})%t{y%@8 z;}T{BlCAgHN}m8O?ohjJn41JlwEqfmD4UN5?xMpeXJX=vqTVqa0)DW6kT?DspLyd8 zf8b!fny{~WJlPhGBj)po#w7+T$>Ab6Uq40O=k7YvMfMFz?E}a1c40hZ;RK!cYfy73egdH@-MK=vW zDoJ3VO>A-&5tB5!G*cHuY|)C?C1#N>qP4)vStsvcDWM%q1OyGyXsjzjsKGtEy>_)% zz4V-TF1-M#AL+PL7cAM#lsE=@3>}^}(JBB$5ZZ{36kEYhW_KelSl zPk42szei5m5R|4B$pU7AccQa3M1mm52w5p{bSu7(~#@P}W>TYc6-khqRF{-jd zM46yKaL^JKixU-guWY{OOIH^@<^TVC*Pr|Z_n&<0=?8fL(5T7F}_emYn)ZD82AdlY9k`xmnu$b%hB zq)}nYEKCMeOk`rM%#36x!JsKtj2XhPc=xs4qjB_!pPhzMZu|RBE~c!${nE)~Y4-dA zzP@nD%d)p>b{dUCNy31xV6kMxlkV|C z@&T;fBq6JQ54%miJ~8K)>py?Z`CW7YaSe4k1HcJE&p_ZtW+Ny;F-vWk%jvdpn4}^` zARyC+v*^VZ-Wt;lsEB&AHo$5~aj%pri3w4{-SDyrlZ8X}RDDmjUCyF{TE zieVUpL z4BT*dBpsYRm~0U)g=Qaek(^al&spe*-3f0Sf$nshaRsGm@bZMIJeLObS5bXfjKzC= z7%3T#+>%3R;o;ImG;id$(){pX@Q_Iz$f!^dy2UVXG`GFi;klT<^!Cn{HmK{tSaP)4 z$y~Xa2@5kCFwHg;PbCll$~D9iJw{-o*}!Jfwop2>bEPmNU`jMRDF_}%Xc|JIZM`CE zyoL(X@Ba^NLFxvq))h<6*cSP=|C$~Pu(XZQn7G;O%$5mpX$q6)tJ1OypbD+CBL+?K zBn>nT8I9$p1?g6Nyw)aQX&hk?wtXz^{p^C}3$R*agqtRt@~Wy_!o$CSk&$ovbMDRAZxBFu6hkt65D9M$+s$5qPcYELX9Wp{Djm;pCJF7S;7e zW<;%nH>nJa+Cs}{9u_FVECk3<@}$i&S}vtebQ+MlF-IOctTM#=AB1G?Nk7{!yz#;V zRsosms4D3a7G{ImT(x5|(X@t+P_Pm*fembz^V3A1!Zb$gEb>xEq~cH%RRkE6DrgbU zop&aVDb%(@VF=6+h!6%5hYe#0TpHQ{5Geq|APhnhow#q2!rNZf>Rw_4MUU5jM#a$u z!&VS}Vxx6ss-neAvrg5>#*DJx_K|F7qX>x+(J88vH<2l5qV|b45jwGnk`_v{h;;=M z>}V)G5{_j>ic`+Ci90P&zzP;(iD(p*1k11^Kp^mt5K9mMKrk3+G(s)f$>Y~AzRfpo zVQafsnAV#xaB9s_1 z5M~x8R)#6oU=*dI5I95ZFd!B7gfe2W8N3>v=zOH`lAPKd#L50AQ+{B1RNX+a2-H{0K&WOW|SbH z8wfT4bzt3K=m-{N48aY=FoJ*xgfeizN*E=?!w_(wiANb{gsYZX%|^Z9_C=|di~eT6 z9`azeU1yRftJ90obpP<#FP8^9ynL-Z@igx@1abR1qd|li86ycOW!cu1acWUQTUH!K zO!4Y2GE5ie3#OypI-Gy7I4m};US8nUBVYQ%ceftiy?J+>4wrVcl&wc1a#9dH76i+= z1#?XR9TJU!UI(qM2Od_A|xH)@`9?| zY!0);P?@>Z9Rizw7kR=}ZHMvQqK_7jUV*_jhY%7nLLPWTnm#){8k3NOHxO6?fe~iX z7c$1;7l2?IV<<75v>|Fu31QQOQ?}rl)Re3+lchk`N_0mDR!69STv8OQ|^Jct#5 zF~|hHxV>3jtJPfHE><7D_HHD{0vT$=$V9MR&UlTcp<7->+gC6ZcN2wCRLj1Qu^2N1 zNR!1`2w{`K*?xBnTTu&ztb?qCG2#5$wtsF48zKryVOl3`@RQzp3>twUoX>>VIf zAizol4FHTVuplC6w8KV(kpLh7278a^Ca)cO>DHxz`R?#RCtOE++tV}kYtiCBfHrB0 zG1wSOctt7f1po{q0PfX~-q@8PSP>0G5h5Z15P^vb0xwX5WgsC! z1PnJ=aZt`iX*f7-$s+gG;n7E@w;z-rzA$NXc49TQplPo?qPIP{^eBFKr<^^r0wg7b zs#HjFoMgrZfJh>-%%}=lDMh$ZK}k@<<cQ;xbgWw%VZuFtqZmFSK^zGnjcjrdO@*Vfsp@Qz38q970cglU{I=fo zaWZG~m)*p;T9jzEMG<4-$#Mc?uo2l*+kIoTEs2d91rqm5lp{(eOblE?z3?$WhDi>y z=`ILiTVt9kQgQv^zYwNpU7i0DVa6XIe&K=@pSa*v-vy%_h~(B&XYMT25er3fhEqWO zsA6}8#~j{V3f;mEK@0$pC>K$u%ADk4*Nh^q8(GW-sMB83| zOuFA`{EyobQ;6gRatBdSsE_zV8f`#fx#Z}tUY&FLq~>_l@zC#07UO& zlQuGQj;_CQ;0_#3o6JEWY9>mvC|nE(0~3fzDk=?0ZE<^I$&l5kiaZd35`Av&y8cQY zG#(D$37+XNi^}&kZ_Cc;TLjXazI_s#3P)NlT+P0er5Y74~dn_6S z!$A<70cHj)3x&dXgg7B6Q6QRN97HIfk9amH00hxl93dej=<1~^5CIrL;bgnpC~`Th z4y~#W>r`Fai}Bjvx*JCmlUO8mqKSk(;Rr8q0!0kN4FCuL-V-2-kRYRL06~Yyim*ad zfHNo)fZq^}HSB1Cgaic0dWeGOTH|%}a-5b19E!^TvJfm3waPr)+8f0!ham!q5s)Av ztdLrmps|KX;5;&ccY$nUv5c(dG}1;~zFj>%!1-Zb0FV(B5RnW}hdSs8hG0>IfDlR$ z5hqa*{i}Mbmo`JMznOt@rcq{)`+m-RV4;Q^7T@bi*HOjYnL`<@z6Md4h_3VeNdpW4 zP)1k;Ab>!~LcqzO6j5ar3SjFb2p9zm3J?&tWf&W0F25+ket#DoF0Slep4&d1-pfHf zshqm4uKJ79`p9yuf0bv>BW(2UO$iYXvd>w9L1dw1(rQ^M8Do^POi0ZYkV(^woLD-V zdA;}i?7f3w_|Dh%f9+X%^4^dAm;XO{IFh}Cc01799PJAC#6Ij!!dX{lGIzL=l;uC<9!T^F7R_p?# zEM^^_$-D-{*@&2!c~%-d1gjtf5Sy{_s^0V@@A@Qvdy9afk){nACYy~pEX;Oh=3Jdv z_q3{R`hs{QF|orxt0~K^~mrc?TM!oJE1n9kAvtL}yIXln|Z`kmGyJzJE{{w({ z9JR<@Cm18mF)~A_kuPXYgray6{7`*A&B-?v7ugJbAapcpbQEaicEAOvPEBkT93IOi zd^C%2$jOL#FuK}Xe%8)I&ljS&E3 zo1W8axt1Lr%77pN06mb~!~X1G9IVTD$ zWeb4Jri^non3i4auY^GyX7)BZcYX%j-J>P4JuJFlS#6SOI%9Ye6J5S+`XGO=R{i55kU;l-joG{anV#G8aUm_!@SNFl`) zsq?A2^5rO0!{usj#Ykhm!Lb4y=aqzUX68GWZ0xbM5qqALS3(knjKyh4ME|ydKb%TG zwBfT?0!vbtFbI$(XH&+c!WG`c)|NMEI>_QN3j{+!Y*;Y}FLaDK2UjRC8$x_#l$*sJ z8y2dc{;Ml9uHT$ue&G`R=tg$Ez;qFmIC`bzG)gVOPXn4Lrk?j0Cd0N;Rd~Is6QdiLfwAs|-_lYHVu;*Z|8h zFCwPUUsjJ6y(br9jME%OY?wAT#yFagwHgkCd65km2x?oKg_#jG23hm!ZIj(3ElD_F z76wqW>N+F`$?SnY8)UbUrDh2p5i+d^j2<^z2g| zF9*b;eJ}fVJt&%Sca*;YPR-_6(!4lclT#p zW)|b+m>3Ku=(~DA+MGgQ85BplY0Di|yA}nKOM5Wl@H(WXwg^lb;>-fUvOp#UuOAj9q0R&J&0pTKsxk?>!p)!`bw9~QO&cr#9JlC#(5Dpqy%U6Fru2d6E?h!iMD z5YckPjA5g}N}rmF62zf15`>7(x~L$KFgYd02#CoslA(zTV4#Uu*W!wrTYQT?jLg^iX?iE@p7>|uNJ%&*jY!!x}2re7EV2uQ&ME5le}5R?Gny+L+|bW?R!ezE}_ zHW{25mADohU;u#N+Jp%f7p%+NI%uY7NJn93ZV&q-iyCDuwRWMOHxU2;1u6hSKpY_@ z7&)*w5(yLzfRS~!2n22|TOuR?Fmosah8f@uBq$IkX_l^0vwv-b{lGeHRn+pOcE)D5 zV|rpLG@!VXj2-0A?J2nFoj2%wAr0MtPT7;i;s@g>UQ1P2&6kXZ~EUKgl< zXBb&F7$Q)pkHfG#9}fK3b$KyWGKtA%T20981Y?z<@x-Qdl1GhqJt+YU4X8XOsOpFy z0f!SL)hq>VIS#=k3el30B7k5q4ee4oQ~!d&vsLx;-?dko_552G@A=4+SNDJQ&I{v* zKJn&XNf$%<;{Bo*#B?T;oJWipj;BrBQ3w=*D@PGH9w4XjW0Ws&v+w5<`kEdC2F+D7 zfog*P%UJx4|JpENwdB|+f~Upw*aV^eKw3`&dv4?za)^2X3{cd}B!~#`jM*e0fd1t= z$-AB~>)_Su(o1Y0nhE1lO>_`$sAAQl*W1`HzB(T&76Wm-AaMZXnn)r_A0ZG>bA}O! z^rQd6nZ|TD7qjAf0-Grc4gqnrZ13z~%#19wr&>*s2}>abi4aRHprI#!Zm{%{*0>$A zr(sXw!W3i#ag=zyCR!mzRd2z()gjKnXNNY76nLV^DGh~l0(@NBq!_$y;1`)p29Jd| z0V=Ty3fpX4@H3v^4KzxxabR-Auy2`)7cdcTR?khe`@Yy~rln+NgwyPdBQfUQ?p#cw zmkx?#$F2#z{HfrOK%+WJK10lND!Uh511?xEh#2 zvIJqKNy2}!zMz@42^eu;lI2JU&uWT{)}|6E-GyZ(Jyg6VZAut;I@()1ibeq{SPacg zlmG;Q2FzZfGkLsOT_fAo8bEWi?1M0AVuIYsWZ;BxB47kSjn2lE(FAzir;^OT#DTMD zC74t=I|UfVH%A3JgNm~kuLOdUXc5`E&lZNDIV{B@F9O0v?Nkl|Dimvlw#4P}j9ANt z1J;@Vjdndk0;q!yASz6ONGaJH36w~%CPr;yHl;LFQ5$AU!+ihq#=;1LQ^uk;5l1*A zSR%v-M8fXmo(%jI5Nt@$t?I_35;_9F1COG7LjY?N0&71!6Hq32*{W!TgafUF9j&{TtUS*!3E6307 zxqI&;zVqvBsUBcm;rmgC z2)o%{uqcZr=OFbT>kJ|s%GH}x5#O>nnzkE6OErj!lC+bR3&?xR$at}2T zQzmP+2w(^d%_JEB>bHF|rhAD9akxvx^o$k5C>>i<;EMM;Kn1ZRm7>6*z+#}CawO#$BgLoU32>< z&`5X})-23G067;B1_2%=()!640>V&EWY+s=QWp+_rN9&cci}1VBd>}@`6-o$2}K|PzFZ=~abfZ(y*8JXE!%#h^~DqIPN?4%n{u!DQC(QK;H3aJ@3 zRWUdNj1H4AdEVUKWP5XsYK^7arfBcRLWYDX5W*(Yn~^I4f~B}GGXSQ9lXvhH2x_lAaRllS zB(R7@Q*^CJ7b6S+1p-MW3f4$;7O5z)ja(t%<3hVg<}3|OoODZxxQnggnN1Ls3cR8K z3=osRkW2*kCPG3$z>cH|0s#~dkRSsGR#$%V;?PGWdIAt4el5QxG8 zKon4eXhN!B0U9ip4{8rQ(77=$-7W#5Bu6L!r#Ml!g;Lv!LYY*e@_>gs5_zoJ&EckC zFhnY~M#131=%fe~gA)^DBa*3eg*!2WWt~Z5Bu=<1UKk^fP>omUQn#0n{@}@z#gpSp zXCHWab*r~L8NBx5^o2Iw9Y6D}zjA%D!{Ny=jUgRMwQv9|E4AxLD8h`)tVbHQ<}mPB z9SFeKE_aN}!ZwFKuo84-2@@FXd!*zQZ_5oN9^h@jOyYc5kQ=b6<{>9MXEYs>+?*jH ztHcIkbZ$*H3DP+?7Fa+6vAV)~)3x{>>9w^Dk#VJJRdC~txW~p_jt9CA&2XSRtp!PP zDvBT_`o_2tqd9PB0^a3&C()6SP6>Ql3Wi7^Cw~e>VBoBdQg+7YHH5^Na|%7)k-U~} zopIR|l>oVP7zK4Ju)K0PoQ2_veH|5J{1`Kf+Dn>r{m zK|Zn()+BTMevE?Q!yceE@QfdLOIYDu8EMyi%d}Kvy5QEqh6)kkAxT#R1_5TtU__3C z#f9D70b4BslW%V63JbY-Q{(5L{e<1Zz?55sf$xz1^HVg5VuGsX7N7rglIQo(A{GDo zlgRnyfSCbTEsr(aT}rBA zXszQ6@)@y0Wh>}iB(k-bA@k(yK$wzS(m^|jK*8PC_Pbp>=8k+dc?3^@7wvXdziUcqe4Q)~*!-<~)1*Yheg-j~ZvIGEvfnln$d3eXw6?Mgo z0E}Dy82w1W(^&YWm_LpwOG@R7L^dengk(X1X196-zo;s*S7qe zB3$*uat;T$%wZiyD*{`E6rLvsA8wS^gAZPvZ46UG)T7G@B7%@mKpeqABP2lua7AXS zNvW!pnyL;}i$Q2G&I&jn0N!HP3MY3>We%{xptszjt!ZRpI_O_z*EgC2&7>8kQ~lK0 zf`kANPFmh?a8ABK|mLSi%8IB5L7^f8FBu``~IiZ|v zYhI7$Gz*Jcjh53lj-DzF_domA?oVs)qxV1jchBM4E7Nb?7`;1xfA**jHUu*-E>lSI zm;?fuMH~}Py|`-8NEC;)ktdQ4wd8wS`YWSL2OL_Q#@j}i4`U|+L1BL1fZ}eg;>=xu z;KUh88l*jS!%5F!vCkQE-Bdz3QXt2m~g=IAYC1gUL>k z;imyKj%89~jD0_+lSqXwk>M%}jl&ptG|$)y6Rrwok}vE1%s%x*TzQ6>*x6WhV_C3l z@71H^Uut>{Z089Om^RBTD?U`9G)9&rc9_P}pz_9wP^5601czyM{7gsku#sk6WKlF` z$r_nJWR0}F_DT72CRjtgUrM79$fZ3=n*ozY4UMpcNrbHc(#-c`4AFX6KxyI*kcOIi zu=tID0DM(zdFy%zD6X+rvnEcY7Bp>w$_7IdLVJa#+F={-sPgO zrxkA0uplh~8iC$Z8!OHsQ^uwp2#*#Cf#ND1Xzq<2EHtO06V%0SJghe+wPRm9A8apd z%U?l}c-K>)VQnCNrxwcH+ttD$k%w28YrBUjo`h^!WV=6#GT>2^f z{jLyVf{kqL%!bvmT`kRk&gwX4)(NJXDpt0Ob^CZ*q=_a2&p|~H!K6)RDV>lV0~06_ zft0zzIevpu=_a1p8yQ^}2e*7MlZB*9tJMGjK$x}lTN;HRkl@K=^cad6c|;*LQy?gW zs0pM3g)(FS-Vq$KcH93XfC53V)rz%^hN%qL`#6QN1W<<}L=*vF&|t{GK_?>-A9xgO z7{o${G6Zms2thyrAV87Lj(A6uxF_i4dRF#6+z_5E0@)Ayj1($`}!{agKOg`Rb-<#nB2?>8YNFwm z`J^r-jS2ujmP|A>;!va{w2L2g*$v?UqYTz3CWpJ6_<7`DYuni$Tp7H)C1lq}?$o%V zgC&U2NiATDLL?#}32d^b*Io`VK}ZA+Kv)YP;ErF zpYx>BHXD^GS0jcEDcc#QZS*K*31VW&%*lj-B{3o=lRWjscC6zZLpUSRQI<)c^^net zu{c3OgROYWy(Mw0@uJqlX@A-OZGcYbx--+A-CyWea-x;PrH?DYO9`pgNE zz}AHU80#BlVWX)D3#l1hmctH3wp#GdE1_Jd!QtD8fVllvrvV3pNmxBt?m0|3&iMGC zbeyOJk7eYJXQzVt6B13XK+*}#93s%H-YjDPu^9<~kr0rUUA3H3)pd~tt59jU$=K9l zHR%Gmqx+l|#blUyRtrRvOsZUSAyDqnB*EhQy9W*01TCdc)~toSC72mrz!hDm@z zlOWI;aqI`|Rd&P>6p(#c%T#26RSz*=`wm9Pgd;kDiPkIbS^9|2%jXz`p+=trOg(Rp z?^S&olZ=!xijy^LPKbd|Ghi39w9z*^pBLBJNwf-1{jW3st@M_A7cblHf@sX~_%C{6S0#6%GB`nt?*znTTh|m+b;trhTc}7n3uXcda?ONfJ53a-Q6WmyzsEUVkO9&hFq%fZE0(PaY->!!PsKR zz8iQjt`FA<>Q~>&%FLP*a;aT9`s0CpH@3YD0Ky?HVSx~8*gd-!H)^7&&86&^ycXSzEGjrT3yc;Bn*kUPS0T97TDb8Mw6mmEuox`0%n%cF6ta$*33m`G5w=A_ zwkGFVB1!~+gaVdr9T8ZpjI#&46s!R#00aOTqTxg|1pq)61z52q5|qLL@ftDEq4#K6 zF^Z4?K?DGtVbQgu9m&lbsEq+2+q-YQjsSWfYY&Tp5E8cAXdQ+Kh!Scs)}j?zVk8P- zfC_tyHv2qteQ|NXho-fGymjZ{nY{rZ0RRpH3IGiVk|^{ot+SW_4G@wE5Kx0Kihu~+ z4jCZG2ySE@rg}e6wc$_(9fG|YAR&kV$e1wQix>LlvCmfI{N$zUx4h!I5(Qw$21{8) z)3eLxtWL*C2}1w?L5UF%45@tP+TOsdTEvuAs{#esZ%L5%3fWu(YX?B3bu%Lvthm^_6 zSv#D8ZQZ`gI6u3y`2NwsweRix^g9PT`P<*U{9pR@AN^l%-uwB}qrdb*n4N}+k_s-O zuny`(nJSGk(QQ_DG$T<6B!?Yp^(i$PEplqTpAuq{8%D=*wBy}bAiKuV(PInfx$hVH zCFwbl*o)Z(YtJ*$Q}d_T$iym91LMtpv&fLxtO7AMiU=rotMZvn=A5+B8YNn*TCqve zuA3>mrd$)xnjwKGq{;)UQoHFpi?dEWrDbG>LM|?>+%r4WAM#y~cL^AT$o3&hkA(0z zIupq&q)Y-rM>8Oq1PXb|9}8dk%nD)*q({4LENu%G2dCrrBc}s8P*P%^QJ!KBQs$WC z*z95^ZP;ttH8=@Zk#6v5e>oM`nTlrUuD!;(#9c10y74Ir@agqUf`xE}yq|38A9HJr z0D@vdTrbS$?0P%u;zg@R(!nieVHb-w9ybjjS$iHCj&!>$1Us-0FuS~`9XOZiH=;{J z?(@RT;&)3|%*nNv!bkitW%@?%-#F!ivYBE=+>{gbRmntk%|evaWx4(H95ltE))B=U zPT3F}n;F=jg>f=Nu?&e!dQs|%ZKc9GIT+Kb0Q0hx3 z0|bV5MdfUla2R*VQjL>I7=?tsK}<7!5dkqmQjviLiTDv?+&CQyLV{OjhO?59>hfJQ z){P<15f)X13}t?S1`$vIz|fL_g|UnQ99o$`1|m*$K%j&ma417I0Y!`u6_6IR7#Rlv z4-}SQF!ykO4*>uUWDZ@kEL2zeA&mggzcj+=tz&y2tCg%3>qShrZr_Fx#<0XX0!Leq zarjYw?YhkFkzquL@Ha2btqhu*b#-7i3euD@>ydAX2y>mGq)UT>4InL9q}`(|HW39pZe-M2e;3?|5vVt`SaiKkH5co;L7>wl@EuHY@UDl@MFc^Yd1FU zD1|yQIsj(@WW%J?LIH_PFlQa-_l`g>byiWZo z9pA@?z&d@uRKnq^1i#B6eIC@tXMlzZL30!h)h`7*9R0uFoV&Ji1fDvsol>)LB zW;bvF1A`&ak16In1owI{^Ibq7EN`5dsc>TuhGS?L8riLnOkl+POPCQX-!%Ui)3LZh z3hrl7wj*tjbjCuh0m9B&!~7a|eZ(zp5Qv#(l*u+E%)HGig6@%tS%`d}F$4QU0ESFZ z^MXj(50k!5*aM54X?hu48qox)zdcC?!e|7QWe^sf%!oHICS4>}s-#*lP=H1OOhE|Y z%9aW(6bLTcFh1bC@hB`@Rv#-w4r|OeQr1D?;FK(_V!5imHeZ+6%-l(dbp~?ItHa(e zV|_~S$+%86!;Ola5!A;WdIxVYg#r`x;u^hXPp`p{!WM2(1&Rtn%vRcZfz-~2+}#o- zT&&Hdi~u+abifd(G;{!l!59R9z+|M!pwJ0tUwH~P0%jyIMVHaZ>41bvH(E1S%&XUZ zh_Q+IVMIy;Btb440iI+$Mo}zqRcO2`KsH3U;uc}0%r8*7O2Tz?Va@&w5Cnj;fbobS zh)|j!5+oCVLoH;G5s)UqjSaS>qQf(R@D8~*+6c1D0R{jVSQNn8tQh>#H^bB(vh2u* zlpWR%FIJ)q1OjFZdb2+P1b{jWBMys>38TQKlYIZfe0~yLz80&Rf$b$v+%3zz=(y2M^sP(VU=zMfWexo9*k@_)DeuFb)l656gGrG#7Qj$ z7`m!hoB6GcTU(o3mdgd&B+GaQe&n-P_n#hI`tjeXd~A+A+AehC^Zn%+mJv}B03h*_x+~;u=g_s}wp(L`)#&%s6XMH<=rS$uFO5Km24Rmv6lJ^1;FFy8YxE?_HnO z^Xc$E@KyQ!$KLv-;fuS!^yuyH|B;XJWhnwzQJ;CEo3b%uZILfE@h^7R3pOOh=DhF| zbeo&KA@L2>5Qd|i7)~77<$Vpv;0Q1#)R!8@AtKoJC&h&mlt^Y}D#!%mj3R&W8rfvi z0#N5adKJRtsUrj;PSc?rOzSkJaOrBpNDyWy-%^%O*T8u0IwXwACTqaDjH*|$A;p>WY8DZ`Eq)5JVZ9(h1{MkwwY+wEfBT1wgl8HpDK6oXA&eUAk!ts}E!O}quCoe~2rvLa zCet4(+SD)w$Op;dgcXU(xI)Mf6Bge%aY4kJI46WyYGdouW)PrUwyk`&T{iCy*Jef0 zfNh;x3TE95=2g2|Cf+JrLL?ZRnupEOo16(_nVDOh?sKxyYNWt17qHOh?-|xJYtzaL z*)5q1(wn1}PURq1Is8O1jgz?VYGE+pFi0wlMN7f%FoH3V_R~u{m;Oe4NXii8radLf zW`W&kqi6Bp0ef^%1{uZznwEp*8FSS{W6|0znn5$^K@+=r7&m}jbmA;P_84;a?tfBL zONvWnSH!9njWyvNP&0 z#t0c$S#H)Tsv(UdHDzo6MZD2rlt=;m^C5ULuol{$peI~huDDtOSYH?KMN)> zrD=lM23TPU;Mzei+ls=xLj$s_$vc%ZZCXshgVp^G=*f{MEeCn8%a{FXUUXa^{ot@Tkmh} zh2b;J7{Ev-#Zv?Y(QKqB6K*xb01QLhJkI>lVPGtzC^64d_<5viI*J9{H5ltA+1Qb> zddE2tGJsCP$cDvkAV3rej5^erAP}Ntqzyr^vIqu4BLyo%0EiIC7-e7_IVlmy0a1rp z7Z^p@0RkPe5DEc+tcM8w83gnCe z$Pf_h_|A;M`X$}CC0Lx5vo5rzs0e_=F##bWWaCjYm7CeT(;tp+f4)p-`TRyGm-7do zygW4Bov-Sn`NAyke5Ln+``bS5AG^A7yVjrh_)vw!Ype;)C{7xhaJkCz3iNkH(3v11 zrEJ@3002-13_(N$;AloQWjQ(EFlg~8)(Y~-WF~7gGaD__$Ly{A%Bc;m`h%;zv?k9^ zE#V+S#D$R+6Kp_&O4fPY2TSw4W_&2GuU`D*YPi}Pe0_XhUVi7_I(zG#OMm>`_x|h; zo_*w#qqLar&DGmZj97s_*K-7Qv*>GhL}L)tiNJxW#th%`32)SXjsMtqIm}3$KEENi zK8X3h3RU4mRd4}syYa#aLm+?T?nEXGP18nl&)IZa5Wva$>8goJ*o=t3BzH;U5L3Al zMKlH|X1=4|7~)*9F*%;qGPn$(tE@tGGLc7aQ3}KfGn1?8t0*?pp5lDUH+f6}&Wee$ z$cjv%BreNlI7On5>47H@y(fh`z5T)cC0H??evA`>FIlzphalg1G%#h5&J4y4^a_{% z_|I?ToF{ZEJDPFDggPjdd%fGdf%)6++zL%1g1`Wr7(;5`8||V+nWi#YZnOmud^bgi zdwMiP6to`jYi!nJ#y<<%R%mjh0rRyhx7&Xb3ds*_SGPEQ>a5qCA zD4uCn&3gxX&|rKTLN)vbux8xTp+|{iT9BpWg8?Q8hN;}Q!KKbr)due9+ZK*N*Zo0m_JbYv0w&~dLv}`i=5R79zE+N~H z646Go88B(s0f?T(u={Xgq6c^weeb_CBM6A`Vu%(k4Fh>TL}DC`Z!D|e!MP96rtHGd z1;9KF8=DbGmikwdu=)y&-t6}aNaa=orXEtU3{1J1scm9Jqmt(MQ$#~)W*LjNN4T$r zoOh(fYqDM#F_HjFn2N_$q=x3AO^vZO(={`gDeYz$c?EPR8Ej@=6fkkg@&Ge6$#sE1 zAhQ-}E(2`O^TEHGmkl=AB`t)NyjfI)oLr zhkeYR*2Z-#pixmk$c6~Br~uo%ISyC@sMcn0E@u!(ks@d&08xRlngR$LN`PS)rm!G@ z01iGA8AGFNrs~a8jc%M8W*J3{37I-Q@M6OQQ1oy-BbJGg1OPR3$8#+_;i7;&f*1S&AnLLx#ZFkq>(fW5^4U;zw39bmwS0DvI}M2XN7VKhT{ z7ff&j1ON#GAR~|gWWcBe4r~ZWpeHeQJ3sPCfo#*6h>RX0&K5{Wpp(;+dnm=eyA53d z(G39wIDi<7Vc4jK}{X-rH2Paw;B z((S?R4j>>Pp##?5DL6_)k+Hp%V+Vi;C8Sopb(42Y6=ZjrBRaw=TA6)L5jw!i9S1* z#@fzLbie@+QH08nIj6-o)|_(6{4W!w z_x6Wgp3irNmlGqY8xVvV z?%Z@M7>Xq9#~}x!*OhXrr_E5zkVLVH2nBXAR9V;EK}Z0QPnO*(-ZoL6v^l@!+stqP zf+NxhXB5aCOJQ3x(_myuG`2%x$Z8?9X*VsAyhwWk#w!3X*g?%E9xp7u!dK_pC5;siV?xnpWyV+Rq=*2D8N!^}brV1hMJQb5)$C@= zCpo+vd#O*Ei4!i`)W7AH32~pN31+ftLSH**1OPPC+}A!`xXgP8`&8W^4+a7d8QEFX zlU2Avss)-T$mFaf17QVF+uXYkt=M%zEpvVDVPR<@Kc)xBXc@?Hvq&sWlMaJHsxs3^ zluZI@n$Tt2RGVf*gh|4{uw_$)o0o+pftAl(5g7|20?G_4S;R+^23st%G{OM-AiZ79 zm7%V^Ju957*!Q)cpBZ_`q766V?^RLi#HLhvNxWWr?on&Y>3q&%7&p6q>1ur{vp=IViR#+eO8 zX9)us9}o|#WDz02L=ngf3PdJSnvMMf=}$5#D09O*YdJ+>z&y_tGuw_Pw%`y4fdypN z<^z!qz6Hv=X18mHHGvoqP!s|Ng=kP9J91Al;{cFsE+ardBA0PSfn>{u3j`oM5pJIz z*b2kL6Dgc9nJCK6+NbI+HW0|nh)QEZ0wI&qF6oa6j5sFR9nKDFd5R8BX#_&h)&`B$ z_K(pZ1q63YS)vRqL_jp_$YBmaLJ$Q3AOePtzyMIjFbaT83o{20MJNq$#0U|3X$ifI zGM)(t@78jWp=3M&L{Nro2qA!wK}YfP5d?ID00IlvMypaQ0LY&FF-1ZT%gUhu2xPq# zfHI>F1MsdtAOIMZa{Wr$C}m7SLK*_K zSO+o&jI`N)A6z^0?DNg-&o1J|D<8Z2CtmsPnRoxQ`t1Ms z^Pm2sofm%P;EVp-U;pKL_5ALqpZ$sd@AiMx@xdr6fJhoziDtKyj1ECPsL8{?nQwT7 z0R+C%XQ-T)i10w)PD28k*ti=B(4xZSo@*VFHSA23Gffex6E_MZYXliddiTbW+bp># z>n4Du;7_lj3}i_T-!UEWNsXJWQKc4>q)rI{OfK~L4MeIZ&FqGasI(%7qH*KoY$4g4 zzKAH!Bn%eY!ndN^`;5hfrjk8N@ zB-`Yn5Gf#N*kIh_E6pa$XRbL}^L?_E0P#%F;EoIiQqF6Es{v~-CY*hL>pKHs zrjE92e`T3TbeUvCnWM@V28O0}X6t4&X$)Wj7HvzHlaCzjnQ!r}M>MWlyg~khd$>>_ zFy(L_7jFdIZb@%eK`ln~UKBSZ57{6v2N7XJ8gp4vAt%jq*i`s8GV^AW)5HM;*o$h) zGhMw0*ppN9*?v~_SZxf>deF)O5XpTH#lxbR+O?0 zqJ#qIl$a!|`dJ$R1quj25EvprgMpQT$s!sIjlc#FEM$~1L_iq<0U5jdo*G>5&%#G5J6yZsWQe3B0?BIU6ori`|tK%xKp|Glm9fgiNF1?*m(Yv$zS>2 zZ@l@|_eSG$1IIUh@XB&IEv3B=gubov8>33|gc#E%ZaZaZ=$yiO!D-G(gGwqeYKf&) zpb|x3h!|QB7qKrbZr5Qt^4xv%{17)6v-{ zp1gbh?6tic%fE8@pZ)*d`FH5Pt`8p=uHOY!tOP2La?>BZ_nw^5G{G@tj|;x#7gPg4 zsK?b4s}S+b(JDwXWfBo0*tZzAhG|~63UxjljU>6z@JdUNNqwfY)|C!J%RQvg%po8Z z{?lcaiE;5D+G?E_Ss?Oo6f!N-<{%1*Y+EINlNs@G4{pLRlT(G_Yz>7lA`zI~f(otqhukxF^aF%?X{H?XCFYji$cpBYUmu$<9J#-0~oAc_P zo-Qa&0775@(jz`*X53T-gjjMLue1vdKt91$t&@g#6A7?w%`~b@eiNSuz0NOfbpuS$ z#Dt$d?8T^A)AtVcsIpiQpQ7CZG_Qu0)PkpXFBgrj`|*c*)26&(#J@cAy|hoqatTAB zx2%(FEC6X;4TEOcw^O@;VYkwg(LQr?3aGXBRbeRzZcv@INP6dx4kJ>Odm@Pef(h=? zl_n%|9(Q69N(Qs%B-1;}GA(j4GL5S;)l)KBG?Bw*Bs+sK72+QtIHkjXGG$G)$rvz; z7h?wIoW#8z33?_1%#oxuSdZX?g-ES;6Tw7PFr_arkJ7tV1U+n1Q9uwy$Re8#I1~*=9At-#ArLGiLr4H1U~CT!Ceh&?feDTh03ZY% zo&_cV3MLB*>p3RK7)Dl$dnE?|MTsyFtd03?T;20&1b~6L?7XABEGvh01oJfp4`dxI z1;1)pA>6Q#P=z1@C_sh=I6O-=FGI9~dr5FeDoG=}lI1q2 zD;+o5F{k7F%teG@w|}WyJF9*uCWr`0CHH}8&vi|D6GneiBle^Q$7a#lN_SV+^d7t|5wR_LpKS!s#Pn>=2 z3ore@|NUQo@IUwOxc_$-f9JUskqc;)BR3mnUp1%P22xO&n^ zh)Imnlcz0Yta|NC(-KU>6sljz5_zEG3?mX)DCWdrVdjLUBYX9DIbM^`nz zRy(bWEZmihX>L-PDK!nHTah)Kt#V}w_y&e;j%aqzDj}gR7<=H8 zQk02xg^k*6Z16U+!XYdJ;g&!B_dl)7-OcB3{VV$OZ8t|pG15i4xIhtt3m~d0J-n%l z0zj}Z8(%?ym?0&ZO;d!zkn->LPf&fU>?>MrVk`U0aYq?IlXRDAh*A95BQ?&isH^bvX7=SpZTAkt^917sbF4-Ue2p}$cp>#TUKKL zd>R(w^lBY`32nUt{s@vp8hc-z##Locji(UT6v+-YmvwDzE}=1XwUDFw8qvV)>?Y*DMBJ zNNHiGZtq^ojF6E;M zQfi+`dcFCJFp5~C&E^=Hop_lUTrzi&r11n}fa0uyG=ntEdd$ppWBD{QFN)pBsZJJE z#Q1X3%FkV}9tK930WnDfib1(AJTZ&l4UCXIiD`C;)_TinIj%UBjSM0UFf7vdAK^l< zwrErW#q8X~z8{qX1BK}mhR8sidy0&wy7BgM2#Cc`7$3chg2pWt~FhocJvx&q$<0G7j zB=;mU6oSVnIY}o^-^O-St;rBF00c5nU;*3#Bw7f}oxV(81PBNiG~HRakWxUxv69du z2>1a;rU^@?jO;i(lG-s4Dc_NbFA4z2GG|MKy9aZutg}UcXxIBp2}lS)VMPf-HXH=Q zKokLG!wQbTkSr3SlmVj-Fv1v+lEWI}$OBLSj=%(mb9ll6aFmlo} zRn~54xm}CB`<_MTuas}@&5#DuSI!(g_>PxfduaId%GTLS{fqW*{QfA{bPt7O>w{*L zoq%mBv1?K+DDzx09xMVPB;ZhsAj*ibw4!VF_lxUlUrt&jYyCW2mE~r_8R_=;{KYKK zyE}U)VRO2*nLKtfec!kl4am}E80MR7CPlQ|MLR~%Ea`!cz>Ff6L?{N6#vIl(1+l8N zs#&Vxo};&}S3Y?9{;#InpPf8-_VSrudA7gzOMiX&_x#}T-}Au%zw&!u_37lHZ~xJm zr-ymXjocTSB`XyZT*YH*hPsnDK;?-We#$TTgaNtp7yil&K&gj4lurRcSU!Gs?(BHA zS(8rhBEH68r|QceRn9)F6E`=^A94x(}S!E?^8Hho6pR7HwmlT#r0DB=du zRwQ6hRrRXYqrvL#&OZTK!~-xf0~p(2LIAn2Z~`%bFi_HTbBs>M6!Z9jGyaWlQYXIU z427^TGI7jvt2{9JL&aFGFPJh8HjQb$S(JT;;FJ@?*H;o;dJ`V!L&R~gTUj~<0f=`O z|Mbrj`qYPC0{ha zSOJl8iMGDCV^7ReIku6&M38N9#nMCJ)4{Qjp45{PO?|RUZI_9wZwT=tN>;|tG=sQE zC*0qtQP+eFuYw|_K+*`bLdCD`@vje^1A#2PuYI~*G4BimgId@mgy6z~zybl7CUq{3 zoLio$vFX&R7tDx(r+;gH7>awjM6oo zN@LpqVUjl3>mP9$@Iin93uGoU6-dK91YH{HcRul7w^E$0KveBsU``)oMtL7zkTjY*2?U#qB52tk!6Ncn+9nrT*zVN zEsMdL(5+Nbaea|qt798qme2;uU`9wbfzoP!OfH`*B5nvJ zavejjX)|Wf+)u#brmF@r==p%r=B!D2Sakl=MCD_nM2tCjb+c%4k>&#qATTIS3mO3}in1!vh8g@uz4D1?j4Ma+a$(NfY4m-S)H(!qR~&Yd zj6Ppj@b;Er*maFRX*o48PYTw{;LY?35#AAOm4ak7x+4GxDXZ2y5cBMx9V5+B*K$vS z6pO{{sIAqlZb*RufV@;T;ffZ)Er9fyj7)1$F+he51Wq?M&8Rh7d%FfWTrI0pKtW0ZVsPmN7zBLhIKZgIfXD&mkj6B6fI>VR`VMA{_SJQ{1!v^!-<^pX*zVZVsb?^%J7~ zGiEX!4cj-oc<|G<(tIx^ZzIH<0wWuMC@8JEXKE^B zZJY@PAXf|cW;3=igS6A#y^Tr+4J>H-WW@k>C^j9&*byV~TZA8|ct^!wNPNe4*B|&D zzvK*11p&ul1f&#YaUbN|^umI655ruxQkgauL1}%T$B^5x;>5&skIYe5Hpg4Xk9_gp z{{1<={a^lfjjTx_uLk?|*EP^Ro-LQI5rkN$-vI<8CK@5JFcxe8Nj#Em$6 zM~==W;qplYTgPfJa!56|g8gPPLCv;b-B4tEk(=JetPh)19PWG^75BYvdY@2*p>51_ zeS*OqK^-B0Z2RYhnURUWMq>e1m+U91NSJXZq5C<$+GwLpl~&q=S7tA0)^P_pV5dxvKqvr*I1GS{MN2H~5$%414h9wg zAV?Si2tl9)2?X45z(KY;DHsG163U1L24!%!%_EaMTe=cN0A)am7y7$#<%T9lbL-ek zP?On)_OY|=I8~w1)<`%Jh(rkKwy^GeoUI8P`D_1rzcL1Z>?eMl_DTe>06<1ygP<^a z6N0c3Q5J+50tdhV0ZfNlXbCYDfF7B0k!h0kf(U}Z2%C&?7=yJSK@Cd4gA(-U?M&!^ z!&yp%L`0Z7-;|PB3Wo>6$o!st`)6B^Z>s)1#Rmt&r`weMH(tB+?YF;JTsDT5r-N*M z_Gf?dOW)9AdtX`JzA`fV9w;_96-Sz#Gn>m3{O>SgIMiHqG%XIQITOWc%HvAj^Q^4k ztX9m7fGA?XP!co{K`Fv8r9o3~)swc1z%83uA71Hi8qIbxY-$QO)=>l$-Ktid2Xdf% zj=&D;&C!?@nL=dMmE}o>%VuqB1<2UQ)c2U7>=BEv8DF}|$8C4H-e|`qnvIo%0jS9AxefabETFbZSLubp@;00?Blk=6*8qZ8B| zxBwy=+7FMjDAJA=1b{GDO4}faI#-x}7rHdU66cV z?YaqsdDyh7@}=N8TJf8#&;Ymz044n;z^o_C*Eb=l8beD>-<~P^x4E7>I~J#OOjB70Ps> zP6Zc#hmqPEj1=yio4Fwq?F*yL>r>Ucmdd*^)5<^*&=dxs9S3t5uoNNKbOaLz0A-LN z27$o?B7uMckwCy$fh}ZZ5lut@wFsk~f()7*x)LTB3WsY})A}~Ho*ybK7QZ5I=Rq?AjWxoWbloMb|`6a)i@3fK!tOP;-2ng9UBC4c9?k@mtp*A`U}tppJO z=&1c<2Q2D9PZ@{a5GDcu4uT1&1_osaASIPJf$MD!YmNd=7_k_KK>)yj1Z5zh4+-?5 zGGv-*%GBWiWDcJ)HWY*)R$wFvBAU!lAOPS9j9;p+?l?O9=)qq)_R=@ge&xMa*1WUO zzdApC>7CW`{KR6#?+zB@n}yld*7_gYbY*FBt?=aLea(;NQuY14KiG0|v>Bb$>Rfld zRm?~=2ABpeWfBHt1CR|XHcQ{GU2bWk!ieDeaRd=CaHhoqfs|p`@|B0x^5J54?1p#! z*u}JMcX!@prb$#3F>zV=){?#`O^mIZlyc~Zs_lx2&?40}u&4}unLEq$-mTdO*PeXk z#UHtG^~j?KzqNa3^ZZx0c{Dj68k>3QOSUCzEsGRe%6ThdVXW|+%r%m4`4!(`00zG2 z_pHDEM`~5pJs7i@8c}&nr{Swtk4m)v@-91qV+L7aJpO?Th^G>ek)xtz?|2?Bm^aON z8vf}ia#4R%V)M#ern6B98k-hVzyyal+m52A+BPfq*?=M#gTBR#iRr5uGxj(5>8g8A zVj38QiDWjbmI>*O1Z*-U`^|gG7>WPoPW^^6e&FR6FlW5-5B!!_7;x7x_y~-0Q*0v7YcLqm2X-$Y$MnxI4xI9ict7UD zKokI<>0oFa)GaWuX3f_vZ?RworT;;}uEQtH2wPy~ov1X&`dYPk7Qwq|%aa=5x;)7)%*O*xJk1a#Zd z>0)C@uEb`GPJ`_fH!hg~Q7y>B0-dCo$AHm-2}7j3O9m8Wm6fLH3gV4eya{4KPM>CD zv0_}kb10^R&*C+%NTMCgg{KLt;29PeiuwFwr-fc&i6Gq}U=Z7xq>{%6I5YvMyj(Zo zOs*z&2U2k0#w(xrfU!FJYh1gtpGG@B@`TOR`!Q}7FoW46>EVd{qN8lf1@ccWSc_=^ za74ZI!8+u=f`u_049SM%E22T#hKCwHu*Rfp`wQO-3<<%QPhRD^uK^&`pmM9n`FO-p zZ38gIj%s})&M+Vx{u5Wy95Y@Nq6CXaA?PXnG4RoE|5G=gf7(ACFaKzKy))T<>Vy8H z`#!l^zkk3Cg@PWTPq5r2t@!{<{$tPM1TVfSAkJ2lL)srFh5dCP>BT>qL>UV z%b+tsijyK1sZ%f7)j^zJO1PG&ME88|I;MiE*4PppIx27o~fVst$oN~k~y1+aQ7 z)y#->q+*Uz5u9<%$XcOOXQqbD1VA!gR2AVsoEUc+Cpbd}29bV2XGsj3)a#fSan^RL z5_7iS8L87{A54UWzQMU_$CW%4MeGgcFIQoKK`l%nnSo-a77kE4x&_^P5p&^%HpMf| zyuYk{+g~Y^%r{$Rx*3Ey7i$DP8zJLBTmuAY6D1o`t3{tvPZbP8b92R zMXn$NrxfR^pDqt<_bA%9?!A{z-X2`u&I8KSxS$@Fnnx}hsZxokYdH_?oeo1Tim*UE z(PK%X(KE8)#t}|Q8 zr|UkYyRS#LT~i7~PV)-D&vCWPlJCCZ=bMBwg$Xt&5ZVAD0A?<_03ycgh7C+I!6(qa z4OHo22VZ<@R``x4s{u^qSl!=sdmb|i6%ekLjI``YFO^9QLR~&?vM7QAm64PIa4^89 z!$>e7y=|!;o<>byLCfah*Z`p727578Hcy)eUNtxfFk%o8B3^6*kpTgw31(R5R_DOb zp^$He<{ZC7VqiX_CtwUl_)M}IBZ(^gYMj6kF8L^qX5D-$W4GU&r0`Mjv zpQgM4d#1LfujzFfs9IoxEEqrx6;9*^I2iH0`d`{i8uKGBufwTatxecw0)zg?%#2H8 z9J4kACiE^TcUv%US*J`)UoCD?w{xbvyEP7?3{$rdM!+KZ*o&tyRX7FiP%*$0EJSjl z_L31Zg2Gkz2EEy)*+8qHx*pnkdTXI={-QEnfXQ#SXx@F*KQ;Vc1my?3?DHWo?Nvv- z3^iUg!J;OySrpm^#6tDX`zM1n8Zd9R*>NA2nE8K!g-q{hD^f+{Q-+qoB_l8aidZl2 z1=OOIKs;tZfSKSuWC6nC$G}*!wH73PRZD&11ZE*-CjMpTzJb4A)oXuOmdOk1U8Yte zYX13FCVJMBX$0@{_rRC~bX26F=@_vr%3vM5Ask?U5MM*y0G>g1BN$r@MO?##8wL&v zhBTmHE`u0Pk_jg)F#2MZ8(ifXPor6PBQ$}^28UjsBM%+7B<%Bm+`1LXo6J=^uhdl2J7tMX(ZbD$7m^{5lK;4s2-8m#1t@D8Yc$Gc-YEuRvr36afCf zPap&hzhP$K-Vi7ZWvDj+f)oGBKmQ-R`O8c7)!w_~RsC<=`~Q#5e*fAR{*P94>iLKF zzVe(5w`R^CCkHQ2qmYKx@W*cbbZs@eeEd6o&Hn7g^T+CUtyJ@55=LPqvNt@tR~O&O zADQ*MMJ?hnjyqtmj^Gp!$dF>NA{YQbZ~y=bB)id(c~lXA0twc#+Si;BNen<#b%lz( zFs&D|fSV>%+Qpnp-Rql)H90Ztq%qQZMYJI321YEFAOH}0xI@|bOaFl~Gnu*X8TQ@% zH@Ou$5LiCB;^U10@YSKdUm_A%yaNhQB@i-10f2)x!)59D_VSD}9$=Tp_6U#@rD;K1 zYRsN-M}+_YLyI_zlUbE`vsfWd@*CE1_eE{YC^JpkXlMb7D$t7%kq#sYajVU>8mo%Z zXek3@p#`fg|JhNmW|2cx)2JO~r<(~lx>~HoVXdlSu5JpgNirKED?d=r3>LF3P3O7o z)xDvjER{~hpu=HiRVnH#>L}QTpO!n7!B70P1zU;^?AjjB%q=3Os%HG za=Dmj%Z#C&*rY8sMLrz3lV&V+$|fZ}c!RY9Tu)j^VR}pGd4&eEk1Hu-o8sj<3WM*z zkUbwWhA@k-UFr_S>%}wI4Oa_`t zOk+;d^M;FG*|Vrf-{LC-j0g~5fB3%wJv0BoI=hxdBsNGCxnz()kT*Uv6Xn15`o!5& z%@6n4`A@%+o(E1x9cc^o4)6q}U-cB-*!gZ`o`hPHtk&c-?Z5sd2VGsxNe&Z@i!(oemEZUx8XM zut^QH^?6<2XW3RgHbf14*Al8sWh~&+;;OIdFU!)_kck8Uy#Ueh$GE_<28~LkBOC95&C%ctxOauz_6vbPQ5I@uHy)z|=o6b~A zhCO*>41^gmjU|rgk7<(b$!hlLw{UWA(>FkZ2*%_3TB)0P@tQxtm^U}x|0Y3qJ;W*A zJK$(()e4||lZCW=0&VEGGo}GE_#LQ>M)|;&ajVmUkJuOjS3t&wgm++sMRm9`Wm~mw ztJJDg01(1Y=VXdc`3OC)i-ja!iKXoY4o|!y2~@{O20kel5TZEU-RGt)IQ^zP_zn{y z#v2?IH%#XG9b(}x=_yFT0&p}R(fq}~`#<%IFV~;#?9I80gM-Cu^^N)QgSF&nE_qTZ z42Jo^jS8DyyYs^A4~`YjT;My}UDx5xtSb#@rDGO`GXw0J~^xmwb+sw=mA zxT$(c`wxcaj~^^8t&n%=t^D$mCKwqk$zX`s05k(g5|Ty9D#E~;28S|I_6|S-VriA{ zd3><_yg#~{j$gD?S4k<87;`?9l&dvW)S8r;)~NLnE{%?87U=FghXvSEU--PTZB+Ab zSp?uE9)5%m{runb&!AcW$ovK$U6~(E(iZ_B`}52h;C5n_Wuk5&={fo1@@4#TZ8Myz8N5s2VO-eCa{E@XhFpEQn@cC4|;kU^Z$YFS+& zHH^V1N*Wzxpb9`S&1`p)B(-Lm*~~D7U=&j#NjwvhL+#Cv?H@eEu}>`du|?F^twYhu z#hq)z`CGjcSK=-wjD*fIem0Jp9>(6U)ccj*xDZkV5L=Dzh7L_%ZR~UWEK71ZwT-@o zF_AJ@Q`jiGmU7=FpKSi3FvB=uJUDCl#q6TS$g~j(%nl(zLIjpENDu@f7%7sP;Gx>g zeK2ch@HiEw9aFSxvYdsuXkn-3%c5)A;g*`gCJ4f?aRLe%(_+^tqs(DMHDW~~sy5k} zO$Jm#LnVmOkQI~8oy?DRC#rLqXeu%z5MxP%m<$t`pcryejR71(OWeimMPec;d5SLr zl^khgDtf&80f z#V5M;C(dK4B%3E;eD-2+gshH=Ffc5E(k8jo?RqcX<_gC?aO^tFV~ z6M?G9f&q{LxI~LxS0Tr~ITkle0K#JdfWQF0^euMFYLyKE5I_6|33^zV&+r-vs8}1= z^a(ct&meE46jVg9S62Thz7F^e^eDPTFf^3sC|?7#A0Wl^odJOX(Rt*TUzyaZyq5Je zYELZ0q6Yj6bCxsa;M9Z(%-dd0^i1F@h!zqof|3rGFu(a#pc0yf@|zQX6PQ?4ujnhU zM}L4Rb0wfr>zb$(1TZ4GI)sTSM}*G;7D4X_pY=sb{G|DSGFxK$XqnVJ>eM9Yt;)oR z8UHfyZC)HRN-DAX1_rJ`s$<2Uf{{Q?n^$-Q$oAzw3%(7(zVXHfK5}7RbAt#iw`s0R zBN>Zv1=9c@%q==ySj1wh`qG>xA$Ex-6n(X=69L(y{P3R23I|Mv1<)uY1CgC6)<&`N zhmo95)q((TocUUJ=eK!k1Y-h2&~Y=>e16MmTFD?7$u$hgM|udJcJ=RE{ij7bQQ1B> zxo_t(JHGefCq8=phfn|W)`!>5-njqK;ZJ^l{bJ(dt@D|cdkE zn^pFi_TusJ@{RJAUT2S zR4^4x9s4uQEh;>yH;Zw3h9qXo8=<%=i)nFkaHkRaWAj*qrBUzV041;@c21vX5@{Nbzy7tx=)A8~#@6P_!OxrVY zIsf!d*q-KDyLs)Nm^C+(zHPB|ZbU3s8&VlQwgJUPglSE$8UfA z<;~Y#e>5-VO`FG@AXyUfdpExWnThOb&kw?lnH&v2qCsgEJ#djyC2ZDPfZoWrRaR9p zo_$z8_raO@ul$)C0fM6)r+A`jy%D*f=-_N*#V2;P(B5#t3Q0AEEOq0`2q3C8S;$Vg zEPGNE46?B(DsHA;#d0fdzUg>KWD-FF0?*Bu)}RVP3?v{7P)HLIQ=QK242b`SEqQaF zoOjQsy;{$KK+`iaF|*A9^y5&#a+I%TJjS8kHq&~|jc&gE_9gsx8BgD00Dy6()w7>3 zT>DtlXv{?8R9>(U>AA`3aixal&Jkae{#6Y7K2v2)(VjIgQg#RCLmqb(v1AnU-zq-s-OLO9-`Tm93&N1|XVBB5=_V zlDchhwYR|%10+}KTZv2J)8sTS_sf8kn$~H=P;rC3otDOFGYX)(wjE*s1Bl)!VGxK z^y0^Sh3TNS44KdE0CR(H{b*r*|JXq_Oq4{3daLMAc0uN~aA9?`2Sm*#K~{t1mM9pp zfHwxTsl+V6^w9X4qFAW9hFPR3{ZmT^uZ4Z^maM?T`64lbH${lO^=zH?RaP~3)KMDP z)DV>KNx`1b=~96nI3M`P;EkiLht)qw4SCJUfH_N)s6!1lWoSsLGxrxR$^XUWOARje zQ6{9d0Wh%g(KR616x$epV|bwv0-lM1n%im00m-1r_&vZ#@GuY<*IuR=eh>0iI|MzM zS#v0ggjKg?;m&}Q06*V9cFCu1)6C%GL9!@>gHT z_O*N8?=8kly)_FigGB%sqYX}uv!XN;vLZyC#8S9WEYs^NmLsN6u`hH00NS@4f9eO{ zeER-Z3&Yp;9$p$cn~Jt(m~F?3Ivb2#v_x`gtv1oLVk0;($QYe*WKBRBc1^Qv;5)cO zdzg;D`5#|@Lt3=}$jVE8;ure!fAnwe`#5~|$M{4i9rj?+i8ko3^z~e%gRMxLAtL~o zOq1oF9Sc`56wuTll6EGtdKiC>JGiQQwCh4t%u$NLr>TM+M%LH&G#8fg$%f~KFWkUv zcy&Bya=K~Oxmk?btyCKbrD7nte0_HNX!}RsKDOq|4<2oJhfyxLP{bN3t`BT0}!(O6C#YdR3+8HkgbhRh)}VcrX+sJ{JG;t(l}DK zHBW?Kq0+(vkXryqEUoS@BUTdDN_#P_jnEtg&^r6W1U+T4skZ((KWR~!V;Y?5*arq6 zvN2Wr)4gk7DhpKaTOR-s89u9DN~_w%z7%sI2qY+Ltf)krf)$h)m{Xa-24sWb?c-fR zq=8!^n@Q!-i>d=C^c>=s5}OAg+QJ5cFhC9iPI@yk%@EK=>6J`JGQ-parj`Ah?-JP{ zwtb;cNn3&6@3sq*!)6P?$ZkUKNv1bSYfhv_tMLp*X~~dap0s@{k1`X5U`{ht>Y|V< ztq_H*8KMC*5ta#3z%M{sNx6oosjYReZP!UlK4T`QT6hO3q7Nhg$lD3Xr;Mh z`aog|ymnp;z|6x>FObBXg_2201QV!zFEWMOIfegXx1K3671Qi1zBt;XQ z09{-<-gC%}a75ILWXoq}MnlC-T<)KMCUFY{0=gk|{ zxLy;Y<-)ji4k{dqB0?Er5$qkbbLNC34y4RbxkxFBa4TUj(C?B#cwN?O8>`;#<;vC1 zUcZg$?YT48)nDEoImw>-H6Hy4NR%$geX^k|!4|DjS4yP7LW^3^T_~g@?1^xY8#n*M z*;}06Vygmxtbc}2{R}_-&qK$SBeQ}HU;)5a0}`9>lx!4K1t@@_PP}&{gdT7p1}VB$ z$U-0pgx=A0&|=npkxfRdEva+_$obIpVDzAR{pbfpZp`@P=5}ZJZ0D8TGmyGFn)=x= z(w#WCxt!VATX=hQshK9wnN4l09IdpWI>e>ef>yvJ(ve?O&yK$12#+Rep^^zPN1l69T$2KO{8tn{F^`nsi01UyR z05UXGf&pd_d89fQn1jl3!+W9IV{AOGFGtnyy<)E^iM~Mr%>aXl zGZ}E2s9NO|U2$}=DVz3@)l2`CAN`O2{H^&P-~BkHmlSUbCjdMfF5kIvcIWV|lLz;& zF74erI~X4w%>gdY_RBG=@wA;rfB4n)=U%!t`1H&JpKrW#py_(V)5bkjQiBTNmFq_al`;e@t`gy zvgbZ!Z2@}%hI%3_54(K^%7m3K_DZGlsY52wL;lsNIV_~>nMrU|d}U$X6yz%l zKyF4{#fv92MAOusElDiQRT-Hw2olQmqr8!XLOeSajz0I#ng(M61c;w>a0@X=Lxjl- zDNV2lX5vY}l)t?G=69cJez<4-mv`qUz9{Kg7@64T09sH92WGF|2`SQ`tJTpEJsNlK z!!+4g#r>i3$?Hene;jA*+zP;Myn`y{aVuM1os6OPw?lA`UT|J^)5u_KU3U#Z#4Uim z2u;O_!A(G>s&1LfJTPh|l^~HxPTjBlQi^RUOm{g$n}%l4&>>(%b8SOF06}C}PFmHc z<1Y$2DP~U90ziN~*;c)VIQC-0qd3UkDhBZf4xqymFh!6af(knTj{FhLRaTpuMywVkg;~w2?qBGpShWVv8#KLXrIV zUb+Ai+ZTU6qTyAKyrejVn=k8Jo+9Mjl?>=k%$NX{Gn4yWHo{(cH!J8^rGEl&L8i;H z$zUcmcrQq2KA7lUH9CvhI*YoR+XwPMRAdFV?1Y(xy9ecFF0KeU^QJc$?AcFC%rsNG zECD8>V>W*=lisM{FJWdx9Gevg+sMKp$oa#Fg?aOboo8O(a{&|az{F3St&YSpW$l*P z<*8fI8%rYtNkkaSKW4Ti3jroKED+=(#VLU5S{)?KY+jOybHjd(+SIdO8^GkjJcXpLTnrdi zvg@-@q>NF{@CcZJcpVoa1T1)m1E8Uz<9CjPjKyKdl3HYm=9RS;wpdvAek2G0VL+b0 zXsunDW4Y1xvj;!<=o|VgAA9z#g5LQ4mrg(YU~6&f(3>y&?MM3f`}*b=LTft}U2%J| zR$jNpH;&`7&{e)Xu6{K~p!pofUBjl6p6C%*eNdFxGcdq-B?jnRotumKx)3(y?0e964o*Yg2Utti+G zlZD~EN*zlOLIMWF=td6%FL)<$7Kf~1@k+kg2rJv0H{wvaRh?!6DpxrlnNRng?C)A^ z&z6T5;_~%ACc4X)iiPzOEvM39Fj><&+r4_+=5m@sX zP`8{P^tY4|iYhKydxii2MaVJ^vS6+3czCsOb6Z|o>SGp`(FYvs&kj-0@&t_L)zqy~=2NZT6PTMlo&IQ`BWpM280&v-Q^ zxiC>g(pWalQWb`dXB^5XiXO(m$V^*ctAj!;3y4 zj?Zo052{y+fO1&kF300g{X&2s=r|+!#BpcXh)J_}a)A)Dmoq|w$=KP607L^uIZVpf zPu$7hp_>48Nqm_hp7dmaoUX;mv&I+@rHsxn=TuoMmjAV@(GPbuZ*JhX{ityj6&->* zBUx~*t$>h04l=oyNhG{PdVrYtg;>UsKgIBR{rZ$_zy9{4N0=ly`o^}XkQq-^h$5Cx zsOrYhz|SuMgP_10y)`?z+|_#sGTC`SzxFOm19V1OPMe58wOo7}c{ka}15jnQyk>+A zK$I!Gbx*&1Lq)5co^SGu32gvPVykRjct(&SNlm%+%O&*&5JPerAId(n-8_MyA!4;r zp+Hng1XhBN3k3_rtTixQt`({Lz?9HFDU=Ta(}%ofe;)W?Ajmz8y_m5GR+sJnsEStM zg|Y&<@z%U0Z)sy@X09wbh>9=N$=q-gSCooydxtQe0LW6jTinjiv26uLn%P zkj;X5t2xS+P&I}N0whr>meS-z3%+1@dCC}_kZ|QC%b}QXFI~vL=f{fue)r>O&YY-$ zq}EX)PXbcL08qeeJKCt6e&))hyRS^%`RZ$7&-~z!zVPb)*@=^t`*QC?zqobzx?W$^ zX*&g!B*l3uQsQD{n6C6Upghy+CH}^Zm(!C+pKblvKX;clUOupyy?qoVr>DZ}GdDJG z?@BY=mZle_3~ebkJC^ zQ3ucm3=)u_4A(Hl&>;@4-4uEs%O6_|_kQ@~6PJtgxYkx-R4z)hu=k?3XSO|89FBG5 zc2PN7&3tM6jz%tweWS(II6hk4)yU=9=Iv$oA<*@Sg}4IOs%boQGH{@)4aBrj#BEii z(!sBG4O{2D&F}X@1 zLJ=f>1VaP>k`S7uYt&k5qp?+D6gV-ivZo(?anr|Jlg}P(SCz}#?Pk5Oa<<^(1_qmH zzt$=Tt{zWJ+ep;vMIbr|02}}XjKe^P*xF3buFoHhC;#BPAKyFJy=e8-7cV_BU47go zn--?El(u^|+zP3A)4l)v^399!6NlII^112MZTG5J1Qz3$_6{zLzkF}K`R;b(Yt#F^ zt-Q7OAOGsbPu~2$e&fk!o2!S%){ssr6Q>$eUks#hW@u(Pjal&wmOSY0mbnK|h`33N zu!7GwqG=r~Nd;PEe`$}S#Z8id_(;|+EuzC*fQ>VZ?!HUqd{MyUSp{bfxl0m22n@wx zL8o_8=T0JTbew2}zy&Mrc?X-bdH_upZ(hb4%r-oe#Q=>YC5&(*9RN>xrJoqr`n!Nh z!V8`(!U+Tz$Pf@llvSE&s?`s!K{55OUO6UD^_<-+f7&}oJ5rv%0U)&aSr6N^xglK_FCBLe{}xQY7kDUHWJ0tH_!eZxsf_ z_rSu*67m4ejKIJ;Fcl`q$Bt-dA+vQw?k^4qZV`NI@}i0154RtFd_aVzM*!n-q2^eC z&A8gbDx&dvsBAo0qQB^rg_+rOmIW}jD+ydt{b!BLh)%I>Q8A0U0n1P%l~|b6JA>#G zBPh4x2Lz?vmCUskBnBcl=R|2mkI#!|`{q1XG$%b2N-ohH6YDPZ5iKTK5on9JK{5$& zqASt^f@9e!F&H2lGiu-%1kj%RQhlwC>o{CgMW-b#tefqS0+A?-bjeCQf5E&gzsRwP zy3}?K8TR$1#Wa@NQLSkfYu4cGOH?3vRMG;($VMDXE!r(GY{0o06Yyd{8$4#(eqpw-4p-C}8UdFZ%uzj*S`JgjYHn})Oas!nlEoUqPN_f+Rl>RTz=i0+!;#6EY$kjrt-swlh!2q zdKaI6{MjEJ>nAs!dw2Ma3uS=f+{f1A&24spg_V$Cl{yNGV+R)55W%D&sF37xVzV>@ zLfRtcB1}{3)@8TvN7F0A{M}uQuiCQd8oWPmoF06r*&P}?y8zLOG}!m#_Q<+Uoee`p zwW+faIRb%2)3IH#DQe&#!;OtKNN@ky$oU|)>z z;f-2fsZo=d%zH&L2|~DGK!h6XDiFGH*OWyZlC5pKExb9<4pz<|9zLHLIL+fkxiovv zr$L^YvIxSC@_2k*jCgjrtW35CxgyEY&=j}Y?eSu9IL^$M`+cF^=uK!I^;eZ0)l8|b z<=q%w`dz8ARGWH{=&WNaDR)KN)6LDDR&2J)9A!5Zot5Sw9ZIX4mV0%@q*M$zZa~-q zrY@USD&sb7HZA8w1|tQlD9(w)ctH`?3tt;JjAmk%q(OsLn?3DcB*G>tF}}F=z{5|K z=aaL~&VQ@-y%&~GFFda7EiY~khr`13t!$Mpa}Ow6i)0Q+T6QQwIzu)|r#G8|N&|h6i4_F~0iNyN{@r_Xbf!C9YjO`1;lL ztHah6J5MgJJ-B%N*JhvpgRA?0@{j+$TSxiC)HSPORZ2*pmD7|ebQZR`<|g{&SuxXjCBeN~Rper#=& zjLsYi<4p$LCX-hP3Nra=HH#(ELi|qDv8Xb^l&1yO$nxgUk}d_=k(E`n6&ss)D47H! zUOZ82F9UVbK|pT(pCak~b=Ox?cv^t-8+B*N{64zpy> zP_P5yVM{~#Vua~_%mNHz&o~%M4YOo7kJ%;aZ-H&Nn4XOZNNNVpI?XPb=-PqYL7QW> zmdy0qDQSwe8mNYt;@a*YY>B4Ha87H>Oj=}746+R5)N-D>j?fn+y%%7zOOo}n(EjqG zdh^Ndh+5+kk87D0VJKOf4#Yz=xhv_28Ac`<@xlI2O;BNSjzVD4`>Y#>$En$DWCE4f zLbyfZUUJ}ciKR%YwR~nY-gPyOQANa>B$db-F=cc6Yog4Q;T13e47QX&B?r&!E-?1R zaP}=Vx{^dXLl!V6;I^+uo0A2wK|sJTTZ|{9J6FUT4l#XnJDfYl2R>pplt2~HS}SBX zjAN?&$+)XSQl4a{nj^p($_A<5+%fhM0{NI$6OMt&fJ}3-2qYEgF%Z_Oo8*A+iak#F zh1bx*84N?i9e-sSW;jIrKF42CNCe2t_E04eAdZbBbk92g@t}73<{#4-LEfPs(|B7X~eq_Z$VSEiTjLVZJiT`r7);=(bX2puZTc_s+l3cyZb7 z+d28p@yvn8b75^i6_OwhIWCP1FN`jKZ}O+FoUNCu{d&sKq*0<$20@WzH;0vK*N+Ml zDuGxrx!0ofU1Dg?$DOGGytHUb$@|rE`H34ZZ2tG(c*mc-^iNKY-{X0cG)kixJ-vSP zQJ@vrD9}({QVAXIVy=u8jTqNzB?Q;np$ZUT2C%2N?C=Rc|0n;~hkmVIrY&hjCjdl9 zP}m5h%VuXW>RSb_MjV&aL;%^nnu9N(nSg}YAzenj_IGBou||@sc)Had&)6acV9i(a z4}E6;`E$$f-@3FT3twE=O^c*|H5iRo&J0#>#oC*rdY=xPqSm%2?CyH$MzeD}ZQW?M zpX%Q`SkDw=V}Cqyp~Zf|lYXJ7{J{XIFdDO>bisYD6xx)@aC}<3V&LD+FumqDU*6&9J0wR1_&IN7L-a z{N6!!$l{rugP+*>^?&~SAO8LMm%fvoNBWIVPTxDbp1jljlmIkpkyEG?TCeFW4d&=P zVh9n8L24Wt7|E4_yq3o{_Ws#FbNrQEI1-7M3^X>agnHWsJ` z_DC@jo4iAiEs#CflS)UNpjUGs;Lp6fmn8-+43BKPV62x}MS@7%z)jRHj_mI*F*2cf z?O8>glD!ekgmJSllbrStrdAXaCf&rqn{r%TBH?0ltxbR@4&KZN^ZA*68=0UmEyZHF zOv!u#vL+VUnPTGiZ9lRPz!o`}1L`CLjk5$0 z(JHYLnowTf-8*?B-a2Y*-w!LpX|rs_Uj3Ut{ldilrIUxN-wVann5K(`EvM1wG&IY> z&iP*DV$!PP9Lv=~Yhg?DW;}SgJ(7=J|H%U za7>~&iIw>+WDtNvB?vVyRv~ZMC`opXBz5K&mAN{-F+cE|e6+;YYVWD}KYM=q3*O+Z zVZ9K1e2I#QrZ)P=A_AcS;1qS1Q=zUCKr z{wMCI|M|a}IESvV!6HILIvR)W>d6W^azQv9cpf<(*er05d{qdcMF9(hps{Sn4y1?> zK_IYt=+fR5rIU?ke)h%NmkytO^D#=j1=??<@BaA*7ro}tOd0QK{gLzh@OnVmy;rWj zGFn(FD%8vr^YL5VbfFu9aB;m+&Er%-jc|cGqKcqHD-^1TLQ)l?bJ`X?hE&^Sq#5Un zROX}^+*GeTH?A!@`@v*pDNUQEENZvX?NYy0Bm{$@?>m0s(4}>p=5Cs51Y{_fkfd1W zilu6cW_eYJ7(I15zC=>5^~0Z)=UzN9KbX`ezO(Rj;UEI35x1Mx#?R4`f(`WBq+g_~x=>COoJbUx4 z)%*H}h`0LmU^ecp%VV1>`?E!>0YTAfWXS1ahd3PdR7_{WMbhbTZvBei5e>Swdasi) z2!N&2Di9d~GzJYt;F)MM2fT%}!I43DkqhMDywF|;UAV*?AQvJOGrN&2tcH$+_$!%> z1b~EcVC#Yubs>jA|1gVN3zE^fceRL-NRbil4@KUDuv5>j7@`vQIuAA&WFUqxo`576 zMAE_80>mLGHglOsrI3HpY#D@w*UEM#eRjZ%1fGDwNa)cll#Yp>$N`2g7u58MaX8y? zYCQuN?{tX8kVq$}O!sZN_IH{QTmp?6m|J;Xov(~)Ze!Jr6C>@|an4)3RmXUA<27mA zJ$iIe0%8;}tkN1JmtlC2HqOhcL(VHSu)}W_e`~}LuVs8I4yHt=yi;BPm>0 zv4Pkmj99=JzXdL~R0~aURrRpYJWYpjDGGPVN{uEBU{>ncs~knhNE^5|Oye2>vW5Ax zncux7aB(HJ)7&q0R_79lkBQ2prg8g-P8IgTKFenTL5v@`vWDyMs`CV-UHc_zMsBmaw zAQ}ckI{|^XCs?GP>`6~N^8?P6)SvQ=J5PM1Rc4lTei)toVrgEA+98+ygV|6uN&H4| zxN4p^+G+mocfZ(HG%}oO_1T%x!0vW1D8Oo5kVTFOJt-yx%-B7av2R!qp}3-hf_uj| zEO0mqew+4=A?=<$l#=kebFBPrZ-+1>Hp-W)9W1)J3G2Px@;Y{;H}_8z+vzX;>`(0M z=GmjwQ!kY9u%Zj+EryRDUV7;Gi_z@($oY&dEqt&ani}CJ*V(cIs{;Vjp66L%= z6|#URTM1WGRsq%$8zTS__C_X-@YnwEUq5^w6k$rRh={NdLJ+_^mId&1U|F(iV$lSc z2!spS95-L7aizpP+G*}V4`-OzydOJg=U^|D=Hjd(TFVpzKmi~G2*4I`&}7hvYbQVQ ztDiZ=-CyCm{%m~LGpp)=+G$Kj(r!!pZTOY`SvlMZVpi|wuld$;6Q_89C=E7915k~n z&?k^4w zcDUFT)kLJ&}^J3_*kpR9a&tCCwO8{QmiPM>kmt$xbN{nxv%dA`uf6-oN%XNNUw$Y&E9?9_b+zdx0>%;`=s;$G z&8ehjLSNxvf@xwIFw9|5PJ)rLtg0{#oF%i3%Z(QzlJ%80tI-AfTg#INt}X6eO|G34 z+G^{q(Rkx|+r7Qsec|$fK*8E6r5LqtBwy)m5 z_TbY$eDd=DxO1>O+1YsTxBvX#e&gS~yS&#JQ3p5xB4Ch`Lmh^hg@<7rK;I~XqZ)p3 z^BDP*u~T)p;H7H8zI|&U$!+f&1rgkm{Y3y`K>&uN9b!c0T?SJmk#jI%Bh)PTgn7;YdESs#jU{3l3z9RO$=t3O`yRRioUT~yZ5V3 zxbAnKyZEoYfI%?cq^sIkLt7jlpD&mkWW<|dgx0Ss>s7EiBU+gJ zapT&5*Qn`OXn){;NWrVIAR%!;AQoQO*&8w(^xap#m@%8BnV?84VZ@a;5}SMolm})4 z21YDIvEO5XEQELFLBwyG6m~25x>Y5E&Yy-q z99A5RZ$`D+o~sYLgC&`!!Q6v}F8kz_L=%Y9oakT#5W>Qb1P-HbX55}zwRTB9$ppYt z8vhFdB0K;q#_wyulOvc3ti|Rn;cT}qR&IZnp;ci8*6Vy6vTBv(48LsNnyk#1uYUC2 z%f%+EmbIje<0`X6I);O%Z;kpt&y3m&I=lVpm519;6rSSGFF$%S7?mnl$}7I>bM<^F zxlP&A^ziWI{XNCrrqfs5@%)VsTDNNB^_N?D(r9l2nWPlujOqFm78-d|YB|lrfyQo0 zvyI-g(KiF@;=T)aA?>}de|{zZ|Kc;1qdv4-N1uN6o%V5Pt%$}n zAs6Gk(pDI7FoGC~+6^`@$NQ^nlkmJ_LM>D)!?B1ndU zql%$Wq4WzUVk`-gq|(;Dx;blOoL^0EY}EHXd|UK7X3=l-d@jYpwjHN&+7`s6roI21 zgR`}h+lz0#wB&ST^x)%=%=nGmajC6GB8bdLk_Pn1FU#868=O(lcr6WxJVapqm5V1eFvE37`;`;Z zV`sN->|c!gs_pSfu3D37WXka7#-p>_Z$dr##NzXDKRx=<%>xJ5pZe8rT&+jq&eboS z{F!UToAdK`oa%3VX8Y1(ebczt4lcaknBe)1y^Bgfa{kB3)y?{1wFi01sf0M&^4QB& zF6LA|XvGqH@yYS_);j7d#CGLC*FfcsetiDQM{bV(_SbIyyWji5fBC`Y59Y&WVf(p) zFW36*R&?y}-pkQqFOyh{D#d6qf$hGe0Tx{|OIrXD;yXYS-XXxXB5D(-_-lXoe~p~M zMG;B7Mlyr|vg}t%yj-dY9Ba*AU&*0DgxCodO@s+RC=i)t#+Z!qiuit|QRI4H8C#Ea z-Uq``FeT%i^SgG~Ez^WE)|6aBAnq2^2GpVkzrlczk&7EIeDdp)ljASF`8RG}J!ISI z(Bbtzx&9-MuA(hX*tYRtwxhzU?1Na-A>-&cl_4v}ez`D(D1GhW;wpQ6vg%@GEG)Kr z^5t)u1FOyQ;eLN!h?VOqhjmd53v!ja_2|Mv=O(isx_5Bk;H6Vn2H$?+(TnT%jkKdf z>q}d;>p397B8(ycfT#!sJ9D%QbSuwbnZP(A2xv*9n8O=PL1BOd0Ba-(#xk#Qchi4( z)-G6GazACb*NcN;y}fJ#0*KH#13E}!nmFvq(XixLK;ov5!8Qj+x88r0d+Mjp{mAeB ziP!f({I5RwhaTM?ow+cUAR>nFju#CwvRJ?w|@!M`Ix`9ZEqst#XgxOR?O zfsnr6<_$W0;eu^)M{w~WNU@9~nOx((6Q>RHDZJ?lZ>z&0%*H0k2r#bQ3`Bd9P(~}i z5^o9nhJ<+xl%A*rhz5(kXE2vs8pJTQw!z!yOhu4GTLYrkW(G`-*6nB(mfkJ@uWgU- z*z|D624g8xqG>UV5u}9OAC8mgFy-7oO#3gUyI#UF>8y0!OkNLWIRt}A=M5ZJU2d#Y zKZ)!JGfY~4WU9@d%TgMBFpYoLEHbL=)1j`LCPz$iS6%hX7K_RsbEOVYY(F)#sQWBb|P2=Vz9smthJG`#2Tr1 z+r@yH*^U5N&NvHcOQMucjzF@V$JU#cn3Rpy>$T79Gk(#q-m6wT_V6}iLSmU@N1qGQ z5T3bEfp0ZI?H1Oqjt6AD2|b31axwL_PK7kkm4ik!(b_~vv}|w+h$3X!i%-8}x4XG&ndsUr18lGOL^Ffi!iXPQ_FoXN3+$*kh+DrAV z)NxL%r-aTo9*2*Uyb{Cl4bQulHe&&zV&4Rb$w-L!jU4_D5DXjv<3uF{EO%>%&U8&P6nfliAm*)qFb~-aOVf^#Eh_^R({=wTv)8x9F9)kxbWdS&Yv7v?AgWUjr_D2Cz0Dpx;gfn&FaEFylUp#;kn^# ztc5lMhqvp}@1I+0-v|_k#JO^5N?UQ5_IYM#nf0f|E0cLK&ObN*$2-fPn!MC2o|l#V zy-hz&&y-It?I!&%{jY)V{=?GnxxfGQ02Ig+l;Xh1{l$b4A#P$2W1fm z;2~khL!anJfBbJW${ze~{Dg}@|HMM^uN?rs2D1g;OWg!S)8qP)j zRu4A60O$e-EFo1$T{=NvO6$?_D^KLl zyOsU?`t`2M*@r&Zvg=d3T>p`#|L*o9)ymYWO(6TTjqfS1^7iK2;&hqYSL z^yYi%nPLwExi+}0Jl?i8&0B@h;$qWV3IlZMDN!I*A&9gFX;GBh`GT4;lROR2B4n!^ zAYO#N7svTxP!6qf*=~31t*%l}wOLZrr3SyGP|2NIo7QtZA!R#1Xe-x>#k5~#nRKOS z_?cT=pH>MmS?nD=c=ixpY$d(eHp9S;v<^63d*+^w{V4g9FUBvweq43kpMC$++b&-J zt+&gQqxv!^H1Qth3KWb0-XQ?)OeD1!h9+GYlrcpaRYxLgN;)pYT|hFVp=m0WcT?8# zs8%F0x29C22uT&vF%t;_Sb!Wxkj_#<1;FHFou+Y&`EdJ+_isJ+$dCP*-^h1gEx+@Z zKffCvy5pR{U?!3ol?du!M~!6RqXx_@vV(FiSeU69<9sBS zWZqg4o{-aPZRG$5`#sVMIEvEYWzmFZ#R zAl6bAY+!DHwpOiGBN&5=X%nGz;P(i5(%N89zM7~+CuF#$#l@k>W)W0%VPGsNo#ZFl zD0uCeeo=lgYsMtb!fY|+lChInG_BNdUYsBJqpQbve+Wi4mJ3q1T4d6c$eQdsjmU6y zbnDUDHbQ650D{IUlVoh&rKk_ABIb)&5rm!S{{IyuM({PHpZ zE+TwV$(OO3r}6dL2w+&lD?6Oc(ZT>Zgee!w+omW=bUj?J;b>2r9Zds7TR7t~lFX>Q z(Gc6`PZ$S@>{+q+d^yV{B+tlFCvK=oFrPYm0=e9V0>e)4N|t_=*LFlvbY?wb6qoPH zMRTcZD$%@)K*7n%5tzLm^U=E>`3QQiNsKqHN_2`Qph^mYh6vybP(+Ibj|3kH6I?j& z$-ePQ3knu6tkqJL7Z>U-nkEbI(fuO|NHQ^k-M#jm3Rm*n3-n-yZcCiQx|qxhlq85P zh-c=F2_Udm2407?*lI#Vz!L{WoInt)Xvnx=7elud6Fe9hzf-FkAmW+0QGi{5MGel{ zTLOv%6-HWAtIa`-+2mUn*G{<7jJ~pRr0oaqywU6*KYne#Z@xQMe&)XU_2^;xn>YS` z&~vp|d2acMBd4`Ln^%8)Biy$feb7*kS`!cR4}NOWjpY13Y2tEM2gP}5I$UqxmYwgfW;s-n5L7ydigwiQ`eoX#rqfTfPTogrzHaY2`tso?zy9F8FYi6M zsH#EvmDgL}zMb5-!EbzP_m!WN8?TQ}E24;XSL8_R9+=?7ir$K7I&h%fgwiUg2L{7--I1O14D-)pc`;3p#QfJGbB1ON~= z(t;2`_NL`G2f7fk790h;G#+RlFb*6XrE}ixtT?HvP(?d;F3(wwF<7vbzzzVqK(=}5 z_@)jjniAJ}VEY`d4-+M4%#ZIC9!faT=^$H>*ih#-+h{7a&)R|aJe6_J`j&<$J zdva|1@Rq}8|MG+1-!;Gb$2W@0v7Vz{@DvFM7y#(t8*&5yU3v^M%S=HAM9mrLn2}Tg zNvesYW>QM5Q5b?sSCBSRBB`onDe=gNh!KGx3^TV*APDt3B%<)V3c804)k1*5CZGP66}?Z9!ZbmKk*nenr_{i7;a6r z(Zj`0)NVNOf1KA$Ac2{uXTFCP2qTc;2{R-z1(I|K385_$PHc0S3#rlM=?51ErTlG; zt_}^wGI56h90i0-BtP4}8@1SNcQ`)7dSHcg4d=r64wX|Q<;`i$b&BaY4NSopm{~lk ztUh!kAt-jufFM|oigCIaTJONRH;|rz#R#Anr2&;}$WzO5ZKH*36S2}{?gfjdJzGa| z$w{XA;xPjzKg&)Kg7TXerYxZ^AH}XWAT|q;MuN!@G4uTc@Uj`}S!P3UL(l|plyQf; z`Apl!rf9Ck&2z?dmA+hR%R{vfgp2Q?t>ag?&A(V#X}vlQq8SLn-eYDP@h((pjbYkI z7A6)YpdPJqgPGi@rYpv8A*DjQ+ZQzg zQDoO(tdcoQr~4u2;+|qo96%(qU2ux9`!NLR0ciAluD^xBD{u4*pZUm1^2LK?W>hSr z6+eCH6XVzW7IF+3ncE9+=)-9Gr=YPBUF8mb1R6vO472 zt2#7w&V-VdrhVPauIXI!qqX4nw~tiK`Tp|U^3jJsT8~Pf`_3o)-}~e03mLq;)+*~s z&(3^(cbtztcJB{&9yC?9Mn3j5S`205WD7tUWKP0xEdW56;X8nL&{a}IfM~_#v0S_M z6Xm6lx$1O>B~TT=Y`ojoB=Wa@{|5#T3x9vb?`-;AnV(pg$0~LqSpxqfd~=92a5Wg` zoLMGm-eng|00P@P$}X!A%6egrFp8SMlHxe;vK@fB@j~ebis+R_v!HXA2yr0vp-cL!TiJiT}N z?adR9+`seq{#(1c>zCW8UN!(_kTK#276nM~4mOC;^jOkr0!mS`l1xEyVuOoDYt$Si zv@BDBYU=OXT=wL_e4k_9NQtCDnj~}}W-c>>>CC|Ns0k|$dPXrnMSrRNC16$n%UMZ$>`ya!hDIr7v$e~x!v=}~At@x;-~ zth#Gsn@cY0k!2A0vz-WIVLY76V89?Az!>AZ=I&$ybU;juM3_!wX$XmB*$RuMLO(M> zs=F8WXd(p59m-L0Bb=2e!)7MN^KgxMXlMGeIfGU5Zl{35WamX1-)$4GW26=U7n^gc z^6n0oh3p0d31@7zg>fl979qVtHDna)YUi?2K}Gr#@l zsM?yNw!~$|%X#xbjJtxrwf4ju?31NJl_wR9h~DIxz+m6mmvV*?%_T&#%nz+F`D26v z%wpihV%{*svIU}RbJXOX8I+`wfdEYU0m5|cd%EryCJ;vSNV)Qb*o?B1#Fu$tOfEmF z{~WM0J{lThIp9_rMG`?;ije>pKJm(puY|*nM=H1!j8(|PWEA<-b05~})n*}p3E0GC zod>BI_BCrsYhN>8xF9aXSx>hkH?9OWB(LN+U;To|xAuv9IAMVx<2scSUSR|?;Wstj z&iIBNBtY=Iapi~)H;p5JFxQB2R8(DLSQTF9R*K5dYAwJ>@r9Rv4VMr`W>c$&i{VvBkg9b6?i`J+d+OL@kk|3{P!JBZUllO ztvt1o4~gRi0hj<2!J^D^mwdh97bjXTaMx3;$BZ}hO&+;CWd*Q0xvYyd{jh|HP!mK& zLnSb3gE#3kM_#`xh-cJkDavR_!STcBRjwI-o+>0|HjpwMb&j6&meV` z=VaGduI=)BAsant$~z|4P!K5?eJUH`)zZ0+Va?N}YF;7?R)-8HA$&fTlUJE^X|o zqF+%n7aP)zG#9P5b4xSrlx%WG#@RHDTL}fh#;Qqqtt)-vnBavVh%i=LS)*)}B8WB! z2eodl1Ti*6vyoPvpy)1k*A%8SFOa6em?BykYFeN|SxW6%Uz74&eVKjspd{NJpc0U#QS=B7n~qgmgDF!p0~kwMi*6TIa%V8Ew%`MTn|a9? zzW-9fd=249L19|IJt8pz*B+Zh=P<>03_XIKw6TNR!E>F+hw4%5>c^B0)Rz?MD+j&4w~R4K)`}uA`55(;RL@- z7J@=X1c)U7M5F+OgGPKgA}}(E4Cp{{W=o)!O#qrm;hj3zDF*7bEj^_esDth!w!C{( zYp-47bEK%F?$)|J}z-gb8-%&(HKa%yhOd1Y~Xe0(P!2 z@Wu?7qaqZLQb8=XN*g#?V7WTX%ppa@qNL;EkL^r8!J2ozgAu9tD@nA{!9mhqCZeqJe$5%{@3(_+2r*TH}UhwnvXis?yH9{U&mI%`(A&kQu}M(|NZ^i zL%a7XHhO9-_rUCpfAXHYJm~(rTSb4o^6ArWys|j4 z|KzpL?f=40J^F>m*Z=w>&;I59AMUh2KELCC{O(zf#(((3wX?(CrS<5oZ(%Ow#nfbH zGb}_XppcPJKtd5+6AS^|L8mE#j2NKbp?QZ60&EU=^ZHMe*3!*h2DZci{+BEYx!&hi#oyzh^Q00B< z7t_bT^ndj0dgs6bO=r? z9CnUISa5snyds`jKG=fB21U4np0-2zkko*&g z{|yhpxGExaN<#A3$0Ig4lYqpHE>B;&Vt{yYK)8QW5fjhJh-3!Tk)r7`P%_-9^OV}Q z)i-xFXbg-I&tYK3=H;%hPPh#~t;sg27Sb9x&@s47d+)gme0LXpy95}1l*!2xrpI@C zz^FqdtH3P81R4Vj2Xe{{vc(rTU?^Ox8OY*t9n>obvH(DVR0t^F15^Y6;s_B1s4xf& zBIFN92??tQgOC&egcEXrdPj<2fzgsJBv4$ja>*6~G7)Jg3F0iT6i}zmAKdf%eNN8v z>YDp=M|q)ox0y%=4Fc%=0c9Lf6|0UhZg!XneC!5 zIoBr(#EcRkIJUrf|6m0?UiCnGi^?WxtywF>9ibF4oALUm|B(lLh>ynI0_CCEu-VHb z5#7rsBlNeE#Ho}@Q!kI{^8Vs`d5oRTp2*q2K3=^u{S^j z^ga$3ePSd7Vi{;}k-YmdcmE6XmT?6zYl2DcA3cHoiJ6ajj_chewu>p;#mLlWGJM#N z+G;go*k0dny$2H&n^>sa=bZ^)8RpXXat}tp3-Jc0K1`#sg%*EI79RFLn3-Tc5b&m} zu@@Lj5;HTiKz5-wxn3ilOw7Cy;NdfqCud**xpAm$+2lHQl>2-YALn>CFJkt$sc(9%1dzv&&&rKwNV9dC{#tz?LoP5y>ZRFS20M^l& zY_kssB!n^odma(!VH_uXi{k?c$KmmbTd@<#SW%Jj+L$gG#smk%ir3-93yy&RG5}~m zm%mVt0%RD_n34rV!9>IXi4Hc^zNR)gnfrEicIIj0@w;yYxq5k{)ofq<`42w!@lV$N z|9|xd_wKjHra||%>(S-hUpo1FKbTy)N@rV+ zKk?{uhhO{6cmJ)^i?4M~kM6GK+248LzaA^UzkJZ%b^CYb{?UKj{6YTk(eJ|GeCsizSPIW?dfmOG>kh@sbvxD$EKh006EUIH_4Q z_D(Zh8l)qU@iA9ycg}UprHm*dat9>hlSXCb^2^`-`rCiAzH#r{w~Jfj zgG#foZE<|L-1l=uIAwGt+#XvW-hXlK)oU-rn^nItVJjSH^PUpTY#*kasw<7{ENp(nv#Q3MRbe4zzd z+b#OhQu%hF?z2ljLOaqqZMLaNi8kAGSn+(Zr;9Q~p=<|v5KCl`R3_-Wk^@!JJjsXP z7fIqc$wj@Z`k^n1;D>c~s))b>Oq7bIyC5|fi;{sL-!?WK&*OP@aWJhHTh(f(+THu+ zrN4CcihnRKZ}B?2Q4jl-ReS%zx1%Du*_&V3>5@cR6b3-XBB5fT#<5ywpc zA`wRkeJ22c0Yd%&0wX0LRA5-8U`Av@aYg{_wk%K&%4o&Z^DC{Xbe9edzz$AAEni z7mu{hz5lJ%%4d56i-o_OKKOQf_4JcRrq`oqc0N6@J-Xg+T~kMgZ|{n6VuE)@rO z7ds|-e*a*2w08D+vvmEB_xQoDpC9H6ma7L_t8Xrc@lbKR+M9Xj>2Q2nG~&&uxvN?X z3flUY-x&V!?mrP#KKbqZ&%W>v|Nd8x-5h`L*S`DL{xtv8KQ52|>DBN55B<-4XY#YH z@~$tO7muB+3^moz;)$NAfHcSoAj^6o2&CvC0wQ$4z!a_;gU%#1-+${Te)DhH_imBJ zuBRRuNelkZ#^sSZ5kQtbw3ffJHlro(5SjTq^E-bYHX6}8z~WkVzx#WBTnu##6%!CZ zKmZv7i#m{aztz3L1ca4Rb`7|vwfnMMquQ__F!%%)QAA`d6<(e}mm~9LrLB!kkJjVP z_JjPsC)E=#G`Of<99@sXX#3(=CC!~5y}ndzR+`ydS4ot+^;id(N<)jc7N`-%d91!9V44_VvG6W5;wv)7iugemH95|k8_J@ zFIZ`wc%^R=Pn=B-qLKm~3R{KJAyJYN#v&jqU<_)pnC6`N6sF~MbMq0sv$t;TV(H4_ z!}l6b|AXJXIeF_F-}p-_gZV_m$X5a#xzen2@mGHCXTS5wUp)6O{@^s31SOF`060Qb z=!i3dqz*0BVr$C0-Jf>121^kT9!ZU$0f1DQ)U0ac4I+sHT`_F6(_A?TXGBpj<5)oz z6uH^NC!!V_jEGV6mdHJRF#Ef!({0OrQ>MNYvdBsuO^B{hsOr24Cu~SPyMtb%Owln= zE!(<4)$@25k2{nO_Bg0`{PHr}&4*9hsJLpDuMt21ib9a__FkVnYQZixE0mzhnyp?z1 z8}&0cLx1xFALoblk;4Q8l$?^WDCxcfdJrNWXlPo+U=zl9Jq zq6j)sTye*Y_^t)RuOtzOFm+tN>;64|{$igW`n0;?@*EZ0?EB4Nne%nK?|}lXBsK2B z;)Y9Erf&i;Vqlo4)TARY(@1Iku#FTq8h zPNs9jWnz-<2}^@?NMW$-8qrQvzc7(7BCX(R=BZw$WbP&6ONSzc${)2*q8PW7I$TdL z+*>!gGn3!I+_hI3qr(DlzNLo}@GNAkjqM{RfCHrw;~y-TaCkJlLvbbI_cz$}8MNMAjk23^0f(Eu|({f)xZNbReriErulC)ZE&sLVXlf8*o-`Msw*uReQvoXO_mJ0ClBFC4VLGYT`~-Y=~A+H`et zJuRIN%ge=?FJFG)R`Eki`v(s%&UpxV3{_*On72#XC<7PgTpb5yojh{rXqGW2yfBTQ}0L-#Y%g-;~DYtB-$UdC!~Q zZ>vcF1JeTpdX$vV01;;N4)Gm0Xg~@L!bq35k6GF_FMs_fzWr7Ch&WNO`(}13@bCT6 zAEW?4Imzc&=Cct1tZ1S-@r%vIpQiOHWsfo9VsW2RtD~RhvB07Zuw9bZ1NTcbCi6xR z<@i)!AQO{50av=sT#CK&go#&536_3q9I;08F-`H*wWp2e!hQrmHnd!AN`%J zcTbOx8f<9SSImj>jw<&+G%02*LV%6{2s_QYmMW;+Yz#*8#kY4oZp%O`((^DzOUXG~!YYg*7=)Ed!2&UoXoP`E zNsTl#skL=c51bjNuvBsh>Bz!V4FsSYj2AA?9=o$SI@sPZg{6}bLr5xNR1%0(Hb@Et z&~^Kn_N_~GU_CS(*$ya*#x$s`wW*s7qCJd*sHl<0uKA!!T(ird7KfjNW3$xeIS*Z;7+I-d?Rd=$@SF5Kt%Ic)H|eDoO%mQlaE zgjRI)+*mj&YDDnZw%P>I)(PpM38i*AExFY|4i}tYq_)?9Mf_9f4v{C%O`mpOT}scC zuk-R?mt;A#dr_cTO_xZL*+V)U`Rhb1T6c*G#VN)$Vs}B=Zt7!ejoPV?ON;7P* znF$Q!>(kgO4UG9?FoU2FM6w%DYZI!0VOv0yw>JR{S!U5Ryi0A$X<80T24fu9B`58! z-q%K*`yI>L5%utp&u_NP%&Vp8Rw_^x=+SzSeKcH8-V5UvZ^ax9-7C-9r0qJP0&egS z=^24wY^oV;tLjmpn2pSmVRCBDBnqfo&CCZhPtPRXVWkKY$$YRz$*D$rqz_i|(beZM zZ=5nK&5I2&GkeXWT2kpMO!|O|31AqT1LHx8&@A@vgYB#rF#n6XBVp-!1NXZLEm?3g#`c^5zKpd=Ad8*}z!t^9R*Bxd? z0~jA@HQ=!fykp4`eIJDYnK^9x{_z_oeBpwIjNj4Zr(wf_i17ki2-Fj27VgYAoIEzn#fdz@eJ4$Uhn@H(JTDc@UV!wY-4xI<_kJ7Cd{QtkvZ}%!kihB;9 zoV;GW5Eb>=q6f`r@vJ_dqG#6+wT@PQo0m2XF8{^RWJ?&|VDGb6`|lh){HxC&+LC{3 zP}{Xs#N%0Uk&njnv)$|aCtE-K>g8|WyXWoW`8Q9^wf60W=IPJ;V0HID`B#(A{!5(B zdWm8!gIRuL^DmdnUrS^D$j2#wk>%cbR|%g3tWPC#7{#@eGR)g8^CK8VNnqLESL z(!H@gK~`Exa}*$K^Qj}da(rD}i@R6*QN9Q+g?1>O8-MI)uKqpm#m~*${qx@&f6wh< zdp-ondvoccjf=a_s?+6I=ir2V0f;vW)vky`6|BX!avFCP;R*v08D*)VE7n4?Q4yM5 zKB#4n>g{&-q4lX!TPzicaN&&2@!;9!?Vp(c-aM6qH?EHhV$Iw#19k+OlcV9UakY!q14NU;`5 zi&v;oqY*oykYQlZP(C2JGvJunZ!hs@It;BHmZq{dI8joL<8==o?mv9lo5-s?+C*V6 zxm4one0xXrexuSYkh>_`Unf0|MjRB+RFtNjmQ*@33Ir-8WZf6q-8VIBJssgy$Ck6hBAmG;DK3 zLR^K-kRTjcuBp<9kpZrbve2$s#_V;iyW#eFm{D=XB#w=J1jvkgC>R9B=a~0wV-Rw~ z2PmtV_n)ZOD^!4i=*-oTd!{cF)oE72(WHsf^$-8}>yfYT{craEhtIt~8jtQj+n;~0 zzuq|179R3vwbEM^7F{j3MG_j=4(rdHKa&`{dZN6R7^9K$p7_!TsB>beX|MRh#*0!= zYPG9@e39V1)SA&i?A!obo{-0K{LaA`$70;ragTw~Vqo$i zxex~{yS?wU)d^Us28LWcc+rSx4#syT#1yC%X!M#~rHv@%0FGn%Ra@fdsLEmVzCOHw zn~T8sOxj>c7K}_&iV@r;`?F?~JzI@wtFx6!dr$`Jfg;(``g*2r0spcO;&LkmW}0o1 zZDzI}dR9w(EyIfT!F%`aib&I<*2o};PNS?5%d$({xnyfm#slL#AMg-LXrhEn3*PmC zL~VU$nMgb=7%V!WQP$#QXu~b9Af1C)%${O%jWW`xt!+v6EM|6sVupb+Z+pv3U?MRv zk2XnwJi7>kSuiCVX?zuEAq;5*W;q}Ke*UVVWb38cARlfZg*z_=zQmMfo#B+uGr zT)aMCw?$cH&8L&CVY#dOiQkFYX)pGp!!^Ni_DnC)^ zyIak}zj^=XPn>`6uN-~sKVST>EBRd{3Lp?+AroM4{r)b90027J(-EQJMt&mkL8J(~ z=0A5n<96Z$6#-;fg#4-cFP1}D-&2VXNYxtM?W@z@PZ)r4cUuAo0K$^0L`+KWd`!dy z6jh;URZnLFsP#0;*LB_pFs8*qbMFlzPsy$6>cYv~$~YD!Km$()7k1W5X?ZHX9%{ym z^=duQy|g;sh7dT_*-2kM9OhX_)4rwMGGCq_+{v}_qx$Ax=>OU5N3V7r*X|Uw&};^} zV95=RjWAW7I9tn6zSq~!UtIqB?mh49Ey<>6&1OztGB5A{#M_I99$Vt4PR-%8bG}%V z>(wtT&m3-MFZ4G2vbTA(Q>?Z)?8^|fQ`~ZWCRds{p6`s6h5-en*>N%iKoRDPTuEyY zV>!DKMvlPA^@UcF#$zX?KaF4UGp`Mve7!m`yWWQsN+oqFjHiW)&Q=76QUHu(8KQ)s z0syBSEhnp^XKu_a43Z;f{eDK*uFt+cc*dU9f8qY0xpHIv3-2Ahby59gExdQyeDr^G zxk+WGcAxZ{HT1hWQk1c)4lCm zvGhh~1|pWN+nNS%D2Nx4NCq)uE&&k0^1ya9^eloXt*2&yF>MnjQN+5VwtM+TI(Ul- zcl73BW(Fp*6h=%NIU(p^ymMFyeg@O>QLgO%`=@wpUQI4U6cauqu|ydyT^j6$Ni`1E z5toWY2-|{v#pwA6CE&?Me9!VP{J>AV;Sbz@W|Syg>|Uoyl7WDpc|RF*<^hb5ruFRX&EqB29SpUnT2|KoZ7_vhEYxA%WM-#<8E zKRx~E{%Jpxw(tk*zw!J6jI3Ft`&An0vYnJP&0^WSMhh^RJQzIgZEhG0mNY{1%*6~$ zDna4B(=$Qk_J4+Lg+4sZuE|&9k^hqv#xMG$5i_$kkgZuPdtUS6Wq;-mFa9vgPPN-+ zp8Rz&GVx^h9hu3542FdP1FZi-vhzSYXg1k4^bzx97AZz2ps`gZ=i~^2a7H1iV+q0p z9Zh;mHv-!2^Y>qgssx|G?pnpfnRshJnzN3O+?OZJ@6MtApSPayt@}Eht->#zR(|dMtFAxanqKJ}zV~bU(TQi_ z;CS%R&R?shb(=HcDCv>P_@O7=T_x0RWKFBQ*O~8)?~W$-sZfU; zWdLuiJ~N+QGhqTC%RnNitx=rh4z+?a0c4Ciia6a#^Lmz}^5O7a745QprJX(2thBqv z-1b!T#>By3p1rN&=6GY!$0c>J#>L+FV)f?6ZQl&=GOe1BCt*+IYIU&h$|)9+sgslK zp`&^GVEE#Diyvw>$?~8KWw5Bk(Na?ml-<|I^Gzl}9=_Z^cA;t?Tz>hd4nLi{eBsfp zPu{=tQ@{TBKW$o^D{cO_e^LMFu6T8}d;ENz`~75WwByBbrA|Dx;;tS$X@tf?sCqf} zsU~hVG#2uWOa{UdTXT}-phEF57)O}nB5RX{9m{3zgf6yd%&GH z3GJ5c4t+gIljt0)SemXzQWd6bVYsmYt|$~#kceh&(=Kh+`*(-bu;M!seW!zCAHLFvD$+8hcz=X}Z z4-vD#NM@nZCD4Hg6tRr@Y8q{=H}B1EAWV>hl54~R6Jp`C0SJ)_hQ?ktSY_*?%Pj6? zqNNuLMHrJ{&u;IIhAF9(M@c=u8`A2ARdo&s%5@`1nb5B$L4xLd0@Bey((fHYx3AWyuX z3V$Vc1`IGD0ONZUnDnd}ifQPMz6w`T>|&WcC!~B1)=?>S@|iinc=P5CZiV5*$O3X$ zoJ);3DgluEjNkDKG(+Uzk!xFyk%<<#n=IB`d!YDNtjJ(Od9olW%EaR{+v&U8eE>CG zdJ`86pwYuIY|c2uCE=0JToJLF`H{g+uBoWg`^vEy7zxaK=R?UsG;pmxdtI2hA z15_nTX$Q`w)OI`+D|swOK#WlVE%So$n^QWjWOWl*hn5+swc;^ zc%`|&kW1O`Pww6die7&`PIG9cgJxG-v2D6dbzDphrBo@TMj=OO%$lHV4kkNa_*4j5 zGiTRN%eBd_7;c4no5@5vBFn>X^zYl6P;9;IM$$ow43kdFJw}OrbtP`=UPzQ;fp_!_ zw5UOmD9m#r8|N(xSpuEQt&)IttInc40`$vYcnP!@k zgz8;usB4-qqC#;3hyW6lGE_vMsqsV+3(Mfv6MY-!5-1XrV1gYX+ti#|uLMRGYHrFY z-h@c-O=eO(2GbNta9@S$RjjIh zTTdAinngANgO%Ruy+aE&WBumlS{p;porR-lQw{})IDiws<{$U~WnkMz|9F#K0!`dr zh=nKQ@qDvpy|Mk=`r@&99@-?|JG}3|c%J{c{uli%&p+Ao??1QI`{Q@#{-K}7mvtQ>RA>j4 zGSWTSfZbRtRD?`Po@<$VMAI>Dv0og!JyUT7^ER$48dK?(8ztbG8K|Bj>W#y2cn$~z zy#aB-ii!fm2>}inir)nl69RTrrV9upJ%QC2i2?Q;i5QMk=Omd13GhG&HZ)!nLRbJP zXn_P6B*Bm@;7I+X+bz_`{QiuXja@Bi^iDRnj&)j1Cog%I4mN#KM4!$svf4U%wRGw8 zD+3>%oj+DQ-*>B>+w4^u4=JgYHt|4opmChv*|@*B{x^U9FaN?%K6~KcE4xmALXdyLIvbQCL91F{B6}fE!yMpBsInJ4^Jlz@|ejU;rR!S8{3Y@$OH4*#GBPJoo0=*=jPg{e9`QwaW6nnpusGo~WY-h25OY z^V3)7>uzyXUg(beZ1K_E)$3P|Kl1e84}W~{-v^4DFSp-2TKC+jo~vC@lrm_X&}e14 zt1hRSE*h$h{jN<^61=qJ6_;FDRxb_%EeRtQU=zj!tPnHYJezs=Y+22xtwD5|J1FtG z>6UJBwirnyN)UlEki|kJY{Pj$Mih#QC~vR}%5w(Q2%t>RVZS_=JqJtE7h!RN@&$&@ z`nPuvmN%LO=A@F#p8NL3;DN;(57%G)`sgW=5I_V_1U~Qy0*zr-qZVx>P0={yhDmBV zWn#9C5(Bho05Aom$qopHwWYK`sJLH_Gly|W&{C%hy)QG z)d2!C6^F*HjFxN-!^lMA5mg})b!ej&=2RpzBaVRvWWRqF9*2&RhF89N_IQbHI^4Di ztT%0VUSbZG{Rvw)?k7PyP#uM-kpM!GP!Iw`@g17S(HkR0&Ry^~CVZ)T!=H&H453No ziHT>>P}pdo#Yrk*lS#byAL%rc0E!AfuGokS7yuJ2xo z+9A2)AshxZGa(}QHMOIC;ZG)lo0>dC&7erh%+vS>=4}$`3rzW(Z`PQ7?~>+F^LpMPET z-k{ju^(gz~&kx4$?Vz%Ft*U~PaRh@n2mld+1VHGTg?>akOgU(vh8AH6Alm?=camk< z#8UoBmYuL1X(Hwa<@hY^z7bd?Q(T;-{xQG>zx33uz?(dEr6)pyuS6jjrw}m z)^Xub3mmx1l`#p!m|@BYbLOXMNzHvao3_Q)bolM+`cQuQLTtvN401Ekq*;vpoY>sV zt8ihjFDEM@OGBpc9Hvoe=KGtCewmbDNJ-JcF|vvat7>uG=;y+7-EVp4yIn>R-1 zU7Js=j(It;S;1k)x>&C8-!2^=kImoSdTI|XpYApFzr6T6BknbNy~~_n*9rw|)y(i< zTCR$)D8aBq&D5OBbJJ91m#U^-C}T!Zkf@P$SxasV#m0 zHCIZ1%}Qs{;3De3n5^`;GKtY3;!7K6&k(}JXatq51&DSb<*xR2Gj^9^yA2~Gfm38D zBC2XI!GsuyK&+(`QEYhxXHh9zm_dSwysgo4P|Y+4&?!d4d~dpQIg{;avzo@nj8bGx zk32?#NLax`(_9pfHb~ zT?n-s2xnjwRdlpuVyjuCBXM@S)o=)ECFCy8>Kwrbe$LMbc*?7>|BVm)!10cIQg@-kL3=$GSH?|N1sd|L-$nPAc&OU64pBb|noObDXV~@?tZ^h_u+TCfmf4PN85( zzPKlMXA}?O^vFbG?IWC#@A((L2V^5j%nC5C*PeRH49D5rr0dWN$Q9^AI@X++1?u{n zhZHUucaeYwBSMVF5vS~6!eLCgC*0L{pzO3I!rss0UR9_=pk@k^AS74?X(rt%M@Q&WH^q|L`IeQOa zC!{39t~-ff4j9ECh{sS0AwD4>A>umpNf#V|fdC{#5HbwE3px@4p8S~c@Qs;~jS=3H z*PY~rW(^@t!XN?(*ho{XSo1c1mv%P$K|GI{4{?^^ChmQAmHJ>?lu)2`dbag7; z!n}8C_t7htR!eO>x=yEdLs|z6OjfWhEVKkh5lT}c5(*1KM7!)|mlStRSwuqvS23c{ zsuw8hRrATrBd~wqzVxp+|LDW+@ZksPn)h?}R#Gwu_0KlljX{IrQ*u$_n-ikLoHiab{%CjHce~&)G@z+PS zsv)qx8*#|IoRXY$lf!{^4Ad|TJtCx}++q8msktzk+U!*aL&}OWB1foHbrsB&dO3EH zcTQp}n3I29+-joE;(}U!hp+x6-1yyQ}59^mwSDgrrC7 z?TKDh^jm|y-9qh2Wt>=RqeSsi+nNiNTo;95E@`GBC_9j?QZ;pEgar>`VN=+8HSLggwp853RoSjozc@ zh+~+gkO9GJn^0kbVhmw~lVKQIpbw^|7PxTMTZ?9;)=79^bQvyy&Y-dx7CkdY$q5Q- zI`e|S6sjl*pw5w4t&W(KfMnw6sfD4`v_%yrYQV)cnnlf6Mm#{#6Lv#mXq@7F6Y}Kg zqXjzr__oJ{VW=xicTyc&_a3Z=7ONuO0lH&%mlQt#vzx_*Kj$Mqz0e8mIdNDROKxO$XkI-@N+6B3x0 z2`3V_vg~=WzLciV*Y`153566OV=9nEn|DALOi0EX+7W*NZ|8x76OU9LtjxxUL0z&S zVm%{*5dbhVeF;$BCTB1Iz32J%oWDKq1kNR{FYO>w;nKJe)sG9B5Cmr-lpp$Sc__>a z7pmTtdCSSdaeImLNYkbB|U=F_XQ=O56WP7QW;RnKidYra^29+Tal%?;J!xa6Hp9{r${E6~#u=XcKA zGR-e$Tm5)&zB{$uGLwaLEpnAa7jRh_ZXgs;0%dsS2B82~s}#Aw69i~sH>udgVg>@j z^(YZ;UUTmY!|(sM=H<#B{=wo8|NYmX(A+$F^PAf*A0OQQ^RgWSfRVwI!=op1W!sB2 zrG|1B9RmQgRo$7~_@jF7?T*$ol69IgJCX*|7t>fv8M z5biI2r;7Bbn9W>pwW@Do1+Aj1#l4{p3Fl0as>Egq z2BpS;L#^+p`{#f5gMYL8>_UEZaBK5St=KD#>#bBSHG``gQ&|y`Og0R#Q1{nq*J}s0@lIXi+L!sNf=9aIqzd4x&n` zZ4Fn16q494p^SbZN-TGDnK>u|00_|<05C9!wouHF$e|w;rC%7KNE8!No+cV7&|+KDp0k`~a8YRv4=qzBT&8L6bUGX~Ibas+93##!;Q+cs-t3$) zdH{8hh=c-!JO)tHN`rAoSwn1(Q;UpZp{6v4zvG0Yw0|yG z{rJfl8*abmZHsV>5wnG*2ksA7euAY^%!xUBl&PaIs{uP90w6fk0}LE8{W>@N4dPF{ z;XiP}oyVlotUWOZTTPX#`?_}~{l@`9a2Oc_-)ZLVKYIX7Q;6LlyJ%8tClE%O6fwz7 zVJZ;lxc0U;Xt+ad(F&Q?Z{18Aqd9ZTAW7o%{DR-`0e}$r!uK5Y0mz*X%QVVXFJD+E zs_I-PU5Etc9ewN)b8vZaLY(HrG;u$McwqYFSm(0KDJOVjJR+u@HU{NwgkNr^0~KD2 ztTd*CQH*Dq{{Sk?(Z^gCmdTm#>g)RLIgbT3<9un?6S7I(eUya{?pr*h3z`tG1aokA zmlHkEiDVYrt(lih?zFAq#3)=fr6zto>&y%zl`^sxdy@R(0wMq#Zsx_s17TP?3>m)- z1Q7v@=X;>2nn1GU%YTIj&`6HKQiFg8HnO`s@Ml3AH~=66)Dak<002cs8EhDPOAw+Y zQ85<5TH*$c`2o>x>=oqq8>J7{bK6{OjOpEZ+<%~-|JLd5{&)JyYiyrXP7F?7c)vG% z8dbVxEu6`1-fFyh2RCjkZ|u2vP?(PQJnQ-w$=2mc(KUbqcqSnN2xLP*f~$T6PErUw zqKr6bpa$JXIo5ZS8|#SkLJ|0P@5q1iB>?%;Wb~spmYDdgm0LukA5>qv*LzzB07OyG z4Ney7rF_xyL(9{Qa#y7;+T`2SR(<`}=IVSg`G5}1ll*W;B+z5M&gp1DL z>cOPAS?m8EfUKYHW8K5m{lVz`nb)pwmD}FL(OcIpKee!Vw_&JKj1ETDU|deEtP9)y zsUlP;X42rioQkdjArh?-Ruhd(0ErX85oFJbj$M9_-!)@ah2yeT+RKvrMbu5h9&srI zTmzkPtr#taYv^!10^J7pe;!P8vtaGAVyvkhzDLQL;xck zx6(vwO)&s`f`?ga^Rm0 zu5jdBeY~FV*QWnxvS?0(!Em1b06R4T6sm3gk@H9%2g

{-?FA%Oo2!Vy;%2;M3 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

`%34DR&lZa%B@@2_xK&7b4>>?H3y?+ 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

H!c;UqvU`pVk4>wQhbyEk^mENTl7leOEUpuk~ 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 M{~Wvj6}9 literal 132 zcmWN_%MHUI3;@tOQ?Nh-CgziDgTWM}wnT;G(CM4glitPO(fUW$Igha`^=$L;Dr32= zCoQSJ)i^k*3q)^Ojv9@1yUAcz$G8>0Y6fe7tly$eF_aKV-<@M}7O_}lGEB|`Cqzxb PvDw6EKbD{YF$D1kEk!5F From 61daff94ca51658c5a2cbf3c5b5fd886e02f3632 Mon Sep 17 00:00:00 2001 From: Nabla7 Date: Wed, 19 Aug 2026 19:29:25 +0200 Subject: [PATCH 05/57] fix(g1-sonic): full blueprint verified in sim; nav stack restored --- .../g1_sonic_wbc_task/g1_sonic_wbc_task.py | 15 +++- .../tasks/g1_sonic_wbc_task/sonic_pipeline.py | 44 ++++++++++ .../blueprints/basic/unitree_g1_sonic_wbc.py | 85 ++++++++++++++++++- dimos/simulation/engines/mujoco_sim_module.py | 14 +++ 4 files changed, 155 insertions(+), 3 deletions(-) diff --git a/dimos/control/tasks/g1_sonic_wbc_task/g1_sonic_wbc_task.py b/dimos/control/tasks/g1_sonic_wbc_task/g1_sonic_wbc_task.py index 32a04eb17a..b1b8a2f2f1 100644 --- a/dimos/control/tasks/g1_sonic_wbc_task/g1_sonic_wbc_task.py +++ b/dimos/control/tasks/g1_sonic_wbc_task/g1_sonic_wbc_task.py @@ -33,6 +33,7 @@ from dataclasses import dataclass from pathlib import Path import threading +import time from typing import TYPE_CHECKING, Any import numpy as np @@ -305,7 +306,11 @@ def on_preempted(self, by_task: str, joints: frozenset[str]) -> None: # -- command inputs ------------------------------------------------------ - def set_velocity_command(self, vx: float, vy: float, yaw_rate: float, t_now: float) -> None: + def set_velocity_command( + self, vx: float, vy: float, yaw_rate: float, t_now: float | None = None + ) -> None: + if t_now is None: + t_now = time.perf_counter() with self._cmd_lock: self._cmd[:] = [vx, vy, yaw_rate] self._last_cmd_time = t_now @@ -446,6 +451,14 @@ def state_snapshot(self) -> dict[str, Any]: "arming_duration": self._arming_duration, } snap.update(self._pipeline.snapshot()) + snap["debug_q_leg"] = [round(float(v), 4) for v in self._cached_q_29[:6]] + snap["debug_dq_leg"] = [round(float(v), 4) for v in self._cached_dq_29[:6]] + try: + imu = self._adapter.read_imu() + snap["debug_quat"] = [round(float(v), 4) for v in imu.quaternion] + snap["debug_gyro"] = [round(float(v), 4) for v in imu.gyroscope] + except Exception: + pass return snap # -- internal ------------------------------------------------------------ diff --git a/dimos/control/tasks/g1_sonic_wbc_task/sonic_pipeline.py b/dimos/control/tasks/g1_sonic_wbc_task/sonic_pipeline.py index f1a75da995..4ed70b1422 100644 --- a/dimos/control/tasks/g1_sonic_wbc_task/sonic_pipeline.py +++ b/dimos/control/tasks/g1_sonic_wbc_task/sonic_pipeline.py @@ -482,6 +482,8 @@ def __init__( # Latest robot state fed by step() (for planner input building) self._cur_quat = np.array([1, 0, 0, 0], dtype=np.float64) self._cur_q_dds = DEFAULT_ANGLES_DDS.copy() + self._nan_reported = 0 + self._last_targets_dds = DEFAULT_ANGLES_DDS.copy() # -- commands --------------------------------------------------------- @@ -678,6 +680,8 @@ def _apply_planner_result(self, result: list) -> None: num_frames = int(result[1].item()) if num_frames < 2: return + if self._nan_check("planner_qpos", qpos_30hz[:num_frames]): + return new_traj = self._resample_to_50hz(qpos_30hz, num_frames) if self._trajectory is not None and self._trajectory.num_frames > 0: @@ -723,6 +727,19 @@ def _resample_to_50hz(self, qpos_30hz: NDArray, n30: int) -> _Trajectory: # -- step ------------------------------------------------------------- + def _nan_check(self, name: str, arr: NDArray) -> bool: + if np.isnan(arr).any() or np.isinf(arr).any(): + if self._nan_reported < 10: + logger.warning( + "SonicPipeline non-finite tensor", + tensor=name, + step=self._step_count, + sample=np.asarray(arr).ravel()[:8].tolist(), + ) + self._nan_reported += 1 + return True + return False + def step( self, q_dds: NDArray, @@ -733,6 +750,28 @@ def step( ) -> NDArray: """One 50 Hz policy step. Returns 29 position targets, DDS order.""" self._step_count += 1 + + # Input sentries: a non-finite or degenerate input poisons the + # heading math and the planner. Hold the previous targets instead. + bad = ( + self._nan_check("q_dds", np.asarray(q_dds)) + or self._nan_check("dq_dds", np.asarray(dq_dds)) + or self._nan_check("base_quat", np.asarray(base_quat_wxyz)) + or self._nan_check("gyro", np.asarray(gyro_body)) + or self._nan_check("gravity", np.asarray(gravity_body)) + ) + qn = float(np.linalg.norm(np.asarray(base_quat_wxyz, dtype=np.float64))) + if qn < 0.5: + if self._nan_reported < 10: + logger.warning( + "SonicPipeline degenerate base quaternion", + norm=qn, + step=self._step_count, + ) + self._nan_reported += 1 + bad = True + if bad: + return self._last_targets_dds.copy() self._cur_quat = np.asarray(base_quat_wxyz, dtype=np.float64) self._cur_q_dds = np.asarray(q_dds, dtype=np.float32) @@ -800,13 +839,18 @@ def step( obs[674:964] = self._his_action[order].ravel() obs[964:994] = self._his_gravity[order].ravel() + self._nan_check("token", token) + self._nan_check("decoder_obs", obs) out = self._decoder.run(None, {self._decoder_input: obs.reshape(1, -1)}) actions = out[0].squeeze()[:NUM_JOINTS].astype(np.float32) + if self._nan_check("actions", actions): + return self._last_targets_dds.copy() self._last_action = actions.copy() # All 29 decoder actions applied directly - no post-decoder override # (D3; matches C++ CreatePolicyCommand). targets_onnx = DEFAULT_ANGLES_ONNX + actions * ACTION_SCALE_ONNX + self._last_targets_dds = targets_onnx[DDS_TO_ONNX].copy() if self._trajectory is not None: self._traj_frame = min(self._traj_frame + 1, self._trajectory.num_frames - 1) diff --git a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_sonic_wbc.py b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_sonic_wbc.py index 934207514d..477e057680 100644 --- a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_sonic_wbc.py +++ b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_sonic_wbc.py @@ -44,13 +44,47 @@ from dimos.core.stream import Out from dimos.core.transport import LCMTransport from dimos.hardware.whole_body.spec import WholeBodyConfig +from dimos.mapping.costmapper import CostMapper +from dimos.mapping.pointclouds.occupancy import HeightCostConfig from dimos.msgs.geometry_msgs.Twist import Twist from dimos.msgs.sensor_msgs.Imu import Imu from dimos.msgs.sensor_msgs.JointState import JointState from dimos.msgs.sensor_msgs.MotorCommandArray import MotorCommandArray +from dimos.navigation.movement_manager.movement_manager import MovementManager +from dimos.navigation.replanning_a_star.module import ReplanningAStarPlanner +from dimos.robot.unitree.g1.config import G1 from dimos.utils.data import LfsPath from dimos.visualization.vis_module import vis_module +_G1_NAV_VOXEL_RESOLUTION = 0.05 +_G1_REAL_NAV_VOXEL_RESOLUTION = 0.08 +_G1_NAV_OVERHEAD_SAFETY_MARGIN = 0.2 +_G1_NAV_MAX_STEP_HEIGHT = 0.10 +_G1_NAV_ROTATION_DIAMETER = 0.8 +_G1_NAV_SAFE_RADIUS_MARGIN = 0.6 +assert G1.height_clearance is not None and G1.width_clearance is not None +_MUJOCO_LIDAR_CAMERAS = ( + "lidar_front_camera", + "lidar_left_camera", + "lidar_right_camera", +) +_MUJOCO_LIDAR_KWARGS: dict[str, Any] = { + "camera_name": _MUJOCO_LIDAR_CAMERAS[0], + "mujoco_lidar_camera_names": list(_MUJOCO_LIDAR_CAMERAS), + "width": 320, + "height": 240, + "fps": 2, + "enable_color": False, + "enable_depth": False, + "enable_pointcloud": True, + "pointcloud_fps": 1.0, + "enable_mujoco_lidar": True, + "mujoco_lidar_geom_groups": [2, 3], + "mujoco_lidar_raycast_width": 64, + "mujoco_lidar_raycast_height": 32, + "mujoco_lidar_robot_exclusion_radius": G1.width_clearance, +} + # SONIC model files. Default to the local GR00T-WholeBodyControl checkout; # override with SONIC_MODEL_DIR / SONIC_PLANNER_PATH for other machines. _SONIC_RELEASE_DIR = Path( @@ -108,12 +142,15 @@ require_imu=True, ) + from dimos.mapping.voxels.module import VoxelGridMapper + _backend = MujocoSimModule.blueprint( address=_MJCF_PATH, headless=True, dof=_G1_NUM_MOTORS, inject_legacy_assets=True, robot_sim_spec=_g1_sim_spec, + **_MUJOCO_LIDAR_KWARGS, ) _adapter_type = "sim_mujoco_g1" _adapter_address = _MJCF_PATH @@ -123,6 +160,23 @@ _default_ramp_seconds = 0.0 _decimation = 1 _n_workers = 2 + _nav_stack = autoconnect( + VoxelGridMapper.blueprint(emit_every=1), + CostMapper.blueprint( + config=HeightCostConfig( + resolution=_G1_NAV_VOXEL_RESOLUTION, + can_pass_under=G1.height_clearance + _G1_NAV_OVERHEAD_SAFETY_MARGIN, + can_climb=_G1_NAV_MAX_STEP_HEIGHT, + ), + initial_safe_radius_meters=G1.width_clearance + _G1_NAV_SAFE_RADIUS_MARGIN, + ), + ReplanningAStarPlanner.blueprint( + robot_width=G1.width_clearance, + robot_rotation_diameter=_G1_NAV_ROTATION_DIAMETER, + ), + MovementManager.blueprint(), + ) + _nav_remap = [(VoxelGridMapper, "lidar", "pointcloud")] else: from dimos.robot.unitree.g1.wholebody_connection import G1WholeBodyConnection @@ -135,6 +189,33 @@ _default_ramp_seconds = 10.0 _decimation = 2 # 100 Hz tick / 2 = 50 Hz policy _n_workers = 10 + from dimos.hardware.sensors.lidar.pointlio.module import PointLio + from dimos.mapping.ray_tracing.module import RayTracingVoxelMap + + _nav_stack = autoconnect( + PointLio.blueprint(), + RayTracingVoxelMap.blueprint( + voxel_size=_G1_REAL_NAV_VOXEL_RESOLUTION, + emit_every=0, + global_emit_every=4, + max_health=10, + graze_cos=0.85, + ), + CostMapper.blueprint( + config=HeightCostConfig( + resolution=_G1_REAL_NAV_VOXEL_RESOLUTION, + can_pass_under=G1.height_clearance + _G1_NAV_OVERHEAD_SAFETY_MARGIN, + can_climb=_G1_NAV_MAX_STEP_HEIGHT, + ), + initial_safe_radius_meters=G1.width_clearance + _G1_NAV_SAFE_RADIUS_MARGIN, + ), + ReplanningAStarPlanner.blueprint( + robot_width=G1.width_clearance, + robot_rotation_diameter=_G1_NAV_ROTATION_DIAMETER, + ), + MovementManager.blueprint(), + ) + _nav_remap = [] class _G1SonicCoordinator(ControlCoordinator): @@ -185,10 +266,10 @@ class _G1SonicCoordinator(ControlCoordinator): } ) -_remappings = [(_G1SonicCoordinator, "twist_command", "cmd_vel")] +_remappings = [*_nav_remap, (_G1SonicCoordinator, "twist_command", "cmd_vel")] unitree_g1_sonic_wbc = ( - autoconnect(_backend, _coordinator, vis_module(viewer_backend=global_config.viewer)) + autoconnect(_backend, _coordinator, _nav_stack, vis_module(viewer_backend=global_config.viewer)) .remappings(cast("Any", _remappings)) .global_config(robot_model="unitree_g1", n_workers=_n_workers) ) diff --git a/dimos/simulation/engines/mujoco_sim_module.py b/dimos/simulation/engines/mujoco_sim_module.py index 41151f722d..44dc1187b1 100644 --- a/dimos/simulation/engines/mujoco_sim_module.py +++ b/dimos/simulation/engines/mujoco_sim_module.py @@ -698,6 +698,20 @@ def reset(self) -> bool: logger.info("MujocoSimModule: reset requested", applied=applied) return applied + @rpc + def get_root_pose(self) -> list[float] | None: + """Floating-base pose [x, y, z, qw, qx, qy, qz] of the robot root.""" + engine = self._engine + if engine is None: + return None + pose = engine.get_root_pose() + if pose is None: + return None + position, quat_xyzw = pose + x, y, z = (float(v) for v in position) + qx, qy, qz, qw = (float(v) for v in quat_xyzw) + return [x, y, z, qw, qx, qy, qz] + @rpc def respawn_at( self, From 7a192fb008a5e84a05670621d5d3062edfcb2948 Mon Sep 17 00:00:00 2001 From: Nabla7 Date: Wed, 19 Aug 2026 20:31:53 +0200 Subject: [PATCH 06/57] feat(g1-sonic): rerun robot visualization config Groot-style URDF static robot + joint-state overrides, entity key matching zenoh's stripped topic naming (world/g1_joints). Guarded off under DIMOS_TRANSPORT=zenoh: callable factories in rerun_config do not survive zenoh module-deploy serialization (msgpack -> dicts -> validation reject); applies to any blueprint, works under LCM. --- .../blueprints/basic/unitree_g1_sonic_wbc.py | 80 ++++++++++++++++--- 1 file changed, 70 insertions(+), 10 deletions(-) diff --git a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_sonic_wbc.py b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_sonic_wbc.py index 477e057680..e9bf4e1952 100644 --- a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_sonic_wbc.py +++ b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_sonic_wbc.py @@ -53,6 +53,11 @@ from dimos.navigation.movement_manager.movement_manager import MovementManager from dimos.navigation.replanning_a_star.module import ReplanningAStarPlanner from dimos.robot.unitree.g1.config import G1 +from dimos.robot.unitree.g1.g1_rerun import ( + G1_RERUN_ROOT, + g1_urdf_joint_state, + g1_urdf_static_robot, +) from dimos.utils.data import LfsPath from dimos.visualization.vis_module import vis_module @@ -255,21 +260,76 @@ class _G1SonicCoordinator(ControlCoordinator): }, ), ], -).transports( - { - ("joint_command", JointState): LCMTransport("/g1/joint_command", JointState), - ("g1_joints", JointState): LCMTransport("/g1/joints", JointState), - ("cmd_vel", Twist): LCMTransport(_cmd_vel_topic, Twist), - ("motor_states", JointState): LCMTransport("/g1/motor_states", JointState), - ("imu", Imu): LCMTransport("/g1/imu", Imu), - ("motor_command", MotorCommandArray): LCMTransport("/g1/motor_command", MotorCommandArray), - } ) +# Real hardware speaks LCM to G1WholeBodyConnection on fixed topics. In sim, +# leave transports to the runtime default (works under both lcm and zenoh); +# pinning LCMTransport here would silently break under DIMOS_TRANSPORT=zenoh. +if not global_config.simulation: + _coordinator = _coordinator.transports( + { + ("joint_command", JointState): LCMTransport("/g1/joint_command", JointState), + ("g1_joints", JointState): LCMTransport("/g1/joints", JointState), + ("cmd_vel", Twist): LCMTransport(_cmd_vel_topic, Twist), + ("motor_states", JointState): LCMTransport("/g1/motor_states", JointState), + ("imu", Imu): LCMTransport("/g1/imu", Imu), + ("motor_command", MotorCommandArray): LCMTransport( + "/g1/motor_command", MotorCommandArray + ), + } + ) + +_G1_JOINTS_ENTITY = "world/g1_joints" + + +def _g1_sonic_rerun_blueprint(): + import rerun as rr + import rerun.blueprint as rrb + + return rrb.Blueprint( + rrb.Spatial3DView( + origin="world", + name="G1 SONIC WBC", + background=rrb.Background(kind="SolidColor", color=[0, 0, 0]), + line_grid=rrb.LineGrid3D( + plane=rr.components.Plane3D.XY.with_distance(0.0), + ), + ), + rrb.TimePanel(state="collapsed"), + ) + + +_rerun_config: dict[str, Any] = { + "blueprint": _g1_sonic_rerun_blueprint, + "visual_override": { + "world/color_image": None, + "world/camera_info": None, + "world/depth_image": None, + "world/depth_camera_info": None, + _G1_JOINTS_ENTITY: g1_urdf_joint_state(root_path=G1_RERUN_ROOT), + }, + "max_hz": { + _G1_JOINTS_ENTITY: 25.0, + "world/g1/imu": 10.0, + "world/odometry": 15.0, + }, + "static": {G1_RERUN_ROOT: g1_urdf_static_robot(root_path=G1_RERUN_ROOT)}, +} + _remappings = [*_nav_remap, (_G1SonicCoordinator, "twist_command", "cmd_vel")] unitree_g1_sonic_wbc = ( - autoconnect(_backend, _coordinator, _nav_stack, vis_module(viewer_backend=global_config.viewer)) + autoconnect( + _backend, + _coordinator, + _nav_stack, + # rerun_config with callable factories does not survive the zenoh + # deploy path (msgpack turns them into dicts); pass it only under LCM. + vis_module( + viewer_backend=global_config.viewer, + rerun_config=None if global_config.transport == "zenoh" else _rerun_config, + ), + ) .remappings(cast("Any", _remappings)) .global_config(robot_model="unitree_g1", n_workers=_n_workers) ) From c00e11236cb8331b0191da78a4838e48806bc32b Mon Sep 17 00:00:00 2001 From: Nabla7 Date: Wed, 19 Aug 2026 20:58:54 +0200 Subject: [PATCH 07/57] feat(g1-sonic): full ZMQ wire parity (Phase 4) SONIC's native protocol as a first-class task input: wire codec for the 1280-byte packed-header format (round-trip verified against NVIDIA's own builders), command/planner/pose topic routing polled non-blocking from compute(), StreamedMotionMerger ported faithfully (sliding window, catch-up, protocol v1/v2/v3, encode-mode selection), SMPL + wrist encoder fields for mode 2, wire-order 17-DoF upper-body targets with velocities, direct planner commands overriding twist mapping, g1_debug state PUB. E2E verified in sim against the live blueprint driven ONLY by NVIDIA's sender code: planner-mode walk, then protocol-v1 streamed-motion playback of the macarena reference clip - 110 planner + 110 pose messages, zero decode errors, zero tick errors, no falls (base z 0.79 at end). --- .../g1_sonic_wbc_task/g1_sonic_wbc_task.py | 160 +++++++++++ .../tasks/g1_sonic_wbc_task/sonic_pipeline.py | 207 +++++++++++++- .../g1_sonic_wbc_task/streamed_motion.py | 268 ++++++++++++++++++ .../tasks/g1_sonic_wbc_task/zmq_wire.py | 177 ++++++++++++ 4 files changed, 802 insertions(+), 10 deletions(-) create mode 100644 dimos/control/tasks/g1_sonic_wbc_task/streamed_motion.py create mode 100644 dimos/control/tasks/g1_sonic_wbc_task/zmq_wire.py diff --git a/dimos/control/tasks/g1_sonic_wbc_task/g1_sonic_wbc_task.py b/dimos/control/tasks/g1_sonic_wbc_task/g1_sonic_wbc_task.py index b1b8a2f2f1..7365aabfb3 100644 --- a/dimos/control/tasks/g1_sonic_wbc_task/g1_sonic_wbc_task.py +++ b/dimos/control/tasks/g1_sonic_wbc_task/g1_sonic_wbc_task.py @@ -53,6 +53,11 @@ NUM_JOINTS, SonicPipeline, ) +from dimos.control.tasks.g1_sonic_wbc_task.zmq_wire import ( + CommandUpdate, + PlannerUpdate, + decode, +) from dimos.protocol.service.spec import BaseConfig from dimos.utils.logging_config import setup_logger @@ -78,6 +83,9 @@ class G1SonicWBCTaskConfig: priority: int = 50 decimation: int = 1 timeout: float = 1.0 + zmq_enabled: bool = True + zmq_sub_endpoint: str = "tcp://127.0.0.1:5556" + zmq_pub_endpoint: str = "tcp://*:5557" auto_arm: bool = False auto_dry_run: bool = False default_ramp_seconds: float = 10.0 @@ -144,6 +152,18 @@ def __init__( self._cmd = np.zeros(3, dtype=np.float32) self._last_cmd_time = 0.0 + # ZMQ wire compatibility (D2): SONIC's native command/planner/pose + # protocol. Sockets are created lazily on start() and polled + # non-blocking from compute() - the task stays passive (no threads). + self._zmq_sub = None + self._zmq_pub = None + self._zmq_started = False + self._left_hand: NDArray | None = None + self._right_hand: NDArray | None = None + self._last_pose_msg_t = 0.0 + self._last_planner_msg_t = 0.0 + self._zmq_stats = {"command": 0, "planner": 0, "pose": 0, "errors": 0} + # -- ControlTask protocol ---------------------------------------------- def claim(self) -> ResourceClaim: @@ -181,6 +201,9 @@ def compute(self, state: CoordinatorState) -> JointCommandOutput | None: if not self._state_seen and not fresh: return None + self._zmq_start() + self._zmq_poll(state.t_now) + current_29 = self._cached_q_29.copy() if self._arm_pending: @@ -273,6 +296,7 @@ def compute(self, state: CoordinatorState) -> JointCommandOutput | None: gravity_body=gravity, ) self._last_targets = targets_29.tolist() + self._zmq_publish_state(state.t_now, q_29, dq_29, quat, gyro, targets_29) if (state.t_now - self._last_diag_log_t) >= 5.0: logger.info("G1SonicWBCTask", task=self._name, **self._pipeline.snapshot()) @@ -347,6 +371,141 @@ def set_upper_body(self, positions: list[float]) -> bool: def clear_upper_body(self) -> None: self._pipeline.set_upper_body(DEFAULT_ANGLES_DDS[15:].copy()) + # -- ZMQ wire endpoint (D2) ------------------------------------------------ + + def _zmq_start(self) -> None: + if self._zmq_started or not self._config.zmq_enabled: + return + try: + import zmq + + ctx = zmq.Context.instance() + sub = ctx.socket(zmq.SUB) + sub.connect(self._config.zmq_sub_endpoint) + for topic in (b"command", b"planner", b"pose"): + sub.setsockopt(zmq.SUBSCRIBE, topic) + pub = ctx.socket(zmq.PUB) + pub.bind(self._config.zmq_pub_endpoint) + self._zmq_sub = sub + self._zmq_pub = pub + self._zmq_started = True + logger.info( + "G1SonicWBCTask ZMQ endpoint up", + task=self._name, + sub=self._config.zmq_sub_endpoint, + pub=self._config.zmq_pub_endpoint, + ) + except Exception as exc: + logger.warning( + "G1SonicWBCTask ZMQ unavailable", task=self._name, error=repr(exc) + ) + self._zmq_started = False + + def _zmq_poll(self, t_now: float) -> None: + """Drain pending wire messages; called once per compute() tick.""" + if not self._zmq_started or self._zmq_sub is None: + return + import zmq + + cmd = CommandUpdate() + got_cmd = False + for _ in range(64): # bounded drain per tick + try: + raw = self._zmq_sub.recv(flags=zmq.NOBLOCK) + except zmq.Again: + break + except Exception as exc: + self._zmq_stats["errors"] += 1 + logger.warning("ZMQ recv failed", task=self._name, error=repr(exc)) + break + try: + msg = decode(raw) + except Exception as exc: + self._zmq_stats["errors"] += 1 + logger.warning("ZMQ decode failed", task=self._name, error=repr(exc)) + continue + if msg.topic == "command": + cmd.merge(msg) + got_cmd = True + self._zmq_stats["command"] += 1 + elif msg.topic == "planner": + self._on_wire_planner(PlannerUpdate.from_message(msg), t_now) + self._zmq_stats["planner"] += 1 + elif msg.topic == "pose": + summary = self._pipeline.apply_pose_message(msg.fields) + self._last_pose_msg_t = t_now + self._zmq_stats["pose"] += 1 + if "error" in summary: + self._zmq_stats["errors"] += 1 + if got_cmd: + self._on_wire_command(cmd) + + def _on_wire_command(self, cmd: CommandUpdate) -> None: + # C++ semantics: start/stop pulses OR-accumulated; planner flag + # selects planner vs streamed-motion source. + self._pipeline.set_source_stream(not cmd.planner) + if cmd.stop: + self.disarm() + elif cmd.start: + self.arm(0.0) + if cmd.delta_heading is not None: + logger.info( + "ZMQ delta_heading received (not yet applied)", + task=self._name, + delta_heading=cmd.delta_heading, + ) + + def _on_wire_planner(self, upd: PlannerUpdate, t_now: float) -> None: + self._pipeline.set_planner_command( + mode=upd.mode, + movement=upd.movement, + facing=upd.facing, + speed=upd.speed, + height=upd.height, + ) + self._last_planner_msg_t = t_now + self._pipeline.set_upper_body_wire17( + upd.upper_body_position, upd.upper_body_velocity + ) + if upd.left_hand_joints is not None: + self._left_hand = upd.left_hand_joints + if upd.right_hand_joints is not None: + self._right_hand = upd.right_hand_joints + # VR 3-point buffers are encoder fields; deferred to the VR phase. + + def _zmq_publish_state( + self, + t_now: float, + q: NDArray, + dq: NDArray, + quat: NDArray, + gyro: NDArray, + targets: NDArray, + ) -> None: + if not self._zmq_started or self._zmq_pub is None: + return + try: + import msgpack + + payload = msgpack.packb( + { + "timestamp": t_now, + "joint_pos": q.tolist(), + "joint_vel": dq.tolist(), + "base_quat": quat.tolist(), + "base_ang_vel": gyro.tolist(), + "position_targets": targets.tolist(), + **{ + k: v + for k, v in self._pipeline.snapshot().items() + if not k.startswith("debug_") + }, + } + ) + self._zmq_pub.send(b"g1_debug" + payload) + except Exception: + pass + # -- lifecycle ----------------------------------------------------------- def start(self) -> None: @@ -451,6 +610,7 @@ def state_snapshot(self) -> dict[str, Any]: "arming_duration": self._arming_duration, } snap.update(self._pipeline.snapshot()) + snap["zmq"] = dict(self._zmq_stats) snap["debug_q_leg"] = [round(float(v), 4) for v in self._cached_q_29[:6]] snap["debug_dq_leg"] = [round(float(v), 4) for v in self._cached_dq_29[:6]] try: diff --git a/dimos/control/tasks/g1_sonic_wbc_task/sonic_pipeline.py b/dimos/control/tasks/g1_sonic_wbc_task/sonic_pipeline.py index 4ed70b1422..8d9eebf6c5 100644 --- a/dimos/control/tasks/g1_sonic_wbc_task/sonic_pipeline.py +++ b/dimos/control/tasks/g1_sonic_wbc_task/sonic_pipeline.py @@ -38,6 +38,10 @@ from numpy.typing import NDArray import onnxruntime as ort # type: ignore[import-untyped] +from dimos.control.tasks.g1_sonic_wbc_task.streamed_motion import ( + StreamedMotion, + StreamedMotionMerger, +) from dimos.utils.logging_config import setup_logger logger = setup_logger() @@ -273,6 +277,14 @@ DEFAULT_ANGLES_ONNX = DEFAULT_ANGLES_DDS[ONNX_TO_DDS] ACTION_SCALE_ONNX = ACTION_SCALE_DDS[ONNX_TO_DDS] +# 6 wrist joints in ONNX order (wrist_joint_isaaclab_order_in_isaaclab_index) +WRIST_ONNX_INDICES = np.array([23, 24, 25, 26, 27, 28], dtype=np.intp) + +# Encoder observation offsets for the SMPL (mode 2) fields +_SMPL_JOINTS_OFFSET = 922 # smpl_joints_10frame_step1: 720 +_SMPL_ANCHOR_OFFSET = 1642 # smpl_anchor_orientation_10frame_step1: 60 +_WRISTS_OFFSET = 1702 # motion_joint_positions_wrists_10frame_step1: 60 + # 17 upper-body joints (waist + arms) in ONNX-order indices, matching the # C++ upper_body_joint_isaaclab_order_in_isaaclab_index. UPPER_BODY_ONNX_INDICES = np.array( @@ -485,6 +497,19 @@ def __init__( self._nan_reported = 0 self._last_targets_dds = DEFAULT_ANGLES_DDS.copy() + # Streamed reference motion (ZMQ pose topic) + self._merger = StreamedMotionMerger() + self._streamed: StreamedMotion | None = None + self._streamed_frame = 0 + self._use_stream = False + # Direct planner command (ZMQ planner topic); None -> twist-derived + self._planner_cmd: dict | None = None + self._upper_vel_dds: NDArray | None = None + # Wire-order (17: waist + arms) upper-body buffers; take precedence + # over the DDS-14 arm API when set + self._ub17_pos: NDArray | None = None + self._ub17_vel: NDArray | None = None + # -- commands --------------------------------------------------------- def set_velocity(self, vx: float, vy: float, wz: float) -> None: @@ -508,8 +533,74 @@ def set_base_height(self, height: float) -> None: self._needs_replan = True self._height_cmd = float(height) - def set_upper_body(self, targets_dds_14: NDArray) -> None: + def set_upper_body( + self, targets_dds_14: NDArray, velocities_dds_14: NDArray | None = None + ) -> None: self._upper_targets_dds = np.asarray(targets_dds_14, dtype=np.float32).flatten()[:14] + self._upper_vel_dds = ( + None + if velocities_dds_14 is None + else np.asarray(velocities_dds_14, dtype=np.float32).flatten()[:14] + ) + + def set_upper_body_wire17( + self, positions_17: NDArray | None, velocities_17: NDArray | None + ) -> None: + """Upper-body targets in ZMQ wire order (17: waist + arms). None clears.""" + self._ub17_pos = ( + None + if positions_17 is None + else np.asarray(positions_17, dtype=np.float32).reshape(17) + ) + self._ub17_vel = ( + None + if velocities_17 is None + else np.asarray(velocities_17, dtype=np.float32).reshape(17) + ) + + def set_source_stream(self, use_stream: bool) -> None: + """Command-topic planner-flag inverse: True -> pose-topic motion.""" + if use_stream != self._use_stream: + self._needs_replan = not use_stream + self._use_stream = bool(use_stream) + + def set_planner_command( + self, + mode: int, + movement: NDArray, + facing: NDArray, + speed: float = -1.0, + height: float = -1.0, + ) -> None: + """Direct planner command (ZMQ planner topic); overrides twist mapping.""" + self._planner_cmd = { + "mode": int(mode), + "movement": np.asarray(movement, dtype=np.float32).reshape(3), + "facing": np.asarray(facing, dtype=np.float32).reshape(3), + "speed": float(speed), + "height": float(height), + } + self._needs_replan = True + + def clear_planner_command(self) -> None: + self._planner_cmd = None + + def apply_pose_message(self, fields: dict) -> dict: + """Merge one decoded pose-topic chunk; returns a merge summary.""" + res = self._merger.merge(fields, self._streamed_frame) + if res.error: + logger.warning("SonicPipeline pose merge rejected", error=res.error) + return {"error": res.error} + self._streamed = res.motion + if res.did_catchup_reset: + self._streamed_frame = 0 + else: + self._streamed_frame = max(0, self._streamed_frame - res.frame_offset_adjustment) + return { + "frames": res.motion.timesteps if res.motion else 0, + "encode_mode": res.motion.encode_mode if res.motion else -1, + "catchup": res.did_catchup_reset, + } def reset(self) -> None: self._his_ang_vel[:] = 0.0 @@ -532,6 +623,14 @@ def reset(self) -> None: self._planner_future = None self._upper_targets_dds = DEFAULT_ANGLES_DDS[15:].copy() self._mode_override = None + self._merger.reset() + self._streamed = None + self._streamed_frame = 0 + self._use_stream = False + self._planner_cmd = None + self._upper_vel_dds = None + self._ub17_pos = None + self._ub17_vel = None # -- encoder ---------------------------------------------------------- @@ -544,24 +643,39 @@ def _build_standing_token(self) -> NDArray: return out[0].squeeze().astype(np.float32) def _has_upper_body_targets(self) -> bool: + if self._ub17_pos is not None: + return True return not np.allclose(self._upper_targets_dds, DEFAULT_ANGLES_DDS[15:], atol=1e-6) def _upper_body_17_onnx(self) -> NDArray: + if self._ub17_pos is not None: + return self._ub17_pos full = DEFAULT_ANGLES_ONNX.copy() for dds_i in range(15, 29): full[DDS_TO_ONNX[dds_i]] = self._upper_targets_dds[dds_i - 15] return full[UPPER_BODY_ONNX_INDICES] + def _upper_body_vel_17_onnx(self) -> NDArray: + if self._ub17_vel is not None: + return self._ub17_vel + full = np.zeros(NUM_JOINTS, dtype=np.float32) + if self._upper_vel_dds is not None: + for dds_i in range(15, 29): + full[DDS_TO_ONNX[dds_i]] = self._upper_vel_dds[dds_i - 15] + return full[UPPER_BODY_ONNX_INDICES] + def _inject_upper_body(self, enc_obs: NDArray) -> None: - """Encoder-observation injection (D3): positions replaced, velocities - zeroed for the 17 upper-body joints across all 10 frames.""" + """Encoder-observation injection (D3): positions replaced; velocities + replaced with provided upper-body velocities (zero when absent) for + the 17 upper-body joints across all 10 frames.""" upper_vals = self._upper_body_17_onnx() + upper_vels = self._upper_body_vel_17_onnx() for i in range(10): pos = 4 + i * NUM_JOINTS vel = 294 + i * NUM_JOINTS for k, idx in enumerate(UPPER_BODY_ONNX_INDICES): enc_obs[pos + idx] = upper_vals[k] - enc_obs[vel + idx] = 0.0 + enc_obs[vel + idx] = upper_vels[k] def _build_encoder_obs(self, base_quat: NDArray) -> NDArray: enc_obs = np.zeros(ENCODER_OBS_DIM, dtype=np.float32) @@ -617,6 +731,12 @@ def _build_planner_context(self) -> NDArray: return context def _build_planner_inputs(self) -> dict: + if self._planner_cmd is not None: + # ZMQ planner topic: mode/movement/facing given directly + c = self._planner_cmd + return self._planner_inputs_dict( + c["mode"], c["movement"], c["facing"], c["speed"], c["height"] + ) speed = math.hypot(self._vx, self._vy) yaw = _yaw_from_quat(self._cur_quat) cos_h, sin_h = math.cos(yaw), math.sin(yaw) @@ -640,12 +760,22 @@ def _build_planner_inputs(self) -> dict: else: target_vel = -1.0 + return self._planner_inputs_dict(mode, move_dir, face_dir, target_vel, self._height_cmd) + + def _planner_inputs_dict( + self, + mode: int, + move_dir: NDArray, + face_dir: NDArray, + target_vel: float, + height: float, + ) -> dict: return { "context_mujoco_qpos": self._build_planner_context().reshape(1, 4, 36), "target_vel": np.array([target_vel], dtype=np.float32), "mode": np.array([mode], dtype=np.int64), - "movement_direction": move_dir.reshape(1, 3), - "facing_direction": face_dir.reshape(1, 3), + "movement_direction": np.asarray(move_dir, dtype=np.float32).reshape(1, 3), + "facing_direction": np.asarray(face_dir, dtype=np.float32).reshape(1, 3), "random_seed": np.array([42], dtype=np.int64), "has_specific_target": np.zeros((1, 1), dtype=np.int64), "specific_target_positions": np.zeros((1, 4, 3), dtype=np.float32), @@ -653,7 +783,7 @@ def _build_planner_inputs(self) -> dict: "allowed_pred_num_tokens": np.array( [[1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]], dtype=np.int64 ), - "height": np.array([self._height_cmd], dtype=np.float32), + "height": np.array([height], dtype=np.float32), } def _submit_planner(self) -> None: @@ -793,7 +923,7 @@ def step( and mode not in STATIC_MODES and self._replan_timer >= interval ) - if ( + if not self._use_stream and ( self._needs_replan or (self._replan_timer >= interval and moving) or traj_low @@ -804,7 +934,16 @@ def step( self._needs_replan = False # Encoder token - if self._trajectory is not None and self._trajectory.num_frames > 0: + if self._use_stream and self._streamed is not None and self._streamed.timesteps > 0: + if not self._heading_initialized: + init_heading = _calc_heading_quat(self._cur_quat) + init_ref_inv = _calc_heading_quat_inv( + self._streamed.root_quat[0].astype(np.float64) + ) + self._heading_delta_quat = _quat_multiply(init_heading, init_ref_inv) + self._heading_initialized = True + token = self._run_encoder(self._build_streamed_encoder_obs(self._cur_quat)) + elif self._trajectory is not None and self._trajectory.num_frames > 0: token = self._run_encoder(self._build_encoder_obs(self._cur_quat)) elif self._has_upper_body_targets(): enc_obs = np.zeros(ENCODER_OBS_DIM, dtype=np.float32) @@ -852,11 +991,55 @@ def step( targets_onnx = DEFAULT_ANGLES_ONNX + actions * ACTION_SCALE_ONNX self._last_targets_dds = targets_onnx[DDS_TO_ONNX].copy() - if self._trajectory is not None: + if self._use_stream and self._streamed is not None: + self._streamed_frame = min(self._streamed_frame + 1, self._streamed.timesteps - 1) + elif self._trajectory is not None: self._traj_frame = min(self._traj_frame + 1, self._trajectory.num_frames - 1) return targets_onnx[DDS_TO_ONNX] + def _build_streamed_encoder_obs(self, base_quat: NDArray) -> NDArray: + """Encoder obs from the streamed motion (pose topic). + + Mode 0 (protocol v1): joint fields step5, like a planner trajectory. + Mode 2 (v2/v3): SMPL fields step1 + wrist positions step1, matching + the C++ observation registry offsets. + """ + motion = self._streamed + assert motion is not None + enc_obs = np.zeros(ENCODER_OBS_DIM, dtype=np.float32) + enc_obs[0] = float(motion.encode_mode) + f_curr = min(self._streamed_frame, motion.timesteps - 1) + q_base_inv = _quat_conjugate(base_quat) + + if motion.encode_mode == 0: + for i in range(10): + f = min(f_curr + i * 5, motion.timesteps - 1) + enc_obs[4 + i * NUM_JOINTS : 4 + (i + 1) * NUM_JOINTS] = motion.joint_pos[f] + enc_obs[294 + i * NUM_JOINTS : 294 + (i + 1) * NUM_JOINTS] = motion.joint_vel[f] + q_aligned = _quat_multiply( + self._heading_delta_quat, motion.root_quat[f].astype(np.float64) + ) + q_rel = _quat_multiply(q_base_inv, q_aligned) + enc_obs[601 + i * 6 : 601 + (i + 1) * 6] = _rotmat_to_6d(_quat_to_rotmat(q_rel)) + if self._has_upper_body_targets(): + self._inject_upper_body(enc_obs) + else: + assert motion.smpl_joints is not None + for i in range(10): + f = min(f_curr + i, motion.timesteps - 1) + o = _SMPL_JOINTS_OFFSET + i * 72 + enc_obs[o : o + 72] = motion.smpl_joints[f].ravel() + q_aligned = _quat_multiply( + self._heading_delta_quat, motion.root_quat[f].astype(np.float64) + ) + q_rel = _quat_multiply(q_base_inv, q_aligned) + ao = _SMPL_ANCHOR_OFFSET + i * 6 + enc_obs[ao : ao + 6] = _rotmat_to_6d(_quat_to_rotmat(q_rel)) + wo = _WRISTS_OFFSET + i * 6 + enc_obs[wo : wo + 6] = motion.joint_pos[f][WRIST_ONNX_INDICES] + return enc_obs + def _run_encoder(self, enc_obs: NDArray) -> NDArray: out = self._encoder.run(None, {self._encoder_input: enc_obs.reshape(1, -1)}) return out[0].squeeze().astype(np.float32) @@ -875,4 +1058,8 @@ def snapshot(self) -> dict: "traj_frames_total": (self._trajectory.num_frames if self._trajectory else 0), "action_norm": float(np.linalg.norm(self._last_action)), "upper_body_active": self._has_upper_body_targets(), + "stream_active": self._use_stream, + "stream_frames": self._streamed.timesteps if self._streamed else 0, + "stream_frame": self._streamed_frame, + "stream_encode_mode": self._streamed.encode_mode if self._streamed else -1, } diff --git a/dimos/control/tasks/g1_sonic_wbc_task/streamed_motion.py b/dimos/control/tasks/g1_sonic_wbc_task/streamed_motion.py new file mode 100644 index 0000000000..bef2f41da3 --- /dev/null +++ b/dimos/control/tasks/g1_sonic_wbc_task/streamed_motion.py @@ -0,0 +1,268 @@ +# Copyright 2025-2026 Dimensional Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Streamed reference-motion merging, ported from SONIC's C++ reference. + +Faithful port of StreamedMotionMerger (gear_sonic_deploy +.../input_interface/streamed_motion_merger.hpp) and the protocol-version +handling of ZMQEndpointInterface: incoming pose-topic chunks (protocol v1 +joint-based, v2 SMPL, v3 both) merge into a sliding-window motion the +policy encoder consumes. Semantics preserved exactly: + +- frame_step detected from consecutive frame indices +- sliding window anchored to the playback cursor minus HISTORY_FRAMES +- catch-up reset when the gap exceeds MAX_GAP_FRAMES (+history) with + catch_up enabled, when incoming data predates the window, or when it + does not extend it +- old frames re-copied to fill the gap between window start and the + incoming chunk +- protocol -> encoder mode: v1 -> 0 (g1 joints), v2/v3 -> 2 (SMPL) +- a protocol-version change mid-session is an error (caller falls back) +""" + +from __future__ import annotations + +from dataclasses import dataclass, field + +import numpy as np +from numpy.typing import NDArray + +from dimos.utils.logging_config import setup_logger + +logger = setup_logger() + +HISTORY_FRAMES = 5 +MAX_GAP_FRAMES = 200 + +NUM_JOINTS = 29 +NUM_SMPL_JOINTS = 24 +NUM_SMPL_POSES = 21 + + +@dataclass +class StreamedMotion: + """Merged sliding-window motion. Joint data in ONNX/IsaacLab order + (the wire convention of the pose topic).""" + + joint_pos: NDArray # [T, 29] + joint_vel: NDArray # [T, 29] + root_quat: NDArray # [T, 4] (w, x, y, z) - body_quat[:, 0] + smpl_joints: NDArray | None # [T, 24, 3] + smpl_pose: NDArray | None # [T, 21, 3] + encode_mode: int = 0 + timesteps: int = 0 + + +@dataclass +class MergeResult: + motion: StreamedMotion | None = None + window_start: int = 0 + frame_offset_adjustment: int = 0 + did_catchup_reset: bool = False + frame_step: int = 1 + protocol_version: int = 0 + error: str | None = None + + +def infer_protocol_version(fields: dict[str, NDArray]) -> int: + """v3: SMPL + joints; v2: SMPL only; v1: joints only (zmq.md rules).""" + has_smpl = "smpl_joints" in fields and "smpl_pose" in fields + has_joints = "joint_pos" in fields and "joint_vel" in fields + if has_smpl and has_joints: + return 3 + if has_smpl: + return 2 + if has_joints: + return 1 + return 0 + + +class StreamedMotionMerger: + def __init__(self) -> None: + self.reset() + + def reset(self) -> None: + self._motion: StreamedMotion | None = None + self._window_start = 0 + self._active_protocol: int | None = None + + def merge( + self, fields: dict[str, NDArray], current_playback_frame: int + ) -> MergeResult: + """Merge one decoded pose-topic message. ``fields`` are the raw + decoded arrays keyed by wire name.""" + result = MergeResult() + + protocol = infer_protocol_version(fields) + if protocol == 0: + result.error = "pose message has neither joint nor SMPL data" + return result + if self._active_protocol is None: + self._active_protocol = protocol + elif self._active_protocol != protocol: + result.error = ( + f"protocol version changed {self._active_protocol} -> {protocol}" + ) + result.protocol_version = protocol + return result + + frame_indices = fields.get("frame_index") + body_quat = fields.get("body_quat") + if frame_indices is None or body_quat is None: + result.error = "missing frame_index or body_quat" + return result + frame_indices = np.asarray(frame_indices).ravel().astype(np.int64) + num_frames = len(frame_indices) + if num_frames == 0: + result.error = "empty chunk" + return result + + joint_pos = fields.get("joint_pos") + joint_vel = fields.get("joint_vel") + smpl_joints = fields.get("smpl_joints") + smpl_pose = fields.get("smpl_pose") + if protocol in (1, 3) and (joint_pos is None or joint_vel is None): + result.error = f"protocol v{protocol} missing joint data" + return result + if protocol in (2, 3) and (smpl_joints is None or smpl_pose is None): + result.error = f"protocol v{protocol} missing SMPL data" + return result + + catch_up = True + cu = fields.get("catch_up") + if cu is not None: + catch_up = bool(np.asarray(cu).ravel()[0]) + + # frame step + if num_frames >= 2: + step = int(abs(frame_indices[1] - frame_indices[0])) + frame_step = step if step > 0 else 1 + else: + frame_step = 1 + + incoming_start = int(frame_indices[0]) + incoming_end = int(frame_indices[-1]) + + new_window_start, merge_dst, did_catchup = self._sliding_window( + incoming_start, incoming_end, frame_step, current_playback_frame, catch_up + ) + + total = merge_dst + num_frames + new = StreamedMotion( + joint_pos=np.zeros((total, NUM_JOINTS), dtype=np.float32), + joint_vel=np.zeros((total, NUM_JOINTS), dtype=np.float32), + root_quat=np.tile( + np.array([1, 0, 0, 0], dtype=np.float32), (total, 1) + ), + smpl_joints=( + np.zeros((total, NUM_SMPL_JOINTS, 3), dtype=np.float32) + if protocol in (2, 3) + else None + ), + smpl_pose=( + np.zeros((total, NUM_SMPL_POSES, 3), dtype=np.float32) + if protocol in (2, 3) + else None + ), + encode_mode=0 if protocol == 1 else 2, + timesteps=total, + ) + + # copy old frames to fill [new_window_start, incoming_start) + if merge_dst > 0 and self._motion is not None and self._motion.timesteps > 0: + old = self._motion + old_start = self._window_start + old_end = old_start + frame_step * old.timesteps + need_start, need_end = new_window_start, incoming_start + ov_start = max(need_start, old_start) + ov_end = min(need_end, old_end) + if ov_start < ov_end: + src0 = (ov_start - old_start) // frame_step + dst0 = (ov_start - new_window_start) // frame_step + n = (ov_end - ov_start) // frame_step + n = min(n, old.timesteps - src0, total - dst0) + if n > 0: + new.joint_pos[dst0:dst0 + n] = old.joint_pos[src0:src0 + n] + new.joint_vel[dst0:dst0 + n] = old.joint_vel[src0:src0 + n] + new.root_quat[dst0:dst0 + n] = old.root_quat[src0:src0 + n] + if new.smpl_joints is not None and old.smpl_joints is not None: + new.smpl_joints[dst0:dst0 + n] = old.smpl_joints[src0:src0 + n] + new.smpl_pose[dst0:dst0 + n] = old.smpl_pose[src0:src0 + n] + + # copy incoming + if joint_pos is not None: + jp = np.asarray(joint_pos, dtype=np.float32).reshape(num_frames, -1) + new.joint_pos[merge_dst:, : jp.shape[1]] = jp[:, :NUM_JOINTS] + if joint_vel is not None: + jv = np.asarray(joint_vel, dtype=np.float32).reshape(num_frames, -1) + new.joint_vel[merge_dst:, : jv.shape[1]] = jv[:, :NUM_JOINTS] + bq = np.asarray(body_quat, dtype=np.float32).reshape(num_frames, -1, 4) + new.root_quat[merge_dst:] = bq[:, 0, :] + if new.smpl_joints is not None: + new.smpl_joints[merge_dst:] = np.asarray( + smpl_joints, dtype=np.float32 + ).reshape(num_frames, NUM_SMPL_JOINTS, 3) + new.smpl_pose[merge_dst:] = np.asarray( + smpl_pose, dtype=np.float32 + ).reshape(num_frames, NUM_SMPL_POSES, 3) + + old_window_start = self._window_start + window_shift = ( + (new_window_start - old_window_start) // frame_step + if frame_step > 0 + else 0 + ) + + self._motion = new + self._window_start = new_window_start + + result.motion = new + result.window_start = new_window_start + result.frame_offset_adjustment = 0 if did_catchup else window_shift + result.did_catchup_reset = did_catchup + result.frame_step = frame_step + result.protocol_version = protocol + return result + + def _sliding_window( + self, + incoming_start: int, + incoming_end: int, + frame_step: int, + current_playback_frame: int, + catch_up_enabled: bool, + ) -> tuple[int, int, bool]: + # first packet + if self._motion is None or self._motion.timesteps <= 0: + return incoming_start, 0, True + + max_gap = (MAX_GAP_FRAMES + HISTORY_FRAMES) if catch_up_enabled else 2**31 + window_end = self._window_start + frame_step * (self._motion.timesteps - 1) + global_playback = self._window_start + frame_step * max( + 0, current_playback_frame - HISTORY_FRAMES + ) + + # older than window, or does not extend it -> catch-up + if incoming_start <= self._window_start or incoming_end <= window_end: + return incoming_start, 0, True + + tentative_start = min(global_playback, incoming_start) + merge_dst = ( + (incoming_start - tentative_start) // frame_step if frame_step > 0 else 0 + ) + large_gap = incoming_start > window_end + frame_step + + if merge_dst > max_gap or large_gap: + return incoming_start, 0, True + return tentative_start, merge_dst, False diff --git a/dimos/control/tasks/g1_sonic_wbc_task/zmq_wire.py b/dimos/control/tasks/g1_sonic_wbc_task/zmq_wire.py new file mode 100644 index 0000000000..d04a16f831 --- /dev/null +++ b/dimos/control/tasks/g1_sonic_wbc_task/zmq_wire.py @@ -0,0 +1,177 @@ +# Copyright 2025-2026 Dimensional Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""SONIC ZMQ wire codec: decode the GEAR-SONIC packed message format. + +Wire layout (gear_sonic_deploy zmq_packed_message_subscriber.hpp, and the +Python builders in gear_sonic/utils/teleop/zmq/zmq_planner_sender.py): + + [topic_prefix][1280-byte null-padded JSON header][concatenated fields] + +The header declares ``{"v", "endian", "count", "fields": [{name, dtype, +shape}, ...]}``; payload fields are concatenated little-endian arrays in +declaration order. Topics: ``command``, ``planner``, ``pose``. + +This module is the receive side of D2 (feature parity by wire +compatibility): NVIDIA's senders — the pico VR server, planner senders, +recorded traffic — must decode without modification. +""" + +from __future__ import annotations + +from dataclasses import dataclass, field +import json +from typing import Any + +import numpy as np + +HEADER_SIZE = 1280 + +_DTYPES: dict[str, np.dtype] = { + "u8": np.dtype("uint8"), + "i32": np.dtype(" np.ndarray | None: + return self.fields.get(name) + + +def split_topic(raw: bytes) -> tuple[str, bytes]: + """Split the topic prefix off a raw single-part ZMQ message.""" + for topic in KNOWN_TOPICS: + prefix = topic.encode() + if raw.startswith(prefix): + return topic, raw[len(prefix):] + raise ValueError(f"unknown topic prefix: {raw[:16]!r}") + + +def decode(raw: bytes) -> DecodedMessage: + """Decode one packed message (topic prefix included).""" + topic, body = split_topic(raw) + if len(body) < HEADER_SIZE: + raise ValueError( + f"{topic}: body shorter than header ({len(body)} < {HEADER_SIZE})" + ) + header_json = body[:HEADER_SIZE].rstrip(b"\x00") + header: dict[str, Any] = json.loads(header_json) + if header.get("endian", "le") != "le": + raise ValueError(f"{topic}: unsupported endianness {header.get('endian')!r}") + + msg = DecodedMessage( + topic=topic, + version=int(header.get("v", 1)), + count=int(header.get("count", 1)), + ) + payload = body[HEADER_SIZE:] + offset = 0 + for f in header.get("fields", []): + name = f["name"] + dtype = _DTYPES.get(f["dtype"]) + if dtype is None: + raise ValueError(f"{topic}: unknown dtype {f['dtype']!r} for {name!r}") + shape = tuple(int(v) for v in f.get("shape", [1])) + nbytes = int(np.prod(shape)) * dtype.itemsize + if offset + nbytes > len(payload): + raise ValueError( + f"{topic}: payload underrun at field {name!r} " + f"({offset + nbytes} > {len(payload)})" + ) + arr = np.frombuffer(payload, dtype=dtype, count=int(np.prod(shape)), offset=offset) + msg.fields[name] = arr.reshape(shape).copy() + offset += nbytes + return msg + + +@dataclass +class CommandUpdate: + """Accumulated 'command' topic state (C++ OR-accumulates start/stop).""" + + start: bool = False + stop: bool = False + planner: bool = False + delta_heading: float | None = None + + def merge(self, msg: DecodedMessage) -> None: + start = msg.get("start") + stop = msg.get("stop") + planner = msg.get("planner") + dh = msg.get("delta_heading") + if start is not None: + self.start = self.start or bool(start.flat[0]) + if stop is not None: + self.stop = self.stop or bool(stop.flat[0]) + if planner is not None: + self.planner = bool(planner.flat[0]) + if dh is not None: + self.delta_heading = float(dh.flat[0]) + + +@dataclass +class PlannerUpdate: + """One decoded 'planner' topic message.""" + + mode: int = 0 + movement: np.ndarray = field(default_factory=lambda: np.zeros(3)) + facing: np.ndarray = field(default_factory=lambda: np.array([1.0, 0.0, 0.0])) + speed: float = -1.0 + height: float = -1.0 + upper_body_position: np.ndarray | None = None + upper_body_velocity: np.ndarray | None = None + left_hand_joints: np.ndarray | None = None + right_hand_joints: np.ndarray | None = None + vr_position: np.ndarray | None = None + vr_orientation: np.ndarray | None = None + vr_compliance: np.ndarray | None = None + + @classmethod + def from_message(cls, msg: DecodedMessage) -> PlannerUpdate: + u = cls() + mode = msg.get("mode") + if mode is not None: + u.mode = int(mode.flat[0]) + for name in ("movement", "facing"): + arr = msg.get(name) + if arr is not None: + setattr(u, name, arr.astype(np.float64).reshape(3)) + for name in ("speed", "height"): + arr = msg.get(name) + if arr is not None: + setattr(u, name, float(arr.flat[0])) + for name in ( + "upper_body_position", + "upper_body_velocity", + "left_hand_joints", + "right_hand_joints", + "vr_position", + "vr_orientation", + "vr_compliance", + ): + arr = msg.get(name) + if arr is not None: + setattr(u, name, arr.astype(np.float64).ravel()) + return u From e52c5a7042536bf2be59eba39fee14a4f8431c42 Mon Sep 17 00:00:00 2001 From: Nabla7 Date: Wed, 19 Aug 2026 22:17:35 +0200 Subject: [PATCH 08/57] feat(g1-sonic): motion-clip RPCs + models and clips in LFS play_motion_clip/stop_motion_clip/list_motion_clips on the task: reference clips (50 Hz CSVs, IsaacLab joint order) load into a StreamedMotion and run through the exact streamed-motion path the ZMQ pose topic uses, heading re-anchored on start. Verified in the sim blueprint over RPC: macarena (1375 frames) and dance_in_da_party (497) play end to end, no falls, clean return to planner idle after stop. data/sonic ships via LFS (encoder+decoder+774MB planner, observation config, 13 reference clips); blueprint model paths now default to LfsPath("sonic") with SONIC_MODEL_DIR/SONIC_PLANNER_PATH still overriding, so the GR00T-WholeBodyControl checkout is no longer required. Also restores the LFS pointer for reloc_and_nav_to.webp that the first SONIC commit accidentally hydrated (132 B -> 1 MB blob). --- data/.lfs/sonic.tar.gz | 3 + .../tasks/g1_sonic_wbc_task/_registry.py | 3 + .../g1_sonic_wbc_task/g1_sonic_wbc_task.py | 56 ++++++++++++++++-- .../tasks/g1_sonic_wbc_task/sonic_pipeline.py | 23 ++++++- .../g1_sonic_wbc_task/streamed_motion.py | 46 ++++++-------- .../tasks/g1_sonic_wbc_task/zmq_wire.py | 9 +-- .../blueprints/basic/unitree_g1_sonic_wbc.py | 23 +++---- .../navigation/assets/reloc_and_nav_to.webp | Bin 1014488 -> 132 bytes 8 files changed, 104 insertions(+), 59 deletions(-) create mode 100644 data/.lfs/sonic.tar.gz diff --git a/data/.lfs/sonic.tar.gz b/data/.lfs/sonic.tar.gz new file mode 100644 index 0000000000..0bf27d52ec --- /dev/null +++ b/data/.lfs/sonic.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:83c599372d1dd04ffbb98bc2b4f6b7eace9797d58ff9deb007ce693081e84e6c +size 775037968 diff --git a/dimos/control/tasks/g1_sonic_wbc_task/_registry.py b/dimos/control/tasks/g1_sonic_wbc_task/_registry.py index 00aca23f37..4934ea67bc 100644 --- a/dimos/control/tasks/g1_sonic_wbc_task/_registry.py +++ b/dimos/control/tasks/g1_sonic_wbc_task/_registry.py @@ -33,5 +33,8 @@ "set_upper_body", "clear_upper_body", "state_snapshot", + "play_motion_clip", + "stop_motion_clip", + "list_motion_clips", ], } diff --git a/dimos/control/tasks/g1_sonic_wbc_task/g1_sonic_wbc_task.py b/dimos/control/tasks/g1_sonic_wbc_task/g1_sonic_wbc_task.py index 7365aabfb3..871108f5a1 100644 --- a/dimos/control/tasks/g1_sonic_wbc_task/g1_sonic_wbc_task.py +++ b/dimos/control/tasks/g1_sonic_wbc_task/g1_sonic_wbc_task.py @@ -344,6 +344,54 @@ def on_twist_command(self, msg: Twist, t_now: float) -> None: float(msg.linear.x), float(msg.linear.y), float(msg.angular.z), t_now ) + def play_motion_clip(self, name: str) -> dict[str, Any]: + """Play a reference motion clip from the sonic data dir by name. + + Clips are 50 Hz CSVs in SONIC's reference layout (joint_pos.csv, + joint_vel.csv, body_quat.csv - IsaacLab joint order, header row). + """ + import numpy as np + + from dimos.control.tasks.g1_sonic_wbc_task.streamed_motion import StreamedMotion + from dimos.utils.data import get_data + + clip_dir = Path(get_data("sonic")) / "motions" / name + if not clip_dir.is_dir(): + raise FileNotFoundError(f"no such clip: {name} ({clip_dir})") + jp = np.loadtxt(clip_dir / "joint_pos.csv", delimiter=",", dtype=np.float32, skiprows=1) + jv = np.loadtxt(clip_dir / "joint_vel.csv", delimiter=",", dtype=np.float32, skiprows=1) + bq = np.loadtxt(clip_dir / "body_quat.csv", delimiter=",", dtype=np.float32, skiprows=1) + motion = StreamedMotion( + joint_pos=jp, + joint_vel=jv, + root_quat=bq[:, :4], + smpl_joints=None, + smpl_pose=None, + encode_mode=0, + timesteps=len(jp), + ) + self._pipeline.play_clip(motion) + logger.info( + "G1SonicWBCTask playing clip", + task=self._name, + clip=name, + frames=len(jp), + seconds=round(len(jp) / 50.0, 1), + ) + return {"clip": name, "frames": len(jp), "seconds": len(jp) / 50.0} + + def stop_motion_clip(self) -> bool: + self._pipeline.stop_clip() + return True + + def list_motion_clips(self) -> list[str]: + from dimos.utils.data import get_data + + motions = Path(get_data("sonic")) / "motions" + if not motions.is_dir(): + return [] + return sorted(p.name for p in motions.iterdir() if p.is_dir()) + def set_locomotion_mode(self, mode: int | str | None) -> dict[str, Any]: """Force one of the 27 GEAR locomotion modes; None = speed-auto.""" applied = self._pipeline.set_mode(mode) @@ -396,9 +444,7 @@ def _zmq_start(self) -> None: pub=self._config.zmq_pub_endpoint, ) except Exception as exc: - logger.warning( - "G1SonicWBCTask ZMQ unavailable", task=self._name, error=repr(exc) - ) + logger.warning("G1SonicWBCTask ZMQ unavailable", task=self._name, error=repr(exc)) self._zmq_started = False def _zmq_poll(self, t_now: float) -> None: @@ -464,9 +510,7 @@ def _on_wire_planner(self, upd: PlannerUpdate, t_now: float) -> None: height=upd.height, ) self._last_planner_msg_t = t_now - self._pipeline.set_upper_body_wire17( - upd.upper_body_position, upd.upper_body_velocity - ) + self._pipeline.set_upper_body_wire17(upd.upper_body_position, upd.upper_body_velocity) if upd.left_hand_joints is not None: self._left_hand = upd.left_hand_joints if upd.right_hand_joints is not None: diff --git a/dimos/control/tasks/g1_sonic_wbc_task/sonic_pipeline.py b/dimos/control/tasks/g1_sonic_wbc_task/sonic_pipeline.py index 8d9eebf6c5..2fe34a7d31 100644 --- a/dimos/control/tasks/g1_sonic_wbc_task/sonic_pipeline.py +++ b/dimos/control/tasks/g1_sonic_wbc_task/sonic_pipeline.py @@ -548,9 +548,7 @@ def set_upper_body_wire17( ) -> None: """Upper-body targets in ZMQ wire order (17: waist + arms). None clears.""" self._ub17_pos = ( - None - if positions_17 is None - else np.asarray(positions_17, dtype=np.float32).reshape(17) + None if positions_17 is None else np.asarray(positions_17, dtype=np.float32).reshape(17) ) self._ub17_vel = ( None @@ -585,6 +583,25 @@ def set_planner_command( def clear_planner_command(self) -> None: self._planner_cmd = None + def play_clip(self, motion: StreamedMotion) -> None: + """Play a disk reference clip through the streamed-motion path. + + Resets heading alignment so the clip is re-anchored to the robot's + current heading (mirrors the C++ reference-motion switch).""" + self._streamed = motion + self._streamed_frame = 0 + self._use_stream = True + self._heading_delta_quat = np.array([1, 0, 0, 0], dtype=np.float64) + self._heading_initialized = False + + def stop_clip(self) -> None: + """Back to planner-driven locomotion.""" + self._use_stream = False + self._streamed = None + self._streamed_frame = 0 + self._merger.reset() + self._needs_replan = True + def apply_pose_message(self, fields: dict) -> dict: """Merge one decoded pose-topic chunk; returns a merge summary.""" res = self._merger.merge(fields, self._streamed_frame) diff --git a/dimos/control/tasks/g1_sonic_wbc_task/streamed_motion.py b/dimos/control/tasks/g1_sonic_wbc_task/streamed_motion.py index bef2f41da3..5324c79f3c 100644 --- a/dimos/control/tasks/g1_sonic_wbc_task/streamed_motion.py +++ b/dimos/control/tasks/g1_sonic_wbc_task/streamed_motion.py @@ -33,7 +33,7 @@ from __future__ import annotations -from dataclasses import dataclass, field +from dataclasses import dataclass import numpy as np from numpy.typing import NDArray @@ -97,9 +97,7 @@ def reset(self) -> None: self._window_start = 0 self._active_protocol: int | None = None - def merge( - self, fields: dict[str, NDArray], current_playback_frame: int - ) -> MergeResult: + def merge(self, fields: dict[str, NDArray], current_playback_frame: int) -> MergeResult: """Merge one decoded pose-topic message. ``fields`` are the raw decoded arrays keyed by wire name.""" result = MergeResult() @@ -111,9 +109,7 @@ def merge( if self._active_protocol is None: self._active_protocol = protocol elif self._active_protocol != protocol: - result.error = ( - f"protocol version changed {self._active_protocol} -> {protocol}" - ) + result.error = f"protocol version changed {self._active_protocol} -> {protocol}" result.protocol_version = protocol return result @@ -162,9 +158,7 @@ def merge( new = StreamedMotion( joint_pos=np.zeros((total, NUM_JOINTS), dtype=np.float32), joint_vel=np.zeros((total, NUM_JOINTS), dtype=np.float32), - root_quat=np.tile( - np.array([1, 0, 0, 0], dtype=np.float32), (total, 1) - ), + root_quat=np.tile(np.array([1, 0, 0, 0], dtype=np.float32), (total, 1)), smpl_joints=( np.zeros((total, NUM_SMPL_JOINTS, 3), dtype=np.float32) if protocol in (2, 3) @@ -193,12 +187,12 @@ def merge( n = (ov_end - ov_start) // frame_step n = min(n, old.timesteps - src0, total - dst0) if n > 0: - new.joint_pos[dst0:dst0 + n] = old.joint_pos[src0:src0 + n] - new.joint_vel[dst0:dst0 + n] = old.joint_vel[src0:src0 + n] - new.root_quat[dst0:dst0 + n] = old.root_quat[src0:src0 + n] + new.joint_pos[dst0 : dst0 + n] = old.joint_pos[src0 : src0 + n] + new.joint_vel[dst0 : dst0 + n] = old.joint_vel[src0 : src0 + n] + new.root_quat[dst0 : dst0 + n] = old.root_quat[src0 : src0 + n] if new.smpl_joints is not None and old.smpl_joints is not None: - new.smpl_joints[dst0:dst0 + n] = old.smpl_joints[src0:src0 + n] - new.smpl_pose[dst0:dst0 + n] = old.smpl_pose[src0:src0 + n] + new.smpl_joints[dst0 : dst0 + n] = old.smpl_joints[src0 : src0 + n] + new.smpl_pose[dst0 : dst0 + n] = old.smpl_pose[src0 : src0 + n] # copy incoming if joint_pos is not None: @@ -210,19 +204,15 @@ def merge( bq = np.asarray(body_quat, dtype=np.float32).reshape(num_frames, -1, 4) new.root_quat[merge_dst:] = bq[:, 0, :] if new.smpl_joints is not None: - new.smpl_joints[merge_dst:] = np.asarray( - smpl_joints, dtype=np.float32 - ).reshape(num_frames, NUM_SMPL_JOINTS, 3) - new.smpl_pose[merge_dst:] = np.asarray( - smpl_pose, dtype=np.float32 - ).reshape(num_frames, NUM_SMPL_POSES, 3) + new.smpl_joints[merge_dst:] = np.asarray(smpl_joints, dtype=np.float32).reshape( + num_frames, NUM_SMPL_JOINTS, 3 + ) + new.smpl_pose[merge_dst:] = np.asarray(smpl_pose, dtype=np.float32).reshape( + num_frames, NUM_SMPL_POSES, 3 + ) old_window_start = self._window_start - window_shift = ( - (new_window_start - old_window_start) // frame_step - if frame_step > 0 - else 0 - ) + window_shift = (new_window_start - old_window_start) // frame_step if frame_step > 0 else 0 self._motion = new self._window_start = new_window_start @@ -258,9 +248,7 @@ def _sliding_window( return incoming_start, 0, True tentative_start = min(global_playback, incoming_start) - merge_dst = ( - (incoming_start - tentative_start) // frame_step if frame_step > 0 else 0 - ) + merge_dst = (incoming_start - tentative_start) // frame_step if frame_step > 0 else 0 large_gap = incoming_start > window_end + frame_step if merge_dst > max_gap or large_gap: diff --git a/dimos/control/tasks/g1_sonic_wbc_task/zmq_wire.py b/dimos/control/tasks/g1_sonic_wbc_task/zmq_wire.py index d04a16f831..8a2039f7ae 100644 --- a/dimos/control/tasks/g1_sonic_wbc_task/zmq_wire.py +++ b/dimos/control/tasks/g1_sonic_wbc_task/zmq_wire.py @@ -66,7 +66,7 @@ def split_topic(raw: bytes) -> tuple[str, bytes]: for topic in KNOWN_TOPICS: prefix = topic.encode() if raw.startswith(prefix): - return topic, raw[len(prefix):] + return topic, raw[len(prefix) :] raise ValueError(f"unknown topic prefix: {raw[:16]!r}") @@ -74,9 +74,7 @@ def decode(raw: bytes) -> DecodedMessage: """Decode one packed message (topic prefix included).""" topic, body = split_topic(raw) if len(body) < HEADER_SIZE: - raise ValueError( - f"{topic}: body shorter than header ({len(body)} < {HEADER_SIZE})" - ) + raise ValueError(f"{topic}: body shorter than header ({len(body)} < {HEADER_SIZE})") header_json = body[:HEADER_SIZE].rstrip(b"\x00") header: dict[str, Any] = json.loads(header_json) if header.get("endian", "le") != "le": @@ -98,8 +96,7 @@ def decode(raw: bytes) -> DecodedMessage: nbytes = int(np.prod(shape)) * dtype.itemsize if offset + nbytes > len(payload): raise ValueError( - f"{topic}: payload underrun at field {name!r} " - f"({offset + nbytes} > {len(payload)})" + f"{topic}: payload underrun at field {name!r} ({offset + nbytes} > {len(payload)})" ) arr = np.frombuffer(payload, dtype=dtype, count=int(np.prod(shape)), offset=offset) msg.fields[name] = arr.reshape(shape).copy() diff --git a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_sonic_wbc.py b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_sonic_wbc.py index e9bf4e1952..27d67e5e64 100644 --- a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_sonic_wbc.py +++ b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_sonic_wbc.py @@ -90,21 +90,14 @@ "mujoco_lidar_robot_exclusion_radius": G1.width_clearance, } -# SONIC model files. Default to the local GR00T-WholeBodyControl checkout; -# override with SONIC_MODEL_DIR / SONIC_PLANNER_PATH for other machines. -_SONIC_RELEASE_DIR = Path( - os.environ.get( - "SONIC_MODEL_DIR", - Path.home() / "Desktop/GR00T-WholeBodyControl/gear_sonic_deploy/policy/release", - ) -) -_SONIC_PLANNER_PATH = Path( - os.environ.get( - "SONIC_PLANNER_PATH", - Path.home() - / "Desktop/GR00T-WholeBodyControl/gear_sonic_deploy/planner/target_vel/V2/planner_sonic.onnx", - ) -) +# SONIC model files ship in the LFS data archive (data/sonic: encoder, +# decoder, 774 MB planner, reference motion clips). LfsPath pulls lazily on +# first access; SONIC_MODEL_DIR / SONIC_PLANNER_PATH override for machines +# with a gear_sonic_deploy checkout. +_env_model_dir = os.environ.get("SONIC_MODEL_DIR") +_SONIC_RELEASE_DIR = Path(_env_model_dir) if _env_model_dir else LfsPath("sonic") +_env_planner = os.environ.get("SONIC_PLANNER_PATH") +_SONIC_PLANNER_PATH = Path(_env_planner) if _env_planner else LfsPath("sonic/planner_sonic.onnx") _MJCF_PATH = LfsPath("mujoco_sim/g1_gear_wbc.xml") _G1_NUM_MOTORS = len(g1_joints) diff --git a/docs/capabilities/navigation/assets/reloc_and_nav_to.webp b/docs/capabilities/navigation/assets/reloc_and_nav_to.webp index 2619fa901912c4b0a07733ebd7fcac4c07db5d7e..65f9d43f766868f35e05dfe5ebf1ede36ff9836e 100644 GIT binary patch literal 132 zcmWN_%MHUI3;@tOQ?Nh-CgziDgTWM}wnT;G(CM4glitPO(fUW$Igha`^=$L;Dr32= zCoQSJ)i^k*3q)^Ojv9@1yUAcz$G8>0Y6fe7tly$eF_aKV-<@M}7O_}lGEB|`Cqzxb PvDw6EKbD{YF$D1kEk!5F literal 1014488 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%0A-JofB%v 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 z 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

vd+mk11sCvD|q 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

6sj4G>b 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 &FZ%0l5HA_j_n1 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%0AX*RtwS^pUKurNeJy*4WD51nz~&D!W- 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 ngtH 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

{-?FA%Oo2!Vy;%2;M3 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

`%34DR&lZa%B@@2_xK&7b4>>?H3y?+ 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

H!c;UqvU`pVk4>wQhbyEk^mENTl7leOEUpuk~ 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 M{~Wvj6}9 From f454e4f944509be869233451f138b8cdc71163db Mon Sep 17 00:00:00 2001 From: Nabla7 Date: Wed, 19 Aug 2026 23:26:32 +0200 Subject: [PATCH 09/57] =?UTF-8?q?fix(g1-sonic):=20drop=20=5F=5Finit=5F=5F.?= =?UTF-8?q?py=20=E2=80=94=20dimos=20task=20dirs=20are=20namespace=20packag?= =?UTF-8?q?es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dimos/control/tasks/g1_sonic_wbc_task/__init__.py | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 dimos/control/tasks/g1_sonic_wbc_task/__init__.py diff --git a/dimos/control/tasks/g1_sonic_wbc_task/__init__.py b/dimos/control/tasks/g1_sonic_wbc_task/__init__.py deleted file mode 100644 index bc1a2ce5cc..0000000000 --- a/dimos/control/tasks/g1_sonic_wbc_task/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright 2025-2026 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. From 0d6b96b7c0be5a3df8945977d64af4c7b31b3d26 Mon Sep 17 00:00:00 2001 From: Nabla7 Date: Thu, 20 Aug 2026 22:42:30 +0200 Subject: [PATCH 10/57] feat(g1-sonic): VR 3-point teleop (encoder mode 1) End-effector teleop through SONIC's native interface: set_vr_3point RPC and the ZMQ planner-topic vr fields feed root-relative wrist/head poses (9 pos + 12 quat, C++ GatherVR3Point buffered convention - sender applies offsets and root normalization) into encoder obs [901:922]. Teleop mode builds the C++-faithful observation: zeroed buffer, mode scalar, lowerbody joint history from the planner trajectory using the mujoco-order-in-isaaclab index set, single-frame anchor orientation. Stale VR data (>0.5 s) reverts to planner obs; locomotion keeps running underneath. Verified: unit test pins every field offset against policy_parameters.hpp and observation_config.yaml; sim E2E - hands-raised targets streamed at 15 Hz swing the elbows 1.28 rad while base z stays 0.77-0.80, and the arms return to idle after the stream stops. --- .../tasks/g1_sonic_wbc_task/_registry.py | 2 + .../g1_sonic_wbc_task/g1_sonic_wbc_task.py | 34 +++++++- .../tasks/g1_sonic_wbc_task/sonic_pipeline.py | 83 +++++++++++++++++++ 3 files changed, 118 insertions(+), 1 deletion(-) diff --git a/dimos/control/tasks/g1_sonic_wbc_task/_registry.py b/dimos/control/tasks/g1_sonic_wbc_task/_registry.py index 4934ea67bc..22da644eb3 100644 --- a/dimos/control/tasks/g1_sonic_wbc_task/_registry.py +++ b/dimos/control/tasks/g1_sonic_wbc_task/_registry.py @@ -34,6 +34,8 @@ "clear_upper_body", "state_snapshot", "play_motion_clip", + "set_vr_3point", + "clear_vr_3point", "stop_motion_clip", "list_motion_clips", ], diff --git a/dimos/control/tasks/g1_sonic_wbc_task/g1_sonic_wbc_task.py b/dimos/control/tasks/g1_sonic_wbc_task/g1_sonic_wbc_task.py index 871108f5a1..f50022cdcf 100644 --- a/dimos/control/tasks/g1_sonic_wbc_task/g1_sonic_wbc_task.py +++ b/dimos/control/tasks/g1_sonic_wbc_task/g1_sonic_wbc_task.py @@ -380,6 +380,37 @@ def play_motion_clip(self, name: str) -> dict[str, Any]: ) return {"clip": name, "frames": len(jp), "seconds": len(jp) / 50.0} + def set_vr_3point( + self, + positions: list[float], + orientations: list[float], + t_now: float | None = None, + ) -> dict[str, Any]: + """VR 3-point teleop targets (SONIC encoder mode 1). + + positions: 9 floats - [left wrist, right wrist, head] xyz, root-relative + (world minus pelvis, rotated into the pelvis frame). orientations: 12 + floats - the same three points as quat wxyz, root-relative + (quat_inv(root) * q_world). The C++ deploy stack's wrist offsets + [0.18, -/+0.025, 0] and head offset [0, 0, 0.35] must already be + applied by the caller. Targets are encoder HINTS through the policy + latent - expect coordinated whole-body following, not servo-accurate + end-effector tracking. Stale data (> 0.5 s) reverts to planner obs; + re-send at teleop rate. + """ + import numpy as np + + self._pipeline.set_vr_3point( + np.asarray(positions, dtype=np.float32), + np.asarray(orientations, dtype=np.float32), + t_now=t_now, + ) + return {"vr_active": True} + + def clear_vr_3point(self) -> bool: + self._pipeline.clear_vr_3point() + return True + def stop_motion_clip(self) -> bool: self._pipeline.stop_clip() return True @@ -515,7 +546,8 @@ def _on_wire_planner(self, upd: PlannerUpdate, t_now: float) -> None: self._left_hand = upd.left_hand_joints if upd.right_hand_joints is not None: self._right_hand = upd.right_hand_joints - # VR 3-point buffers are encoder fields; deferred to the VR phase. + if upd.vr_position is not None and upd.vr_orientation is not None: + self._pipeline.set_vr_3point(upd.vr_position, upd.vr_orientation, t_now=t_now) def _zmq_publish_state( self, diff --git a/dimos/control/tasks/g1_sonic_wbc_task/sonic_pipeline.py b/dimos/control/tasks/g1_sonic_wbc_task/sonic_pipeline.py index 2fe34a7d31..b416f49e6e 100644 --- a/dimos/control/tasks/g1_sonic_wbc_task/sonic_pipeline.py +++ b/dimos/control/tasks/g1_sonic_wbc_task/sonic_pipeline.py @@ -33,6 +33,7 @@ from concurrent.futures import Future, ThreadPoolExecutor import math from pathlib import Path +import time import numpy as np from numpy.typing import NDArray @@ -281,6 +282,17 @@ WRIST_ONNX_INDICES = np.array([23, 24, 25, 26, 27, 28], dtype=np.intp) # Encoder observation offsets for the SMPL (mode 2) fields +# Teleop (encoder mode 1) fields. Lowerbody gather uses MUJOCO-order indices +# into the IsaacLab-order joint array (policy_parameters.hpp +# lower_body_joint_mujoco_order_in_isaaclab_index) - NOT the sorted variant. +LOWER_BODY_MJC_IN_ONNX = np.array([0, 3, 6, 9, 13, 17, 1, 4, 7, 10, 14, 18], dtype=np.intp) +_ANCHOR_SINGLE_OFFSET = 595 # motion_anchor_orientation: 6 +_LOWERBODY_POS_OFFSET = 661 # motion_joint_positions_lowerbody_10frame_step5: 120 +_LOWERBODY_VEL_OFFSET = 781 # motion_joint_velocities_lowerbody_10frame_step5: 120 +_VR_POS_OFFSET = 901 # vr_3point_local_target: 9 +_VR_ORN_OFFSET = 910 # vr_3point_local_orn_target: 12 +VR_STALE_SEC = 0.5 # hold-last window; stale -> revert to planner obs (mode 0) + _SMPL_JOINTS_OFFSET = 922 # smpl_joints_10frame_step1: 720 _SMPL_ANCHOR_OFFSET = 1642 # smpl_anchor_orientation_10frame_step1: 60 _WRISTS_OFFSET = 1702 # motion_joint_positions_wrists_10frame_step1: 60 @@ -509,6 +521,11 @@ def __init__( # over the DDS-14 arm API when set self._ub17_pos: NDArray | None = None self._ub17_vel: NDArray | None = None + # VR 3-point teleop (encoder mode 1). Root-relative, sender-normalized: + # positions [L wrist, R wrist, head] xyz; orientations 3x quat wxyz. + self._vr_pos: NDArray | None = None + self._vr_orn: NDArray | None = None + self._vr_time = 0.0 # -- commands --------------------------------------------------------- @@ -556,6 +573,32 @@ def set_upper_body_wire17( else np.asarray(velocities_17, dtype=np.float32).reshape(17) ) + def set_vr_3point( + self, positions_9: NDArray, orientations_12: NDArray, t_now: float | None = None + ) -> None: + """VR 3-point teleop targets (encoder mode 1). + + Frame convention (matches C++ GatherVR3Point buffered path - values are + copied into the encoder obs verbatim): point order left wrist, right + wrist, head; positions root-relative (p_world - root_pos rotated into + the root frame); orientations quat wxyz, root-relative + (quat_mul(quat_inv(root_quat), q_world)); wrist offsets + [0.18, -/+0.025, 0] and head offset [0, 0, 0.35] already applied by + the sender. While fresh (< VR_STALE_SEC) the encoder runs in teleop + mode; stale data reverts to planner obs. + """ + self._vr_pos = np.asarray(positions_9, dtype=np.float32).reshape(9) + self._vr_orn = np.asarray(orientations_12, dtype=np.float32).reshape(12) + self._vr_time = time.perf_counter() if t_now is None else t_now + + def clear_vr_3point(self) -> None: + self._vr_pos = None + self._vr_orn = None + self._vr_time = 0.0 + + def _vr_active(self) -> bool: + return self._vr_pos is not None and (time.perf_counter() - self._vr_time) < VR_STALE_SEC + def set_source_stream(self, use_stream: bool) -> None: """Command-topic planner-flag inverse: True -> pose-topic motion.""" if use_stream != self._use_stream: @@ -718,6 +761,40 @@ def _build_encoder_obs(self, base_quat: NDArray) -> NDArray: enc_obs[601 + i * 6 : 601 + (i + 1) * 6] = _rotmat_to_6d(_quat_to_rotmat(q_rel)) return enc_obs + def _build_teleop_encoder_obs(self, base_quat: NDArray) -> NDArray: + """Encoder obs for teleop mode (1): mode scalar, lowerbody joint + pos/vel history from the planner trajectory, single-frame anchor + orientation, VR 3-point blocks. All other fields stay zero - the C++ + gathers ONLY the active mode's required observations into a zeroed + buffer (GatherEncoderObservations).""" + enc_obs = np.zeros(ENCODER_OBS_DIM, dtype=np.float32) + enc_obs[0] = 1.0 # encoder_mode_4: scalar mode id, rest zeros + traj = self._trajectory + assert traj is not None + f_curr = min(self._traj_frame, traj.num_frames - 1) + + for i in range(10): + f = min(f_curr + i * 5, traj.num_frames - 1) + enc_obs[_LOWERBODY_POS_OFFSET + i * 12 : _LOWERBODY_POS_OFFSET + (i + 1) * 12] = ( + traj.joint_pos[f][LOWER_BODY_MJC_IN_ONNX] + ) + enc_obs[_LOWERBODY_VEL_OFFSET + i * 12 : _LOWERBODY_VEL_OFFSET + (i + 1) * 12] = ( + traj.joint_vel[f][LOWER_BODY_MJC_IN_ONNX] + ) + + q_base_inv = _quat_conjugate(base_quat) + q_aligned = _quat_multiply( + self._heading_delta_quat, traj.root_quat[f_curr].astype(np.float64) + ) + q_rel = _quat_multiply(q_base_inv, q_aligned) + enc_obs[_ANCHOR_SINGLE_OFFSET : _ANCHOR_SINGLE_OFFSET + 6] = _rotmat_to_6d( + _quat_to_rotmat(q_rel) + ) + + enc_obs[_VR_POS_OFFSET : _VR_POS_OFFSET + 9] = self._vr_pos + enc_obs[_VR_ORN_OFFSET : _VR_ORN_OFFSET + 12] = self._vr_orn + return enc_obs + # -- planner ---------------------------------------------------------- def _auto_mode(self, speed: float) -> int: @@ -960,6 +1037,8 @@ def step( self._heading_delta_quat = _quat_multiply(init_heading, init_ref_inv) self._heading_initialized = True token = self._run_encoder(self._build_streamed_encoder_obs(self._cur_quat)) + elif self._vr_active() and self._trajectory is not None and self._trajectory.num_frames > 0: + token = self._run_encoder(self._build_teleop_encoder_obs(self._cur_quat)) elif self._trajectory is not None and self._trajectory.num_frames > 0: token = self._run_encoder(self._build_encoder_obs(self._cur_quat)) elif self._has_upper_body_targets(): @@ -1079,4 +1158,8 @@ def snapshot(self) -> dict: "stream_frames": self._streamed.timesteps if self._streamed else 0, "stream_frame": self._streamed_frame, "stream_encode_mode": self._streamed.encode_mode if self._streamed else -1, + "vr_active": self._vr_active(), + "vr_age_sec": ( + round(time.perf_counter() - self._vr_time, 3) if self._vr_pos is not None else -1.0 + ), } From 9b0cb4cf2d0221a0f58453b1eb642eff03c51374 Mon Sep 17 00:00:00 2001 From: Nabla7 Date: Sat, 22 Aug 2026 08:19:56 +0200 Subject: [PATCH 11/57] feat(g1-sonic): SONIC v1.1 checkpoint + PICO SMPL teleop wire parity NVIDIA's SONIC v1.1 (HF nvidia/GEAR-SONIC sonic_v1_1) is now the shipped checkpoint: heading-normalized target orientations + wrist-pose augmentation, the intended model for whole-body teleoperation. The pipeline selects the obs layout by the encoder's input width (1762 original / 1751 v1.1 - root_z dropped, anchor fields reordered, every downstream offset shifted) and switches the anchor-orientation left quat to robot heading only (C++ orientation_mode 1). The original release still runs via SONIC_MODEL_DIR; data/sonic and the LFS archive carry v1.1. Fixes a heading bug v1.1 exposed (latent under the original checkpoint): motion-source switches kept the previous source's heading delta, so post-clip planner trajectories stayed anchored to the clip's mocap heading and the policy turned instead of walking. Heading now re-anchors on every source switch (C++ reinitialize_heading_ semantics). PICO 5-sensor teleop path (full-body SMPL from headset + controllers + foot trackers, pose-topic protocol v3): accept the pico server's body_quat_w field name, consume vr_position/vr_orientation from the pose topic, and apply heading_increment (joystick yaw) into the heading delta. Verified on v1.1 in sim: walk 4.28 m; macarena tracks end to end; VR 3-point elbows 1.34 rad with base z 0.786-0.807; clip->VR->walk regression 4.19 m; pico-faithful SMPL stream (NVIDIA's pack_pose_message, exact field set) runs encoder mode 2 with stable stance and +0.9 rad heading_increment yaws the robot +0.72 rad. Obs layouts for both variants unit-pinned against the C++ registry and both observation_config.yaml files. --- data/.lfs/sonic.tar.gz | 4 +- .../g1_sonic_wbc_task/g1_sonic_wbc_task.py | 14 ++ .../tasks/g1_sonic_wbc_task/sonic_pipeline.py | 209 ++++++++++++++---- .../g1_sonic_wbc_task/streamed_motion.py | 4 + 4 files changed, 187 insertions(+), 44 deletions(-) diff --git a/data/.lfs/sonic.tar.gz b/data/.lfs/sonic.tar.gz index 0bf27d52ec..750370b786 100644 --- a/data/.lfs/sonic.tar.gz +++ b/data/.lfs/sonic.tar.gz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:83c599372d1dd04ffbb98bc2b4f6b7eace9797d58ff9deb007ce693081e84e6c -size 775037968 +oid sha256:6dac154cc5088d643cfbf34a558b510ed5c3cffa19c1c0ca5c6b55cbc88f25dc +size 875876110 diff --git a/dimos/control/tasks/g1_sonic_wbc_task/g1_sonic_wbc_task.py b/dimos/control/tasks/g1_sonic_wbc_task/g1_sonic_wbc_task.py index f50022cdcf..de7a950d6e 100644 --- a/dimos/control/tasks/g1_sonic_wbc_task/g1_sonic_wbc_task.py +++ b/dimos/control/tasks/g1_sonic_wbc_task/g1_sonic_wbc_task.py @@ -514,6 +514,20 @@ def _zmq_poll(self, t_now: float) -> None: self._zmq_stats["pose"] += 1 if "error" in summary: self._zmq_stats["errors"] += 1 + # Pico pose messages also carry VR 3-point targets and the + # operator's joystick yaw (heading_increment) - C++ consumes + # both from this topic as well as the planner topic. + vr_p = msg.get("vr_position") + vr_o = msg.get("vr_orientation") + if vr_p is not None and vr_o is not None: + self._pipeline.set_vr_3point( + vr_p.astype("float64").ravel(), + vr_o.astype("float64").ravel(), + t_now=t_now, + ) + hi = msg.get("heading_increment") + if hi is not None: + self._pipeline.apply_heading_increment(float(hi.flat[0])) if got_cmd: self._on_wire_command(cmd) diff --git a/dimos/control/tasks/g1_sonic_wbc_task/sonic_pipeline.py b/dimos/control/tasks/g1_sonic_wbc_task/sonic_pipeline.py index b416f49e6e..0cab4775b0 100644 --- a/dimos/control/tasks/g1_sonic_wbc_task/sonic_pipeline.py +++ b/dimos/control/tasks/g1_sonic_wbc_task/sonic_pipeline.py @@ -286,16 +286,93 @@ # into the IsaacLab-order joint array (policy_parameters.hpp # lower_body_joint_mujoco_order_in_isaaclab_index) - NOT the sorted variant. LOWER_BODY_MJC_IN_ONNX = np.array([0, 3, 6, 9, 13, 17, 1, 4, 7, 10, 14, 18], dtype=np.intp) -_ANCHOR_SINGLE_OFFSET = 595 # motion_anchor_orientation: 6 -_LOWERBODY_POS_OFFSET = 661 # motion_joint_positions_lowerbody_10frame_step5: 120 -_LOWERBODY_VEL_OFFSET = 781 # motion_joint_velocities_lowerbody_10frame_step5: 120 -_VR_POS_OFFSET = 901 # vr_3point_local_target: 9 -_VR_ORN_OFFSET = 910 # vr_3point_local_orn_target: 12 VR_STALE_SEC = 0.5 # hold-last window; stale -> revert to planner obs (mode 0) -_SMPL_JOINTS_OFFSET = 922 # smpl_joints_10frame_step1: 720 -_SMPL_ANCHOR_OFFSET = 1642 # smpl_anchor_orientation_10frame_step1: 60 -_WRISTS_OFFSET = 1702 # motion_joint_positions_wrists_10frame_step1: 60 + +class _ObsLayout: + """Encoder-obs field offsets per checkpoint variant (observation_config.yaml + order; verified against the C++ observation registry). ``heading_anchor`` + selects the anchor-orientation left quaternion: full base quat (original + release, orientation_mode 0) vs robot heading only (SONIC v1.1, + orientation_mode 1 - the motion_anchor_orientation_heading fields).""" + + __slots__ = ( + "anchor_hist", + "anchor_single", + "heading_anchor", + "lowerbody_pos", + "lowerbody_vel", + "name", + "obs_dim", + "smpl_anchor", + "smpl_joints", + "vr_orn", + "vr_pos", + "wrists", + ) + + def __init__( + self, + name: str, + obs_dim: int, + heading_anchor: bool, + anchor_hist: int, + anchor_single: int, + lowerbody_pos: int, + lowerbody_vel: int, + vr_pos: int, + vr_orn: int, + smpl_joints: int, + smpl_anchor: int, + wrists: int, + ) -> None: + self.name = name + self.obs_dim = obs_dim + self.heading_anchor = heading_anchor + self.anchor_hist = anchor_hist + self.anchor_single = anchor_single + self.lowerbody_pos = lowerbody_pos + self.lowerbody_vel = lowerbody_vel + self.vr_pos = vr_pos + self.vr_orn = vr_orn + self.smpl_joints = smpl_joints + self.smpl_anchor = smpl_anchor + self.wrists = wrists + + +# Original release: 1762 = 4 + 290 + 290 + 10 (root_z hist) + 1 (root_z) + +# 6 (anchor single) + 60 (anchor hist) + 120 + 120 + 9 + 12 + 720 + 60 + 60. +LAYOUT_RELEASE = _ObsLayout( + "release", + 1762, + False, + anchor_hist=601, + anchor_single=595, + lowerbody_pos=661, + lowerbody_vel=781, + vr_pos=901, + vr_orn=910, + smpl_joints=922, + smpl_anchor=1642, + wrists=1702, +) +# SONIC v1.1: 1751 - root_z fields dropped, anchor fields heading-normalized +# and reordered (10-frame history BEFORE the single frame). +LAYOUT_V1_1 = _ObsLayout( + "sonic_v1_1", + 1751, + True, + anchor_hist=584, + anchor_single=644, + lowerbody_pos=650, + lowerbody_vel=770, + vr_pos=890, + vr_orn=899, + smpl_joints=911, + smpl_anchor=1631, + wrists=1691, +) +_LAYOUTS_BY_DIM = {1762: LAYOUT_RELEASE, 1751: LAYOUT_V1_1} # 17 upper-body joints (waist + arms) in ONNX-order indices, matching the # C++ upper_body_joint_isaaclab_order_in_isaaclab_index. @@ -465,8 +542,18 @@ def __init__( self._planner = ort.InferenceSession(str(planner_path), providers=cpu) self._encoder_input = self._encoder.get_inputs()[0].name self._decoder_input = self._decoder.get_inputs()[0].name + # Checkpoint variant is identified by the encoder's input width + enc_dim = int(self._encoder.get_inputs()[0].shape[-1]) + layout = _LAYOUTS_BY_DIM.get(enc_dim) + if layout is None: + raise ValueError( + f"unknown SONIC encoder obs dim {enc_dim}; known: {sorted(_LAYOUTS_BY_DIM)}" + ) + self._layout = layout logger.info( "SonicPipeline models loaded", + variant=layout.name, + encoder_obs_dim=enc_dim, encoder_providers=self._encoder.get_providers(), planner_providers=self._planner.get_providers(), ) @@ -603,8 +690,29 @@ def set_source_stream(self, use_stream: bool) -> None: """Command-topic planner-flag inverse: True -> pose-topic motion.""" if use_stream != self._use_stream: self._needs_replan = not use_stream + # Motion-source switch = heading re-anchor (C++ sets + # reinitialize_heading_ on every motion switch). Without this the + # next source keeps the previous source's heading delta - after a + # clip, planner trajectories would stay anchored to the clip's + # mocap heading and the policy turns instead of tracking. + self._reset_heading_alignment() self._use_stream = bool(use_stream) + def _reset_heading_alignment(self) -> None: + self._heading_delta_quat = np.array([1, 0, 0, 0], dtype=np.float64) + self._heading_initialized = False + + def apply_heading_increment(self, increment_rad: float) -> None: + """Operator yaw adjustment (pose-topic heading_increment field, pico + joystick). C++ accumulates it into HeadingState.delta_heading, applied + left of the ref-alignment quat; folding it into _heading_delta_quat is + equivalent and resets with it on re-anchor.""" + if increment_rad == 0.0: + return + half = 0.5 * float(increment_rad) + yaw_quat = np.array([math.cos(half), 0.0, 0.0, math.sin(half)], dtype=np.float64) + self._heading_delta_quat = _quat_multiply(yaw_quat, self._heading_delta_quat) + def set_planner_command( self, mode: int, @@ -634,16 +742,17 @@ def play_clip(self, motion: StreamedMotion) -> None: self._streamed = motion self._streamed_frame = 0 self._use_stream = True - self._heading_delta_quat = np.array([1, 0, 0, 0], dtype=np.float64) - self._heading_initialized = False + self._reset_heading_alignment() def stop_clip(self) -> None: - """Back to planner-driven locomotion.""" + """Back to planner-driven locomotion (heading re-anchors on the next + planner trajectory - see set_source_stream).""" self._use_stream = False self._streamed = None self._streamed_frame = 0 self._merger.reset() self._needs_replan = True + self._reset_heading_alignment() def apply_pose_message(self, fields: dict) -> dict: """Merge one decoded pose-topic chunk; returns a merge summary.""" @@ -695,13 +804,22 @@ def reset(self) -> None: # -- encoder ---------------------------------------------------------- def _build_standing_token(self) -> NDArray: - enc_obs = np.zeros(ENCODER_OBS_DIM, dtype=np.float32) + lay = self._layout + enc_obs = np.zeros(lay.obs_dim, dtype=np.float32) for i in range(10): enc_obs[4 + i * NUM_JOINTS : 4 + (i + 1) * NUM_JOINTS] = DEFAULT_ANGLES_ONNX - enc_obs[601 + i * 6 : 601 + (i + 1) * 6] = _IDENTITY_6D + enc_obs[lay.anchor_hist + i * 6 : lay.anchor_hist + (i + 1) * 6] = _IDENTITY_6D out = self._encoder.run(None, {self._encoder_input: enc_obs.reshape(1, -1)}) return out[0].squeeze().astype(np.float32) + def _anchor_left_inv(self, base_quat: NDArray) -> NDArray: + """Conjugated left quaternion for anchor-orientation obs: full base + quat for the original release (orientation_mode 0), heading-only for + v1.1 (orientation_mode 1, motion_anchor_orientation_heading).""" + if self._layout.heading_anchor: + return _calc_heading_quat_inv(base_quat) + return _quat_conjugate(base_quat) + def _has_upper_body_targets(self) -> bool: if self._ub17_pos is not None: return True @@ -738,7 +856,8 @@ def _inject_upper_body(self, enc_obs: NDArray) -> None: enc_obs[vel + idx] = upper_vels[k] def _build_encoder_obs(self, base_quat: NDArray) -> NDArray: - enc_obs = np.zeros(ENCODER_OBS_DIM, dtype=np.float32) + lay = self._layout + enc_obs = np.zeros(lay.obs_dim, dtype=np.float32) traj = self._trajectory assert traj is not None f_curr = min(self._traj_frame, traj.num_frames - 1) @@ -751,14 +870,16 @@ def _build_encoder_obs(self, base_quat: NDArray) -> NDArray: if self._has_upper_body_targets(): self._inject_upper_body(enc_obs) - q_base_inv = _quat_conjugate(base_quat) + q_left_inv = self._anchor_left_inv(base_quat) for i in range(10): f = min(f_curr + i * 5, traj.num_frames - 1) q_aligned = _quat_multiply( self._heading_delta_quat, traj.root_quat[f].astype(np.float64) ) - q_rel = _quat_multiply(q_base_inv, q_aligned) - enc_obs[601 + i * 6 : 601 + (i + 1) * 6] = _rotmat_to_6d(_quat_to_rotmat(q_rel)) + q_rel = _quat_multiply(q_left_inv, q_aligned) + enc_obs[lay.anchor_hist + i * 6 : lay.anchor_hist + (i + 1) * 6] = _rotmat_to_6d( + _quat_to_rotmat(q_rel) + ) return enc_obs def _build_teleop_encoder_obs(self, base_quat: NDArray) -> NDArray: @@ -767,7 +888,8 @@ def _build_teleop_encoder_obs(self, base_quat: NDArray) -> NDArray: orientation, VR 3-point blocks. All other fields stay zero - the C++ gathers ONLY the active mode's required observations into a zeroed buffer (GatherEncoderObservations).""" - enc_obs = np.zeros(ENCODER_OBS_DIM, dtype=np.float32) + lay = self._layout + enc_obs = np.zeros(lay.obs_dim, dtype=np.float32) enc_obs[0] = 1.0 # encoder_mode_4: scalar mode id, rest zeros traj = self._trajectory assert traj is not None @@ -775,24 +897,22 @@ def _build_teleop_encoder_obs(self, base_quat: NDArray) -> NDArray: for i in range(10): f = min(f_curr + i * 5, traj.num_frames - 1) - enc_obs[_LOWERBODY_POS_OFFSET + i * 12 : _LOWERBODY_POS_OFFSET + (i + 1) * 12] = ( - traj.joint_pos[f][LOWER_BODY_MJC_IN_ONNX] - ) - enc_obs[_LOWERBODY_VEL_OFFSET + i * 12 : _LOWERBODY_VEL_OFFSET + (i + 1) * 12] = ( - traj.joint_vel[f][LOWER_BODY_MJC_IN_ONNX] - ) - - q_base_inv = _quat_conjugate(base_quat) + enc_obs[lay.lowerbody_pos + i * 12 : lay.lowerbody_pos + (i + 1) * 12] = traj.joint_pos[ + f + ][LOWER_BODY_MJC_IN_ONNX] + enc_obs[lay.lowerbody_vel + i * 12 : lay.lowerbody_vel + (i + 1) * 12] = traj.joint_vel[ + f + ][LOWER_BODY_MJC_IN_ONNX] + + q_left_inv = self._anchor_left_inv(base_quat) q_aligned = _quat_multiply( self._heading_delta_quat, traj.root_quat[f_curr].astype(np.float64) ) - q_rel = _quat_multiply(q_base_inv, q_aligned) - enc_obs[_ANCHOR_SINGLE_OFFSET : _ANCHOR_SINGLE_OFFSET + 6] = _rotmat_to_6d( - _quat_to_rotmat(q_rel) - ) + q_rel = _quat_multiply(q_left_inv, q_aligned) + enc_obs[lay.anchor_single : lay.anchor_single + 6] = _rotmat_to_6d(_quat_to_rotmat(q_rel)) - enc_obs[_VR_POS_OFFSET : _VR_POS_OFFSET + 9] = self._vr_pos - enc_obs[_VR_ORN_OFFSET : _VR_ORN_OFFSET + 12] = self._vr_orn + enc_obs[lay.vr_pos : lay.vr_pos + 9] = self._vr_pos + enc_obs[lay.vr_orn : lay.vr_orn + 12] = self._vr_orn return enc_obs # -- planner ---------------------------------------------------------- @@ -1042,10 +1162,11 @@ def step( elif self._trajectory is not None and self._trajectory.num_frames > 0: token = self._run_encoder(self._build_encoder_obs(self._cur_quat)) elif self._has_upper_body_targets(): - enc_obs = np.zeros(ENCODER_OBS_DIM, dtype=np.float32) + lay = self._layout + enc_obs = np.zeros(lay.obs_dim, dtype=np.float32) for i in range(10): enc_obs[4 + i * NUM_JOINTS : 4 + (i + 1) * NUM_JOINTS] = DEFAULT_ANGLES_ONNX - enc_obs[601 + i * 6 : 601 + (i + 1) * 6] = _IDENTITY_6D + enc_obs[lay.anchor_hist + i * 6 : lay.anchor_hist + (i + 1) * 6] = _IDENTITY_6D self._inject_upper_body(enc_obs) token = self._run_encoder(enc_obs) else: @@ -1103,10 +1224,11 @@ def _build_streamed_encoder_obs(self, base_quat: NDArray) -> NDArray: """ motion = self._streamed assert motion is not None - enc_obs = np.zeros(ENCODER_OBS_DIM, dtype=np.float32) + lay = self._layout + enc_obs = np.zeros(lay.obs_dim, dtype=np.float32) enc_obs[0] = float(motion.encode_mode) f_curr = min(self._streamed_frame, motion.timesteps - 1) - q_base_inv = _quat_conjugate(base_quat) + q_left_inv = self._anchor_left_inv(base_quat) if motion.encode_mode == 0: for i in range(10): @@ -1116,23 +1238,25 @@ def _build_streamed_encoder_obs(self, base_quat: NDArray) -> NDArray: q_aligned = _quat_multiply( self._heading_delta_quat, motion.root_quat[f].astype(np.float64) ) - q_rel = _quat_multiply(q_base_inv, q_aligned) - enc_obs[601 + i * 6 : 601 + (i + 1) * 6] = _rotmat_to_6d(_quat_to_rotmat(q_rel)) + q_rel = _quat_multiply(q_left_inv, q_aligned) + enc_obs[lay.anchor_hist + i * 6 : lay.anchor_hist + (i + 1) * 6] = _rotmat_to_6d( + _quat_to_rotmat(q_rel) + ) if self._has_upper_body_targets(): self._inject_upper_body(enc_obs) else: assert motion.smpl_joints is not None for i in range(10): f = min(f_curr + i, motion.timesteps - 1) - o = _SMPL_JOINTS_OFFSET + i * 72 + o = lay.smpl_joints + i * 72 enc_obs[o : o + 72] = motion.smpl_joints[f].ravel() q_aligned = _quat_multiply( self._heading_delta_quat, motion.root_quat[f].astype(np.float64) ) - q_rel = _quat_multiply(q_base_inv, q_aligned) - ao = _SMPL_ANCHOR_OFFSET + i * 6 + q_rel = _quat_multiply(q_left_inv, q_aligned) + ao = lay.smpl_anchor + i * 6 enc_obs[ao : ao + 6] = _rotmat_to_6d(_quat_to_rotmat(q_rel)) - wo = _WRISTS_OFFSET + i * 6 + wo = lay.wrists + i * 6 enc_obs[wo : wo + 6] = motion.joint_pos[f][WRIST_ONNX_INDICES] return enc_obs @@ -1154,6 +1278,7 @@ def snapshot(self) -> dict: "traj_frames_total": (self._trajectory.num_frames if self._trajectory else 0), "action_norm": float(np.linalg.norm(self._last_action)), "upper_body_active": self._has_upper_body_targets(), + "checkpoint_variant": self._layout.name, "stream_active": self._use_stream, "stream_frames": self._streamed.timesteps if self._streamed else 0, "stream_frame": self._streamed_frame, diff --git a/dimos/control/tasks/g1_sonic_wbc_task/streamed_motion.py b/dimos/control/tasks/g1_sonic_wbc_task/streamed_motion.py index 5324c79f3c..6186bdf09b 100644 --- a/dimos/control/tasks/g1_sonic_wbc_task/streamed_motion.py +++ b/dimos/control/tasks/g1_sonic_wbc_task/streamed_motion.py @@ -114,7 +114,11 @@ def merge(self, fields: dict[str, NDArray], current_playback_frame: int) -> Merg return result frame_indices = fields.get("frame_index") + # The pico teleop server names this field body_quat_w; the reference + # senders use body_quat. The C++ accepts both. body_quat = fields.get("body_quat") + if body_quat is None: + body_quat = fields.get("body_quat_w") if frame_indices is None or body_quat is None: result.error = "missing frame_index or body_quat" return result From 87f35131e1ac03f47081a7e5b3a94522d1222a26 Mon Sep 17 00:00:00 2001 From: Nabla7 Date: Sat, 22 Aug 2026 08:52:21 +0200 Subject: [PATCH 12/57] refactor(g1-sonic): single-checkpoint build - v1.1 only Drop the checkpoint-variant layout table: we ship exactly one policy (SONIC v1.1 in the LFS archive), so the obs layout is flat module constants again and the anchor math is unconditionally heading-normalized. A checkpoint with a different encoder width now fails at load with a clear error instead of being silently supported. Smoke on the stripped build: clip -> walk 4.21 m, base z 0.788. --- .../tasks/g1_sonic_wbc_task/sonic_pipeline.py | 190 +++++------------- 1 file changed, 55 insertions(+), 135 deletions(-) diff --git a/dimos/control/tasks/g1_sonic_wbc_task/sonic_pipeline.py b/dimos/control/tasks/g1_sonic_wbc_task/sonic_pipeline.py index 0cab4775b0..fcede3adad 100644 --- a/dimos/control/tasks/g1_sonic_wbc_task/sonic_pipeline.py +++ b/dimos/control/tasks/g1_sonic_wbc_task/sonic_pipeline.py @@ -289,91 +289,6 @@ VR_STALE_SEC = 0.5 # hold-last window; stale -> revert to planner obs (mode 0) -class _ObsLayout: - """Encoder-obs field offsets per checkpoint variant (observation_config.yaml - order; verified against the C++ observation registry). ``heading_anchor`` - selects the anchor-orientation left quaternion: full base quat (original - release, orientation_mode 0) vs robot heading only (SONIC v1.1, - orientation_mode 1 - the motion_anchor_orientation_heading fields).""" - - __slots__ = ( - "anchor_hist", - "anchor_single", - "heading_anchor", - "lowerbody_pos", - "lowerbody_vel", - "name", - "obs_dim", - "smpl_anchor", - "smpl_joints", - "vr_orn", - "vr_pos", - "wrists", - ) - - def __init__( - self, - name: str, - obs_dim: int, - heading_anchor: bool, - anchor_hist: int, - anchor_single: int, - lowerbody_pos: int, - lowerbody_vel: int, - vr_pos: int, - vr_orn: int, - smpl_joints: int, - smpl_anchor: int, - wrists: int, - ) -> None: - self.name = name - self.obs_dim = obs_dim - self.heading_anchor = heading_anchor - self.anchor_hist = anchor_hist - self.anchor_single = anchor_single - self.lowerbody_pos = lowerbody_pos - self.lowerbody_vel = lowerbody_vel - self.vr_pos = vr_pos - self.vr_orn = vr_orn - self.smpl_joints = smpl_joints - self.smpl_anchor = smpl_anchor - self.wrists = wrists - - -# Original release: 1762 = 4 + 290 + 290 + 10 (root_z hist) + 1 (root_z) + -# 6 (anchor single) + 60 (anchor hist) + 120 + 120 + 9 + 12 + 720 + 60 + 60. -LAYOUT_RELEASE = _ObsLayout( - "release", - 1762, - False, - anchor_hist=601, - anchor_single=595, - lowerbody_pos=661, - lowerbody_vel=781, - vr_pos=901, - vr_orn=910, - smpl_joints=922, - smpl_anchor=1642, - wrists=1702, -) -# SONIC v1.1: 1751 - root_z fields dropped, anchor fields heading-normalized -# and reordered (10-frame history BEFORE the single frame). -LAYOUT_V1_1 = _ObsLayout( - "sonic_v1_1", - 1751, - True, - anchor_hist=584, - anchor_single=644, - lowerbody_pos=650, - lowerbody_vel=770, - vr_pos=890, - vr_orn=899, - smpl_joints=911, - smpl_anchor=1631, - wrists=1691, -) -_LAYOUTS_BY_DIM = {1762: LAYOUT_RELEASE, 1751: LAYOUT_V1_1} - # 17 upper-body joints (waist + arms) in ONNX-order indices, matching the # C++ upper_body_joint_isaaclab_order_in_isaaclab_index. UPPER_BODY_ONNX_INDICES = np.array( @@ -382,14 +297,29 @@ def __init__( ) # --------------------------------------------------------------------------- -# Observation dimensions (observation_config.yaml; offsets verified against -# the C++ observation registry) +# Encoder observation layout - SONIC v1.1 (sonic_v1_1/observation_config.yaml; +# offsets verified against the C++ observation registry). 1751 = 4 (mode) + +# 290 (joint pos) + 290 (joint vel) + 60 (anchor hist) + 6 (anchor single) + +# 120 (lowerbody pos) + 120 (lowerbody vel) + 9 (vr pos) + 12 (vr orn) + +# 720 (smpl joints) + 60 (smpl anchor) + 60 (wrists). Anchor orientations +# are heading-normalized (C++ orientation_mode 1 - left quat is the robot's +# heading, not the full base quat). # --------------------------------------------------------------------------- -ENCODER_OBS_DIM = 1762 +ENCODER_OBS_DIM = 1751 ENCODER_TOKEN_DIM = 64 DECODER_OBS_DIM = 994 +ANCHOR_HIST_OFFSET = 584 # motion_anchor_orientation_heading_10frame_step5: 60 +ANCHOR_SINGLE_OFFSET = 644 # motion_anchor_orientation_heading: 6 +LOWERBODY_POS_OFFSET = 650 # motion_joint_positions_lowerbody_10frame_step5: 120 +LOWERBODY_VEL_OFFSET = 770 # motion_joint_velocities_lowerbody_10frame_step5: 120 +VR_POS_OFFSET = 890 # vr_3point_local_target: 9 +VR_ORN_OFFSET = 899 # vr_3point_local_orn_target: 12 +SMPL_JOINTS_OFFSET = 911 # smpl_joints_10frame_step1: 720 +SMPL_ANCHOR_OFFSET = 1631 # smpl_anchor_orientation_heading_10frame_step1: 60 +WRISTS_OFFSET = 1691 # motion_joint_positions_wrists_10frame_step1: 60 + DEFAULT_HEIGHT = 0.788740 POLICY_DT = 0.02 REPLAN_INTERVAL_DEFAULT = 1.0 @@ -542,18 +472,17 @@ def __init__( self._planner = ort.InferenceSession(str(planner_path), providers=cpu) self._encoder_input = self._encoder.get_inputs()[0].name self._decoder_input = self._decoder.get_inputs()[0].name - # Checkpoint variant is identified by the encoder's input width + # Fail loudly on a mismatched checkpoint (e.g. the pre-v1.1 release, + # whose encoder takes 1762 floats and a different field layout). enc_dim = int(self._encoder.get_inputs()[0].shape[-1]) - layout = _LAYOUTS_BY_DIM.get(enc_dim) - if layout is None: + if enc_dim != ENCODER_OBS_DIM: raise ValueError( - f"unknown SONIC encoder obs dim {enc_dim}; known: {sorted(_LAYOUTS_BY_DIM)}" + f"SONIC encoder obs dim {enc_dim} != {ENCODER_OBS_DIM}; this build " + "supports only the SONIC v1.1 checkpoint (HF nvidia/GEAR-SONIC " + "sonic_v1_1/)" ) - self._layout = layout logger.info( "SonicPipeline models loaded", - variant=layout.name, - encoder_obs_dim=enc_dim, encoder_providers=self._encoder.get_providers(), planner_providers=self._planner.get_providers(), ) @@ -804,22 +733,13 @@ def reset(self) -> None: # -- encoder ---------------------------------------------------------- def _build_standing_token(self) -> NDArray: - lay = self._layout - enc_obs = np.zeros(lay.obs_dim, dtype=np.float32) + enc_obs = np.zeros(ENCODER_OBS_DIM, dtype=np.float32) for i in range(10): enc_obs[4 + i * NUM_JOINTS : 4 + (i + 1) * NUM_JOINTS] = DEFAULT_ANGLES_ONNX - enc_obs[lay.anchor_hist + i * 6 : lay.anchor_hist + (i + 1) * 6] = _IDENTITY_6D + enc_obs[ANCHOR_HIST_OFFSET + i * 6 : ANCHOR_HIST_OFFSET + (i + 1) * 6] = _IDENTITY_6D out = self._encoder.run(None, {self._encoder_input: enc_obs.reshape(1, -1)}) return out[0].squeeze().astype(np.float32) - def _anchor_left_inv(self, base_quat: NDArray) -> NDArray: - """Conjugated left quaternion for anchor-orientation obs: full base - quat for the original release (orientation_mode 0), heading-only for - v1.1 (orientation_mode 1, motion_anchor_orientation_heading).""" - if self._layout.heading_anchor: - return _calc_heading_quat_inv(base_quat) - return _quat_conjugate(base_quat) - def _has_upper_body_targets(self) -> bool: if self._ub17_pos is not None: return True @@ -856,8 +776,7 @@ def _inject_upper_body(self, enc_obs: NDArray) -> None: enc_obs[vel + idx] = upper_vels[k] def _build_encoder_obs(self, base_quat: NDArray) -> NDArray: - lay = self._layout - enc_obs = np.zeros(lay.obs_dim, dtype=np.float32) + enc_obs = np.zeros(ENCODER_OBS_DIM, dtype=np.float32) traj = self._trajectory assert traj is not None f_curr = min(self._traj_frame, traj.num_frames - 1) @@ -870,14 +789,15 @@ def _build_encoder_obs(self, base_quat: NDArray) -> NDArray: if self._has_upper_body_targets(): self._inject_upper_body(enc_obs) - q_left_inv = self._anchor_left_inv(base_quat) + # Anchor orientations are heading-normalized (orientation_mode 1) + q_left_inv = _calc_heading_quat_inv(base_quat) for i in range(10): f = min(f_curr + i * 5, traj.num_frames - 1) q_aligned = _quat_multiply( self._heading_delta_quat, traj.root_quat[f].astype(np.float64) ) q_rel = _quat_multiply(q_left_inv, q_aligned) - enc_obs[lay.anchor_hist + i * 6 : lay.anchor_hist + (i + 1) * 6] = _rotmat_to_6d( + enc_obs[ANCHOR_HIST_OFFSET + i * 6 : ANCHOR_HIST_OFFSET + (i + 1) * 6] = _rotmat_to_6d( _quat_to_rotmat(q_rel) ) return enc_obs @@ -888,8 +808,7 @@ def _build_teleop_encoder_obs(self, base_quat: NDArray) -> NDArray: orientation, VR 3-point blocks. All other fields stay zero - the C++ gathers ONLY the active mode's required observations into a zeroed buffer (GatherEncoderObservations).""" - lay = self._layout - enc_obs = np.zeros(lay.obs_dim, dtype=np.float32) + enc_obs = np.zeros(ENCODER_OBS_DIM, dtype=np.float32) enc_obs[0] = 1.0 # encoder_mode_4: scalar mode id, rest zeros traj = self._trajectory assert traj is not None @@ -897,22 +816,24 @@ def _build_teleop_encoder_obs(self, base_quat: NDArray) -> NDArray: for i in range(10): f = min(f_curr + i * 5, traj.num_frames - 1) - enc_obs[lay.lowerbody_pos + i * 12 : lay.lowerbody_pos + (i + 1) * 12] = traj.joint_pos[ - f - ][LOWER_BODY_MJC_IN_ONNX] - enc_obs[lay.lowerbody_vel + i * 12 : lay.lowerbody_vel + (i + 1) * 12] = traj.joint_vel[ - f - ][LOWER_BODY_MJC_IN_ONNX] - - q_left_inv = self._anchor_left_inv(base_quat) + enc_obs[LOWERBODY_POS_OFFSET + i * 12 : LOWERBODY_POS_OFFSET + (i + 1) * 12] = ( + traj.joint_pos[f][LOWER_BODY_MJC_IN_ONNX] + ) + enc_obs[LOWERBODY_VEL_OFFSET + i * 12 : LOWERBODY_VEL_OFFSET + (i + 1) * 12] = ( + traj.joint_vel[f][LOWER_BODY_MJC_IN_ONNX] + ) + + q_left_inv = _calc_heading_quat_inv(base_quat) q_aligned = _quat_multiply( self._heading_delta_quat, traj.root_quat[f_curr].astype(np.float64) ) q_rel = _quat_multiply(q_left_inv, q_aligned) - enc_obs[lay.anchor_single : lay.anchor_single + 6] = _rotmat_to_6d(_quat_to_rotmat(q_rel)) + enc_obs[ANCHOR_SINGLE_OFFSET : ANCHOR_SINGLE_OFFSET + 6] = _rotmat_to_6d( + _quat_to_rotmat(q_rel) + ) - enc_obs[lay.vr_pos : lay.vr_pos + 9] = self._vr_pos - enc_obs[lay.vr_orn : lay.vr_orn + 12] = self._vr_orn + enc_obs[VR_POS_OFFSET : VR_POS_OFFSET + 9] = self._vr_pos + enc_obs[VR_ORN_OFFSET : VR_ORN_OFFSET + 12] = self._vr_orn return enc_obs # -- planner ---------------------------------------------------------- @@ -1162,11 +1083,12 @@ def step( elif self._trajectory is not None and self._trajectory.num_frames > 0: token = self._run_encoder(self._build_encoder_obs(self._cur_quat)) elif self._has_upper_body_targets(): - lay = self._layout - enc_obs = np.zeros(lay.obs_dim, dtype=np.float32) + enc_obs = np.zeros(ENCODER_OBS_DIM, dtype=np.float32) for i in range(10): enc_obs[4 + i * NUM_JOINTS : 4 + (i + 1) * NUM_JOINTS] = DEFAULT_ANGLES_ONNX - enc_obs[lay.anchor_hist + i * 6 : lay.anchor_hist + (i + 1) * 6] = _IDENTITY_6D + enc_obs[ANCHOR_HIST_OFFSET + i * 6 : ANCHOR_HIST_OFFSET + (i + 1) * 6] = ( + _IDENTITY_6D + ) self._inject_upper_body(enc_obs) token = self._run_encoder(enc_obs) else: @@ -1224,11 +1146,10 @@ def _build_streamed_encoder_obs(self, base_quat: NDArray) -> NDArray: """ motion = self._streamed assert motion is not None - lay = self._layout - enc_obs = np.zeros(lay.obs_dim, dtype=np.float32) + enc_obs = np.zeros(ENCODER_OBS_DIM, dtype=np.float32) enc_obs[0] = float(motion.encode_mode) f_curr = min(self._streamed_frame, motion.timesteps - 1) - q_left_inv = self._anchor_left_inv(base_quat) + q_left_inv = _calc_heading_quat_inv(base_quat) if motion.encode_mode == 0: for i in range(10): @@ -1239,8 +1160,8 @@ def _build_streamed_encoder_obs(self, base_quat: NDArray) -> NDArray: self._heading_delta_quat, motion.root_quat[f].astype(np.float64) ) q_rel = _quat_multiply(q_left_inv, q_aligned) - enc_obs[lay.anchor_hist + i * 6 : lay.anchor_hist + (i + 1) * 6] = _rotmat_to_6d( - _quat_to_rotmat(q_rel) + enc_obs[ANCHOR_HIST_OFFSET + i * 6 : ANCHOR_HIST_OFFSET + (i + 1) * 6] = ( + _rotmat_to_6d(_quat_to_rotmat(q_rel)) ) if self._has_upper_body_targets(): self._inject_upper_body(enc_obs) @@ -1248,15 +1169,15 @@ def _build_streamed_encoder_obs(self, base_quat: NDArray) -> NDArray: assert motion.smpl_joints is not None for i in range(10): f = min(f_curr + i, motion.timesteps - 1) - o = lay.smpl_joints + i * 72 + o = SMPL_JOINTS_OFFSET + i * 72 enc_obs[o : o + 72] = motion.smpl_joints[f].ravel() q_aligned = _quat_multiply( self._heading_delta_quat, motion.root_quat[f].astype(np.float64) ) q_rel = _quat_multiply(q_left_inv, q_aligned) - ao = lay.smpl_anchor + i * 6 + ao = SMPL_ANCHOR_OFFSET + i * 6 enc_obs[ao : ao + 6] = _rotmat_to_6d(_quat_to_rotmat(q_rel)) - wo = lay.wrists + i * 6 + wo = WRISTS_OFFSET + i * 6 enc_obs[wo : wo + 6] = motion.joint_pos[f][WRIST_ONNX_INDICES] return enc_obs @@ -1278,7 +1199,6 @@ def snapshot(self) -> dict: "traj_frames_total": (self._trajectory.num_frames if self._trajectory else 0), "action_norm": float(np.linalg.norm(self._last_action)), "upper_body_active": self._has_upper_body_targets(), - "checkpoint_variant": self._layout.name, "stream_active": self._use_stream, "stream_frames": self._streamed.timesteps if self._streamed else 0, "stream_frame": self._streamed_frame, From 7d8986e1e0d5471e53f254e7374b6f413f872f1c Mon Sep 17 00:00:00 2001 From: Nabla7 Date: Sat, 22 Aug 2026 16:53:09 +0200 Subject: [PATCH 13/57] fix(g1-sonic): declare set_velocity_command; route blueprint validation to self-hosted Both from PR review: set_velocity_command was reachable only via the coordinator's undeclared reflective-dispatch fallback (warning, no signature validation); and the blueprint stringifies LfsPath model paths at import, which on the plain Ubuntu runner means a git-lfs failure or an 836MB pull during blueprint validation - same reason unitree-g1-nav-sim is self-hosted. --- dimos/control/tasks/g1_sonic_wbc_task/_registry.py | 1 + dimos/robot/test_all_blueprints.py | 1 + 2 files changed, 2 insertions(+) diff --git a/dimos/control/tasks/g1_sonic_wbc_task/_registry.py b/dimos/control/tasks/g1_sonic_wbc_task/_registry.py index 22da644eb3..be40565874 100644 --- a/dimos/control/tasks/g1_sonic_wbc_task/_registry.py +++ b/dimos/control/tasks/g1_sonic_wbc_task/_registry.py @@ -27,6 +27,7 @@ "set_dry_run", "reset_runtime_state", "start", + "set_velocity_command", "set_locomotion_mode", "list_locomotion_modes", "set_base_height", diff --git a/dimos/robot/test_all_blueprints.py b/dimos/robot/test_all_blueprints.py index 7d3e01f2c0..33ac5516c5 100644 --- a/dimos/robot/test_all_blueprints.py +++ b/dimos/robot/test_all_blueprints.py @@ -64,6 +64,7 @@ "teleop-quest-xarm7", "teleop-quest-xarm7-video", "unitree-g1-nav-sim", + "unitree-g1-sonic-wbc", "xarm-perception", "xarm-perception-agent", "xarm-perception-sim", From a94e8b5cd6c0438544f0a51cfb05bd2058656a3d Mon Sep 17 00:00:00 2001 From: Nabla7 Date: Mon, 24 Aug 2026 17:37:30 +0200 Subject: [PATCH 14/57] feat(g1-sonic): staged floor transitions + per-mode planner params Two mechanisms from the C++ gamepad manager that the port lacked, found by chasing a kneel-entry crash (instant walking-context -> kneel switch made the planner emit a violent drop): - set_mode now stages floor postures exactly like gamepad_manager.hpp: crawling is entered through kneel, elbow crawling through crawling, exits reverse the ladder, one rung per 2 s dwell, advanced from step(). - Forced modes apply the C++ applySpeedAndHeight table: kneel/squat/crawl send the planner height command (0.4 / 0.4 / 0.3) - without it the planner emits a floor-collapse descent instead of a supported kneel - and the crawl/boxing families their canonical 0.7 speed. Also applies command-topic delta_heading (incremental yaw, was decoded and only logged). Verified in the standalone harness at real-time planner pacing: kneel holds at z 0.41 and stands back up; single kneel likewise; crawl -> kneel -> stand recovery works; full 27-mode + 13-clip take with a live chained floor section, zero falls. Genuine policy limitation left: lying face down has no get-up (the C++ transition logic never chains out of lying either). --- .../g1_sonic_wbc_task/g1_sonic_wbc_task.py | 8 +- .../tasks/g1_sonic_wbc_task/sonic_pipeline.py | 114 +++++++++++++++++- 2 files changed, 112 insertions(+), 10 deletions(-) diff --git a/dimos/control/tasks/g1_sonic_wbc_task/g1_sonic_wbc_task.py b/dimos/control/tasks/g1_sonic_wbc_task/g1_sonic_wbc_task.py index ba79eef5ab..9ed6baa3aa 100644 --- a/dimos/control/tasks/g1_sonic_wbc_task/g1_sonic_wbc_task.py +++ b/dimos/control/tasks/g1_sonic_wbc_task/g1_sonic_wbc_task.py @@ -549,11 +549,9 @@ def _on_wire_command(self, cmd: CommandUpdate) -> None: elif cmd.start: self.arm(0.0) if cmd.delta_heading is not None: - logger.info( - "ZMQ delta_heading received (not yet applied)", - task=self._name, - delta_heading=cmd.delta_heading, - ) + # C++ command-topic semantics: incremental yaw pulses folded into + # HeadingState.delta_heading (gamepad delta_left/right are +/-0.1). + self._pipeline.apply_heading_increment(float(cmd.delta_heading)) def _on_wire_planner(self, upd: PlannerUpdate, t_now: float) -> None: self._pipeline.set_planner_command( diff --git a/dimos/control/tasks/g1_sonic_wbc_task/sonic_pipeline.py b/dimos/control/tasks/g1_sonic_wbc_task/sonic_pipeline.py index fcede3adad..7384e9b7c1 100644 --- a/dimos/control/tasks/g1_sonic_wbc_task/sonic_pipeline.py +++ b/dimos/control/tasks/g1_sonic_wbc_task/sonic_pipeline.py @@ -361,6 +361,66 @@ } STATIC_MODES = {0, 4, 5, 6, 7, 9} +# Per-mode planner speed/height (gamepad_manager.hpp applySpeedAndHeight). +# Kneel/squat/crawl NEED the height command - with the -1 default the +# planner emits a floor-collapse descent instead of a supported kneel. +MODE_PLANNER_PARAMS: dict[int, tuple[float, float]] = { + 1: (0.4, -1.0), # SLOW_WALK + 3: (1.5, -1.0), # RUN + 4: (-1.0, 0.4), # IDEL_SQUAT + 5: (-1.0, 0.4), # IDEL_KNEEL_TWO_LEGS + 6: (-1.0, 0.4), # IDEL_KNEEL + 8: (0.7, 0.4), # CRAWLING + 9: (0.7, -1.0), # IDEL_BOXING + 10: (0.7, -1.0), # WALK_BOXING + 11: (0.7, -1.0), # LEFT_PUNCH + 12: (0.7, -1.0), # RIGHT_PUNCH + 13: (0.7, -1.0), # RANDOM_PUNCH + 14: (0.7, 0.3), # ELBOW_CRAWLING + 15: (0.7, -1.0), # LEFT_HOOK + 16: (0.7, -1.0), # RIGHT_HOOK +} + +# Floor-posture ladders (C++ gamepad_manager staging): every deep posture is +# reached through KNEEL_TWO_LEGS, one rung per TRANSITION_DWELL_SEC. +TRANSITION_DWELL_SEC = 2.0 +_KNEEL2, _KNEEL, _LYING, _CRAWL, _ELBOW = 5, 6, 7, 8, 14 +_FLOOR_CHAINS: dict[int, list[int]] = { + _KNEEL2: [_KNEEL2], + _KNEEL: [_KNEEL2, _KNEEL], + _LYING: [_KNEEL2, _KNEEL, _LYING], + _CRAWL: [_KNEEL2, _CRAWL], + _ELBOW: [_KNEEL2, _CRAWL, _ELBOW], +} + + +def _transition_stages(current: int | None, target: int | None) -> list[int | None]: + """Mode sequence from ``current`` to ``target`` (target included last). + + Mirrors gamepad_manager.hpp: entering a floor posture descends the + ladder (stand -> kneel -> crawl -> elbow), leaving one ascends it, and + switching floor branches goes back through the shared rungs. Non-floor + to non-floor transitions are direct, exactly like the C++. + """ + cur_chain = _FLOOR_CHAINS.get(current) if current is not None else None + tgt_chain = _FLOOR_CHAINS.get(target) if target is not None else None + if cur_chain is None and tgt_chain is None: + return [target] + if cur_chain is None: + return list(tgt_chain) + if tgt_chain is None: + up = list(reversed(cur_chain[:-1])) + return [*up, target] + common = 0 + for a, b in zip(cur_chain, tgt_chain, strict=False): + if a != b: + break + common += 1 + up = list(reversed(cur_chain[common:-1])) + down = tgt_chain[common:] + stages = [*up, *down] + return stages if stages else [target] + # --------------------------------------------------------------------------- # Quaternion helpers ([w, x, y, z] convention throughout) @@ -517,6 +577,8 @@ def __init__( self._yaw_rate = 0.0 self._height_cmd = -1.0 # -1 = mode default self._mode_override: int | None = None + self._mode_queue: list[int | None] = [] + self._mode_dwell = 0.0 self._upper_targets_dds = DEFAULT_ANGLES_DDS[15:].copy() # Latest robot state fed by step() (for planner input building) @@ -545,21 +607,40 @@ def __init__( # -- commands --------------------------------------------------------- + @property + def target_mode(self) -> int | None: + """Final mode after any pending staged transition.""" + return self._mode_queue[-1] if self._mode_queue else self._mode_override + def set_velocity(self, vx: float, vy: float, wz: float) -> None: if abs(vx - self._vx) > 0.05 or abs(vy - self._vy) > 0.05 or abs(wz - self._yaw_rate) > 0.1: self._needs_replan = True self._vx, self._vy, self._yaw_rate = vx, vy, wz def set_mode(self, mode: int | str | None) -> int | None: - """Force a LocomotionMode (int or name); None returns to speed-auto.""" + """Force a LocomotionMode (int or name); None returns to speed-auto. + + Floor postures are STAGED like the C++ gamepad manager + (gamepad_manager.hpp): entering crawling kneels first, elbow + crawling passes through crawling, and exits reverse the ladder - + each stage holding TRANSITION_DWELL_SEC before the next. Jumping + straight from a standing/walking context into a deep floor mode + makes the planner emit a violent drop that the policy tracks into + a crash. The staged target applies immediately; the remaining + stages advance from step().""" if isinstance(mode, str): mode = LOCOMOTION_MODES[mode.upper()] if mode is not None and not 0 <= int(mode) <= 26: raise ValueError(f"locomotion mode out of range: {mode}") - if mode != self._mode_override: + target = None if mode is None else int(mode) + stages = _transition_stages(self._mode_override, target) + self._mode_queue = stages[1:] + self._mode_dwell = 0.0 + first = stages[0] + if first != self._mode_override: self._needs_replan = True - self._mode_override = None if mode is None else int(mode) - return self._mode_override + self._mode_override = first + return target def set_base_height(self, height: float) -> None: if abs(height - self._height_cmd) > 0.01: @@ -721,6 +802,8 @@ def reset(self) -> None: self._planner_future = None self._upper_targets_dds = DEFAULT_ANGLES_DDS[15:].copy() self._mode_override = None + self._mode_queue = [] + self._mode_dwell = 0.0 self._merger.reset() self._streamed = None self._streamed_frame = 0 @@ -895,7 +978,18 @@ def _build_planner_inputs(self) -> dict: else: target_vel = -1.0 - return self._planner_inputs_dict(mode, move_dir, face_dir, target_vel, self._height_cmd) + # Per-mode planner params (C++ applySpeedAndHeight): forced modes get + # their canonical speed/height; an explicit set_base_height wins. + params = MODE_PLANNER_PARAMS.get(mode) if self._mode_override is not None else None + height = self._height_cmd + if params is not None: + mode_speed, mode_height = params + if mode_speed > 0 and mode not in (1, 3): + target_vel = mode_speed + if mode_height > 0 and height < 0: + height = mode_height + + return self._planner_inputs_dict(mode, move_dir, face_dir, target_vel, height) def _planner_inputs_dict( self, @@ -1042,6 +1136,15 @@ def step( self._check_planner_result() + # Staged floor transitions: hold each ladder rung for the dwell, + # then advance (gamepad_manager.hpp transition timers). + if self._mode_queue: + self._mode_dwell += POLICY_DT + if self._mode_dwell >= TRANSITION_DWELL_SEC: + self._mode_override = self._mode_queue.pop(0) + self._mode_dwell = 0.0 + self._needs_replan = True + self._replan_timer += POLICY_DT speed = math.hypot(self._vx, self._vy) mode = self._mode_override if self._mode_override is not None else self._auto_mode(speed) @@ -1193,6 +1296,7 @@ def snapshot(self) -> dict: return { "mode": mode, "mode_override": self._mode_override, + "mode_queue": list(self._mode_queue), "speed": speed, "trajectory": self._trajectory is not None, "traj_frame": self._traj_frame, From 2dc563329f02a85ea02ecf1239af3cb25295c8f8 Mon Sep 17 00:00:00 2001 From: mustafab0 Date: Thu, 20 Aug 2026 12:15:50 -0700 Subject: [PATCH 15/57] feat(g1): stiffness soft-start in the whole-body connection Taking low-level control stepped from damp to full GR00T kp in a single lowcmd frame, so the robot slammed to the commanded pose the instant the first command arrived. The connection now passes kd through in full from the first frame (Unitree's own damp mode) while kp and tau scale in over soft_start_seconds (default 3 s, 0 disables), so bring-up feels like the remote's damp -> lock-stand no matter what the coordinator sends. The clock resets on every start(), so reacquiring control ramps again rather than reusing a finished ramp. Carved out of the G1 watering demo branch: the safety belongs on the robot, not in one demo blueprint. --- .../unitree/g1/test_wholebody_connection.py | 123 ++++++++++++++++++ .../robot/unitree/g1/wholebody_connection.py | 36 ++++- 2 files changed, 157 insertions(+), 2 deletions(-) create mode 100644 dimos/robot/unitree/g1/test_wholebody_connection.py diff --git a/dimos/robot/unitree/g1/test_wholebody_connection.py b/dimos/robot/unitree/g1/test_wholebody_connection.py new file mode 100644 index 0000000000..8edc56a65b --- /dev/null +++ b/dimos/robot/unitree/g1/test_wholebody_connection.py @@ -0,0 +1,123 @@ +# Copyright 2026 Dimensional Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from contextlib import contextmanager +from types import SimpleNamespace + +from dimos.msgs.sensor_msgs.MotorCommandArray import MotorCommandArray +from dimos.robot.unitree.g1.wholebody_connection import ( + _NUM_MOTOR_SLOTS, + _NUM_MOTORS, + G1WholeBodyConnection, +) + + +@contextmanager +def _connection(): + connection = G1WholeBodyConnection() + try: + yield connection + finally: + connection._publisher = None # keep stop() away from the fake DDS state + connection._low_cmd = None + connection.stop() + + +class _FakePublisher: + def __init__(self): + self.frames = [] + + def Write(self, low_cmd): + self.frames.append( + [(m.q, m.dq, m.kp, m.kd, m.tau) for m in low_cmd.motor_cmd[:_NUM_MOTORS]] + ) + + +def _wire(connection, soft_start_seconds): + """Give the connection just enough fake DDS state to accept commands.""" + connection.config.soft_start_seconds = soft_start_seconds + connection._publisher = _FakePublisher() + connection._low_cmd = SimpleNamespace( + mode_machine=0, + crc=0, + motor_cmd=[ + SimpleNamespace(mode=1, q=0.0, dq=0.0, kp=0.0, kd=0.0, tau=0.0) + for _ in range(_NUM_MOTOR_SLOTS) + ], + ) + connection._crc = SimpleNamespace(Crc=lambda _cmd: 0) + connection._mode_machine = 5 + return connection._publisher + + +def _command(): + return MotorCommandArray( + q=[1.0] * _NUM_MOTORS, + dq=[0.0] * _NUM_MOTORS, + kp=[100.0] * _NUM_MOTORS, + kd=[5.0] * _NUM_MOTORS, + tau=[8.0] * _NUM_MOTORS, + ) + + +def test_soft_start_is_damping_first(): + with _connection() as connection: + publisher = _wire(connection, soft_start_seconds=1000.0) + + connection._on_motor_command(_command()) + + q, dq, kp, kd, tau = publisher.frames[0][0] + # First frame: target and damping pass through, stiffness and tau do not — + # this is what keeps taking control from slamming the robot. + assert q == 1.0 + assert kd == 5.0 + assert kp < 1.0 + assert abs(tau) < 0.1 + + +def test_stiffness_ramps_to_full(): + with _connection() as connection: + publisher = _wire(connection, soft_start_seconds=0.05) + + connection._on_motor_command(_command()) + # Rewind the clock instead of sleeping through the window. + connection._soft_start_t0 -= 1.0 + connection._on_motor_command(_command()) + + _q, _dq, kp, kd, tau = publisher.frames[-1][0] + assert kp == 100.0 + assert kd == 5.0 + assert tau == 8.0 + + +def test_soft_start_disabled_passes_through(): + with _connection() as connection: + publisher = _wire(connection, soft_start_seconds=0.0) + + connection._on_motor_command(_command()) + + _q, _dq, kp, _kd, tau = publisher.frames[0][0] + assert kp == 100.0 + assert tau == 8.0 + + +def test_wrong_joint_count_is_dropped(): + with _connection() as connection: + publisher = _wire(connection, soft_start_seconds=0.0) + + connection._on_motor_command(MotorCommandArray(q=[0.0] * 5)) + + assert publisher.frames == [] diff --git a/dimos/robot/unitree/g1/wholebody_connection.py b/dimos/robot/unitree/g1/wholebody_connection.py index 7cef249799..6d243fcc9e 100644 --- a/dimos/robot/unitree/g1/wholebody_connection.py +++ b/dimos/robot/unitree/g1/wholebody_connection.py @@ -88,6 +88,12 @@ class G1WholeBodyConnectionConfig(ModuleConfig): publish_rate_hz: float = 500.0 frame_id: str = "g1_pelvis" mode_machine: int = _MODE_MACHINE_G1 + # Stiffness soft-start on taking low-level control: the first commands go + # out with full damping (kd) but kp and tau scaled in over this window, + # mirroring the remote's damp -> lock-stand feel. Full commanded stiffness + # in the very first frame slams the robot from wherever it hangs to the + # commanded pose. 0 disables. + soft_start_seconds: float = Field(default=3.0, ge=0.0) @dataclass(frozen=True) @@ -137,6 +143,9 @@ def __init__(self, **kwargs: Any) -> None: self._lock = threading.Lock() self._stop_event = threading.Event() self._publish_thread: Thread | None = None + # Soft-start clock, armed by the first motor command after start(). + self._soft_start_t0: float | None = None + self._soft_start_done = False @rpc def start(self) -> None: @@ -197,6 +206,10 @@ def start(self) -> None: logger.info("G1WholeBodyConnection connected", mode_machine=self._mode_machine) + # Fresh soft-start every time control is (re)acquired. + self._soft_start_t0 = None + self._soft_start_done = False + self.register_disposable(Disposable(self.motor_command.subscribe(self._on_motor_command))) self._publish_thread = Thread( @@ -365,6 +378,20 @@ def _publish_loop(self) -> None: else: next_tick = time.perf_counter() + def _soft_start_scale(self, now: float) -> float: + """Stiffness scale in [0, 1] for this command frame. Caller holds the lock.""" + duration = self.config.soft_start_seconds + if duration <= 0.0: + return 1.0 + if self._soft_start_t0 is None: + self._soft_start_t0 = now + logger.info(f"Soft-start: full damping now, stiffness ramping in over {duration:.1f}s") + scale = min(1.0, (now - self._soft_start_t0) / duration) + if scale >= 1.0 and not self._soft_start_done: + self._soft_start_done = True + logger.info("Soft-start complete - full commanded stiffness") + return scale + def _on_motor_command(self, msg: MotorCommandArray) -> None: if msg.num_joints != _NUM_MOTORS: logger.warning(f"Expected {_NUM_MOTORS} motor commands, got {msg.num_joints}; ignoring") @@ -383,12 +410,17 @@ def _on_motor_command(self, msg: MotorCommandArray) -> None: # G1 firmware requires mode_machine on every LowCmd frame. self._low_cmd.mode_machine = self._mode_machine + # Damping-first bring-up: kd applies in full from the first frame + # (that is Unitree's own damp mode), while kp and tau fade in so + # taking control never step-changes the stiffness. + scale = self._soft_start_scale(time.perf_counter()) + for i in range(_NUM_MOTORS): self._low_cmd.motor_cmd[i].q = msg.q[i] self._low_cmd.motor_cmd[i].dq = msg.dq[i] - self._low_cmd.motor_cmd[i].kp = msg.kp[i] + self._low_cmd.motor_cmd[i].kp = msg.kp[i] * scale self._low_cmd.motor_cmd[i].kd = msg.kd[i] - self._low_cmd.motor_cmd[i].tau = msg.tau[i] + self._low_cmd.motor_cmd[i].tau = msg.tau[i] * scale self._low_cmd.crc = self._crc.Crc(self._low_cmd) self._publisher.Write(self._low_cmd) From 82d4c706e30b936a63f05de7d66bbfed4f65bdfc Mon Sep 17 00:00:00 2001 From: mustafab0 Date: Thu, 20 Aug 2026 12:15:59 -0700 Subject: [PATCH 16/57] fix(control): hold the measured pose at servo startup and after preemption servo_arms latched its configured pose at construction and commanded it on the very first tick, with no state guard and no ramp. On a G1 hanging in damp with bent elbows that is a hard slam to ARM_DEFAULT_POSE (14 zeros) at full GR00T stiffness, the moment the blueprint starts. JointServoTaskConfig grows hold_measured_on_start: the hold target is latched from the first measured state instead. The task stays active while waiting for that state so it gets the chance to latch, and commands nothing until it does. The G1 hardware blueprint uses it; sim keeps the configured pose, where the MJCF already starts near it. Two related fixes in the same path: - Preempted joints now track their measured positions while a higher-priority task drives them, so the hold resumes from wherever that task releases them instead of snapping back to the stale target. Preemption also defers the timeout, since the hold has to still be alive at release. - A partial joint command is still dropped, but now says so and names the missing joint. It used to fail silently. Carved out of the G1 watering demo branch. --- dimos/control/tasks/servo_task/servo_task.py | 78 +++++++++++++++++-- .../tasks/servo_task/test_servo_task.py | 65 ++++++++++++++++ .../blueprints/basic/unitree_g1_groot_wbc.py | 7 +- 3 files changed, 143 insertions(+), 7 deletions(-) diff --git a/dimos/control/tasks/servo_task/servo_task.py b/dimos/control/tasks/servo_task/servo_task.py index 30b173fa56..5cc2cb44ea 100644 --- a/dimos/control/tasks/servo_task/servo_task.py +++ b/dimos/control/tasks/servo_task/servo_task.py @@ -55,12 +55,17 @@ class JointServoTaskConfig: length if provided. Useful for "hold at this pose" tasks (e.g. arms during whole-body locomotion). Pair with timeout=0.0 to hold indefinitely. + hold_measured_on_start: Latch the hold target from the first + measured state instead of a configured pose. Startup is then + bumpless: a configured pose would snap the joints there from + wherever the robot actually is, at full stiffness. """ joint_names: list[str] priority: int = 10 timeout: float = 0.5 # 500ms default timeout default_positions: list[float] | None = None + hold_measured_on_start: bool = False class JointServoTask(BaseControlTask): @@ -108,6 +113,9 @@ def __init__(self, name: str, config: JointServoTaskConfig) -> None: self._target: list[float] | None = None self._last_update_time: float = 0.0 self._active = False + self._name_to_index = {name: i for i, name in enumerate(self._joint_names_list)} + self._preempted_joints: set[str] = set() + self._logged_preemption: frozenset[str] = frozenset() if config.default_positions is not None: if len(config.default_positions) != self._num_joints: @@ -131,8 +139,24 @@ def claim(self) -> ResourceClaim: def is_active(self) -> bool: """Check if task should run this tick.""" with self._lock: + if self._active and self._config.hold_measured_on_start and self._target is None: + # No target yet, but compute() will latch one from measured + # state; stay active so it gets the chance. + return True return self._active and self._target is not None + def _latch_measured(self, state: CoordinatorState) -> bool: + """Adopt measured positions as the hold target. False until all arrive.""" + measured = [] + for name in self._joint_names_list: + position = state.joints.joint_positions.get(name) + if position is None: + return False + measured.append(float(position)) + self._target = measured + logger.info(f"JointServoTask {self._name} holding measured start pose") + return True + def compute(self, state: CoordinatorState) -> JointCommandOutput | None: """Output current target positions. @@ -143,8 +167,33 @@ def compute(self, state: CoordinatorState) -> JointCommandOutput | None: JointCommandOutput with positions, or None if inactive/timed out """ with self._lock: - if not self._active or self._target is None: + if not self._active: return None + if self._target is None: + # Latching from measured keeps startup bumpless: commanding a + # configured pose here would snap the joints there from + # wherever the robot actually is, at full stiffness. + if not self._config.hold_measured_on_start or not self._latch_measured(state): + return None + target = self._target + assert target is not None # narrowed by the latch above + + if self._preempted_joints: + # Bumpless handoff: while a higher-priority task drives some of + # our joints, track their measured positions so the hold + # resumes from wherever that task releases them instead of + # snapping back to the previously latched target. + for name in self._preempted_joints: + position = state.joints.joint_positions.get(name) + if position is not None: + target[self._name_to_index[name]] = position + self._preempted_joints.clear() + # Preemption defers the timeout: the joints are actively + # driven, and the hold must be alive when they are released. + self._last_update_time = state.t_now + elif self._logged_preemption: + self._logged_preemption = frozenset() + logger.info(f"JointServoTask {self._name} resumed hold at handed-off positions") # Check timeout if self._config.timeout > 0: @@ -159,7 +208,7 @@ def compute(self, state: CoordinatorState) -> JointCommandOutput | None: return JointCommandOutput( joint_names=self._joint_names_list, - positions=list(self._target), + positions=list(target), mode=ControlMode.SERVO_POSITION, ) @@ -170,8 +219,19 @@ def on_preempted(self, by_task: str, joints: frozenset[str]) -> None: by_task: Name of preempting task joints: Joints that were preempted """ - if joints & self._joint_names: - logger.warning(f"JointServoTask {self._name} preempted by {by_task} on joints {joints}") + overlap = joints & self._joint_names + if not overlap: + return + with self._lock: + self._preempted_joints |= overlap + should_log = overlap != self._logged_preemption + if should_log: + self._logged_preemption = frozenset(overlap) + if should_log: + logger.warning( + f"JointServoTask {self._name} preempted by {by_task} on joints " + f"{sorted(overlap)}; hold target tracks measured positions until released" + ) def set_target(self, positions: list[float], t_now: float) -> bool: """Set target joint positions. @@ -215,7 +275,11 @@ def set_target_by_name(self, positions: dict[str, float], t_now: float) -> bool: ordered = [] for name in self._joint_names_list: if name not in positions: - # Missing joint - don't update + logger.warning( + f"JointServoTask {self._name}: dropping command missing '{name}' " + f"(partial sets are ignored; name all {len(self._joint_names_list)} " + f"claimed joints)" + ) return False ordered.append(positions[name]) @@ -260,6 +324,7 @@ def is_streaming(self) -> bool: class JointServoTaskParams(BaseConfig): timeout: float | None = None default_positions: list[float] | None = None + hold_measured_on_start: bool = False def create_task(cfg: Any, hardware: Any) -> JointServoTask: @@ -274,4 +339,7 @@ def create_task(cfg: Any, hardware: Any) -> JointServoTask: kwargs["default_positions"] = params.default_positions # Zero timeout pairs naturally with default-hold. kwargs.setdefault("timeout", 0.0) + if params.hold_measured_on_start: + kwargs["hold_measured_on_start"] = True + kwargs.setdefault("timeout", 0.0) return JointServoTask(cfg.name, JointServoTaskConfig(**kwargs)) # type: ignore[arg-type] diff --git a/dimos/control/tasks/servo_task/test_servo_task.py b/dimos/control/tasks/servo_task/test_servo_task.py index 32aba5d96e..9d4d397408 100644 --- a/dimos/control/tasks/servo_task/test_servo_task.py +++ b/dimos/control/tasks/servo_task/test_servo_task.py @@ -43,3 +43,68 @@ def test_on_joint_command_requires_all_claimed_joints() -> None: task = _task() assert not task.on_joint_command(JointState(name=["a/j1"], position=[0.1]), 1.0) assert not task.is_active() + + +def _state(t_now: float, positions: dict[str, float] | None = None) -> CoordinatorState: + return CoordinatorState(joints=JointStateSnapshot(joint_positions=positions or {}), t_now=t_now) + + +def test_preempted_joints_track_measured_positions() -> None: + task = _task() + task.on_joint_command(JointState(name=["a/j1", "a/j2"], position=[0.0, 0.0]), 1.0) + + task.on_preempted("traj", frozenset({"a/j2"})) + out = task.compute(_state(1.1, {"a/j1": 0.5, "a/j2": 0.8})) + assert out is not None + assert out.positions == [0.0, 0.8] + + out = task.compute(_state(1.2, {"a/j1": 0.5, "a/j2": 0.0})) + assert out is not None + assert out.positions == [0.0, 0.8] + + +def test_hold_resumes_at_handoff_position_after_release() -> None: + task = _task() + task.on_joint_command(JointState(name=["a/j1", "a/j2"], position=[0.0, 0.0]), 1.0) + + for step in range(5): + task.on_preempted("traj", frozenset({"a/j1", "a/j2"})) + task.compute(_state(1.0 + 0.1 * step, {"a/j1": 0.2 * step, "a/j2": 0.1 * step})) + + out = task.compute(_state(1.5, {"a/j1": 0.81, "a/j2": 0.41})) + assert out is not None + assert out.positions == [0.8, 0.4] + + +def test_hold_measured_on_start_latches_the_real_pose() -> None: + # A configured pose would snap the joints there from wherever the robot + # is, at full stiffness, on the first tick — the G1 arms did exactly that. + task = JointServoTask( + "servo_arms", + JointServoTaskConfig(joint_names=["a", "b"], timeout=0.0, hold_measured_on_start=True), + ) + task.start() + + # Stays active while waiting so it gets a chance to latch. + assert task.is_active() + assert task.compute(_state(1.0)) is None, "must not command before state arrives" + + out = task.compute(_state(1.1, {"a": 0.4, "b": -0.25})) + assert out is not None + assert out.positions == [0.4, -0.25] + + # Once latched it holds that pose, not whatever the joints drift to. + held = task.compute(_state(1.2, {"a": 0.9, "b": -0.9})) + assert held is not None + assert held.positions == [0.4, -0.25] + + +def test_default_positions_still_command_the_configured_pose() -> None: + task = JointServoTask( + "servo", + JointServoTaskConfig(joint_names=["a"], timeout=0.0, default_positions=[0.0]), + ) + task.start() + out = task.compute(_state(1.0, {"a": 0.7})) + assert out is not None + assert out.positions == [0.0] diff --git a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_groot_wbc.py b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_groot_wbc.py index f9604c57d6..8d1e1dd0a2 100644 --- a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_groot_wbc.py +++ b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_groot_wbc.py @@ -328,14 +328,17 @@ def _precomposed_g1_scene(package: ScenePackage) -> Path | None: # One process per heavy module; fewer workers starve the Rerun bridge. _n_workers = 10 # Real hardware needs the arms held -- kd damping alone would let - # them sag toward singular configurations between trajectories. + # them sag toward singular configurations between trajectories. The hold + # starts from the measured pose, not ARM_DEFAULT_POSE: the servo has no + # ramp, so a configured pose slams the arms there from wherever the robot + # actually is, at full GR00T stiffness, on the very first tick. _arm_holder = TaskConfig( name="servo_arms", type="servo", joint_names=g1_arms, priority=10, auto_start=True, - params={"default_positions": ARM_DEFAULT_POSE}, + params={"hold_measured_on_start": True}, ) # Same nav middle as unitree-g1-nav-simple, fed by Point-LIO from the # MID-360, executed through the coordinator's twist_command. From 6899f19a93e3b242528ab02ca3c2b281572e85d4 Mon Sep 17 00:00:00 2001 From: mustafab0 Date: Thu, 20 Aug 2026 22:40:03 -0700 Subject: [PATCH 17/57] fix(control): keep unmeasured preempted joints pending on handoff Two review findings on the servo hold task. The handoff cleared every preempted joint from the pending set even when that joint was absent from the state snapshot, so its target was never refreshed. Arbitration sends no further preemption callback once it releases a joint, so the hold resumed on the stale pre-preemption target instead of the position the higher-priority task handed it. Unmeasured joints now stay pending until a snapshot carries them. create_task also forwarded hold_measured_on_start only when it was truthy, which let the dataclass default decide the outcome for an explicit opt-out. Forward the parsed value so the two defaults stay independent. --- dimos/control/tasks/servo_task/servo_task.py | 14 ++++++++++---- .../tasks/servo_task/test_servo_task.py | 18 ++++++++++++++++++ 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/dimos/control/tasks/servo_task/servo_task.py b/dimos/control/tasks/servo_task/servo_task.py index 5cc2cb44ea..5726e9343e 100644 --- a/dimos/control/tasks/servo_task/servo_task.py +++ b/dimos/control/tasks/servo_task/servo_task.py @@ -183,11 +183,17 @@ def compute(self, state: CoordinatorState) -> JointCommandOutput | None: # our joints, track their measured positions so the hold # resumes from wherever that task releases them instead of # snapping back to the previously latched target. + # A joint missing from this snapshot stays pending: clearing + # it unmeasured resumes the hold on the stale pre-preemption + # target, and no further callback arrives once released. + still_pending: set[str] = set() for name in self._preempted_joints: position = state.joints.joint_positions.get(name) - if position is not None: - target[self._name_to_index[name]] = position - self._preempted_joints.clear() + if position is None: + still_pending.add(name) + continue + target[self._name_to_index[name]] = position + self._preempted_joints = still_pending # Preemption defers the timeout: the joints are actively # driven, and the hold must be alive when they are released. self._last_update_time = state.t_now @@ -339,7 +345,7 @@ def create_task(cfg: Any, hardware: Any) -> JointServoTask: kwargs["default_positions"] = params.default_positions # Zero timeout pairs naturally with default-hold. kwargs.setdefault("timeout", 0.0) + kwargs["hold_measured_on_start"] = params.hold_measured_on_start if params.hold_measured_on_start: - kwargs["hold_measured_on_start"] = True kwargs.setdefault("timeout", 0.0) return JointServoTask(cfg.name, JointServoTaskConfig(**kwargs)) # type: ignore[arg-type] diff --git a/dimos/control/tasks/servo_task/test_servo_task.py b/dimos/control/tasks/servo_task/test_servo_task.py index 9d4d397408..a2ec8f2d74 100644 --- a/dimos/control/tasks/servo_task/test_servo_task.py +++ b/dimos/control/tasks/servo_task/test_servo_task.py @@ -108,3 +108,21 @@ def test_default_positions_still_command_the_configured_pose() -> None: out = task.compute(_state(1.0, {"a": 0.7})) assert out is not None assert out.positions == [0.0] + + +def test_unmeasured_preempted_joint_stays_pending() -> None: + task = _task() + task.on_joint_command(JointState(name=["a/j1", "a/j2"], position=[0.0, 0.0]), 1.0) + + task.on_preempted("traj", frozenset({"a/j2"})) + # a/j2 is missing from this snapshot, so there is nothing to hand off yet. + out = task.compute(_state(1.1, {"a/j1": 0.5})) + assert out is not None + assert out.positions == [0.0, 0.0] + + # Arbitration released the joint, so no further preemption callback comes. + # The first complete snapshot must still adopt the handed-off position + # rather than resuming on the stale pre-preemption target. + out = task.compute(_state(1.2, {"a/j1": 0.5, "a/j2": 0.8})) + assert out is not None + assert out.positions == [0.0, 0.8] From 3b4a27bbc942fbfd4eea8cbe0cf6ea7a099fddc0 Mon Sep 17 00:00:00 2001 From: mustafab0 Date: Thu, 20 Aug 2026 23:15:56 -0700 Subject: [PATCH 18/57] fix(g1): reject a non-finite soft-start duration ge=0.0 admits +inf, and every finite elapsed time over inf is zero, so the stiffness scale pinned at 0 for good: full damping, kp and tau held at zero, and no path back to the commanded gains. A G1 configured that way sags instead of standing, and the only hint is a log line reading "ramping in over infs". allow_inf_nan=False rejects it at config time. -inf and nan already failed the ge bound; the test covers all three so the boundary stays documented. --- dimos/robot/unitree/g1/test_wholebody_connection.py | 13 +++++++++++++ dimos/robot/unitree/g1/wholebody_connection.py | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/dimos/robot/unitree/g1/test_wholebody_connection.py b/dimos/robot/unitree/g1/test_wholebody_connection.py index 8edc56a65b..9b918c47cd 100644 --- a/dimos/robot/unitree/g1/test_wholebody_connection.py +++ b/dimos/robot/unitree/g1/test_wholebody_connection.py @@ -17,11 +17,15 @@ from contextlib import contextmanager from types import SimpleNamespace +from pydantic import ValidationError +import pytest + from dimos.msgs.sensor_msgs.MotorCommandArray import MotorCommandArray from dimos.robot.unitree.g1.wholebody_connection import ( _NUM_MOTOR_SLOTS, _NUM_MOTORS, G1WholeBodyConnection, + G1WholeBodyConnectionConfig, ) @@ -121,3 +125,12 @@ def test_wrong_joint_count_is_dropped(): connection._on_motor_command(MotorCommandArray(q=[0.0] * 5)) assert publisher.frames == [] + + +@pytest.mark.parametrize("value", [float("inf"), float("-inf"), float("nan")]) +def test_non_finite_soft_start_is_rejected(value): + # inf satisfies a bare ge=0.0, and every finite elapsed time over inf is + # zero, so the scale would pin at 0 forever: full damping, no stiffness, + # and no way back to the commanded gains. + with pytest.raises(ValidationError): + G1WholeBodyConnectionConfig(soft_start_seconds=value) diff --git a/dimos/robot/unitree/g1/wholebody_connection.py b/dimos/robot/unitree/g1/wholebody_connection.py index 6d243fcc9e..4a3ea23c86 100644 --- a/dimos/robot/unitree/g1/wholebody_connection.py +++ b/dimos/robot/unitree/g1/wholebody_connection.py @@ -93,7 +93,7 @@ class G1WholeBodyConnectionConfig(ModuleConfig): # mirroring the remote's damp -> lock-stand feel. Full commanded stiffness # in the very first frame slams the robot from wherever it hangs to the # commanded pose. 0 disables. - soft_start_seconds: float = Field(default=3.0, ge=0.0) + soft_start_seconds: float = Field(default=3.0, ge=0.0, allow_inf_nan=False) @dataclass(frozen=True) From 83cd4a93b5a0a9e608d4dacd88f217c7b3712caa Mon Sep 17 00:00:00 2001 From: cc Date: Fri, 21 Aug 2026 16:04:25 -0700 Subject: [PATCH 19/57] refactor(control): reuse trajectory task for joint servo --- dimos/control/components.py | 4 + dimos/control/joint_limits.py | 73 +++++++ dimos/control/tasks/servo_task/servo_task.py | 205 ++++++------------ .../tasks/servo_task/test_servo_task.py | 60 +++++ .../tasks/trajectory_task/trajectory_task.py | 107 +++++++-- dimos/control/test_control.py | 35 +++ dimos/control/test_joint_limits.py | 53 +++++ .../basic/unitree_g1_coordinator.py | 2 + .../blueprints/basic/unitree_g1_groot_wbc.py | 7 +- dimos/robot/unitree/g1/joint_limits.py | 38 ++++ dimos/robot/unitree/g1/test_joint_limits.py | 23 ++ 11 files changed, 451 insertions(+), 156 deletions(-) create mode 100644 dimos/control/joint_limits.py create mode 100644 dimos/control/test_joint_limits.py create mode 100644 dimos/robot/unitree/g1/joint_limits.py create mode 100644 dimos/robot/unitree/g1/test_joint_limits.py diff --git a/dimos/control/components.py b/dimos/control/components.py index 922b853ee4..62be64f176 100644 --- a/dimos/control/components.py +++ b/dimos/control/components.py @@ -76,6 +76,9 @@ class HardwareComponent: on hardware_type=WHOLE_BODY components. Keeps WB-only knobs off the generic HardwareComponent shared by manipulators, bases, and grippers. + joint_velocity_limits: Optional physical velocity limits keyed by + coordinator joint name. Values use each joint's declared position + coordinate per second and override adapter-reported limits. """ hardware_id: HardwareId @@ -87,6 +90,7 @@ class HardwareComponent: domain_id: int = 0 adapter_kwargs: dict[str, Any] = field(default_factory=dict) wb_config: WholeBodyConfig | None = None + joint_velocity_limits: dict[JointName, float] = field(default_factory=dict) def make_joints(hardware_id: HardwareId, dof: int) -> list[JointName]: diff --git a/dimos/control/joint_limits.py b/dimos/control/joint_limits.py new file mode 100644 index 0000000000..e4a3e816fd --- /dev/null +++ b/dimos/control/joint_limits.py @@ -0,0 +1,73 @@ +# Copyright 2026 Dimensional Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Resolve physical joint limits for control tasks.""" + +from collections.abc import Mapping, Sequence +import math +from typing import Any + +from dimos.utils.logging_config import setup_logger + +logger = setup_logger() + + +def resolve_velocity_limits( + joint_names: Sequence[str], + hardware: Mapping[str, Any], + *, + speed_scale: float, +) -> dict[str, float]: + """Resolve physical limits from adapters plus component overrides.""" + if not math.isfinite(speed_scale) or not 0.0 < speed_scale <= 1.0: + raise ValueError("speed_scale must be finite and within (0, 1]") + + requested = set(joint_names) + resolved: dict[str, float] = {} + for connected in hardware.values(): + component = connected.component + arm_names = list(component.joints) + get_limits = getattr(connected.adapter, "get_limits", None) + if callable(get_limits) and requested.intersection(arm_names): + limits = get_limits().velocity_max + if len(limits) != len(arm_names): + raise ValueError( + f"hardware '{component.hardware_id}' returned {len(limits)} velocity " + f"limits for {len(arm_names)} joints" + ) + resolved.update( + (name, float(limit)) + for name, limit in zip(arm_names, limits, strict=True) + if name in requested + ) + overrides = component.joint_velocity_limits + unknown = set(overrides) - set(component.all_joints) + if unknown: + raise ValueError( + f"hardware '{component.hardware_id}' has velocity limits for unknown joints: " + f"{sorted(unknown)}" + ) + resolved.update( + (name, float(limit)) for name, limit in overrides.items() if name in requested + ) + + if any(not math.isfinite(limit) or limit <= 0.0 for limit in resolved.values()): + raise ValueError("hardware velocity limits must be finite and positive") + missing = sorted(requested - resolved.keys()) + if missing: + logger.warning( + "Position control has no velocity limit for joints; commands are unbounded", + joints=missing, + ) + return {name: limit * speed_scale for name, limit in resolved.items()} diff --git a/dimos/control/tasks/servo_task/servo_task.py b/dimos/control/tasks/servo_task/servo_task.py index 5726e9343e..1f0fc6da12 100644 --- a/dimos/control/tasks/servo_task/servo_task.py +++ b/dimos/control/tasks/servo_task/servo_task.py @@ -12,27 +12,31 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Streaming joint servo task for real-time position control. - -Accepts streaming joint positions (e.g., from teleoperation) and outputs them -directly to hardware each tick. Useful for teleoperation, visual servoing, -or any real-time control where you don't want trajectory planning overhead. -""" +"""Streaming policy wrapper around joint trajectory execution.""" from __future__ import annotations from dataclasses import dataclass +import math import threading import time from typing import TYPE_CHECKING, Any +from pydantic import Field + +from dimos.control.joint_limits import resolve_velocity_limits from dimos.control.task import ( BaseControlTask, - ControlMode, CoordinatorState, JointCommandOutput, ResourceClaim, ) +from dimos.control.tasks.trajectory_task.trajectory_task import ( + JointTrajectoryTask, + JointTrajectoryTaskConfig, +) +from dimos.msgs.trajectory_msgs.JointTrajectory import JointTrajectory +from dimos.msgs.trajectory_msgs.TrajectoryPoint import TrajectoryPoint from dimos.protocol.service.spec import BaseConfig from dimos.utils.logging_config import setup_logger @@ -59,6 +63,7 @@ class JointServoTaskConfig: measured state instead of a configured pose. Startup is then bumpless: a configured pose would snap the joints there from wherever the robot actually is, at full stiffness. + velocity_limits: Effective physical limits resolved by the task factory. """ joint_names: list[str] @@ -66,49 +71,20 @@ class JointServoTaskConfig: timeout: float = 0.5 # 500ms default timeout default_positions: list[float] | None = None hold_measured_on_start: bool = False + velocity_limits: dict[str, float] | None = None class JointServoTask(BaseControlTask): - """Streaming joint position control for teleoperation/visual servoing. - - Accepts target positions via set_target() or set_target_by_name() and - outputs them each tick. Uses SERVO_POSITION mode for high-frequency control. - - No trajectory planning - just pass-through with optional timeout. - - Example: - >>> task = JointServoTask( - ... name="servo_arm", - ... config=JointServoTaskConfig( - ... joint_names=["arm/joint1", "arm/joint2", "arm/joint3"], - ... priority=10, - ... timeout=0.5, - ... ), - ... ) - >>> coordinator.add_task(task) - >>> task.start() - >>> - >>> # From teleop callback or other source: - >>> task.set_target([0.1, 0.2, 0.3], t_now=time.perf_counter()) - """ + """Translate streamed position targets into replacement JTT trajectories.""" def __init__(self, name: str, config: JointServoTaskConfig) -> None: - """Initialize servo task. - - Args: - name: Unique task name - config: Task configuration - """ if not config.joint_names: raise ValueError(f"JointServoTask '{name}' requires at least one joint") - self._name = name self._config = config self._joint_names = frozenset(config.joint_names) self._joint_names_list = list(config.joint_names) self._num_joints = len(config.joint_names) - - # Current target (thread-safe) self._lock = threading.Lock() self._target: list[float] | None = None self._last_update_time: float = 0.0 @@ -116,7 +92,14 @@ def __init__(self, name: str, config: JointServoTaskConfig) -> None: self._name_to_index = {name: i for i, name in enumerate(self._joint_names_list)} self._preempted_joints: set[str] = set() self._logged_preemption: frozenset[str] = frozenset() - + self._trajectory_task = JointTrajectoryTask( + JointTrajectoryTaskConfig( + joint_names=tuple(config.joint_names), + priority=config.priority, + velocity_limits=config.velocity_limits, + hold_final=True, + ) + ) if config.default_positions is not None: if len(config.default_positions) != self._num_joints: raise ValueError( @@ -124,107 +107,72 @@ def __init__(self, name: str, config: JointServoTaskConfig) -> None: f"{len(config.default_positions)} does not match " f"joint_names length {self._num_joints}" ) + if any(not math.isfinite(position) for position in config.default_positions): + raise ValueError(f"JointServoTask '{name}': default_positions must be finite") self._target = list(config.default_positions) - + self._trajectory_task.replace(self._target_trajectory()) logger.info(f"JointServoTask {name} initialized for joints: {config.joint_names}") def claim(self) -> ResourceClaim: - """Declare resource requirements.""" - return ResourceClaim( - joints=self._joint_names, - priority=self._config.priority, - mode=ControlMode.SERVO_POSITION, - ) + return self._trajectory_task.claim() def is_active(self) -> bool: - """Check if task should run this tick.""" with self._lock: - if self._active and self._config.hold_measured_on_start and self._target is None: - # No target yet, but compute() will latch one from measured - # state; stay active so it gets the chance. - return True - return self._active and self._target is not None + waiting_for_state = self._config.hold_measured_on_start and self._target is None + return self._active and (waiting_for_state or self._target is not None) def _latch_measured(self, state: CoordinatorState) -> bool: - """Adopt measured positions as the hold target. False until all arrive.""" - measured = [] + measured: dict[str, float] = {} for name in self._joint_names_list: position = state.joints.joint_positions.get(name) if position is None: return False - measured.append(float(position)) - self._target = measured + measured[name] = float(position) + self._target = [measured[name] for name in self._joint_names_list] + self._trajectory_task.replace(self._target_trajectory(), measured) logger.info(f"JointServoTask {self._name} holding measured start pose") return True - def compute(self, state: CoordinatorState) -> JointCommandOutput | None: - """Output current target positions. - - Args: - state: Current coordinator state + def _target_trajectory(self) -> JointTrajectory: + assert self._target is not None + return JointTrajectory( + joint_names=self._joint_names_list, + points=[TrajectoryPoint(positions=list(self._target))], + ) - Returns: - JointCommandOutput with positions, or None if inactive/timed out - """ + def compute(self, state: CoordinatorState) -> JointCommandOutput | None: with self._lock: if not self._active: return None if self._target is None: - # Latching from measured keeps startup bumpless: commanding a - # configured pose here would snap the joints there from - # wherever the robot actually is, at full stiffness. if not self._config.hold_measured_on_start or not self._latch_measured(state): return None - target = self._target - assert target is not None # narrowed by the latch above - + assert self._target is not None if self._preempted_joints: - # Bumpless handoff: while a higher-priority task drives some of - # our joints, track their measured positions so the hold - # resumes from wherever that task releases them instead of - # snapping back to the previously latched target. - # A joint missing from this snapshot stays pending: clearing - # it unmeasured resumes the hold on the stale pre-preemption - # target, and no further callback arrives once released. still_pending: set[str] = set() + handoff: dict[str, float] = {} for name in self._preempted_joints: position = state.joints.joint_positions.get(name) if position is None: still_pending.add(name) continue - target[self._name_to_index[name]] = position + self._target[self._name_to_index[name]] = position + handoff[name] = position self._preempted_joints = still_pending - # Preemption defers the timeout: the joints are actively - # driven, and the hold must be alive when they are released. + self._trajectory_task.replace(self._target_trajectory(), handoff) self._last_update_time = state.t_now elif self._logged_preemption: self._logged_preemption = frozenset() logger.info(f"JointServoTask {self._name} resumed hold at handed-off positions") - - # Check timeout - if self._config.timeout > 0: - time_since_update = state.t_now - self._last_update_time - if time_since_update > self._config.timeout: - logger.warning( - f"JointServoTask {self._name} timed out " - f"(no update for {time_since_update:.3f}s)" - ) - self._active = False - return None - - return JointCommandOutput( - joint_names=self._joint_names_list, - positions=list(target), - mode=ControlMode.SERVO_POSITION, - ) + elapsed = state.t_now - self._last_update_time + if self._config.timeout > 0 and elapsed > self._config.timeout: + logger.warning(f"JointServoTask {self._name} timed out after {elapsed:.3f}s") + self._active = False + self._trajectory_task.cancel() + return None + return self._trajectory_task.compute(state) def on_preempted(self, by_task: str, joints: frozenset[str]) -> None: - """Handle preemption by higher-priority task. - - Args: - by_task: Name of preempting task - joints: Joints that were preempted - """ overlap = joints & self._joint_names if not overlap: return @@ -240,45 +188,24 @@ def on_preempted(self, by_task: str, joints: frozenset[str]) -> None: ) def set_target(self, positions: list[float], t_now: float) -> bool: - """Set target joint positions. - - Call this from your teleop callback or other data source. - - Args: - positions: Joint positions in radians (must match joint_names length) - t_now: Current time (from coordinator or time.perf_counter()) - - Returns: - True if accepted, False if wrong number of joints - """ if len(positions) != self._num_joints: logger.warning( f"JointServoTask {self._name}: expected {self._num_joints} " f"positions, got {len(positions)}" ) return False - + if any(not math.isfinite(position) for position in positions): + logger.warning(f"JointServoTask {self._name}: positions must be finite") + return False with self._lock: self._target = list(positions) + self._trajectory_task.replace(self._target_trajectory()) self._last_update_time = t_now self._active = True - return True def set_target_by_name(self, positions: dict[str, float], t_now: float) -> bool: - """Set target positions by joint name. - - Extracts only the joints this task controls from the dict. - Useful for routing when multiple tasks share an input stream. - - Args: - positions: {joint_name: position} dict (can contain extra joints) - t_now: Current time - - Returns: - True if all required joints found, False if any missing - """ - ordered = [] + ordered: list[float] = [] for name in self._joint_names_list: if name not in positions: logger.warning( @@ -292,37 +219,32 @@ def set_target_by_name(self, positions: dict[str, float], t_now: float) -> bool: return self.set_target(ordered, t_now) def on_joint_command(self, msg: JointState, t_now: float) -> bool: - """Uniform stream handler: digest the position half of a joint_command.""" if not msg.position: return False return self.set_target_by_name(dict(zip(msg.name, msg.position, strict=True)), t_now) def start(self) -> None: - """Activate the task (start accepting and outputting commands).""" with self._lock: self._active = True - # Refresh the timeout reference so a caller that re-starts - # the task after a long idle window (or uses default_positions - # with a non-zero timeout) doesn't time out on the first tick - # from the stale 0.0 left at construction. + if self._target is not None: + self._trajectory_task.replace(self._target_trajectory()) self._last_update_time = time.perf_counter() logger.info(f"JointServoTask {self._name} started") def stop(self) -> None: - """Deactivate the task (stop outputting commands).""" with self._lock: self._active = False + self._trajectory_task.cancel() logger.info(f"JointServoTask {self._name} stopped") def clear(self) -> None: - """Clear current target and deactivate.""" with self._lock: self._target = None self._active = False + self._trajectory_task.cancel() logger.info(f"JointServoTask {self._name} cleared") def is_streaming(self) -> bool: - """Check if actively receiving and outputting commands.""" with self._lock: return self._active and self._target is not None @@ -331,13 +253,20 @@ class JointServoTaskParams(BaseConfig): timeout: float | None = None default_positions: list[float] | None = None hold_measured_on_start: bool = False + speed_scale: float = Field(default=1.0, gt=0.0, le=1.0, allow_inf_nan=False) def create_task(cfg: Any, hardware: Any) -> JointServoTask: params = JointServoTaskParams.model_validate(cfg.params) + velocity_limits = resolve_velocity_limits( + cfg.joint_names, + hardware, + speed_scale=params.speed_scale, + ) kwargs: dict[str, object] = { "joint_names": cfg.joint_names, "priority": cfg.priority, + "velocity_limits": velocity_limits, } if params.timeout is not None: kwargs["timeout"] = params.timeout diff --git a/dimos/control/tasks/servo_task/test_servo_task.py b/dimos/control/tasks/servo_task/test_servo_task.py index a2ec8f2d74..4a1082c2cc 100644 --- a/dimos/control/tasks/servo_task/test_servo_task.py +++ b/dimos/control/tasks/servo_task/test_servo_task.py @@ -16,6 +16,8 @@ from __future__ import annotations +import pytest + from dimos.control.task import CoordinatorState, JointStateSnapshot from dimos.control.tasks.servo_task.servo_task import JointServoTask, JointServoTaskConfig from dimos.msgs.sensor_msgs.JointState import JointState @@ -31,6 +33,64 @@ def test_on_joint_command_sets_position_targets() -> None: out = task.compute(CoordinatorState(joints=JointStateSnapshot(), t_now=1.0)) assert out is not None assert out.positions == [0.1, 0.2] + assert task.is_active() + + +def test_on_joint_command_uses_shared_velocity_limited_tracking() -> None: + task = JointServoTask( + "servo", + JointServoTaskConfig( + joint_names=["a/j1"], + velocity_limits={"a/j1": 0.5}, + ), + ) + assert task.on_joint_command(JointState(name=["a/j1"], position=[1.0]), 1.0) + + first = task.compute(_state(1.0, {"a/j1": 0.0})) + second = task.compute( + CoordinatorState( + joints=JointStateSnapshot(joint_positions={"a/j1": 0.0}), + t_now=1.1, + dt=0.1, + ) + ) + + assert first is not None + assert first.positions == [0.0] + assert second is not None + assert second.positions == pytest.approx([0.05]) + + +def test_stream_replacement_preserves_bounded_command_continuity() -> None: + task = JointServoTask( + "servo", + JointServoTaskConfig( + joint_names=["a/j1"], + velocity_limits={"a/j1": 1.0}, + ), + ) + assert task.on_joint_command(JointState(name=["a/j1"], position=[1.0]), 1.0) + before = task.compute( + CoordinatorState( + joints=JointStateSnapshot(joint_positions={"a/j1": 0.0}), + t_now=1.0, + dt=0.1, + ) + ) + + assert task.on_joint_command(JointState(name=["a/j1"], position=[-1.0]), 1.1) + after = task.compute( + CoordinatorState( + joints=JointStateSnapshot(joint_positions={"a/j1": 0.0}), + t_now=1.1, + dt=0.1, + ) + ) + + assert before is not None + assert before.positions == pytest.approx([0.1]) + assert after is not None + assert after.positions == pytest.approx([0.0]) def test_on_joint_command_ignores_messages_without_positions() -> None: diff --git a/dimos/control/tasks/trajectory_task/trajectory_task.py b/dimos/control/tasks/trajectory_task/trajectory_task.py index 85630e7930..1cabdaa170 100644 --- a/dimos/control/tasks/trajectory_task/trajectory_task.py +++ b/dimos/control/tasks/trajectory_task/trajectory_task.py @@ -31,6 +31,7 @@ from pydantic import BeforeValidator, ConfigDict, Field from pydantic.dataclasses import dataclass as pydantic_dataclass +from dimos.control.joint_limits import resolve_velocity_limits from dimos.control.task import ( BaseControlTask, ControlMode, @@ -55,17 +56,21 @@ def joint_trajectory_task( joint_names: Sequence[str], priority: int = 10, start_position_tolerance: float = 0.05, + speed_scale: float = 1.0, ) -> TaskConfig: """Build the coordinator's single canonical joint-trajectory task.""" # The coordinator imports this module to recognize the canonical JTT. from dimos.control.coordinator import TaskConfig + params: dict[str, float] = {"start_position_tolerance": start_position_tolerance} + if speed_scale != 1.0: + params["speed_scale"] = speed_scale return TaskConfig( name=JOINT_TRAJECTORY_TASK_NAME, type="trajectory", joint_names=list(joint_names), priority=priority, - params={"start_position_tolerance": start_position_tolerance}, + params=params, ) @@ -131,6 +136,8 @@ class JointTrajectoryTaskConfig: priority: Priority for arbitration (higher wins) start_position_tolerance: Maximum difference between current joint position and the first trajectory point. + velocity_limits: Effective physical limits resolved by the task factory. + hold_final: Keep tracking the final point instead of completing. """ joint_names: Annotated[ @@ -143,6 +150,8 @@ class JointTrajectoryTaskConfig: ge=0.0, allow_inf_nan=False, ) + velocity_limits: dict[str, float] | None = None + hold_final: bool = False class JointTrajectoryTask(BaseControlTask): @@ -187,6 +196,15 @@ def __init__(self, config: JointTrajectoryTaskConfig) -> None: self._pending_start: bool = False # Defer start time to first compute() self._last_duration: float = 0.0 self._last_elapsed: float = 0.0 + self._velocity_limits = dict(config.velocity_limits or {}) + unknown_limits = set(self._velocity_limits) - self._joint_names + if unknown_limits: + raise ValueError(f"velocity limits name unknown joints: {sorted(unknown_limits)}") + if any( + not math.isfinite(limit) or limit <= 0.0 for limit in self._velocity_limits.values() + ): + raise ValueError("velocity limits must be finite and positive") + self._commanded_positions: dict[str, float] = {} logger.info( f"JointTrajectoryTask {self._name} initialized for joints: {config.joint_names}" @@ -223,29 +241,46 @@ def compute(self, state: CoordinatorState) -> JointCommandOutput | None: self._start_time = state.t_now self._pending_start = False - t_elapsed = state.t_now - self._start_time - self._last_elapsed = max(0.0, t_elapsed) - - # Check completion - clamp to final position to ensure we reach goal - if t_elapsed >= self._trajectory.duration: + t_elapsed = max(0.0, state.t_now - self._start_time) + self._last_elapsed = t_elapsed + desired, _ = self._trajectory.sample(t_elapsed) + positions: list[float] = [] + for name, target in zip(self._trajectory.joint_names, desired, strict=True): + limit = self._velocity_limits.get(name) + if limit is None: + commanded = float(target) + else: + current = self._commanded_positions.get(name) + if current is None: + measured = state.joints.get_position(name) + if measured is None or not math.isfinite(measured): + return None + current = float(measured) + max_delta = limit * max(0.0, state.dt) + delta = max(-max_delta, min(max_delta, float(target) - current)) + commanded = current + delta + positions.append(commanded) + self._commanded_positions[name] = commanded + + final_positions = self._trajectory.points[-1].positions + reached = all( + math.isclose(commanded, final, abs_tol=1e-9) + for commanded, final in zip(positions, final_positions, strict=True) + ) + if t_elapsed >= self._trajectory.duration and reached and not self._config.hold_final: self._state = TrajectoryState.COMPLETED logger.info(f"Trajectory {self._name} completed after {t_elapsed:.3f}s") - # Return final position to hold at goal - q_ref, _ = self._trajectory.sample(self._trajectory.duration) - final_names = list(self._trajectory.joint_names) + joint_names = list(self._trajectory.joint_names) self._clear_active_trajectory() return JointCommandOutput( - joint_names=final_names, - positions=list(q_ref), + joint_names=joint_names, + positions=positions, mode=ControlMode.SERVO_POSITION, ) - # Sample trajectory - q_ref, _ = self._trajectory.sample(t_elapsed) - return JointCommandOutput( joint_names=list(self._trajectory.joint_names), - positions=list(q_ref), + positions=positions, mode=ControlMode.SERVO_POSITION, ) @@ -265,9 +300,41 @@ def on_preempted(self, by_task: str, joints: frozenset[str]) -> None: def _clear_active_trajectory(self) -> None: """Clear stored trajectory-specific execution state.""" self._trajectory = None + self._commanded_positions.clear() self._pending_start = False self._start_time = 0.0 + def replace( + self, + trajectory: JointTrajectory, + current_positions: Mapping[str, float] | None = None, + ) -> None: + """Replace the active trajectory while preserving command continuity.""" + active = set(trajectory.joint_names) + self._commanded_positions = { + name: position for name, position in self._commanded_positions.items() if name in active + } + if current_positions is not None: + self._commanded_positions.update( + (name, float(position)) + for name, position in current_positions.items() + if name in active + ) + self._trajectory = trajectory + self._last_duration = trajectory.duration + self._last_elapsed = 0.0 + self._pending_start = True + self._state = TrajectoryState.EXECUTING + + def reseed(self, positions: Mapping[str, float]) -> None: + """Adopt measured positions for joints in the active trajectory.""" + if self._trajectory is None: + return + active = set(self._trajectory.joint_names) + self._commanded_positions.update( + (name, float(position)) for name, position in positions.items() if name in active + ) + def _validate_trajectory(self, trajectory: JointTrajectory) -> bool: """Validate a trajectory before execution.""" joint_names = list(trajectory.joint_names) @@ -374,6 +441,9 @@ def execute( ) self._trajectory = trajectory + self._commanded_positions = { + name: float(current_positions[name]) for name in trajectory.joint_names + } self._last_duration = trajectory.duration self._last_elapsed = 0.0 self._pending_start = True # Start time set on first compute() @@ -459,6 +529,7 @@ class JointTrajectoryTaskParams(BaseConfig): ge=0.0, allow_inf_nan=False, ) + speed_scale: float = Field(default=1.0, gt=0.0, le=1.0, allow_inf_nan=False) def create_task(cfg: Any, hardware: Any) -> JointTrajectoryTask: @@ -467,10 +538,16 @@ def create_task(cfg: Any, hardware: Any) -> JointTrajectoryTask: f"trajectory task must be named {JOINT_TRAJECTORY_TASK_NAME!r}, got {cfg.name!r}" ) params = JointTrajectoryTaskParams.model_validate(cfg.params) + velocity_limits = resolve_velocity_limits( + cfg.joint_names, + hardware, + speed_scale=params.speed_scale, + ) return JointTrajectoryTask( JointTrajectoryTaskConfig( joint_names=cfg.joint_names, priority=cfg.priority, start_position_tolerance=params.start_position_tolerance, + velocity_limits=velocity_limits, ), ) diff --git a/dimos/control/test_control.py b/dimos/control/test_control.py index 8c4ebfa1a0..3cb3c0ee77 100644 --- a/dimos/control/test_control.py +++ b/dimos/control/test_control.py @@ -772,6 +772,41 @@ def test_trajectory_completes(self, trajectory_task, simple_trajectory, coordina assert not trajectory_task.is_active() assert trajectory_task.get_state() == TrajectoryState.COMPLETED + def test_trajectory_waits_for_velocity_limited_output_to_reach_goal(self): + task = JointTrajectoryTask( + JointTrajectoryTaskConfig( + joint_names=["arm/joint1"], + velocity_limits={"arm/joint1": 0.5}, + ) + ) + trajectory = JointTrajectory( + joint_names=["arm/joint1"], + points=[ + TrajectoryPoint(positions=[0.0], velocities=[0.0], time_from_start=0.0), + TrajectoryPoint(positions=[1.0], velocities=[0.0], time_from_start=1.0), + ], + ) + state = JointStateSnapshot(joint_positions={"arm/joint1": 0.0}) + assert ( + task.execute(trajectory, state.joint_positions).status + is TrajectoryExecutionStatus.ACCEPTED + ) + + task.compute(CoordinatorState(joints=state, t_now=0.0, dt=0.1)) + nominal_end = task.compute(CoordinatorState(joints=state, t_now=1.0, dt=0.1)) + + assert nominal_end is not None + assert nominal_end.positions == pytest.approx([0.05]) + assert task.get_state() == TrajectoryState.EXECUTING + + final = None + for step in range(2, 21): + final = task.compute(CoordinatorState(joints=state, t_now=1.0 + step * 0.1, dt=0.1)) + + assert final is not None + assert final.positions == pytest.approx([1.0]) + assert task.get_state() == TrajectoryState.COMPLETED + def test_cancel_trajectory(self, trajectory_task, simple_trajectory): trajectory_task.execute(simple_trajectory, trajectory_start_positions(simple_trajectory)) assert trajectory_task.is_active() diff --git a/dimos/control/test_joint_limits.py b/dimos/control/test_joint_limits.py new file mode 100644 index 0000000000..fdf2a6847a --- /dev/null +++ b/dimos/control/test_joint_limits.py @@ -0,0 +1,53 @@ +# Copyright 2026 Dimensional Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from types import SimpleNamespace + +import pytest + +from dimos.control.components import HardwareComponent, HardwareType +from dimos.control.joint_limits import resolve_velocity_limits +from dimos.hardware.manipulators.spec import JointLimits + + +def test_resolver_uses_adapter_limits_scale_and_component_override() -> None: + component = HardwareComponent( + hardware_id="arm", + hardware_type=HardwareType.MANIPULATOR, + joints=["arm/j1", "arm/j2"], + gripper_joints=["arm/gripper"], + joint_velocity_limits={"arm/j2": 2.0, "arm/gripper": 0.4}, + ) + adapter = SimpleNamespace( + get_limits=lambda: JointLimits( + position_lower=[-1.0, -1.0], + position_upper=[1.0, 1.0], + velocity_max=[4.0, 5.0], + ) + ) + connected = SimpleNamespace(component=component, adapter=adapter) + + resolved = resolve_velocity_limits( + ["arm/j1", "arm/j2", "arm/gripper"], + {"arm": connected}, + speed_scale=0.5, + ) + + assert resolved == {"arm/j1": 2.0, "arm/j2": 1.0, "arm/gripper": 0.2} + + +@pytest.mark.parametrize("speed_scale", [0.0, -1.0, 1.1, float("inf"), float("nan")]) +def test_resolver_rejects_invalid_speed_scale(speed_scale: float) -> None: + with pytest.raises(ValueError, match="speed_scale"): + resolve_velocity_limits([], {}, speed_scale=speed_scale) diff --git a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_coordinator.py b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_coordinator.py index 5412ac8cce..33a6b80c01 100644 --- a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_coordinator.py +++ b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_coordinator.py @@ -30,6 +30,7 @@ from dimos.msgs.sensor_msgs.Imu import Imu from dimos.msgs.sensor_msgs.JointState import JointState from dimos.msgs.sensor_msgs.MotorCommandArray import MotorCommandArray +from dimos.robot.unitree.g1.joint_limits import g1_velocity_limits from dimos.robot.unitree.g1.wholebody_connection import G1WholeBodyConnection _g1_joints = make_humanoid_joints("g1") @@ -56,6 +57,7 @@ class _G1Coordinator(ControlCoordinator): hardware_type=HardwareType.WHOLE_BODY, joints=_g1_joints, adapter_type="transport_lcm", + joint_velocity_limits=g1_velocity_limits(), ), ], tasks=[ diff --git a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_groot_wbc.py b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_groot_wbc.py index 8d1e1dd0a2..2992b4184c 100644 --- a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_groot_wbc.py +++ b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_groot_wbc.py @@ -80,6 +80,7 @@ g1_urdf_joint_state, g1_urdf_static_robot, ) +from dimos.robot.unitree.g1.joint_limits import g1_velocity_limits from dimos.simulation.scene_assets.spec import ScenePackage from dimos.utils.data import LfsPath from dimos.visualization.rerun.scene_package import scene_package_static_entities @@ -329,9 +330,8 @@ def _precomposed_g1_scene(package: ScenePackage) -> Path | None: _n_workers = 10 # Real hardware needs the arms held -- kd damping alone would let # them sag toward singular configurations between trajectories. The hold - # starts from the measured pose, not ARM_DEFAULT_POSE: the servo has no - # ramp, so a configured pose slams the arms there from wherever the robot - # actually is, at full GR00T stiffness, on the very first tick. + # starts from the measured pose, not ARM_DEFAULT_POSE, so taking ownership + # produces no commanded arm motion on the first tick. _arm_holder = TaskConfig( name="servo_arms", type="servo", @@ -503,6 +503,7 @@ def _viewer() -> Any: adapter_type=_adapter_type, address=_adapter_address, wb_config=WholeBodyConfig(kp=tuple(G1_GROOT_KP), kd=tuple(G1_GROOT_KD)), + joint_velocity_limits=g1_velocity_limits(), ), ], tasks=[ diff --git a/dimos/robot/unitree/g1/joint_limits.py b/dimos/robot/unitree/g1/joint_limits.py new file mode 100644 index 0000000000..c0bca97df3 --- /dev/null +++ b/dimos/robot/unitree/g1/joint_limits.py @@ -0,0 +1,38 @@ +# Copyright 2026 Dimensional Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Physical G1 joint limits from the bundled robot description.""" + +from functools import cache +from pathlib import Path +import xml.etree.ElementTree as ET + + +@cache +def _g1_velocity_limit_items() -> tuple[tuple[str, float], ...]: + root = ET.parse(Path(__file__).with_name("g1.urdf")).getroot() + limits: dict[str, float] = {} + for joint in root.findall("joint"): + name = joint.get("name", "") + limit = joint.find("limit") + velocity = None if limit is None else limit.get("velocity") + if not name.endswith("_joint") or velocity is None: + continue + limits[name.removesuffix("_joint")] = float(velocity) + return tuple(limits.items()) + + +def g1_velocity_limits(hardware_id: str = "g1") -> dict[str, float]: + """Return URDF velocity limits in coordinator joint-name form.""" + return {f"{hardware_id}/{name}": velocity for name, velocity in _g1_velocity_limit_items()} diff --git a/dimos/robot/unitree/g1/test_joint_limits.py b/dimos/robot/unitree/g1/test_joint_limits.py new file mode 100644 index 0000000000..68a7310aea --- /dev/null +++ b/dimos/robot/unitree/g1/test_joint_limits.py @@ -0,0 +1,23 @@ +# Copyright 2026 Dimensional Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from dimos.robot.unitree.g1.joint_limits import g1_velocity_limits + + +def test_g1_velocity_limits_cover_all_controlled_joints() -> None: + limits = g1_velocity_limits() + + assert len(limits) == 29 + assert limits["g1/left_shoulder_pitch"] == 37.0 + assert limits["g1/right_wrist_yaw"] == 22.0 From e3a8a2109984755f5f2b12ee6e0180f9c8ab4636 Mon Sep 17 00:00:00 2001 From: cc Date: Fri, 21 Aug 2026 21:04:04 -0700 Subject: [PATCH 20/57] revert(control): restore original trajectory streaming design --- dimos/control/components.py | 4 - dimos/control/coordinator.py | 29 ++ dimos/control/joint_limits.py | 73 ----- dimos/control/tasks/servo_task/_registry.py | 25 -- dimos/control/tasks/servo_task/servo_task.py | 280 ------------------ .../tasks/servo_task/test_servo_task.py | 188 ------------ dimos/control/tasks/test_registry.py | 6 +- .../tasks/trajectory_task/trajectory_task.py | 237 +++++++-------- dimos/control/test_control.py | 108 ++++--- dimos/control/test_coordinator_commands.py | 9 +- dimos/control/test_coordinator_routing.py | 80 +++-- dimos/control/test_joint_limits.py | 53 ---- dimos/control/test_per_robot_joint_states.py | 11 +- dimos/robot/all_blueprints.py | 2 +- dimos/robot/manipulators/common/blueprints.py | 2 +- .../manipulators/xarm/blueprints/teleop.py | 16 +- dimos/robot/test_all_blueprints.py | 2 +- .../basic/unitree_g1_coordinator.py | 13 +- .../blueprints/basic/unitree_g1_groot_wbc.py | 35 +-- dimos/robot/unitree/g1/joint_limits.py | 38 --- dimos/robot/unitree/g1/test_joint_limits.py | 23 -- .../unitree/g1/test_wholebody_connection.py | 70 +++-- .../robot/unitree/g1/wholebody_connection.py | 5 +- 23 files changed, 335 insertions(+), 974 deletions(-) delete mode 100644 dimos/control/joint_limits.py delete mode 100644 dimos/control/tasks/servo_task/_registry.py delete mode 100644 dimos/control/tasks/servo_task/servo_task.py delete mode 100644 dimos/control/tasks/servo_task/test_servo_task.py delete mode 100644 dimos/control/test_joint_limits.py delete mode 100644 dimos/robot/unitree/g1/joint_limits.py delete mode 100644 dimos/robot/unitree/g1/test_joint_limits.py diff --git a/dimos/control/components.py b/dimos/control/components.py index 62be64f176..922b853ee4 100644 --- a/dimos/control/components.py +++ b/dimos/control/components.py @@ -76,9 +76,6 @@ class HardwareComponent: on hardware_type=WHOLE_BODY components. Keeps WB-only knobs off the generic HardwareComponent shared by manipulators, bases, and grippers. - joint_velocity_limits: Optional physical velocity limits keyed by - coordinator joint name. Values use each joint's declared position - coordinate per second and override adapter-reported limits. """ hardware_id: HardwareId @@ -90,7 +87,6 @@ class HardwareComponent: domain_id: int = 0 adapter_kwargs: dict[str, Any] = field(default_factory=dict) wb_config: WholeBodyConfig | None = None - joint_velocity_limits: dict[JointName, float] = field(default_factory=dict) def make_joints(hardware_id: HardwareId, dof: int) -> list[JointName]: diff --git a/dimos/control/coordinator.py b/dimos/control/coordinator.py index c784576c24..bce1c43880 100644 --- a/dimos/control/coordinator.py +++ b/dimos/control/coordinator.py @@ -68,6 +68,10 @@ from dimos.msgs.sensor_msgs.JointState import JointState from dimos.msgs.std_msgs.Float32 import Float32 from dimos.msgs.trajectory_msgs.JointTrajectory import JointTrajectory +from dimos.msgs.trajectory_msgs.TrajectoryPoint import TrajectoryPoint +from dimos.teleop.quest.quest_types import ( + Buttons, +) from dimos.utils.logging_config import setup_logger if TYPE_CHECKING: @@ -197,6 +201,7 @@ def __init__(self, *args: Any, **kwargs: Any) -> None: # dispatch. They must stay out of _dispatch: the twist mapper itself # dispatches joint_command, and _task_lock is not reentrant. self._stream_pre_hooks: dict[str, Callable[[Any], None]] = { + "joint_command": self._map_joint_positions_to_trajectory, "twist_command": self._map_twist_to_base_joints, } @@ -593,6 +598,8 @@ def _sync_stream_subscriptions(self) -> None: return with self._task_lock: active = {stream for stream, entries in self._routes.items() if entries} + if self._trajectory_task is not None: + active.add("joint_command") with self._hardware_lock: has_base = any( hw.component.hardware_type == HardwareType.BASE @@ -700,6 +707,28 @@ def _map_twist_to_base_joints(self, msg: Twist) -> None: joint_state = JointState(name=names, velocity=velocities) self._dispatch("joint_command", joint_state) + def _map_joint_positions_to_trajectory(self, msg: JointState) -> None: + """Route position-bearing joint commands through the canonical JTT limiter.""" + if not msg.position or len(msg.name) != len(msg.position): + return + with self._task_lock: + task = self._trajectory_task + if task is None: + return + claimed = task.claim().joints + selected = [ + (name, position) + for name, position in zip(msg.name, msg.position, strict=True) + if name in claimed + ] + if not selected: + return + trajectory = JointTrajectory( + joint_names=[name for name, _ in selected], + points=[TrajectoryPoint(positions=[position for _, position in selected])], + ) + task.execute(trajectory, {}) + @rpc def set_estop(self, estopped: bool) -> bool: """Latch/clear E-STOP on every task exposing ``set_estop``, making them diff --git a/dimos/control/joint_limits.py b/dimos/control/joint_limits.py deleted file mode 100644 index e4a3e816fd..0000000000 --- a/dimos/control/joint_limits.py +++ /dev/null @@ -1,73 +0,0 @@ -# Copyright 2026 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Resolve physical joint limits for control tasks.""" - -from collections.abc import Mapping, Sequence -import math -from typing import Any - -from dimos.utils.logging_config import setup_logger - -logger = setup_logger() - - -def resolve_velocity_limits( - joint_names: Sequence[str], - hardware: Mapping[str, Any], - *, - speed_scale: float, -) -> dict[str, float]: - """Resolve physical limits from adapters plus component overrides.""" - if not math.isfinite(speed_scale) or not 0.0 < speed_scale <= 1.0: - raise ValueError("speed_scale must be finite and within (0, 1]") - - requested = set(joint_names) - resolved: dict[str, float] = {} - for connected in hardware.values(): - component = connected.component - arm_names = list(component.joints) - get_limits = getattr(connected.adapter, "get_limits", None) - if callable(get_limits) and requested.intersection(arm_names): - limits = get_limits().velocity_max - if len(limits) != len(arm_names): - raise ValueError( - f"hardware '{component.hardware_id}' returned {len(limits)} velocity " - f"limits for {len(arm_names)} joints" - ) - resolved.update( - (name, float(limit)) - for name, limit in zip(arm_names, limits, strict=True) - if name in requested - ) - overrides = component.joint_velocity_limits - unknown = set(overrides) - set(component.all_joints) - if unknown: - raise ValueError( - f"hardware '{component.hardware_id}' has velocity limits for unknown joints: " - f"{sorted(unknown)}" - ) - resolved.update( - (name, float(limit)) for name, limit in overrides.items() if name in requested - ) - - if any(not math.isfinite(limit) or limit <= 0.0 for limit in resolved.values()): - raise ValueError("hardware velocity limits must be finite and positive") - missing = sorted(requested - resolved.keys()) - if missing: - logger.warning( - "Position control has no velocity limit for joints; commands are unbounded", - joints=missing, - ) - return {name: limit * speed_scale for name, limit in resolved.items()} diff --git a/dimos/control/tasks/servo_task/_registry.py b/dimos/control/tasks/servo_task/_registry.py deleted file mode 100644 index feac45d3f7..0000000000 --- a/dimos/control/tasks/servo_task/_registry.py +++ /dev/null @@ -1,25 +0,0 @@ -# Copyright 2025-2026 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -TASK_FACTORIES = { - "servo": "dimos.control.tasks.servo_task.servo_task:create_task", -} - -TASK_CONSUMES = { - "servo": {"joint_command": ("on_joint_command", "claim_overlap")}, -} - -TASK_EXPOSES = { - "servo": ["start"], -} diff --git a/dimos/control/tasks/servo_task/servo_task.py b/dimos/control/tasks/servo_task/servo_task.py deleted file mode 100644 index 1f0fc6da12..0000000000 --- a/dimos/control/tasks/servo_task/servo_task.py +++ /dev/null @@ -1,280 +0,0 @@ -# Copyright 2025-2026 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Streaming policy wrapper around joint trajectory execution.""" - -from __future__ import annotations - -from dataclasses import dataclass -import math -import threading -import time -from typing import TYPE_CHECKING, Any - -from pydantic import Field - -from dimos.control.joint_limits import resolve_velocity_limits -from dimos.control.task import ( - BaseControlTask, - CoordinatorState, - JointCommandOutput, - ResourceClaim, -) -from dimos.control.tasks.trajectory_task.trajectory_task import ( - JointTrajectoryTask, - JointTrajectoryTaskConfig, -) -from dimos.msgs.trajectory_msgs.JointTrajectory import JointTrajectory -from dimos.msgs.trajectory_msgs.TrajectoryPoint import TrajectoryPoint -from dimos.protocol.service.spec import BaseConfig -from dimos.utils.logging_config import setup_logger - -if TYPE_CHECKING: - from dimos.msgs.sensor_msgs.JointState import JointState - -logger = setup_logger() - - -@dataclass -class JointServoTaskConfig: - """Configuration for servo task. - - Attributes: - joint_names: List of joint names this task controls - priority: Priority for arbitration (higher wins) - timeout: If no command received for this many seconds, go inactive (0 = never timeout) - default_positions: Optional initial target held until/unless a - new target arrives via set_target(). Must match joint_names - length if provided. Useful for "hold at this pose" tasks - (e.g. arms during whole-body locomotion). Pair with - timeout=0.0 to hold indefinitely. - hold_measured_on_start: Latch the hold target from the first - measured state instead of a configured pose. Startup is then - bumpless: a configured pose would snap the joints there from - wherever the robot actually is, at full stiffness. - velocity_limits: Effective physical limits resolved by the task factory. - """ - - joint_names: list[str] - priority: int = 10 - timeout: float = 0.5 # 500ms default timeout - default_positions: list[float] | None = None - hold_measured_on_start: bool = False - velocity_limits: dict[str, float] | None = None - - -class JointServoTask(BaseControlTask): - """Translate streamed position targets into replacement JTT trajectories.""" - - def __init__(self, name: str, config: JointServoTaskConfig) -> None: - if not config.joint_names: - raise ValueError(f"JointServoTask '{name}' requires at least one joint") - self._name = name - self._config = config - self._joint_names = frozenset(config.joint_names) - self._joint_names_list = list(config.joint_names) - self._num_joints = len(config.joint_names) - self._lock = threading.Lock() - self._target: list[float] | None = None - self._last_update_time: float = 0.0 - self._active = False - self._name_to_index = {name: i for i, name in enumerate(self._joint_names_list)} - self._preempted_joints: set[str] = set() - self._logged_preemption: frozenset[str] = frozenset() - self._trajectory_task = JointTrajectoryTask( - JointTrajectoryTaskConfig( - joint_names=tuple(config.joint_names), - priority=config.priority, - velocity_limits=config.velocity_limits, - hold_final=True, - ) - ) - if config.default_positions is not None: - if len(config.default_positions) != self._num_joints: - raise ValueError( - f"JointServoTask '{name}': default_positions length " - f"{len(config.default_positions)} does not match " - f"joint_names length {self._num_joints}" - ) - if any(not math.isfinite(position) for position in config.default_positions): - raise ValueError(f"JointServoTask '{name}': default_positions must be finite") - self._target = list(config.default_positions) - self._trajectory_task.replace(self._target_trajectory()) - logger.info(f"JointServoTask {name} initialized for joints: {config.joint_names}") - - def claim(self) -> ResourceClaim: - return self._trajectory_task.claim() - - def is_active(self) -> bool: - with self._lock: - waiting_for_state = self._config.hold_measured_on_start and self._target is None - return self._active and (waiting_for_state or self._target is not None) - - def _latch_measured(self, state: CoordinatorState) -> bool: - measured: dict[str, float] = {} - for name in self._joint_names_list: - position = state.joints.joint_positions.get(name) - if position is None: - return False - measured[name] = float(position) - self._target = [measured[name] for name in self._joint_names_list] - self._trajectory_task.replace(self._target_trajectory(), measured) - logger.info(f"JointServoTask {self._name} holding measured start pose") - return True - - def _target_trajectory(self) -> JointTrajectory: - assert self._target is not None - return JointTrajectory( - joint_names=self._joint_names_list, - points=[TrajectoryPoint(positions=list(self._target))], - ) - - def compute(self, state: CoordinatorState) -> JointCommandOutput | None: - with self._lock: - if not self._active: - return None - if self._target is None: - if not self._config.hold_measured_on_start or not self._latch_measured(state): - return None - assert self._target is not None - if self._preempted_joints: - still_pending: set[str] = set() - handoff: dict[str, float] = {} - for name in self._preempted_joints: - position = state.joints.joint_positions.get(name) - if position is None: - still_pending.add(name) - continue - self._target[self._name_to_index[name]] = position - handoff[name] = position - self._preempted_joints = still_pending - self._trajectory_task.replace(self._target_trajectory(), handoff) - self._last_update_time = state.t_now - elif self._logged_preemption: - self._logged_preemption = frozenset() - logger.info(f"JointServoTask {self._name} resumed hold at handed-off positions") - elapsed = state.t_now - self._last_update_time - if self._config.timeout > 0 and elapsed > self._config.timeout: - logger.warning(f"JointServoTask {self._name} timed out after {elapsed:.3f}s") - self._active = False - self._trajectory_task.cancel() - return None - return self._trajectory_task.compute(state) - - def on_preempted(self, by_task: str, joints: frozenset[str]) -> None: - overlap = joints & self._joint_names - if not overlap: - return - with self._lock: - self._preempted_joints |= overlap - should_log = overlap != self._logged_preemption - if should_log: - self._logged_preemption = frozenset(overlap) - if should_log: - logger.warning( - f"JointServoTask {self._name} preempted by {by_task} on joints " - f"{sorted(overlap)}; hold target tracks measured positions until released" - ) - - def set_target(self, positions: list[float], t_now: float) -> bool: - if len(positions) != self._num_joints: - logger.warning( - f"JointServoTask {self._name}: expected {self._num_joints} " - f"positions, got {len(positions)}" - ) - return False - if any(not math.isfinite(position) for position in positions): - logger.warning(f"JointServoTask {self._name}: positions must be finite") - return False - with self._lock: - self._target = list(positions) - self._trajectory_task.replace(self._target_trajectory()) - self._last_update_time = t_now - self._active = True - return True - - def set_target_by_name(self, positions: dict[str, float], t_now: float) -> bool: - ordered: list[float] = [] - for name in self._joint_names_list: - if name not in positions: - logger.warning( - f"JointServoTask {self._name}: dropping command missing '{name}' " - f"(partial sets are ignored; name all {len(self._joint_names_list)} " - f"claimed joints)" - ) - return False - ordered.append(positions[name]) - - return self.set_target(ordered, t_now) - - def on_joint_command(self, msg: JointState, t_now: float) -> bool: - if not msg.position: - return False - return self.set_target_by_name(dict(zip(msg.name, msg.position, strict=True)), t_now) - - def start(self) -> None: - with self._lock: - self._active = True - if self._target is not None: - self._trajectory_task.replace(self._target_trajectory()) - self._last_update_time = time.perf_counter() - logger.info(f"JointServoTask {self._name} started") - - def stop(self) -> None: - with self._lock: - self._active = False - self._trajectory_task.cancel() - logger.info(f"JointServoTask {self._name} stopped") - - def clear(self) -> None: - with self._lock: - self._target = None - self._active = False - self._trajectory_task.cancel() - logger.info(f"JointServoTask {self._name} cleared") - - def is_streaming(self) -> bool: - with self._lock: - return self._active and self._target is not None - - -class JointServoTaskParams(BaseConfig): - timeout: float | None = None - default_positions: list[float] | None = None - hold_measured_on_start: bool = False - speed_scale: float = Field(default=1.0, gt=0.0, le=1.0, allow_inf_nan=False) - - -def create_task(cfg: Any, hardware: Any) -> JointServoTask: - params = JointServoTaskParams.model_validate(cfg.params) - velocity_limits = resolve_velocity_limits( - cfg.joint_names, - hardware, - speed_scale=params.speed_scale, - ) - kwargs: dict[str, object] = { - "joint_names": cfg.joint_names, - "priority": cfg.priority, - "velocity_limits": velocity_limits, - } - if params.timeout is not None: - kwargs["timeout"] = params.timeout - if params.default_positions is not None: - kwargs["default_positions"] = params.default_positions - # Zero timeout pairs naturally with default-hold. - kwargs.setdefault("timeout", 0.0) - kwargs["hold_measured_on_start"] = params.hold_measured_on_start - if params.hold_measured_on_start: - kwargs.setdefault("timeout", 0.0) - return JointServoTask(cfg.name, JointServoTaskConfig(**kwargs)) # type: ignore[arg-type] diff --git a/dimos/control/tasks/servo_task/test_servo_task.py b/dimos/control/tasks/servo_task/test_servo_task.py deleted file mode 100644 index 4a1082c2cc..0000000000 --- a/dimos/control/tasks/servo_task/test_servo_task.py +++ /dev/null @@ -1,188 +0,0 @@ -# Copyright 2026 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Behavioral tests for the uniform ``(msg, t_now)`` joint_command handler.""" - -from __future__ import annotations - -import pytest - -from dimos.control.task import CoordinatorState, JointStateSnapshot -from dimos.control.tasks.servo_task.servo_task import JointServoTask, JointServoTaskConfig -from dimos.msgs.sensor_msgs.JointState import JointState - - -def _task() -> JointServoTask: - return JointServoTask("servo", JointServoTaskConfig(joint_names=["a/j1", "a/j2"])) - - -def test_on_joint_command_sets_position_targets() -> None: - task = _task() - assert task.on_joint_command(JointState(name=["a/j1", "a/j2"], position=[0.1, 0.2]), 1.0) - out = task.compute(CoordinatorState(joints=JointStateSnapshot(), t_now=1.0)) - assert out is not None - assert out.positions == [0.1, 0.2] - assert task.is_active() - - -def test_on_joint_command_uses_shared_velocity_limited_tracking() -> None: - task = JointServoTask( - "servo", - JointServoTaskConfig( - joint_names=["a/j1"], - velocity_limits={"a/j1": 0.5}, - ), - ) - assert task.on_joint_command(JointState(name=["a/j1"], position=[1.0]), 1.0) - - first = task.compute(_state(1.0, {"a/j1": 0.0})) - second = task.compute( - CoordinatorState( - joints=JointStateSnapshot(joint_positions={"a/j1": 0.0}), - t_now=1.1, - dt=0.1, - ) - ) - - assert first is not None - assert first.positions == [0.0] - assert second is not None - assert second.positions == pytest.approx([0.05]) - - -def test_stream_replacement_preserves_bounded_command_continuity() -> None: - task = JointServoTask( - "servo", - JointServoTaskConfig( - joint_names=["a/j1"], - velocity_limits={"a/j1": 1.0}, - ), - ) - assert task.on_joint_command(JointState(name=["a/j1"], position=[1.0]), 1.0) - before = task.compute( - CoordinatorState( - joints=JointStateSnapshot(joint_positions={"a/j1": 0.0}), - t_now=1.0, - dt=0.1, - ) - ) - - assert task.on_joint_command(JointState(name=["a/j1"], position=[-1.0]), 1.1) - after = task.compute( - CoordinatorState( - joints=JointStateSnapshot(joint_positions={"a/j1": 0.0}), - t_now=1.1, - dt=0.1, - ) - ) - - assert before is not None - assert before.positions == pytest.approx([0.1]) - assert after is not None - assert after.positions == pytest.approx([0.0]) - - -def test_on_joint_command_ignores_messages_without_positions() -> None: - task = _task() - assert not task.on_joint_command(JointState(name=["a/j1", "a/j2"], velocity=[0.1, 0.2]), 1.0) - assert not task.is_active() - - -def test_on_joint_command_requires_all_claimed_joints() -> None: - task = _task() - assert not task.on_joint_command(JointState(name=["a/j1"], position=[0.1]), 1.0) - assert not task.is_active() - - -def _state(t_now: float, positions: dict[str, float] | None = None) -> CoordinatorState: - return CoordinatorState(joints=JointStateSnapshot(joint_positions=positions or {}), t_now=t_now) - - -def test_preempted_joints_track_measured_positions() -> None: - task = _task() - task.on_joint_command(JointState(name=["a/j1", "a/j2"], position=[0.0, 0.0]), 1.0) - - task.on_preempted("traj", frozenset({"a/j2"})) - out = task.compute(_state(1.1, {"a/j1": 0.5, "a/j2": 0.8})) - assert out is not None - assert out.positions == [0.0, 0.8] - - out = task.compute(_state(1.2, {"a/j1": 0.5, "a/j2": 0.0})) - assert out is not None - assert out.positions == [0.0, 0.8] - - -def test_hold_resumes_at_handoff_position_after_release() -> None: - task = _task() - task.on_joint_command(JointState(name=["a/j1", "a/j2"], position=[0.0, 0.0]), 1.0) - - for step in range(5): - task.on_preempted("traj", frozenset({"a/j1", "a/j2"})) - task.compute(_state(1.0 + 0.1 * step, {"a/j1": 0.2 * step, "a/j2": 0.1 * step})) - - out = task.compute(_state(1.5, {"a/j1": 0.81, "a/j2": 0.41})) - assert out is not None - assert out.positions == [0.8, 0.4] - - -def test_hold_measured_on_start_latches_the_real_pose() -> None: - # A configured pose would snap the joints there from wherever the robot - # is, at full stiffness, on the first tick — the G1 arms did exactly that. - task = JointServoTask( - "servo_arms", - JointServoTaskConfig(joint_names=["a", "b"], timeout=0.0, hold_measured_on_start=True), - ) - task.start() - - # Stays active while waiting so it gets a chance to latch. - assert task.is_active() - assert task.compute(_state(1.0)) is None, "must not command before state arrives" - - out = task.compute(_state(1.1, {"a": 0.4, "b": -0.25})) - assert out is not None - assert out.positions == [0.4, -0.25] - - # Once latched it holds that pose, not whatever the joints drift to. - held = task.compute(_state(1.2, {"a": 0.9, "b": -0.9})) - assert held is not None - assert held.positions == [0.4, -0.25] - - -def test_default_positions_still_command_the_configured_pose() -> None: - task = JointServoTask( - "servo", - JointServoTaskConfig(joint_names=["a"], timeout=0.0, default_positions=[0.0]), - ) - task.start() - out = task.compute(_state(1.0, {"a": 0.7})) - assert out is not None - assert out.positions == [0.0] - - -def test_unmeasured_preempted_joint_stays_pending() -> None: - task = _task() - task.on_joint_command(JointState(name=["a/j1", "a/j2"], position=[0.0, 0.0]), 1.0) - - task.on_preempted("traj", frozenset({"a/j2"})) - # a/j2 is missing from this snapshot, so there is nothing to hand off yet. - out = task.compute(_state(1.1, {"a/j1": 0.5})) - assert out is not None - assert out.positions == [0.0, 0.0] - - # Arbitration released the joint, so no further preemption callback comes. - # The first complete snapshot must still adopt the handed-off position - # rather than resuming on the stale pre-preemption target. - out = task.compute(_state(1.2, {"a/j1": 0.5, "a/j2": 0.8})) - assert out is not None - assert out.positions == [0.0, 0.8] diff --git a/dimos/control/tasks/test_registry.py b/dimos/control/tasks/test_registry.py index 14f9be62c9..df01a9113e 100644 --- a/dimos/control/tasks/test_registry.py +++ b/dimos/control/tasks/test_registry.py @@ -140,11 +140,7 @@ def test_task_cards_are_well_formed() -> None: def test_seeded_cards_load_into_registry() -> None: - servo = control_task_registry.bindings_for("servo") - assert servo.consumes == ( - StreamBinding("joint_command", "on_joint_command", Routing.CLAIM_OVERLAP), - ) - assert servo.exposes == frozenset({"start"}) + assert "servo" not in control_task_registry.available() velocity = control_task_registry.bindings_for("velocity") assert velocity.consumes == ( StreamBinding("joint_command", "on_joint_command", Routing.CLAIM_OVERLAP), diff --git a/dimos/control/tasks/trajectory_task/trajectory_task.py b/dimos/control/tasks/trajectory_task/trajectory_task.py index 1cabdaa170..2e0ca3dd4b 100644 --- a/dimos/control/tasks/trajectory_task/trajectory_task.py +++ b/dimos/control/tasks/trajectory_task/trajectory_task.py @@ -31,7 +31,6 @@ from pydantic import BeforeValidator, ConfigDict, Field from pydantic.dataclasses import dataclass as pydantic_dataclass -from dimos.control.joint_limits import resolve_velocity_limits from dimos.control.task import ( BaseControlTask, ControlMode, @@ -40,6 +39,7 @@ ResourceClaim, ) from dimos.msgs.trajectory_msgs.JointTrajectory import JointTrajectory +from dimos.msgs.trajectory_msgs.TrajectoryPoint import TrajectoryPoint from dimos.msgs.trajectory_msgs.TrajectoryStatus import TrajectoryState, TrajectoryStatus from dimos.protocol.service.spec import BaseConfig from dimos.utils.logging_config import setup_logger @@ -56,15 +56,15 @@ def joint_trajectory_task( joint_names: Sequence[str], priority: int = 10, start_position_tolerance: float = 0.05, - speed_scale: float = 1.0, + velocity_limits: Mapping[str, float] | None = None, ) -> TaskConfig: """Build the coordinator's single canonical joint-trajectory task.""" # The coordinator imports this module to recognize the canonical JTT. from dimos.control.coordinator import TaskConfig - params: dict[str, float] = {"start_position_tolerance": start_position_tolerance} - if speed_scale != 1.0: - params["speed_scale"] = speed_scale + params: dict[str, Any] = {"start_position_tolerance": start_position_tolerance} + if velocity_limits is not None: + params["velocity_limits"] = dict(velocity_limits) return TaskConfig( name=JOINT_TRAJECTORY_TASK_NAME, type="trajectory", @@ -136,8 +136,8 @@ class JointTrajectoryTaskConfig: priority: Priority for arbitration (higher wins) start_position_tolerance: Maximum difference between current joint position and the first trajectory point. - velocity_limits: Effective physical limits resolved by the task factory. - hold_final: Keep tracking the final point instead of completing. + velocity_limits: Optional positive velocity limit for every configured + joint. Defaults to 1 rad/s per joint. """ joint_names: Annotated[ @@ -151,7 +151,12 @@ class JointTrajectoryTaskConfig: allow_inf_nan=False, ) velocity_limits: dict[str, float] | None = None - hold_final: bool = False + + +@dataclass +class _TrajectoryRun: + trajectory: JointTrajectory + start_time: float | None = None class JointTrajectoryTask(BaseControlTask): @@ -192,19 +197,22 @@ def __init__(self, config: JointTrajectoryTaskConfig) -> None: # State machine self._state = TrajectoryState.IDLE self._trajectory: JointTrajectory | None = None + self._motions: dict[str, tuple[_TrajectoryRun, int]] = {} + self._commanded_positions: dict[str, float] = {} self._start_time: float = 0.0 self._pending_start: bool = False # Defer start time to first compute() self._last_duration: float = 0.0 self._last_elapsed: float = 0.0 - self._velocity_limits = dict(config.velocity_limits or {}) - unknown_limits = set(self._velocity_limits) - self._joint_names - if unknown_limits: - raise ValueError(f"velocity limits name unknown joints: {sorted(unknown_limits)}") - if any( - not math.isfinite(limit) or limit <= 0.0 for limit in self._velocity_limits.values() - ): - raise ValueError("velocity limits must be finite and positive") - self._commanded_positions: dict[str, float] = {} + + configured_limits = config.velocity_limits + if configured_limits is None: + self._velocity_limits = {name: 1.0 for name in config.joint_names} + else: + if set(configured_limits) != self._joint_names: + raise ValueError("velocity_limits must name every configured trajectory joint") + if any(not math.isfinite(value) or value <= 0.0 for value in configured_limits.values()): + raise ValueError("velocity_limits must be finite and positive") + self._velocity_limits = dict(configured_limits) logger.info( f"JointTrajectoryTask {self._name} initialized for joints: {config.joint_names}" @@ -233,54 +241,51 @@ def compute(self, state: CoordinatorState) -> JointCommandOutput | None: Returns: JointCommandOutput with positions, or None if not executing """ - if self._trajectory is None or not self._trajectory.joint_names: + if not self._motions: return None - # Set start time on first compute() for consistent timing - if self._pending_start: - self._start_time = state.t_now - self._pending_start = False - - t_elapsed = max(0.0, state.t_now - self._start_time) - self._last_elapsed = t_elapsed - desired, _ = self._trajectory.sample(t_elapsed) - positions: list[float] = [] - for name, target in zip(self._trajectory.joint_names, desired, strict=True): - limit = self._velocity_limits.get(name) - if limit is None: - commanded = float(target) + output_names = [name for name in self._joint_names_list if name in self._motions] + all_complete = bool(self._motions) + for joint_name, (run, index) in list(self._motions.items()): + if run.start_time is None: + run.start_time = state.t_now + if run.trajectory is self._trajectory: + self._start_time = state.t_now + self._pending_start = False + elapsed = max(0.0, state.t_now - run.start_time) + self._last_elapsed = max(self._last_elapsed, elapsed) + desired = run.trajectory.sample(elapsed)[0][index] + current = self._commanded_positions.get(joint_name) + if current is None: + current = state.joints.get_position(joint_name) + if current is None or not math.isfinite(current): + all_complete = False + continue + max_delta = self._velocity_limits[joint_name] * max(0.0, state.dt) + delta = max(-max_delta, min(max_delta, desired - current)) + commanded = current + delta + self._commanded_positions[joint_name] = commanded + + final_position = run.trajectory.points[-1].positions[index] + nominal_complete = elapsed >= run.trajectory.duration + reached = math.isclose(commanded, final_position, abs_tol=1e-9) + if nominal_complete and reached: + del self._motions[joint_name] else: - current = self._commanded_positions.get(name) - if current is None: - measured = state.joints.get_position(name) - if measured is None or not math.isfinite(measured): - return None - current = float(measured) - max_delta = limit * max(0.0, state.dt) - delta = max(-max_delta, min(max_delta, float(target) - current)) - commanded = current + delta - positions.append(commanded) - self._commanded_positions[name] = commanded - - final_positions = self._trajectory.points[-1].positions - reached = all( - math.isclose(commanded, final, abs_tol=1e-9) - for commanded, final in zip(positions, final_positions, strict=True) - ) - if t_elapsed >= self._trajectory.duration and reached and not self._config.hold_final: + all_complete = False + + if all_complete and not self._motions and self._state == TrajectoryState.EXECUTING: self._state = TrajectoryState.COMPLETED - logger.info(f"Trajectory {self._name} completed after {t_elapsed:.3f}s") - joint_names = list(self._trajectory.joint_names) - self._clear_active_trajectory() - return JointCommandOutput( - joint_names=joint_names, - positions=positions, - mode=ControlMode.SERVO_POSITION, - ) + self._trajectory = None + self._pending_start = False + logger.info("Trajectory completed", task_name=self._name) + emitted_names = [name for name in output_names if name in self._commanded_positions] + if not emitted_names: + return None return JointCommandOutput( - joint_names=list(self._trajectory.joint_names), - positions=positions, + joint_names=emitted_names, + positions=[self._commanded_positions[name] for name in emitted_names], mode=ControlMode.SERVO_POSITION, ) @@ -300,41 +305,11 @@ def on_preempted(self, by_task: str, joints: frozenset[str]) -> None: def _clear_active_trajectory(self) -> None: """Clear stored trajectory-specific execution state.""" self._trajectory = None + self._motions.clear() self._commanded_positions.clear() self._pending_start = False self._start_time = 0.0 - def replace( - self, - trajectory: JointTrajectory, - current_positions: Mapping[str, float] | None = None, - ) -> None: - """Replace the active trajectory while preserving command continuity.""" - active = set(trajectory.joint_names) - self._commanded_positions = { - name: position for name, position in self._commanded_positions.items() if name in active - } - if current_positions is not None: - self._commanded_positions.update( - (name, float(position)) - for name, position in current_positions.items() - if name in active - ) - self._trajectory = trajectory - self._last_duration = trajectory.duration - self._last_elapsed = 0.0 - self._pending_start = True - self._state = TrajectoryState.EXECUTING - - def reseed(self, positions: Mapping[str, float]) -> None: - """Adopt measured positions for joints in the active trajectory.""" - if self._trajectory is None: - return - active = set(self._trajectory.joint_names) - self._commanded_positions.update( - (name, float(position)) for name, position in positions.items() if name in active - ) - def _validate_trajectory(self, trajectory: JointTrajectory) -> bool: """Validate a trajectory before execution.""" joint_names = list(trajectory.joint_names) @@ -377,7 +352,7 @@ def _validate_trajectory(self, trajectory: JointTrajectory) -> bool: logger.warning("Trajectory for %s has non-increasing timestamps", self._name) return False previous_time = point.time_from_start - if trajectory.duration <= 0.0: + if len(trajectory.points) > 1 and trajectory.duration <= 0.0: logger.warning("Trajectory for %s has nonpositive duration", self._name) return False return True @@ -410,40 +385,57 @@ def execute( "Trajectory is missing", ) - if self._state == TrajectoryState.EXECUTING: - return TrajectoryExecutionResult( - TrajectoryExecutionStatus.ALREADY_EXECUTING, - f"Trajectory task '{self._name}' is already executing", - ) - if not self._validate_trajectory(trajectory): return TrajectoryExecutionResult( TrajectoryExecutionStatus.INVALID_TRAJECTORY, "Trajectory structure or joints are invalid", ) - first_positions = trajectory.points[0].positions - for joint_name, planned_position in zip( - trajectory.joint_names, first_positions, strict=True - ): - current_position = current_positions.get(joint_name) - if current_position is None or not math.isfinite(current_position): - return TrajectoryExecutionResult( - TrajectoryExecutionStatus.START_STATE_UNAVAILABLE, - f"Current position for joint '{joint_name}' is unavailable", - ) - error = abs(current_position - planned_position) - if error > self._config.start_position_tolerance: - return TrajectoryExecutionResult( - TrajectoryExecutionStatus.START_STATE_MISMATCH, - f"Trajectory start for joint '{joint_name}' differs from current " - f"position by {error:.6f}", - ) + first_positions = list(trajectory.points[0].positions) + anchored = False + if len(trajectory.points) > 1: + for index, (joint_name, planned_position) in enumerate( + zip(trajectory.joint_names, first_positions, strict=True) + ): + commanded_position = self._commanded_positions.get(joint_name) + if commanded_position is not None: + first_positions[index] = commanded_position + anchored = True + continue + current_position = current_positions.get(joint_name) + if current_position is None or not math.isfinite(current_position): + return TrajectoryExecutionResult( + TrajectoryExecutionStatus.START_STATE_UNAVAILABLE, + f"Current position for joint '{joint_name}' is unavailable", + ) + error = abs(current_position - planned_position) + if error > self._config.start_position_tolerance: + return TrajectoryExecutionResult( + TrajectoryExecutionStatus.START_STATE_MISMATCH, + f"Trajectory start for joint '{joint_name}' differs from current " + f"position by {error:.6f}", + ) + + if anchored: + trajectory = JointTrajectory( + joint_names=list(trajectory.joint_names), + points=[ + TrajectoryPoint( + time_from_start=trajectory.points[0].time_from_start, + positions=first_positions, + velocities=list(trajectory.points[0].velocities), + ), + *trajectory.points[1:], + ], + timestamp=trajectory.timestamp, + ) + run = _TrajectoryRun(trajectory) + for index, joint_name in enumerate(trajectory.joint_names): + self._motions[joint_name] = (run, index) + if len(trajectory.points) > 1 and joint_name not in self._commanded_positions: + self._commanded_positions[joint_name] = current_positions[joint_name] self._trajectory = trajectory - self._commanded_positions = { - name: float(current_positions[name]) for name in trajectory.joint_names - } self._last_duration = trajectory.duration self._last_elapsed = 0.0 self._pending_start = True # Start time set on first compute() @@ -497,6 +489,8 @@ def get_progress(self, t_now: float) -> float: """ if self._state != TrajectoryState.EXECUTING or self._trajectory is None: return 0.0 + if self._trajectory.duration <= 0.0: + return 0.0 t_elapsed = t_now - self._start_time return min(1.0, t_elapsed / self._trajectory.duration) @@ -529,7 +523,7 @@ class JointTrajectoryTaskParams(BaseConfig): ge=0.0, allow_inf_nan=False, ) - speed_scale: float = Field(default=1.0, gt=0.0, le=1.0, allow_inf_nan=False) + velocity_limits: dict[str, float] | None = None def create_task(cfg: Any, hardware: Any) -> JointTrajectoryTask: @@ -538,16 +532,11 @@ def create_task(cfg: Any, hardware: Any) -> JointTrajectoryTask: f"trajectory task must be named {JOINT_TRAJECTORY_TASK_NAME!r}, got {cfg.name!r}" ) params = JointTrajectoryTaskParams.model_validate(cfg.params) - velocity_limits = resolve_velocity_limits( - cfg.joint_names, - hardware, - speed_scale=params.speed_scale, - ) return JointTrajectoryTask( JointTrajectoryTaskConfig( joint_names=cfg.joint_names, priority=cfg.priority, start_position_tolerance=params.start_position_tolerance, - velocity_limits=velocity_limits, + velocity_limits=params.velocity_limits, ), ) diff --git a/dimos/control/test_control.py b/dimos/control/test_control.py index 3cb3c0ee77..135a0169cf 100644 --- a/dimos/control/test_control.py +++ b/dimos/control/test_control.py @@ -96,6 +96,11 @@ def trajectory_task(): config = JointTrajectoryTaskConfig( joint_names=["arm/joint1", "arm/joint2", "arm/joint3"], priority=10, + velocity_limits={ + "arm/joint1": 1000.0, + "arm/joint2": 1000.0, + "arm/joint3": 1000.0, + }, ) return JointTrajectoryTask(config=config) @@ -612,20 +617,6 @@ def test_execute_accepts_start_position_at_tolerance(self, trajectory_task, simp joint_names=["arm/joint1"], points=[TrajectoryPoint(time_from_start=0.0, positions=[], velocities=[0.0])], ), - JointTrajectory( - joint_names=["arm/joint1"], - points=[TrajectoryPoint(time_from_start=0.0, positions=[0.0], velocities=[0.0])], - ), - JointTrajectory( - joint_names=["arm/joint1", "arm/joint2", "arm/joint3"], - points=[ - TrajectoryPoint( - time_from_start=0.0, - positions=[0.0, 0.0, 0.0], - velocities=[0.0, 0.0, 0.0], - ) - ], - ), JointTrajectory( joint_names=["arm/joint1"], points=[ @@ -657,7 +648,7 @@ def test_invalid_partial_inputs_reject_before_state_changes(self, trajectory_tas is None ) - def test_compute_emits_active_subset_only_and_clears_on_completion(self, trajectory_task): + def test_compute_emits_active_subset_and_retains_final_target(self, trajectory_task): trajectory = JointTrajectory( joint_names=["arm/joint2"], points=[ @@ -705,12 +696,12 @@ def test_replacement_reset_and_cancel_clear_active_subset(self, trajectory_task) ) assert ( trajectory_task.execute(second, trajectory_start_positions(second)).status - is TrajectoryExecutionStatus.ALREADY_EXECUTING + is TrajectoryExecutionStatus.ACCEPTED ) trajectory_task.compute(CoordinatorState(joints=MagicMock(), t_now=1.0, dt=0.01)) output = trajectory_task.compute(CoordinatorState(joints=MagicMock(), t_now=1.5, dt=0.01)) assert output is not None - assert output.joint_names == ["arm/joint1"] + assert output.joint_names == ["arm/joint1", "arm/joint3"] assert trajectory_task.cancel().status is TrajectoryCancellationStatus.CANCELLED assert ( trajectory_task.compute(CoordinatorState(joints=MagicMock(), t_now=2.0, dt=0.01)) @@ -772,40 +763,81 @@ def test_trajectory_completes(self, trajectory_task, simple_trajectory, coordina assert not trajectory_task.is_active() assert trajectory_task.get_state() == TrajectoryState.COMPLETED - def test_trajectory_waits_for_velocity_limited_output_to_reach_goal(self): + def test_one_point_stream_target_is_velocity_bounded(self): task = JointTrajectoryTask( JointTrajectoryTaskConfig( joint_names=["arm/joint1"], velocity_limits={"arm/joint1": 0.5}, ) ) - trajectory = JointTrajectory( + target = JointTrajectory( joint_names=["arm/joint1"], - points=[ - TrajectoryPoint(positions=[0.0], velocities=[0.0], time_from_start=0.0), - TrajectoryPoint(positions=[1.0], velocities=[0.0], time_from_start=1.0), - ], + points=[TrajectoryPoint(positions=[1.0])], ) state = JointStateSnapshot(joint_positions={"arm/joint1": 0.0}) - assert ( - task.execute(trajectory, state.joint_positions).status - is TrajectoryExecutionStatus.ACCEPTED - ) - task.compute(CoordinatorState(joints=state, t_now=0.0, dt=0.1)) - nominal_end = task.compute(CoordinatorState(joints=state, t_now=1.0, dt=0.1)) + assert task.execute(target, {}).status is TrajectoryExecutionStatus.ACCEPTED + first = task.compute(CoordinatorState(joints=state, t_now=1.0, dt=0.1)) + second = task.compute(CoordinatorState(joints=state, t_now=1.1, dt=0.1)) + + assert first is not None + assert first.positions == [pytest.approx(0.05)] + assert second is not None + assert second.positions == [pytest.approx(0.1)] + assert task.get_status(1.1).progress == 0.0 + + @pytest.mark.parametrize("limit", [0.0, -1.0, float("inf"), float("nan")]) + def test_velocity_limits_must_be_finite_and_positive(self, limit): + with pytest.raises(ValueError, match="finite and positive"): + JointTrajectoryTask( + JointTrajectoryTaskConfig( + joint_names=["arm/joint1"], + velocity_limits={"arm/joint1": limit}, + ) + ) - assert nominal_end is not None - assert nominal_end.positions == pytest.approx([0.05]) - assert task.get_state() == TrajectoryState.EXECUTING + def test_velocity_limits_must_cover_every_joint(self): + with pytest.raises(ValueError, match="every configured trajectory joint"): + JointTrajectoryTask( + JointTrajectoryTaskConfig( + joint_names=["arm/joint1", "arm/joint2"], + velocity_limits={"arm/joint1": 1.0}, + ) + ) - final = None - for step in range(2, 21): - final = task.compute(CoordinatorState(joints=state, t_now=1.0 + step * 0.1, dt=0.1)) + def test_replacement_anchors_at_bounded_command_and_preserves_other_joints(self): + task = JointTrajectoryTask( + JointTrajectoryTaskConfig( + joint_names=["arm/joint1", "arm/joint2"], + velocity_limits={"arm/joint1": 1.0, "arm/joint2": 1.0}, + ) + ) + state = JointStateSnapshot( + joint_positions={"arm/joint1": 0.0, "arm/joint2": 0.0} + ) + first = JointTrajectory( + joint_names=["arm/joint1"], + points=[TrajectoryPoint(positions=[1.0])], + ) + other = JointTrajectory( + joint_names=["arm/joint2"], + points=[TrajectoryPoint(positions=[-1.0])], + ) + replacement = JointTrajectory( + joint_names=["arm/joint1"], + points=[TrajectoryPoint(positions=[-1.0])], + ) - assert final is not None - assert final.positions == pytest.approx([1.0]) - assert task.get_state() == TrajectoryState.COMPLETED + task.execute(first, {}) + task.execute(other, {}) + before = task.compute(CoordinatorState(joints=state, t_now=1.0, dt=0.1)) + assert before is not None + assert before.positions == [pytest.approx(0.1), pytest.approx(-0.1)] + + assert task.execute(replacement, {}).status is TrajectoryExecutionStatus.ACCEPTED + after = task.compute(CoordinatorState(joints=state, t_now=1.1, dt=0.1)) + assert after is not None + assert after.positions == [pytest.approx(0.0), pytest.approx(-0.2)] def test_cancel_trajectory(self, trajectory_task, simple_trajectory): trajectory_task.execute(simple_trajectory, trajectory_start_positions(simple_trajectory)) diff --git a/dimos/control/test_coordinator_commands.py b/dimos/control/test_coordinator_commands.py index 65a71d7379..43c7f0bd14 100644 --- a/dimos/control/test_coordinator_commands.py +++ b/dimos/control/test_coordinator_commands.py @@ -336,12 +336,11 @@ def test_reports_command_signatures(self, coordinator): assert desc["commands"]["cancel"]["params"] == [] assert desc["streams"] == [] - def test_reports_stream_routes(self, coordinator): - # servo declares no commands but consumes joint_command. - task = CommandRecordingTask("servo1") - coordinator.add_task(task, task_type="servo") + def test_reports_velocity_stream_route(self, coordinator): + task = CommandRecordingTask("velocity1") + coordinator.add_task(task, task_type="velocity") - desc = coordinator.describe_task("servo1") + desc = coordinator.describe_task("velocity1") assert desc["commands"] == {} assert desc["streams"] == [("joint_command", "claim_overlap")] diff --git a/dimos/control/test_coordinator_routing.py b/dimos/control/test_coordinator_routing.py index 810b0f79bb..cd8a5794e9 100644 --- a/dimos/control/test_coordinator_routing.py +++ b/dimos/control/test_coordinator_routing.py @@ -39,9 +39,11 @@ import dimos.control.coordinator as coord_mod from dimos.control.coordinator import ControlCoordinator, TaskConfig from dimos.control.tasks.registry import control_task_registry -from dimos.control.tasks.servo_task.servo_task import JointServoTask, JointServoTaskConfig -from dimos.control.tasks.trajectory_task.trajectory_task import JOINT_TRAJECTORY_TASK_NAME -from dimos.control.teleop_coordinator import TeleopControlCoordinator +from dimos.control.tasks.trajectory_task.trajectory_task import ( + JOINT_TRAJECTORY_TASK_NAME, + JointTrajectoryTask, + JointTrajectoryTaskConfig, +) from dimos.core.stream import In from dimos.hardware.drive_trains.registry import twist_base_adapter_registry from dimos.msgs.geometry_msgs.PoseStamped import PoseStamped @@ -147,7 +149,11 @@ def make( def _streaming_coordinator(make_coordinator): coordinator, taps = make_coordinator( tasks=[ - TaskConfig(name="servo1", type="servo", joint_names=ARM_JOINTS), + TaskConfig( + name=JOINT_TRAJECTORY_TASK_NAME, + type="trajectory", + joint_names=ARM_JOINTS, + ), TaskConfig(name="vel1", type="velocity", joint_names=ARM_JOINTS), ] ) @@ -156,12 +162,15 @@ def _streaming_coordinator(make_coordinator): class TestJointCommandRouting: - def test_position_only_updates_servo_task(self, make_coordinator): + def test_position_only_updates_trajectory_task(self, make_coordinator): coordinator, taps = _streaming_coordinator(make_coordinator) taps["joint_command"].emit(JointState(name=ARM_JOINTS, position=[0.1, 0.2])) - assert coordinator.get_task("servo1")._target == [0.1, 0.2] + assert coordinator.get_task(JOINT_TRAJECTORY_TASK_NAME)._trajectory.points[-1].positions == [ + 0.1, + 0.2, + ] assert coordinator.get_task("vel1")._velocities is None def test_velocity_only_updates_velocity_task(self, make_coordinator): @@ -170,7 +179,7 @@ def test_velocity_only_updates_velocity_task(self, make_coordinator): taps["joint_command"].emit(JointState(name=ARM_JOINTS, velocity=[0.5, 0.6])) assert coordinator.get_task("vel1")._velocities == [0.5, 0.6] - assert coordinator.get_task("servo1")._target is None + assert coordinator.get_task(JOINT_TRAJECTORY_TASK_NAME)._trajectory is None def test_position_wins_when_both_present(self, make_coordinator): coordinator, taps = _streaming_coordinator(make_coordinator) @@ -179,7 +188,10 @@ def test_position_wins_when_both_present(self, make_coordinator): JointState(name=ARM_JOINTS, position=[0.1, 0.2], velocity=[0.5, 0.6]) ) - assert coordinator.get_task("servo1")._target == [0.1, 0.2] + assert coordinator.get_task(JOINT_TRAJECTORY_TASK_NAME)._trajectory.points[-1].positions == [ + 0.1, + 0.2, + ] assert coordinator.get_task("vel1")._velocities is None def test_unclaimed_joints_route_to_nobody(self, make_coordinator): @@ -187,7 +199,7 @@ def test_unclaimed_joints_route_to_nobody(self, make_coordinator): taps["joint_command"].emit(JointState(name=["other/joint9"], position=[1.0])) - assert coordinator.get_task("servo1")._target is None + assert coordinator.get_task(JOINT_TRAJECTORY_TASK_NAME)._trajectory is None assert coordinator.get_task("vel1")._velocities is None def test_empty_message_routes_to_nobody(self, make_coordinator): @@ -195,7 +207,7 @@ def test_empty_message_routes_to_nobody(self, make_coordinator): taps["joint_command"].emit(JointState(name=[], position=[])) - assert coordinator.get_task("servo1")._target is None + assert coordinator.get_task(JOINT_TRAJECTORY_TASK_NAME)._trajectory is None assert coordinator.get_task("vel1")._velocities is None @@ -521,7 +533,7 @@ def pump() -> None: class TestSubscriptionLifecycle: - def test_streams_without_consumers_are_not_subscribed(self, make_coordinator): + def test_trajectory_task_subscribes_only_joint_command(self, make_coordinator): coordinator, taps = make_coordinator( tasks=[ TaskConfig( @@ -533,25 +545,36 @@ def test_streams_without_consumers_are_not_subscribed(self, make_coordinator): ) coordinator.start() - for stream in STREAMS: + assert taps["joint_command"].subscribed + for stream in set(STREAMS) - {"joint_command"}: assert not taps[stream].subscribed, stream def test_missing_transport_warns_and_start_completes(self, make_coordinator): coordinator, taps = make_coordinator( fail_streams=("joint_command",), - tasks=[TaskConfig(name="servo1", type="servo", joint_names=ARM_JOINTS)], + tasks=[ + TaskConfig( + name=JOINT_TRAJECTORY_TASK_NAME, + type="trajectory", + joint_names=ARM_JOINTS, + ) + ], ) coordinator.start() - assert coordinator.get_task("servo1") is not None + assert coordinator.get_task(JOINT_TRAJECTORY_TASK_NAME) is not None assert not taps["joint_command"].subscribed def test_stop_unsubscribes_all_streams(self, make_coordinator): coordinator, taps = make_coordinator( hardware=[_base_component()], tasks=[ - TaskConfig(name="servo1", type="servo", joint_names=ARM_JOINTS), + TaskConfig( + name=JOINT_TRAJECTORY_TASK_NAME, + type="trajectory", + joint_names=ARM_JOINTS, + ), TaskConfig(name="vel1", type="velocity", joint_names=ARM_JOINTS), ], ) @@ -636,18 +659,18 @@ def test_bare_add_task_gets_no_stream_routing(self, make_coordinator): taps["joint_command"].emit(JointState(name=ARM_JOINTS, position=[0.1, 0.2])) - assert coordinator.get_task("servo1")._target == [0.1, 0.2] + assert coordinator.get_task(JOINT_TRAJECTORY_TASK_NAME)._trajectory is not None assert bare.position_targets == [] def test_remove_task_prunes_its_routes(self, make_coordinator): coordinator, taps = _streaming_coordinator(make_coordinator) - servo = coordinator.get_task("servo1") - assert coordinator.remove_task("servo1") + trajectory = coordinator.get_task(JOINT_TRAJECTORY_TASK_NAME) + assert coordinator.remove_task(JOINT_TRAJECTORY_TASK_NAME) taps["joint_command"].emit(JointState(name=ARM_JOINTS, position=[0.1, 0.2])) taps["joint_command"].emit(JointState(name=ARM_JOINTS, velocity=[0.5, 0.6])) - assert servo._target is None + assert trajectory._trajectory is None assert coordinator.get_task("vel1")._velocities == [0.5, 0.6] def test_runtime_add_task_with_type_activates_routing(self, make_coordinator): @@ -655,12 +678,13 @@ def test_runtime_add_task_with_type_activates_routing(self, make_coordinator): coordinator.start() assert not taps["joint_command"].subscribed - task = JointServoTask("servo_rt", JointServoTaskConfig(joint_names=ARM_JOINTS)) - assert coordinator.add_task(task, task_type="servo") + task = JointTrajectoryTask(JointTrajectoryTaskConfig(joint_names=ARM_JOINTS)) + assert coordinator.add_task(task, task_type="trajectory") assert taps["joint_command"].subscribed taps["joint_command"].emit(JointState(name=ARM_JOINTS, position=[0.3, 0.4])) - assert task._target == [0.3, 0.4] + assert task._trajectory is not None + assert task._trajectory.points[-1].positions == [0.3, 0.4] def test_runtime_registered_card_routes_with_zero_coordinator_edits( self, make_coordinator, probe_card_type @@ -713,14 +737,18 @@ def test_dispatch_isolates_raising_handler_from_siblings( def test_removing_last_consumer_unsubscribes_stream(self, make_coordinator): coordinator, taps = make_coordinator( tasks=[ - TaskConfig(name="servo1", type="servo", joint_names=ARM_JOINTS), + TaskConfig( + name=JOINT_TRAJECTORY_TASK_NAME, + type="trajectory", + joint_names=ARM_JOINTS, + ), TaskConfig(name="vel1", type="velocity", joint_names=ARM_JOINTS), ] ) coordinator.start() assert taps["joint_command"].subscribed - assert coordinator.remove_task("servo1") + assert coordinator.remove_task(JOINT_TRAJECTORY_TASK_NAME) taps["joint_command"].unsub.assert_not_called() # vel1 still consumes assert coordinator.remove_task("vel1") @@ -743,9 +771,7 @@ def test_no_stream_bind_keeps_card_named_ports(self, make_coordinator): # The default path: routes are keyed by the card's own stream name. coordinator, _ = _streaming_coordinator(make_coordinator) - assert coordinator.describe_task("servo1")["streams"] == [ - ("joint_command", "claim_overlap") - ] + assert coordinator.describe_task(JOINT_TRAJECTORY_TASK_NAME)["streams"] == [] def test_cardless_known_type_does_not_warn(self, make_coordinator, mocker): warn = mocker.patch.object(coord_mod.logger, "warning") diff --git a/dimos/control/test_joint_limits.py b/dimos/control/test_joint_limits.py deleted file mode 100644 index fdf2a6847a..0000000000 --- a/dimos/control/test_joint_limits.py +++ /dev/null @@ -1,53 +0,0 @@ -# Copyright 2026 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from types import SimpleNamespace - -import pytest - -from dimos.control.components import HardwareComponent, HardwareType -from dimos.control.joint_limits import resolve_velocity_limits -from dimos.hardware.manipulators.spec import JointLimits - - -def test_resolver_uses_adapter_limits_scale_and_component_override() -> None: - component = HardwareComponent( - hardware_id="arm", - hardware_type=HardwareType.MANIPULATOR, - joints=["arm/j1", "arm/j2"], - gripper_joints=["arm/gripper"], - joint_velocity_limits={"arm/j2": 2.0, "arm/gripper": 0.4}, - ) - adapter = SimpleNamespace( - get_limits=lambda: JointLimits( - position_lower=[-1.0, -1.0], - position_upper=[1.0, 1.0], - velocity_max=[4.0, 5.0], - ) - ) - connected = SimpleNamespace(component=component, adapter=adapter) - - resolved = resolve_velocity_limits( - ["arm/j1", "arm/j2", "arm/gripper"], - {"arm": connected}, - speed_scale=0.5, - ) - - assert resolved == {"arm/j1": 2.0, "arm/j2": 1.0, "arm/gripper": 0.2} - - -@pytest.mark.parametrize("speed_scale", [0.0, -1.0, 1.1, float("inf"), float("nan")]) -def test_resolver_rejects_invalid_speed_scale(speed_scale: float) -> None: - with pytest.raises(ValueError, match="speed_scale"): - resolve_velocity_limits([], {}, speed_scale=speed_scale) diff --git a/dimos/control/test_per_robot_joint_states.py b/dimos/control/test_per_robot_joint_states.py index 8723957b48..bfec8d9f6f 100644 --- a/dimos/control/test_per_robot_joint_states.py +++ b/dimos/control/test_per_robot_joint_states.py @@ -350,21 +350,22 @@ def test_subclass_serves_its_own_input_and_outputs_together( hardware=[_left(), _right()], tasks=[ TaskConfig( - name="servo_left", - type="servo", + name="joint_trajectory", + type="trajectory", joint_names=LEFT_JOINTS, - stream_bind={"joint_command": "left_arm_command"}, ) ], ) - commands = InTap(mocker, coordinator.left_arm_command) + commands = InTap(mocker, coordinator.joint_command) left = OutTap(coordinator.left_arm_joints) right = OutTap(coordinator.right_arm_joints) coordinator.start() commands.emit(JointState(name=LEFT_JOINTS, position=[0.4, 0.5])) - assert coordinator.get_task("servo_left")._target == [0.4, 0.5] + trajectory = coordinator.get_task("joint_trajectory")._trajectory + assert trajectory is not None + assert trajectory.points[-1].positions == [0.4, 0.5] wait_until(lambda: bool(left.count and right.count), timeout=5.0) assert list(left.latest().name) == LEFT_JOINTS assert list(right.latest().name) == RIGHT_JOINTS diff --git a/dimos/robot/all_blueprints.py b/dimos/robot/all_blueprints.py index 93fcd0c00a..9ac4bbfbc2 100644 --- a/dimos/robot/all_blueprints.py +++ b/dimos/robot/all_blueprints.py @@ -33,12 +33,12 @@ "coordinator-openyam": "dimos.robot.manipulators.openyam.blueprints.basic:coordinator_openyam", "coordinator-piper": "dimos.robot.manipulators.piper.blueprints.basic:coordinator_piper", "coordinator-piper-xarm": "dimos.robot.manipulators.common.mixed:coordinator_piper_xarm", - "coordinator-servo-xarm6": "dimos.robot.manipulators.xarm.blueprints.teleop:coordinator_servo_xarm6", "coordinator-teleop-a1z": "dimos.robot.manipulators.a1z.blueprints.teleop:coordinator_teleop_a1z", "coordinator-teleop-dual": "dimos.robot.manipulators.common.mixed:coordinator_teleop_dual", "coordinator-teleop-piper": "dimos.robot.manipulators.piper.blueprints.teleop:coordinator_teleop_piper", "coordinator-teleop-xarm6": "dimos.robot.manipulators.xarm.blueprints.teleop:coordinator_teleop_xarm6", "coordinator-teleop-xarm7": "dimos.robot.manipulators.xarm.blueprints.teleop:coordinator_teleop_xarm7", + "coordinator-trajectory-xarm6": "dimos.robot.manipulators.xarm.blueprints.teleop:coordinator_trajectory_xarm6", "coordinator-velocity-xarm6": "dimos.robot.manipulators.xarm.blueprints.teleop:coordinator_velocity_xarm6", "coordinator-xarm6": "dimos.robot.manipulators.xarm.blueprints.basic:coordinator_xarm6", "coordinator-xarm7": "dimos.robot.manipulators.xarm.blueprints.basic:coordinator_xarm7", diff --git a/dimos/robot/manipulators/common/blueprints.py b/dimos/robot/manipulators/common/blueprints.py index cee7cd1898..5c9d25c501 100644 --- a/dimos/robot/manipulators/common/blueprints.py +++ b/dimos/robot/manipulators/common/blueprints.py @@ -49,7 +49,7 @@ def trajectory_task( ) -> TaskConfig: hardware_components = (hardware, *additional_hardware) return joint_trajectory_task( - [joint_name for component in hardware_components for joint_name in component.joints], + [joint_name for component in hardware_components for joint_name in component.all_joints], priority=priority, start_position_tolerance=start_position_tolerance, ) diff --git a/dimos/robot/manipulators/xarm/blueprints/teleop.py b/dimos/robot/manipulators/xarm/blueprints/teleop.py index 98c76624c3..1555facbf3 100644 --- a/dimos/robot/manipulators/xarm/blueprints/teleop.py +++ b/dimos/robot/manipulators/xarm/blueprints/teleop.py @@ -110,15 +110,10 @@ gripper=True, ) -coordinator_servo_xarm6 = ControlCoordinator.blueprint( +coordinator_trajectory_xarm6 = ControlCoordinator.blueprint( hardware=[_xarm6_control_hw], tasks=[ - TaskConfig( - name="servo_arm", - type="servo", - joint_names=_xarm6_control_hw.joints, - priority=10, - ), + trajectory_task(_xarm6_control_hw), ], ) @@ -137,12 +132,7 @@ coordinator_combined_xarm6 = ControlCoordinator.blueprint( hardware=[_xarm6_control_hw], tasks=[ - TaskConfig( - name="servo_arm", - type="servo", - joint_names=_xarm6_control_hw.joints, - priority=10, - ), + trajectory_task(_xarm6_control_hw), TaskConfig( name="velocity_arm", type="velocity", diff --git a/dimos/robot/test_all_blueprints.py b/dimos/robot/test_all_blueprints.py index d07b1fbcd3..8aa1313977 100644 --- a/dimos/robot/test_all_blueprints.py +++ b/dimos/robot/test_all_blueprints.py @@ -42,7 +42,7 @@ "coordinator-mock-twist-base", "coordinator-openarm", "coordinator-piper", - "coordinator-servo-xarm6", + "coordinator-trajectory-xarm6", "coordinator-teleop-dual", "coordinator-teleop-piper", "coordinator-teleop-xarm6", diff --git a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_coordinator.py b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_coordinator.py index 33a6b80c01..35408e812b 100644 --- a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_coordinator.py +++ b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_coordinator.py @@ -23,14 +23,14 @@ import os from dimos.control.components import HardwareComponent, HardwareType, make_humanoid_joints -from dimos.control.coordinator import ControlCoordinator, TaskConfig +from dimos.control.coordinator import ControlCoordinator +from dimos.control.tasks.trajectory_task.trajectory_task import joint_trajectory_task from dimos.core.coordination.blueprints import autoconnect from dimos.core.stream import Out from dimos.core.transport import LCMTransport from dimos.msgs.sensor_msgs.Imu import Imu from dimos.msgs.sensor_msgs.JointState import JointState from dimos.msgs.sensor_msgs.MotorCommandArray import MotorCommandArray -from dimos.robot.unitree.g1.joint_limits import g1_velocity_limits from dimos.robot.unitree.g1.wholebody_connection import G1WholeBodyConnection _g1_joints = make_humanoid_joints("g1") @@ -57,15 +57,12 @@ class _G1Coordinator(ControlCoordinator): hardware_type=HardwareType.WHOLE_BODY, joints=_g1_joints, adapter_type="transport_lcm", - joint_velocity_limits=g1_velocity_limits(), ), ], tasks=[ - TaskConfig( - name="servo_g1", - type="servo", - joint_names=_g1_joints, - priority=10, + joint_trajectory_task( + _g1_joints, + velocity_limits={name: 1.0 for name in _g1_joints}, ), ], ), diff --git a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_groot_wbc.py b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_groot_wbc.py index 2992b4184c..8d7b9f6cc8 100644 --- a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_groot_wbc.py +++ b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_groot_wbc.py @@ -22,15 +22,14 @@ start; activate explicitly through ControlCoordinator RPC after verifying commands. The policy ramps from the current pose to its bent-knee default over 10 s before taking torque control. The 14 arm - joints are held at the relaxed GR00T-trained default via a lower-priority - servo task. + joints accept bounded position commands through the lower-priority joint + trajectory task. Sim (``--simulation``): MujocoSimModule (in-process MuJoCo + SHM) + sim_mujoco_g1 adapter. 50 Hz tick (matches the rate the policy was trained at). No arming - ramp and no dry-run. The 14 arm joints are still held with the same - lower-priority servo task as hardware so headless and viewer runs do not - depend on incidental startup timing. + ramp and no dry-run. The same bounded arm-command path is available in + simulation and on hardware. Usage: dimos run unitree-g1-groot-wbc # real hardware @@ -52,13 +51,13 @@ from dimos.control.components import HardwareComponent, HardwareType from dimos.control.coordinator import ControlCoordinator, TaskConfig from dimos.control.tasks.g1_groot_wbc_task.g1_groot_wbc_task import ( - ARM_DEFAULT_POSE, G1_GROOT_KD, G1_GROOT_KP, g1_arms, g1_joints, g1_legs_waist, ) +from dimos.control.tasks.trajectory_task.trajectory_task import joint_trajectory_task from dimos.core.coordination.blueprints import autoconnect from dimos.core.global_config import global_config from dimos.core.stream import Out @@ -80,7 +79,6 @@ g1_urdf_joint_state, g1_urdf_static_robot, ) -from dimos.robot.unitree.g1.joint_limits import g1_velocity_limits from dimos.simulation.scene_assets.spec import ScenePackage from dimos.utils.data import LfsPath from dimos.visualization.rerun.scene_package import scene_package_static_entities @@ -279,13 +277,10 @@ def _precomposed_g1_scene(package: ScenePackage) -> Path | None: _default_ramp_seconds = 0.0 _decimation: int | None = 1 _n_workers = 2 # sim: keep the default worker count - _arm_holder = TaskConfig( - name="servo_arms", - type="servo", - joint_names=g1_arms, + _arm_holder = joint_trajectory_task( + g1_arms, priority=10, - auto_start=True, - params={"default_positions": ARM_DEFAULT_POSE}, + velocity_limits={name: 1.0 for name in g1_arms}, ) _mapper = VoxelGridMapper.blueprint(emit_every=1) _nav_stack = autoconnect( @@ -328,17 +323,10 @@ def _precomposed_g1_scene(package: ScenePackage) -> Path | None: _decimation = 2 # 100 Hz tick / 2 = 50 Hz policy (training + sim rate). # One process per heavy module; fewer workers starve the Rerun bridge. _n_workers = 10 - # Real hardware needs the arms held -- kd damping alone would let - # them sag toward singular configurations between trajectories. The hold - # starts from the measured pose, not ARM_DEFAULT_POSE, so taking ownership - # produces no commanded arm motion on the first tick. - _arm_holder = TaskConfig( - name="servo_arms", - type="servo", - joint_names=g1_arms, + _arm_holder = joint_trajectory_task( + g1_arms, priority=10, - auto_start=True, - params={"hold_measured_on_start": True}, + velocity_limits={name: 1.0 for name in g1_arms}, ) # Same nav middle as unitree-g1-nav-simple, fed by Point-LIO from the # MID-360, executed through the coordinator's twist_command. @@ -503,7 +491,6 @@ def _viewer() -> Any: adapter_type=_adapter_type, address=_adapter_address, wb_config=WholeBodyConfig(kp=tuple(G1_GROOT_KP), kd=tuple(G1_GROOT_KD)), - joint_velocity_limits=g1_velocity_limits(), ), ], tasks=[ diff --git a/dimos/robot/unitree/g1/joint_limits.py b/dimos/robot/unitree/g1/joint_limits.py deleted file mode 100644 index c0bca97df3..0000000000 --- a/dimos/robot/unitree/g1/joint_limits.py +++ /dev/null @@ -1,38 +0,0 @@ -# Copyright 2026 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Physical G1 joint limits from the bundled robot description.""" - -from functools import cache -from pathlib import Path -import xml.etree.ElementTree as ET - - -@cache -def _g1_velocity_limit_items() -> tuple[tuple[str, float], ...]: - root = ET.parse(Path(__file__).with_name("g1.urdf")).getroot() - limits: dict[str, float] = {} - for joint in root.findall("joint"): - name = joint.get("name", "") - limit = joint.find("limit") - velocity = None if limit is None else limit.get("velocity") - if not name.endswith("_joint") or velocity is None: - continue - limits[name.removesuffix("_joint")] = float(velocity) - return tuple(limits.items()) - - -def g1_velocity_limits(hardware_id: str = "g1") -> dict[str, float]: - """Return URDF velocity limits in coordinator joint-name form.""" - return {f"{hardware_id}/{name}": velocity for name, velocity in _g1_velocity_limit_items()} diff --git a/dimos/robot/unitree/g1/test_joint_limits.py b/dimos/robot/unitree/g1/test_joint_limits.py deleted file mode 100644 index 68a7310aea..0000000000 --- a/dimos/robot/unitree/g1/test_joint_limits.py +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright 2026 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from dimos.robot.unitree.g1.joint_limits import g1_velocity_limits - - -def test_g1_velocity_limits_cover_all_controlled_joints() -> None: - limits = g1_velocity_limits() - - assert len(limits) == 29 - assert limits["g1/left_shoulder_pitch"] == 37.0 - assert limits["g1/right_wrist_yaw"] == 22.0 diff --git a/dimos/robot/unitree/g1/test_wholebody_connection.py b/dimos/robot/unitree/g1/test_wholebody_connection.py index 9b918c47cd..35c41badab 100644 --- a/dimos/robot/unitree/g1/test_wholebody_connection.py +++ b/dimos/robot/unitree/g1/test_wholebody_connection.py @@ -14,7 +14,7 @@ from __future__ import annotations -from contextlib import contextmanager +from collections.abc import Iterator from types import SimpleNamespace from pydantic import ValidationError @@ -29,8 +29,8 @@ ) -@contextmanager -def _connection(): +@pytest.fixture +def connection() -> Iterator[G1WholeBodyConnection]: connection = G1WholeBodyConnection() try: yield connection @@ -77,54 +77,50 @@ def _command(): ) -def test_soft_start_is_damping_first(): - with _connection() as connection: - publisher = _wire(connection, soft_start_seconds=1000.0) +def test_soft_start_is_damping_first(connection: G1WholeBodyConnection): + publisher = _wire(connection, soft_start_seconds=1000.0) - connection._on_motor_command(_command()) + connection._on_motor_command(_command()) - q, dq, kp, kd, tau = publisher.frames[0][0] - # First frame: target and damping pass through, stiffness and tau do not — - # this is what keeps taking control from slamming the robot. - assert q == 1.0 - assert kd == 5.0 - assert kp < 1.0 - assert abs(tau) < 0.1 + q, dq, kp, kd, tau = publisher.frames[0][0] + # First frame: target and damping pass through, stiffness and tau do not — + # this is what keeps taking control from slamming the robot. + assert q == 1.0 + assert kd == 5.0 + assert kp < 1.0 + assert abs(tau) < 0.1 -def test_stiffness_ramps_to_full(): - with _connection() as connection: - publisher = _wire(connection, soft_start_seconds=0.05) +def test_stiffness_ramps_to_full(connection: G1WholeBodyConnection): + publisher = _wire(connection, soft_start_seconds=0.05) - connection._on_motor_command(_command()) - # Rewind the clock instead of sleeping through the window. - connection._soft_start_t0 -= 1.0 - connection._on_motor_command(_command()) + connection._on_motor_command(_command()) + # Rewind the clock instead of sleeping through the window. + connection._soft_start_t0 -= 1.0 + connection._on_motor_command(_command()) - _q, _dq, kp, kd, tau = publisher.frames[-1][0] - assert kp == 100.0 - assert kd == 5.0 - assert tau == 8.0 + _q, _dq, kp, kd, tau = publisher.frames[-1][0] + assert kp == 100.0 + assert kd == 5.0 + assert tau == 8.0 -def test_soft_start_disabled_passes_through(): - with _connection() as connection: - publisher = _wire(connection, soft_start_seconds=0.0) +def test_soft_start_disabled_passes_through(connection: G1WholeBodyConnection): + publisher = _wire(connection, soft_start_seconds=0.0) - connection._on_motor_command(_command()) + connection._on_motor_command(_command()) - _q, _dq, kp, _kd, tau = publisher.frames[0][0] - assert kp == 100.0 - assert tau == 8.0 + _q, _dq, kp, _kd, tau = publisher.frames[0][0] + assert kp == 100.0 + assert tau == 8.0 -def test_wrong_joint_count_is_dropped(): - with _connection() as connection: - publisher = _wire(connection, soft_start_seconds=0.0) +def test_wrong_joint_count_is_dropped(connection: G1WholeBodyConnection): + publisher = _wire(connection, soft_start_seconds=0.0) - connection._on_motor_command(MotorCommandArray(q=[0.0] * 5)) + connection._on_motor_command(MotorCommandArray(q=[0.0] * 5)) - assert publisher.frames == [] + assert publisher.frames == [] @pytest.mark.parametrize("value", [float("inf"), float("-inf"), float("nan")]) diff --git a/dimos/robot/unitree/g1/wholebody_connection.py b/dimos/robot/unitree/g1/wholebody_connection.py index 4a3ea23c86..2f185d62e8 100644 --- a/dimos/robot/unitree/g1/wholebody_connection.py +++ b/dimos/robot/unitree/g1/wholebody_connection.py @@ -385,7 +385,10 @@ def _soft_start_scale(self, now: float) -> float: return 1.0 if self._soft_start_t0 is None: self._soft_start_t0 = now - logger.info(f"Soft-start: full damping now, stiffness ramping in over {duration:.1f}s") + logger.info( + "Soft-start: full damping now, stiffness ramping in", + duration_seconds=duration, + ) scale = min(1.0, (now - self._soft_start_t0) / duration) if scale >= 1.0 and not self._soft_start_done: self._soft_start_done = True From 75534a09f1a59713c94b98472aea1599e261101f Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Sat, 22 Aug 2026 04:04:41 +0000 Subject: [PATCH 21/57] [autofix.ci] apply automated fixes --- dimos/control/tasks/trajectory_task/trajectory_task.py | 4 +++- dimos/control/test_control.py | 4 +--- dimos/control/test_coordinator_routing.py | 8 ++++++-- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/dimos/control/tasks/trajectory_task/trajectory_task.py b/dimos/control/tasks/trajectory_task/trajectory_task.py index 2e0ca3dd4b..064afed6cf 100644 --- a/dimos/control/tasks/trajectory_task/trajectory_task.py +++ b/dimos/control/tasks/trajectory_task/trajectory_task.py @@ -210,7 +210,9 @@ def __init__(self, config: JointTrajectoryTaskConfig) -> None: else: if set(configured_limits) != self._joint_names: raise ValueError("velocity_limits must name every configured trajectory joint") - if any(not math.isfinite(value) or value <= 0.0 for value in configured_limits.values()): + if any( + not math.isfinite(value) or value <= 0.0 for value in configured_limits.values() + ): raise ValueError("velocity_limits must be finite and positive") self._velocity_limits = dict(configured_limits) diff --git a/dimos/control/test_control.py b/dimos/control/test_control.py index 135a0169cf..72a199d94c 100644 --- a/dimos/control/test_control.py +++ b/dimos/control/test_control.py @@ -812,9 +812,7 @@ def test_replacement_anchors_at_bounded_command_and_preserves_other_joints(self) velocity_limits={"arm/joint1": 1.0, "arm/joint2": 1.0}, ) ) - state = JointStateSnapshot( - joint_positions={"arm/joint1": 0.0, "arm/joint2": 0.0} - ) + state = JointStateSnapshot(joint_positions={"arm/joint1": 0.0, "arm/joint2": 0.0}) first = JointTrajectory( joint_names=["arm/joint1"], points=[TrajectoryPoint(positions=[1.0])], diff --git a/dimos/control/test_coordinator_routing.py b/dimos/control/test_coordinator_routing.py index cd8a5794e9..02475baf60 100644 --- a/dimos/control/test_coordinator_routing.py +++ b/dimos/control/test_coordinator_routing.py @@ -167,7 +167,9 @@ def test_position_only_updates_trajectory_task(self, make_coordinator): taps["joint_command"].emit(JointState(name=ARM_JOINTS, position=[0.1, 0.2])) - assert coordinator.get_task(JOINT_TRAJECTORY_TASK_NAME)._trajectory.points[-1].positions == [ + assert coordinator.get_task(JOINT_TRAJECTORY_TASK_NAME)._trajectory.points[ + -1 + ].positions == [ 0.1, 0.2, ] @@ -188,7 +190,9 @@ def test_position_wins_when_both_present(self, make_coordinator): JointState(name=ARM_JOINTS, position=[0.1, 0.2], velocity=[0.5, 0.6]) ) - assert coordinator.get_task(JOINT_TRAJECTORY_TASK_NAME)._trajectory.points[-1].positions == [ + assert coordinator.get_task(JOINT_TRAJECTORY_TASK_NAME)._trajectory.points[ + -1 + ].positions == [ 0.1, 0.2, ] From 51bb52669ce5f002cb1b94b784e99e80ac031e4a Mon Sep 17 00:00:00 2001 From: cc Date: Tue, 25 Aug 2026 13:36:13 -0700 Subject: [PATCH 22/57] fix(control): wait for whole-body feedback before commands --- dimos/control/hardware_interface.py | 8 ++++ dimos/control/test_control.py | 64 ++++++++++++++++++++++++++++- dimos/control/tick_loop.py | 6 +++ 3 files changed, 77 insertions(+), 1 deletion(-) diff --git a/dimos/control/hardware_interface.py b/dimos/control/hardware_interface.py index 546b11626a..1e14419e43 100644 --- a/dimos/control/hardware_interface.py +++ b/dimos/control/hardware_interface.py @@ -98,6 +98,10 @@ def disconnect(self) -> None: """Disconnect the underlying adapter.""" self._adapter.disconnect() + def ready_for_control(self) -> bool: + """Whether state is available and control commands may be sent.""" + return True + def read_state(self) -> dict[JointName, JointState]: """Read state as {joint_name: JointState}. @@ -349,6 +353,10 @@ def disconnect(self) -> None: """Disconnect the underlying adapter.""" self._wb_adapter.disconnect() + def ready_for_control(self) -> bool: + """Wait for real motor feedback before exposing state or accepting commands.""" + return self._wb_adapter.has_motor_states() + def read_state(self) -> dict[JointName, JointState]: """Read motor states as {joint_name: JointState}.""" from dimos.control.components import JointState diff --git a/dimos/control/test_control.py b/dimos/control/test_control.py index 72a199d94c..ca59ee5b8c 100644 --- a/dimos/control/test_control.py +++ b/dimos/control/test_control.py @@ -33,7 +33,11 @@ make_twist_base_joints, ) from dimos.control.coordinator import ControlCoordinator, TaskConfig -from dimos.control.hardware_interface import ConnectedHardware, ConnectedTwistBase +from dimos.control.hardware_interface import ( + ConnectedHardware, + ConnectedTwistBase, + ConnectedWholeBody, +) from dimos.control.task import ( BaseControlTask, ControlMode, @@ -57,6 +61,7 @@ from dimos.control.tick_loop import TickLoop from dimos.core.stream import In from dimos.hardware.manipulators.spec import ManipulatorAdapter +from dimos.hardware.whole_body.spec import MotorState, WholeBodyAdapter from dimos.msgs.geometry_msgs.Twist import Twist from dimos.msgs.geometry_msgs.TwistStamped import TwistStamped from dimos.msgs.sensor_msgs.JointState import JointState @@ -980,6 +985,63 @@ def test_non_overlapping_joints(self): class TestTickLoop: + def test_unready_whole_body_is_excluded_from_read_and_write(self, mocker): + adapter = MagicMock(spec=WholeBodyAdapter) + adapter.has_motor_states.return_value = False + component = HardwareComponent( + hardware_id="g1", + hardware_type=HardwareType.WHOLE_BODY, + joints=["g1/joint1"], + ) + hardware = ConnectedWholeBody(adapter, component) + log_error = mocker.patch("dimos.control.tick_loop.logger.error") + tick_loop = TickLoop( + tick_rate=100.0, + hardware={"g1": hardware}, + hardware_lock=threading.Lock(), + tasks={}, + task_lock=threading.Lock(), + joint_to_hardware={"g1/joint1": "g1"}, + ) + + state, per_hardware = tick_loop._read_all_hardware() + imu = tick_loop._read_all_imu() + tick_loop._write_all_hardware({"g1": ({"g1/joint1": 0.25}, ControlMode.SERVO_POSITION)}) + + assert state.joint_positions == {} + assert per_hardware == {} + assert imu == {} + adapter.read_motor_states.assert_not_called() + adapter.read_imu.assert_not_called() + adapter.write_motor_commands.assert_not_called() + log_error.assert_not_called() + + def test_ready_whole_body_reads_and_writes(self): + adapter = MagicMock(spec=WholeBodyAdapter) + adapter.has_motor_states.return_value = True + adapter.read_motor_states.return_value = [MotorState(q=0.5, dq=0.1, tau=0.2)] + adapter.write_motor_commands.return_value = True + component = HardwareComponent( + hardware_id="g1", + hardware_type=HardwareType.WHOLE_BODY, + joints=["g1/joint1"], + ) + hardware = ConnectedWholeBody(adapter, component) + tick_loop = TickLoop( + tick_rate=100.0, + hardware={"g1": hardware}, + hardware_lock=threading.Lock(), + tasks={}, + task_lock=threading.Lock(), + joint_to_hardware={"g1/joint1": "g1"}, + ) + + state, _per_hardware = tick_loop._read_all_hardware() + tick_loop._write_all_hardware({"g1": ({"g1/joint1": 0.25}, ControlMode.SERVO_POSITION)}) + + assert state.joint_positions == {"g1/joint1": 0.5} + adapter.write_motor_commands.assert_called_once() + def test_partial_trajectory_and_gripper_command_share_hardware_write(self, mocker): joint_names = ["arm/joint1", "arm/joint2", "arm/gripper"] adapter = mocker.Mock(spec=ManipulatorAdapter) diff --git a/dimos/control/tick_loop.py b/dimos/control/tick_loop.py index 17e8e962a9..668186922d 100644 --- a/dimos/control/tick_loop.py +++ b/dimos/control/tick_loop.py @@ -217,6 +217,8 @@ def _read_all_hardware( with self._hardware_lock: for hw in self._hardware.values(): + if not hw.ready_for_control(): + continue try: state = hw.read_state() for joint_name, joint_state in state.items(): @@ -250,6 +252,8 @@ def _read_all_imu(self) -> dict[str, IMUState]: for hw_id, hw in self._hardware.items(): if not isinstance(hw, ConnectedWholeBody): continue + if not hw.ready_for_control(): + continue read_imu = getattr(hw.adapter, "read_imu", None) if not callable(read_imu): continue @@ -409,6 +413,8 @@ def _write_all_hardware( with self._hardware_lock: for hw_id, (positions, mode) in hw_commands.items(): if hw_id in hardware: + if not hardware[hw_id].ready_for_control(): + continue try: accepted = hardware[hw_id].write_command(positions, mode) if not accepted: From d4933178157b8f7565bc3c0beb8103d576fa2b6c Mon Sep 17 00:00:00 2001 From: cc Date: Tue, 25 Aug 2026 15:05:38 -0700 Subject: [PATCH 23/57] fix(g1): hold arm positions between trajectories --- .../tasks/trajectory_task/trajectory_task.py | 35 ++++++++++-- dimos/control/test_control.py | 53 +++++++++++++++++++ .../blueprints/basic/unitree_g1_groot_wbc.py | 2 + 3 files changed, 87 insertions(+), 3 deletions(-) diff --git a/dimos/control/tasks/trajectory_task/trajectory_task.py b/dimos/control/tasks/trajectory_task/trajectory_task.py index 064afed6cf..17252a404a 100644 --- a/dimos/control/tasks/trajectory_task/trajectory_task.py +++ b/dimos/control/tasks/trajectory_task/trajectory_task.py @@ -57,6 +57,7 @@ def joint_trajectory_task( priority: int = 10, start_position_tolerance: float = 0.05, velocity_limits: Mapping[str, float] | None = None, + hold_position_when_idle: bool = False, ) -> TaskConfig: """Build the coordinator's single canonical joint-trajectory task.""" # The coordinator imports this module to recognize the canonical JTT. @@ -65,6 +66,8 @@ def joint_trajectory_task( params: dict[str, Any] = {"start_position_tolerance": start_position_tolerance} if velocity_limits is not None: params["velocity_limits"] = dict(velocity_limits) + if hold_position_when_idle: + params["hold_position_when_idle"] = True return TaskConfig( name=JOINT_TRAJECTORY_TASK_NAME, type="trajectory", @@ -138,6 +141,8 @@ class JointTrajectoryTaskConfig: position and the first trajectory point. velocity_limits: Optional positive velocity limit for every configured joint. Defaults to 1 rad/s per joint. + hold_position_when_idle: Keep emitting the last commanded position, + latching measured positions before the first trajectory. """ joint_names: Annotated[ @@ -151,6 +156,7 @@ class JointTrajectoryTaskConfig: allow_inf_nan=False, ) velocity_limits: dict[str, float] | None = None + hold_position_when_idle: bool = False @dataclass @@ -230,7 +236,7 @@ def claim(self) -> ResourceClaim: def is_active(self) -> bool: """Check if task should run this tick.""" - return self._state == TrajectoryState.EXECUTING + return self._config.hold_position_when_idle or self._state == TrajectoryState.EXECUTING def compute(self, state: CoordinatorState) -> JointCommandOutput | None: """Compute trajectory output for this tick. @@ -243,10 +249,31 @@ def compute(self, state: CoordinatorState) -> JointCommandOutput | None: Returns: JointCommandOutput with positions, or None if not executing """ + if self._config.hold_position_when_idle: + for joint_name in self._joint_names_list: + if joint_name in self._commanded_positions: + continue + measured = state.joints.get_position(joint_name) + if measured is not None and math.isfinite(measured): + self._commanded_positions[joint_name] = measured + if not self._motions: - return None + held_names = [ + name for name in self._joint_names_list if name in self._commanded_positions + ] + if not held_names: + return None + return JointCommandOutput( + joint_names=held_names, + positions=[self._commanded_positions[name] for name in held_names], + mode=ControlMode.SERVO_POSITION, + ) - output_names = [name for name in self._joint_names_list if name in self._motions] + output_names = ( + self._joint_names_list + if self._config.hold_position_when_idle + else [name for name in self._joint_names_list if name in self._motions] + ) all_complete = bool(self._motions) for joint_name, (run, index) in list(self._motions.items()): if run.start_time is None: @@ -526,6 +553,7 @@ class JointTrajectoryTaskParams(BaseConfig): allow_inf_nan=False, ) velocity_limits: dict[str, float] | None = None + hold_position_when_idle: bool = False def create_task(cfg: Any, hardware: Any) -> JointTrajectoryTask: @@ -540,5 +568,6 @@ def create_task(cfg: Any, hardware: Any) -> JointTrajectoryTask: priority=cfg.priority, start_position_tolerance=params.start_position_tolerance, velocity_limits=params.velocity_limits, + hold_position_when_idle=params.hold_position_when_idle, ), ) diff --git a/dimos/control/test_control.py b/dimos/control/test_control.py index ca59ee5b8c..35c2e8d1a0 100644 --- a/dimos/control/test_control.py +++ b/dimos/control/test_control.py @@ -522,6 +522,59 @@ def test_initial_state(self, trajectory_task): assert not trajectory_task.is_active() assert trajectory_task.get_state() == TrajectoryState.IDLE + def test_idle_hold_latches_measured_positions(self): + task = JointTrajectoryTask( + JointTrajectoryTaskConfig( + joint_names=["arm/joint1", "arm/joint2"], + hold_position_when_idle=True, + ) + ) + state = JointStateSnapshot( + joint_positions={"arm/joint1": 0.25, "arm/joint2": -0.5} + ) + + output = task.compute(CoordinatorState(joints=state, t_now=1.0, dt=0.1)) + + assert task.is_active() + assert output is not None + assert output.joint_names == ["arm/joint1", "arm/joint2"] + assert output.positions == [0.25, -0.5] + + def test_idle_hold_retains_final_target_after_trajectory(self): + task = JointTrajectoryTask( + JointTrajectoryTaskConfig( + joint_names=["arm/joint1", "arm/joint2"], + start_position_tolerance=2.0, + velocity_limits={"arm/joint1": 10.0, "arm/joint2": 10.0}, + hold_position_when_idle=True, + ) + ) + trajectory = JointTrajectory( + joint_names=["arm/joint1"], + points=[ + TrajectoryPoint( + positions=[1.0], + velocities=[0.0], + time_from_start=0.0, + ) + ], + ) + state = JointStateSnapshot( + joint_positions={"arm/joint1": 0.0, "arm/joint2": -0.5} + ) + assert ( + task.execute(trajectory, {"arm/joint1": 0.0}).status + is TrajectoryExecutionStatus.ACCEPTED + ) + + completed = task.compute(CoordinatorState(joints=state, t_now=1.0, dt=0.1)) + held = task.compute(CoordinatorState(joints=state, t_now=1.1, dt=0.1)) + + assert completed is not None + assert completed.positions == [1.0, -0.5] + assert held is not None + assert held.positions == [1.0, -0.5] + def test_claim(self, trajectory_task): claim = trajectory_task.claim() assert claim.priority == 10 diff --git a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_groot_wbc.py b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_groot_wbc.py index 8d7b9f6cc8..71ed4f8b2e 100644 --- a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_groot_wbc.py +++ b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_groot_wbc.py @@ -281,6 +281,7 @@ def _precomposed_g1_scene(package: ScenePackage) -> Path | None: g1_arms, priority=10, velocity_limits={name: 1.0 for name in g1_arms}, + hold_position_when_idle=True, ) _mapper = VoxelGridMapper.blueprint(emit_every=1) _nav_stack = autoconnect( @@ -327,6 +328,7 @@ def _precomposed_g1_scene(package: ScenePackage) -> Path | None: g1_arms, priority=10, velocity_limits={name: 1.0 for name in g1_arms}, + hold_position_when_idle=True, ) # Same nav middle as unitree-g1-nav-simple, fed by Point-LIO from the # MID-360, executed through the coordinator's twist_command. From 2719158b5f90e5595836a44f78974a83a5130b8e Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Tue, 25 Aug 2026 22:51:20 +0000 Subject: [PATCH 24/57] [autofix.ci] apply automated fixes --- dimos/control/coordinator.py | 3 --- dimos/control/test_control.py | 8 ++------ 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/dimos/control/coordinator.py b/dimos/control/coordinator.py index bce1c43880..a01d327841 100644 --- a/dimos/control/coordinator.py +++ b/dimos/control/coordinator.py @@ -69,9 +69,6 @@ from dimos.msgs.std_msgs.Float32 import Float32 from dimos.msgs.trajectory_msgs.JointTrajectory import JointTrajectory from dimos.msgs.trajectory_msgs.TrajectoryPoint import TrajectoryPoint -from dimos.teleop.quest.quest_types import ( - Buttons, -) from dimos.utils.logging_config import setup_logger if TYPE_CHECKING: diff --git a/dimos/control/test_control.py b/dimos/control/test_control.py index 35c2e8d1a0..7d9e1a0bdf 100644 --- a/dimos/control/test_control.py +++ b/dimos/control/test_control.py @@ -529,9 +529,7 @@ def test_idle_hold_latches_measured_positions(self): hold_position_when_idle=True, ) ) - state = JointStateSnapshot( - joint_positions={"arm/joint1": 0.25, "arm/joint2": -0.5} - ) + state = JointStateSnapshot(joint_positions={"arm/joint1": 0.25, "arm/joint2": -0.5}) output = task.compute(CoordinatorState(joints=state, t_now=1.0, dt=0.1)) @@ -559,9 +557,7 @@ def test_idle_hold_retains_final_target_after_trajectory(self): ) ], ) - state = JointStateSnapshot( - joint_positions={"arm/joint1": 0.0, "arm/joint2": -0.5} - ) + state = JointStateSnapshot(joint_positions={"arm/joint1": 0.0, "arm/joint2": -0.5}) assert ( task.execute(trajectory, {"arm/joint1": 0.0}).status is TrajectoryExecutionStatus.ACCEPTED From 910e90d705c2c1fc9116acdf56f2f130226cf3fd Mon Sep 17 00:00:00 2001 From: cc Date: Tue, 25 Aug 2026 16:07:47 -0700 Subject: [PATCH 25/57] fix(control): restore contracts lost during stack rebase --- dimos/control/tasks/trajectory_task/trajectory_task.py | 2 ++ dimos/control/test_coordinator_routing.py | 1 + dimos/robot/manipulators/common/blueprints.py | 2 +- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/dimos/control/tasks/trajectory_task/trajectory_task.py b/dimos/control/tasks/trajectory_task/trajectory_task.py index 17252a404a..fc87e9f2f7 100644 --- a/dimos/control/tasks/trajectory_task/trajectory_task.py +++ b/dimos/control/tasks/trajectory_task/trajectory_task.py @@ -258,6 +258,8 @@ def compute(self, state: CoordinatorState) -> JointCommandOutput | None: self._commanded_positions[joint_name] = measured if not self._motions: + if not self._config.hold_position_when_idle: + return None held_names = [ name for name in self._joint_names_list if name in self._commanded_positions ] diff --git a/dimos/control/test_coordinator_routing.py b/dimos/control/test_coordinator_routing.py index 02475baf60..f7045663c8 100644 --- a/dimos/control/test_coordinator_routing.py +++ b/dimos/control/test_coordinator_routing.py @@ -44,6 +44,7 @@ JointTrajectoryTask, JointTrajectoryTaskConfig, ) +from dimos.control.teleop_coordinator import TeleopControlCoordinator from dimos.core.stream import In from dimos.hardware.drive_trains.registry import twist_base_adapter_registry from dimos.msgs.geometry_msgs.PoseStamped import PoseStamped diff --git a/dimos/robot/manipulators/common/blueprints.py b/dimos/robot/manipulators/common/blueprints.py index 5c9d25c501..cee7cd1898 100644 --- a/dimos/robot/manipulators/common/blueprints.py +++ b/dimos/robot/manipulators/common/blueprints.py @@ -49,7 +49,7 @@ def trajectory_task( ) -> TaskConfig: hardware_components = (hardware, *additional_hardware) return joint_trajectory_task( - [joint_name for component in hardware_components for joint_name in component.all_joints], + [joint_name for component in hardware_components for joint_name in component.joints], priority=priority, start_position_tolerance=start_position_tolerance, ) From e1c67b2ca19808a14bc67d5ad6c2b640898701bb Mon Sep 17 00:00:00 2001 From: cc Date: Fri, 14 Aug 2026 14:15:06 -0700 Subject: [PATCH 26/57] feat(g1): add Quest dual-arm teleoperation --- .../g1_groot_wbc_task/g1_groot_wbc_task.py | 6 - dimos/control/test_control.py | 27 ++++ .../coordination/blueprint_config/parser.py | 5 +- .../blueprint_config/test_parser.py | 21 +++ .../coordination/blueprint_config/values.py | 35 ++++ .../planning/kinematics/pink_solver.py | 24 +++ .../planning/kinematics/test_pink_ik.py | 21 +++ dimos/robot/all_blueprints.py | 3 + .../blueprints/basic/unitree_g1_groot_wbc.py | 51 +++++- .../g1/blueprints/basic/unitree_g1_teleop.py | 150 ++++++++++++++++++ dimos/robot/unitree/g1/teleop_ik.py | 68 ++++++++ dimos/robot/unitree/g1/test_g1_teleop.py | 138 ++++++++++++++++ dimos/teleop/quest/quest_extensions.py | 87 +++++++++- dimos/teleop/quest/quest_teleop_module.py | 9 +- .../teleop/quest/test_quest_teleop_module.py | 80 +++++++++- dimos/teleop/quest/web/static/teleop.js | 14 +- pyproject.toml | 4 +- uv.lock | 7 +- 18 files changed, 730 insertions(+), 20 deletions(-) create mode 100644 dimos/robot/unitree/g1/blueprints/basic/unitree_g1_teleop.py create mode 100644 dimos/robot/unitree/g1/teleop_ik.py create mode 100644 dimos/robot/unitree/g1/test_g1_teleop.py diff --git a/dimos/control/tasks/g1_groot_wbc_task/g1_groot_wbc_task.py b/dimos/control/tasks/g1_groot_wbc_task/g1_groot_wbc_task.py index 1fae10de3d..deed610f77 100644 --- a/dimos/control/tasks/g1_groot_wbc_task/g1_groot_wbc_task.py +++ b/dimos/control/tasks/g1_groot_wbc_task/g1_groot_wbc_task.py @@ -125,12 +125,6 @@ 2.0, # right arm ] -# Relaxed arms-down pose. The policy treats all 14 arm defaults as zero. -# Operators can override at runtime by publishing joint targets on the -# arms via the coordinator's joint_command transport. -ARM_DEFAULT_POSE: list[float] = [0.0] * 14 - - # Default joint angles for all 29 G1 joints. The policy treats these as # its zero-offset pose. _DEFAULT_POSITIONS_29 = [ diff --git a/dimos/control/test_control.py b/dimos/control/test_control.py index 7d9e1a0bdf..8bc014e97a 100644 --- a/dimos/control/test_control.py +++ b/dimos/control/test_control.py @@ -253,6 +253,33 @@ def test_write_command(self, connected_hardware, mock_adapter): mock_adapter.write_joint_positions.assert_called() +class TestConnectedWholeBody: + def test_partial_commands_retain_last_targets_for_omitted_joints(self) -> None: + adapter = MagicMock() + adapter.has_motor_states.return_value = True + adapter.read_motor_states.return_value = [ + MotorState(q=0.1), + MotorState(q=0.2), + MotorState(q=0.3), + ] + adapter.write_motor_commands.return_value = True + hardware = ConnectedWholeBody( + adapter, + HardwareComponent( + hardware_id="robot", + hardware_type=HardwareType.WHOLE_BODY, + joints=["robot/leg", "robot/waist", "robot/arm"], + ), + ) + + assert hardware.write_command({"robot/arm": 0.8}, ControlMode.SERVO_POSITION) + assert hardware.write_command({"robot/leg": -0.4}, ControlMode.SERVO_POSITION) + + commands = adapter.write_motor_commands.call_args.args[0] + assert [command.q for command in commands] == [-0.4, 0.2, 0.8] + assert [command.kp for command in commands] == [40.0, 40.0, 40.0] + + @pytest.fixture def make_coordinator() -> Iterator[Callable[..., ControlCoordinator]]: """Factory for real coordinators, all stopped on teardown.""" diff --git a/dimos/core/coordination/blueprint_config/parser.py b/dimos/core/coordination/blueprint_config/parser.py index ce8338ec66..ebfcf51f80 100644 --- a/dimos/core/coordination/blueprint_config/parser.py +++ b/dimos/core/coordination/blueprint_config/parser.py @@ -75,6 +75,7 @@ plain, plain_mapping, snapshot_mapping, + validated_model_values, ) from dimos.core.coordination.blueprints import ( Blueprint, @@ -421,7 +422,7 @@ def _validate_modules( raise BlueprintConfigError( format_validation_error(module.atom.name, error) ) from error - dumped = model.model_dump(mode="python", exclude_unset=True) + dumped = validated_model_values(model, exclude_unset=True) dumped.pop("g", None) dumped.pop("instance_name", None) parsed[module.atom.name] = dumped @@ -463,7 +464,7 @@ def _validate_transports( ) from error if not models: continue - full = models[0].model_dump(mode="python") + full = validated_model_values(models[0]) if raw_overrides: parsed[transport.name] = extract_shape(full, raw_overrides) return parsed diff --git a/dimos/core/coordination/blueprint_config/test_parser.py b/dimos/core/coordination/blueprint_config/test_parser.py index b75ee52707..115cfb6197 100644 --- a/dimos/core/coordination/blueprint_config/test_parser.py +++ b/dimos/core/coordination/blueprint_config/test_parser.py @@ -13,6 +13,7 @@ # limitations under the License. from collections.abc import Callable +from dataclasses import dataclass from pathlib import Path from typing import Annotated, Any, Literal @@ -504,6 +505,26 @@ def test_blueprint_pinned_arbitrary_value_survives_filtering() -> None: assert isinstance(parsed.module_kwargs("arbitrarymodule")["scaling"], Anchor) +def test_blueprint_pinned_callable_dataclass_survives_validation() -> None: + @dataclass + class CallableFactory: + result: str + + def __call__(self, _value: Any) -> str: + return self.result + + factory = CallableFactory(result="rendered") + parsed = BlueprintConfigParser(ArbitraryModule.blueprint(handlers={"visual": factory})).parse( + environ={} + ) + + kwargs = parsed.module_kwargs("arbitrarymodule") + validated = ArbitraryConfig.model_validate(kwargs) + + assert isinstance(validated.handlers["visual"], CallableFactory) + assert validated.handlers["visual"](None) == "rendered" + + def test_format_help_uses_nested_parent_default_instance() -> None: class NestedRequiredConfig(BaseModel): value: int diff --git a/dimos/core/coordination/blueprint_config/values.py b/dimos/core/coordination/blueprint_config/values.py index 39cab50442..c7a6054064 100644 --- a/dimos/core/coordination/blueprint_config/values.py +++ b/dimos/core/coordination/blueprint_config/values.py @@ -55,6 +55,41 @@ def plain(value: Any) -> Any: return _copy_opaque(value) +def validated_model_values(model: BaseModel, *, exclude_unset: bool = False) -> dict[str, Any]: + """Export validated fields while preserving opaque Python values. + + Pydantic's ``model_dump`` expands dataclass instances, including callable + factories, into dictionaries. Module kwargs cross another validation + boundary in their worker process, where those dictionaries no longer + satisfy callable-typed fields. + """ + included = model.model_fields_set if exclude_unset else type(model).model_fields + return { + name: _validated_value(getattr(model, name), exclude_unset=exclude_unset) + for name in type(model).model_fields + if name in included + } + + +def _validated_value(value: Any, *, exclude_unset: bool) -> Any: + if isinstance(value, BaseModel): + return validated_model_values(value, exclude_unset=exclude_unset) + if isinstance(value, Mapping): + return { + _copy_opaque(key): _validated_value(item, exclude_unset=exclude_unset) + for key, item in value.items() + } + if isinstance(value, list): + return [_validated_value(item, exclude_unset=exclude_unset) for item in value] + if isinstance(value, tuple): + return tuple(_validated_value(item, exclude_unset=exclude_unset) for item in value) + if isinstance(value, set): + return {_validated_value(item, exclude_unset=exclude_unset) for item in value} + if isinstance(value, frozenset): + return frozenset(_validated_value(item, exclude_unset=exclude_unset) for item in value) + return _copy_opaque(value) + + def deep_merge(destination: dict[str, Any], incoming: Mapping[str, Any]) -> None: for key, value in incoming.items(): if key in destination and isinstance(destination[key], dict) and isinstance(value, Mapping): diff --git a/dimos/manipulation/planning/kinematics/pink_solver.py b/dimos/manipulation/planning/kinematics/pink_solver.py index c853769dc2..0236cd55ec 100644 --- a/dimos/manipulation/planning/kinematics/pink_solver.py +++ b/dimos/manipulation/planning/kinematics/pink_solver.py @@ -222,6 +222,7 @@ def _build_robot_context( description = prepare_urdf_for_drake(config.model.load(), convert_meshes=False) model = pinocchio.buildModelFromXML(description.xml) + model = _reduce_to_controlled_joints(model, config, controlled_joints) data = model.createData() _assert_base_link_is_model_root(model, config.base_link) frame_id = _get_frame_id(model, frame_name) @@ -275,6 +276,29 @@ def _target_in_model_frame( return target_model +def _reduce_to_controlled_joints( + model: pinocchio.Model, + config: RobotModelConfig, + controlled_joints: Sequence[str] | None, +) -> pinocchio.Model: + """Lock joints outside the solve so IK cannot exploit uncommanded motion.""" + dimos_joint_names = tuple(controlled_joints or config.joint_names) + controlled_joint_ids = { + _get_joint_id(model, config.get_urdf_joint_name(joint_name)) + for joint_name in dimos_joint_names + } + locked_joint_ids = [ + joint_id for joint_id in range(1, len(model.joints)) if joint_id not in controlled_joint_ids + ] + if not locked_joint_ids: + return model + return pinocchio.buildReducedModel( + model, + locked_joint_ids, + np.asarray(pinocchio.neutral(model), dtype=np.float64), + ) + + def _build_joint_mapping( model: pinocchio.Model, config: RobotModelConfig, diff --git a/dimos/manipulation/planning/kinematics/test_pink_ik.py b/dimos/manipulation/planning/kinematics/test_pink_ik.py index 0e39bc49a3..1952d715d1 100644 --- a/dimos/manipulation/planning/kinematics/test_pink_ik.py +++ b/dimos/manipulation/planning/kinematics/test_pink_ik.py @@ -350,6 +350,27 @@ def _robot_config() -> RobotModelConfig: ) +def test_reduce_to_controlled_joints_locks_every_other_joint(mocker: MockerFixture) -> None: + modules = _install_fake_modules(mocker) + model = _FakeModel() + reduced = _FakeModel() + modules.pinocchio.neutral = lambda source: np.zeros(source.nq) + build_reduced_model = mocker.Mock(return_value=reduced) + modules.pinocchio.buildReducedModel = build_reduced_model + + result = pink_ik._reduce_to_controlled_joints( + model, + _robot_config(), + ["joint_a"], + ) + + assert result is reduced + args = build_reduced_model.call_args.args + assert args[0] is model + assert args[1] == [1, 3] + assert args[2] == pytest.approx([0.0, 0.0, 0.0]) + + def _streaming_ik(mocker: MockerFixture, converge: bool = True) -> _StreamingTestPinkIK: _install_fake_modules(mocker, converge=converge) return _StreamingTestPinkIK(PinkIKConfig(max_iterations=3)) diff --git a/dimos/robot/all_blueprints.py b/dimos/robot/all_blueprints.py index 9ac4bbfbc2..0a573ef147 100644 --- a/dimos/robot/all_blueprints.py +++ b/dimos/robot/all_blueprints.py @@ -119,6 +119,7 @@ "unitree-g1-record": "dimos.robot.unitree.g1.blueprints.basic.unitree_g1_record:unitree_g1_record", "unitree-g1-shm": "dimos.robot.unitree.g1.blueprints.perceptive.unitree_g1_shm:unitree_g1_shm", "unitree-g1-sim": "dimos.robot.unitree.g1.blueprints.perceptive.unitree_g1_sim:unitree_g1_sim", + "unitree-g1-teleop": "dimos.robot.unitree.g1.blueprints.basic.unitree_g1_teleop:unitree_g1_teleop", "unitree-go2": "dimos.robot.unitree.go2.blueprints.smart.unitree_go2:unitree_go2", "unitree-go2-agentic": "dimos.robot.unitree.go2.blueprints.agentic.unitree_go2_agentic:unitree_go2_agentic", "unitree-go2-agentic-huggingface": "dimos.robot.unitree.go2.blueprints.agentic.unitree_go2_agentic_huggingface:unitree_go2_agentic_huggingface", @@ -195,6 +196,7 @@ "fast-lio2": "dimos.hardware.sensors.lidar.fastlio2.module.FastLio2", "fast-lio2-recorder": "dimos.hardware.sensors.lidar.fastlio2.recorder.FastLio2Recorder", "front-camera": "dimos.teleop.hosted.blueprints.cloudflare.FrontCamera", + "g1-collection-recorder": "dimos.robot.unitree.g1.blueprints.basic.unitree_g1_teleop.G1CollectionRecorder", "g1-connection": "dimos.robot.unitree.g1.connection.G1Connection", "g1-connection-base": "dimos.robot.unitree.g1.connection.G1ConnectionBase", "g1-high-level-dds-sdk": "dimos.robot.unitree.g1.effectors.high_level.dds_sdk.G1HighLevelDdsSdk", @@ -237,6 +239,7 @@ "mid360-realsense-recorder": "dimos.robot.assembly.mid360_realsense_30.Mid360RealsenseRecorder", "mid360-realsense-static-tf": "dimos.robot.assembly.mid360_realsense_30.Mid360RealsenseStaticTf", "mls-planner-native": "dimos.navigation.nav_3d.mls_planner.mls_planner_native.MLSPlannerNative", + "mobile-video-arm-teleop-module": "dimos.teleop.quest.quest_extensions.MobileVideoArmTeleopModule", "mock-b1-connection-module": "dimos.robot.unitree.b1.connection.MockB1ConnectionModule", "module-a": "dimos.robot.unitree.demo_error_on_name_conflicts.ModuleA", "module-b": "dimos.robot.unitree.demo_error_on_name_conflicts.ModuleB", diff --git a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_groot_wbc.py b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_groot_wbc.py index 71ed4f8b2e..c88f93ca13 100644 --- a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_groot_wbc.py +++ b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_groot_wbc.py @@ -45,11 +45,12 @@ from __future__ import annotations +import math from pathlib import Path from typing import Any, cast from dimos.control.components import HardwareComponent, HardwareType -from dimos.control.coordinator import ControlCoordinator, TaskConfig +from dimos.control.coordinator import TaskConfig from dimos.control.tasks.g1_groot_wbc_task.g1_groot_wbc_task import ( G1_GROOT_KD, G1_GROOT_KP, @@ -58,11 +59,14 @@ g1_legs_waist, ) from dimos.control.tasks.trajectory_task.trajectory_task import joint_trajectory_task +from dimos.control.teleop_coordinator import TeleopControlCoordinator from dimos.core.coordination.blueprints import autoconnect from dimos.core.global_config import global_config from dimos.core.stream import Out from dimos.core.transport import LCMTransport from dimos.hardware.whole_body.spec import WholeBodyConfig +from dimos.manipulation.planning.kinematics.config import PinkKinematicsConfig +from dimos.manipulation.planning.spec.config import RobotModelConfig from dimos.mapping.costmapper import CostMapper from dimos.mapping.pointclouds.occupancy import HeightCostConfig from dimos.msgs.geometry_msgs.Twist import Twist @@ -79,6 +83,7 @@ g1_urdf_joint_state, g1_urdf_static_robot, ) +from dimos.robot.unitree.g1.teleop_ik import G1PinkPoseTargetSolver from dimos.simulation.scene_assets.spec import ScenePackage from dimos.utils.data import LfsPath from dimos.visualization.rerun.scene_package import scene_package_static_entities @@ -131,7 +136,7 @@ _G1_NAV_SAFE_RADIUS_MARGIN = 0.6 -class _G1GrootCoordinator(ControlCoordinator): +class _G1GrootCoordinator(TeleopControlCoordinator): g1_joints: Out[JointState] @@ -385,6 +390,26 @@ def _g1_nav_path(path: NavPath) -> Any: _G1_ROOT = G1_RERUN_ROOT if global_config.simulation == "mujoco" else "world/odometry/g1" _G1_URDF_PATH = Path(__file__).resolve().parents[2] / "g1.urdf" +G1_TELEOP_TASK_NAME = "teleop_g1" +_G1_ARM_JOINT_NAME_MAPPING = { + joint_name: f"{joint_name.partition('/')[2]}_joint" for joint_name in g1_arms +} +_G1_TELEOP_MODEL = RobotModelConfig( + name="g1_arms", + model_path=_G1_URDF_PATH, + joint_names=list(_G1_ARM_JOINT_NAME_MAPPING.values()), + base_link="pelvis", + joint_name_mapping=_G1_ARM_JOINT_NAME_MAPPING, +) +_G1_TELEOP_PINK = PinkKinematicsConfig( + dt=0.01, + position_cost=8.0, + orientation_cost=2.0, + posture_cost=0.01, + joint_limit_posture_margin=0.3, + lm_damping=0.01, + gain=0.25, +) # Nominal standing pelvis height; matches G1GrootWBCTask's height_cmd. _G1_NOMINAL_PELVIS_Z = 0.74 _g1_pelvis_mid360_cache: list[Any] = [] @@ -511,7 +536,27 @@ def _viewer() -> Any: "decimation": _decimation, }, ), - *([_arm_holder] if _arm_holder is not None else []), + _arm_holder, + # Shared bimanual Quest task with G1-only model and objective tuning. + TaskConfig( + name=G1_TELEOP_TASK_NAME, + type="teleop_ik", + joint_names=g1_arms, + priority=20, + params={ + "robot_model": _G1_TELEOP_MODEL, + "bindings": [ + {"hand": "left", "target_frame": "left_rubber_hand"}, + {"hand": "right", "target_frame": "right_rubber_hand"}, + ], + "solver_type": G1PinkPoseTargetSolver, + "pink": _G1_TELEOP_PINK, + "timeout": 0.5, + "max_command_tracking_error_deg": 10.0, + "max_joint_velocity_rad_s": math.radians(120.0), + "joint_command_filter_cutoff_hz": 5.0, + }, + ), ], ).transports( { diff --git a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_teleop.py b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_teleop.py new file mode 100644 index 0000000000..9f1ce7b42e --- /dev/null +++ b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_teleop.py @@ -0,0 +1,150 @@ +# Copyright 2025-2026 Dimensional Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Unitree G1 GR00T WBC + Quest teleop + episode recording. + +The full ``unitree-g1-groot-wbc`` stack (locomotion policy, nav, viewer, +``--simulation mujoco`` / ``--scene-package`` support) plus the Quest WebXR +retargeting module and the dimos.imitation data-collection stack. Put on the +headset, open ``https://:8443/teleop``, and: + + left stick walk forward/back (+ yaw in strafe mode) + right stick yaw (press = zero-Twist e-stop) + X + A hold to track both arms from a shared reference + B start / save an episode + Y discard the in-progress episode + +Controller poses route to the shared ``teleop_g1`` coordinator task declared +in the groot blueprint. Locomotion enters ``MovementManager.tele_cmd_vel`` so +operator input cancels navigation before reaching the GR00T WBC task. + +Recording runs continuously into a timestamped session DB under +``~/.local/state/dimos/recordings/``; B/Y only place episode markers +(EpisodeMonitorModule). Off-sim, a RealSense provides ``color_image`` — +recorded for training and pushed into the headset as the operator's view. +The groot MuJoCo sim publishes no color camera, so sim sessions record +joints/commands only (point DataPrep's sync anchor at joint state, or +enable a sim color camera, if you need images from sim). + +Export afterwards with ``dimos dataprep build`` — measured joint state, +the commanded wrist poses, and episode status are all in the DB, so +action semantics (next-state vs commanded) are a DataPrep config choice. + +Usage: + dimos --simulation mujoco --scene-package office run unitree-g1-teleop + dimos run unitree-g1-teleop # real hardware +""" + +from __future__ import annotations + +from datetime import datetime + +from dimos.constants import DEFAULT_CAPACITY_COLOR_IMAGE, STATE_DIR +from dimos.core.coordination.blueprints import Blueprint, autoconnect +from dimos.core.global_config import global_config +from dimos.core.stream import In +from dimos.core.transport import pSHMTransport +from dimos.imitation.collection.episode_monitor import EpisodeMonitorModule +from dimos.imitation.collection.recorder import CollectionRecorder +from dimos.msgs.geometry_msgs.PoseStamped import PoseStamped +from dimos.msgs.sensor_msgs.Image import Image +from dimos.robot.unitree.g1.blueprints.basic.unitree_g1_groot_wbc import ( + G1_TELEOP_TASK_NAME, + unitree_g1_groot_wbc, +) +from dimos.teleop.quest.quest_extensions import MobileVideoArmTeleopModule + + +class G1CollectionRecorder(CollectionRecorder): + """CollectionRecorder plus the operator's absolute controller poses. + + The shared teleop IK captures controller and robot references internally, + so joint commands do not appear on a stream. Recording both controller + streams preserves the operator input alongside measured joint state. + """ + + # Own process: sqlite/eMMC writes and the torch import must not share + # a GIL with control modules. + dedicated_worker = True + + left_cartesian_command: In[PoseStamped] + right_cartesian_command: In[PoseStamped] + + +def _session_db() -> str: + return str(STATE_DIR / "recordings" / f"session_g1_{datetime.now():%Y%m%d_%H%M%S}.db") + + +if not global_config.simulation: + from dimos.hardware.sensors.camera.realsense.camera import RealSenseCamera + + class DedicatedRealSenseCamera(RealSenseCamera): + """Own process: 15 fps frame copies must not share a GIL with the + coordinator's tick loop (measured arm latency when colocated).""" + + dedicated_worker = True + + +def _camera_if_real() -> tuple[Blueprint, ...]: + """Real RealSense only off-sim: the groot MuJoCo sim exposes no color + camera, and instantiating the module with no device would fail.""" + if global_config.simulation: + return () + return (DedicatedRealSenseCamera.blueprint(enable_pointcloud=False),) + + +unitree_g1_teleop = ( + autoconnect( + unitree_g1_groot_wbc, + MobileVideoArmTeleopModule.blueprint( + task_names={"left": G1_TELEOP_TASK_NAME, "right": G1_TELEOP_TASK_NAME} + ), + *_camera_if_real(), + EpisodeMonitorModule.blueprint(), # default button_map: toggle=B, discard=Y + G1CollectionRecorder.blueprint( + db_path=_session_db(), + # Command/status streams have no tf frame to anchor a pose; + # declaring them avoids a per-message no-pose warning at + # teleop rates. + poseless_streams=[ + "status", + "left_cartesian_command", + "right_cartesian_command", + "coordinator_joint_state", + ], + ), + ) + .remappings( + [ + (MobileVideoArmTeleopModule, "left_controller_output", "left_cartesian_command"), + (MobileVideoArmTeleopModule, "right_controller_output", "right_cartesian_command"), + (MobileVideoArmTeleopModule, "cmd_vel", "tele_cmd_vel"), + ] + ) + # Camera frames stay off the LCM bus: every consumer (quest module, + # recorder, viewer bridge) is on-box, and raw images multicast over LCM + # make each subscribing process pay receive+decode per frame — measured + # at ~31 MB/s and a starved coordinator tick loop on the Orin. SHM is + # zero-copy; an unconsumed stream costs only the producer's write. + .transports( + { + ("color_image", Image): pSHMTransport( + "/color_image", default_capacity=DEFAULT_CAPACITY_COLOR_IMAGE + ), + ("depth_image", Image): pSHMTransport( + "/depth_image", default_capacity=DEFAULT_CAPACITY_COLOR_IMAGE + ), + } + ) +) diff --git a/dimos/robot/unitree/g1/teleop_ik.py b/dimos/robot/unitree/g1/teleop_ik.py new file mode 100644 index 0000000000..2e2320feaa --- /dev/null +++ b/dimos/robot/unitree/g1/teleop_ik.py @@ -0,0 +1,68 @@ +# Copyright 2025-2026 Dimensional Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""G1-specific Pink objective tuning for bimanual Quest teleoperation.""" + +from __future__ import annotations + +from collections.abc import Mapping + +import numpy as np +import pink + +from dimos.control.tasks.pose_target_ik import PinkPoseTargetSolver + +_FRAME_POSITION_COST = 8.0 +_FRAME_ORIENTATION_COST = 2.0 +_POSTURE_WEIGHTS = np.tile( + np.array([4.0, 3.0, 0.1, 3.0, 1.0, 1.0, 0.1], dtype=np.float64), + 2, +) +_NOMINAL_POSTURE = np.zeros(14, dtype=np.float64) + + +class G1PinkPoseTargetSolver(PinkPoseTargetSolver): + """Shape G1 arm redundancy while retaining common solve and safety logic.""" + + def _create_tasks( + self, + configuration: pink.Configuration, + target_frames: tuple[str, ...], + ) -> dict[str, pink.Task]: + tasks = super()._create_tasks(configuration, target_frames) + for frame_name in target_frames: + frame_task = tasks[f"frame/{frame_name}"] + frame_task.set_position_cost(_FRAME_POSITION_COST) + frame_task.set_orientation_cost(_FRAME_ORIENTATION_COST) + + posture_task = tasks.get("posture/current") + if posture_task is None: + raise ValueError("G1PinkPoseTargetSolver requires a positive posture cost") + posture_task.cost = self.config.posture_cost * _POSTURE_WEIGHTS + return tasks + + def _update_current_posture_target( + self, + tasks: Mapping[str, pink.Task], + configuration: pink.Configuration, + ) -> None: + posture_task = tasks.get("posture/current") + if not isinstance(posture_task, pink.tasks.PostureTask): + raise ValueError("G1PinkPoseTargetSolver requires a posture task") + if configuration.model.nq != len(_NOMINAL_POSTURE): + raise ValueError( + f"G1 nominal posture has {len(_NOMINAL_POSTURE)} joints, " + f"model has {configuration.model.nq}" + ) + posture_task.set_target(_NOMINAL_POSTURE) diff --git a/dimos/robot/unitree/g1/test_g1_teleop.py b/dimos/robot/unitree/g1/test_g1_teleop.py new file mode 100644 index 0000000000..f7011d7805 --- /dev/null +++ b/dimos/robot/unitree/g1/test_g1_teleop.py @@ -0,0 +1,138 @@ +# Copyright 2025-2026 Dimensional Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Construction and objective tests for shared G1 Quest teleoperation.""" + +from typing import Any + +import numpy as np +import pytest + +from dimos.control.coordinator import TaskConfig +from dimos.control.tasks.g1_groot_wbc_task.g1_groot_wbc_task import g1_arms +from dimos.control.tasks.pose_target_ik import PoseTargetIKTaskConfig +from dimos.control.teleop_coordinator import TeleopControlCoordinator +from dimos.core.coordination.blueprints import Blueprint +from dimos.msgs.sensor_msgs.JointState import JointState +from dimos.robot.unitree.g1.blueprints.basic.unitree_g1_groot_wbc import ( + _G1_ARM_JOINT_NAME_MAPPING, + _G1_TELEOP_MODEL, + _G1_TELEOP_PINK, + G1_TELEOP_TASK_NAME, + unitree_g1_groot_wbc, +) +from dimos.robot.unitree.g1.blueprints.basic.unitree_g1_teleop import ( + G1CollectionRecorder, + unitree_g1_teleop, +) +from dimos.robot.unitree.g1.teleop_ik import G1PinkPoseTargetSolver +from dimos.teleop.quest.quest_extensions import MobileVideoArmTeleopModule + + +def _module_kwargs(blueprint: Blueprint, module_type: type) -> dict[str, Any]: + return next(atom.kwargs for atom in blueprint.blueprints if atom.module is module_type) + + +def _teleop_task() -> TaskConfig: + coordinator = next( + atom + for atom in unitree_g1_groot_wbc.blueprints + if issubclass(atom.module, TeleopControlCoordinator) + ) + return next(task for task in coordinator.kwargs["tasks"] if task.type == "teleop_ik") + + +def test_g1_blueprint_uses_shared_bimanual_teleop_task() -> None: + task = _teleop_task() + + assert task.name == G1_TELEOP_TASK_NAME + assert task.joint_names == g1_arms + assert task.priority == 20 + assert task.params["robot_model"] is _G1_TELEOP_MODEL + assert task.params["solver_type"] is G1PinkPoseTargetSolver + assert task.params["bindings"] == [ + {"hand": "left", "target_frame": "left_rubber_hand"}, + {"hand": "right", "target_frame": "right_rubber_hand"}, + ] + assert _G1_TELEOP_MODEL.base_link == "pelvis" + assert _G1_TELEOP_MODEL.joint_name_mapping == _G1_ARM_JOINT_NAME_MAPPING + assert task.params["max_joint_velocity_rad_s"] == pytest.approx(np.deg2rad(120.0)) + + +def test_g1_blueprint_has_no_static_arm_holder() -> None: + coordinator = next( + atom + for atom in unitree_g1_groot_wbc.blueprints + if issubclass(atom.module, TeleopControlCoordinator) + ) + + arm_tasks = [ + task for task in coordinator.kwargs["tasks"] if set(task.joint_names) & set(g1_arms) + ] + + assert [(task.name, task.type) for task in arm_tasks] == [(G1_TELEOP_TASK_NAME, "teleop_ik")] + + +def test_g1_teleop_wires_arm_velocity_and_recording_streams() -> None: + teleop_kwargs = _module_kwargs(unitree_g1_teleop, MobileVideoArmTeleopModule) + + assert teleop_kwargs["task_names"] == { + "left": G1_TELEOP_TASK_NAME, + "right": G1_TELEOP_TASK_NAME, + } + assert ( + unitree_g1_teleop.remapping_map[(MobileVideoArmTeleopModule.name, "left_controller_output")] + == "left_cartesian_command" + ) + assert ( + unitree_g1_teleop.remapping_map[ + (MobileVideoArmTeleopModule.name, "right_controller_output") + ] + == "right_cartesian_command" + ) + assert ( + unitree_g1_teleop.remapping_map[(MobileVideoArmTeleopModule.name, "cmd_vel")] + == "tele_cmd_vel" + ) + assert "left_cartesian_command" in G1CollectionRecorder.__annotations__ + assert "right_cartesian_command" in G1CollectionRecorder.__annotations__ + + +@pytest.mark.self_hosted +def test_g1_pink_solver_reduces_model_and_uses_g1_objective() -> None: + frames = ("left_rubber_hand", "right_rubber_hand") + config = PoseTargetIKTaskConfig( + joint_names=tuple(g1_arms), + robot_model=_G1_TELEOP_MODEL, + target_frames=frames, + pink=_G1_TELEOP_PINK, + ) + solver = G1PinkPoseTargetSolver(config) + seed = JointState(name=list(g1_arms), position=[0.0] * len(g1_arms)) + targets = solver.frame_poses(seed, frames) + + command = solver.step(targets, seed, 0.01) + + assert command is not None + assert command.name == g1_arms + context = next(iter(solver._control_contexts.values())) + assert context.robot.model.nq == len(g1_arms) + assert context.tasks is not None + for frame_name in frames: + frame_task = context.tasks[f"frame/{frame_name}"] + assert frame_task.position_cost == pytest.approx([8.0, 8.0, 8.0]) + assert frame_task.orientation_cost == pytest.approx([2.0, 2.0, 2.0]) + posture = context.tasks["posture/current"] + assert posture.cost == pytest.approx(np.tile([4.0, 3.0, 0.1, 3.0, 1.0, 1.0, 0.1], 2) * 0.01) + assert posture.target_q == pytest.approx(np.zeros(len(g1_arms))) diff --git a/dimos/teleop/quest/quest_extensions.py b/dimos/teleop/quest/quest_extensions.py index 75a9dd29a4..a983e5dd82 100644 --- a/dimos/teleop/quest/quest_extensions.py +++ b/dimos/teleop/quest/quest_extensions.py @@ -19,11 +19,12 @@ - HandTeleopModule: Pinch-to-toggle arm teleop using WebXR hand tracking - TwistTeleopModule: Outputs Twist instead of PoseStamped - VideoArmTeleopModule: ArmTeleopModule + JPEG frames pushed to the Quest over /ws + - MobileVideoArmTeleopModule: Video arm teleop + thumbstick base velocity - Go2TeleopModule: Thumbstick → Twist velocity for the Go2 + camera over /ws """ import asyncio -from typing import Any +from typing import Any, Literal from fastapi import WebSocket @@ -262,6 +263,90 @@ async def handle_color_image(self, msg: Image) -> None: _push_jpeg(self, msg, self.config.video_jpeg_quality) +class MobileVideoArmTeleopConfig(VideoArmTeleopConfig): + """Configuration for combined arm, video, and mobile-base teleoperation.""" + + linear_scale: float = 0.3 + yaw_scale: float = 0.3 + strafe_scale: float = 0.3 + right_stick_mode: Literal["yaw", "strafe"] = "yaw" + deadzone: float = 0.18 + + +class MobileVideoArmTeleopModule(VideoArmTeleopModule): + """Video arm teleop with thumbstick velocity for a mobile manipulator.""" + + dedicated_worker = True + + config: MobileVideoArmTeleopConfig + + cmd_vel: Out[Twist] + + def __init__(self, **kwargs: Any) -> None: + super().__init__(**kwargs) + self._cmd_vel_moving = False + self._right_stick_pressed = False + + def _on_joy_bytes(self, data: bytes) -> None: + super()._on_joy_bytes(data) + with self._lock: + left = self._controllers.get(Hand.LEFT) + right = self._controllers.get(Hand.RIGHT) + self._publish_cmd_vel(left, right) + + def _publish_cmd_vel( + self, + left: QuestControllerState | None, + right: QuestControllerState | None, + ) -> None: + """Publish operator motion and one definitive stop per stop transition.""" + + def deadzone(value: float) -> float: + return 0.0 if abs(value) < self.config.deadzone else value + + right_stick_pressed = right is not None and right.thumbstick_press + if right_stick_pressed: + if not self._right_stick_pressed: + self.cmd_vel.publish(Twist.zero()) + self._right_stick_pressed = True + self._cmd_vel_moving = False + return + self._right_stick_pressed = False + + left_x = deadzone(left.thumbstick.x if left is not None else 0.0) + left_y = deadzone(left.thumbstick.y if left is not None else 0.0) + right_x = deadzone(right.thumbstick.x if right is not None else 0.0) + + vx = -left_y * self.config.linear_scale + vy = 0.0 + yaw_rate = 0.0 + if self.config.right_stick_mode == "strafe": + vy = -right_x * self.config.strafe_scale + yaw_rate = -left_x * self.config.yaw_scale + else: + yaw_rate = -right_x * self.config.yaw_scale + + moving = any(value != 0.0 for value in (vx, vy, yaw_rate)) + if moving: + self.cmd_vel.publish( + Twist( + linear=Vector3(vx, vy, 0.0), + angular=Vector3(0.0, 0.0, yaw_rate), + ) + ) + elif self._cmd_vel_moving: + self.cmd_vel.publish(Twist.zero()) + self._cmd_vel_moving = moving + + @rpc + def stop(self) -> None: + try: + self.cmd_vel.publish(Twist.zero()) + except Exception: + logger.exception("Failed to publish stop Twist") + super().stop() + + class Go2TeleopConfig(QuestTeleopConfig): """Configuration for Go2TeleopModule.""" diff --git a/dimos/teleop/quest/quest_teleop_module.py b/dimos/teleop/quest/quest_teleop_module.py index 031a1aba0a..56f0462e57 100644 --- a/dimos/teleop/quest/quest_teleop_module.py +++ b/dimos/teleop/quest/quest_teleop_module.py @@ -339,8 +339,15 @@ def _resolve_hand(frame_id: str) -> Hand: raise ValueError(f"Unexpected frame_id: {frame_id!r}, expected 'left' or 'right'") def _on_pose_bytes(self, data: bytes) -> None: - """Decode LCM bytes into PoseStamped, transform to robot frame.""" + """Decode LCM bytes into PoseStamped, transform to robot frame. + + Poses that aren't controller poses (e.g. the "head" viewer pose the + web client also streams) are ignored here; subclasses that want them + override this method. Raising instead would kill the websocket. + """ msg = PoseStamped.lcm_decode(data) + if msg.frame_id not in ("left", "right"): + return hand = self._resolve_hand(msg.frame_id) robot_pose = webxr_to_robot(msg, is_left_controller=(hand == Hand.LEFT)) with self._lock: diff --git a/dimos/teleop/quest/test_quest_teleop_module.py b/dimos/teleop/quest/test_quest_teleop_module.py index 2e736e3ff3..5774246f69 100644 --- a/dimos/teleop/quest/test_quest_teleop_module.py +++ b/dimos/teleop/quest/test_quest_teleop_module.py @@ -23,7 +23,13 @@ from dimos.imitation.collection.episode_monitor import EpisodeStatus from dimos.msgs.geometry_msgs.PoseStamped import PoseStamped -from dimos.teleop.quest.quest_extensions import ArmTeleopModule, Go2TeleopModule, HandTeleopModule +from dimos.msgs.geometry_msgs.Twist import Twist +from dimos.teleop.quest.quest_extensions import ( + ArmTeleopModule, + Go2TeleopModule, + HandTeleopModule, + MobileVideoArmTeleopModule, +) from dimos.teleop.quest.quest_teleop_module import QuestTeleopModule, _ws_send_text from dimos.teleop.quest.quest_types import ( Buttons, @@ -418,3 +424,75 @@ def test_hand_teleop_pinch_toggles_engagement(mocker: pytest_mock.MockerFixture) assert not publish.call_args.args[0].right_primary finally: module.stop() + + +def _controller( + *, + is_left: bool, + stick_x: float = 0.0, + stick_y: float = 0.0, + thumbstick_press: bool = False, +) -> QuestControllerState: + return QuestControllerState( + is_left=is_left, + thumbstick_press=thumbstick_press, + thumbstick=ThumbstickState(x=stick_x, y=stick_y), + ) + + +def test_mobile_arm_teleop_publishes_yaw_drive_and_one_neutral_stop(mocker) -> None: + module = MobileVideoArmTeleopModule() + try: + publish = mocker.patch.object(module.cmd_vel, "publish") + left = _controller(is_left=True, stick_y=-1.0) + right = _controller(is_left=False, stick_x=0.5) + + module._publish_cmd_vel(left, right) + moving = publish.call_args.args[0] + assert isinstance(moving, Twist) + assert moving.linear.x == pytest.approx(module.config.linear_scale) + assert moving.linear.y == 0.0 + assert moving.angular.z == pytest.approx(-0.5 * module.config.yaw_scale) + + idle_left = _controller(is_left=True) + idle_right = _controller(is_left=False) + module._publish_cmd_vel(idle_left, idle_right) + module._publish_cmd_vel(idle_left, idle_right) + + assert publish.call_count == 2 + assert publish.call_args.args[0] == Twist.zero() + finally: + module.stop() + + +def test_mobile_arm_teleop_strafe_mode_and_deadzone(mocker) -> None: + module = MobileVideoArmTeleopModule(right_stick_mode="strafe") + try: + publish = mocker.patch.object(module.cmd_vel, "publish") + left = _controller(is_left=True, stick_x=0.5, stick_y=0.1) + right = _controller(is_left=False, stick_x=-0.5) + + module._publish_cmd_vel(left, right) + + moving = publish.call_args.args[0] + assert moving.linear.x == 0.0 + assert moving.linear.y == pytest.approx(0.5 * module.config.strafe_scale) + assert moving.angular.z == pytest.approx(-0.5 * module.config.yaw_scale) + finally: + module.stop() + + +def test_mobile_arm_teleop_stick_press_publishes_one_stop_per_press(mocker) -> None: + module = MobileVideoArmTeleopModule() + try: + publish = mocker.patch.object(module.cmd_vel, "publish") + left = _controller(is_left=True, stick_y=-1.0) + pressed = _controller(is_left=False, thumbstick_press=True) + + module._publish_cmd_vel(left, pressed) + module._publish_cmd_vel(left, pressed) + + assert publish.call_count == 1 + assert publish.call_args.args[0] == Twist.zero() + finally: + module.stop() diff --git a/dimos/teleop/quest/web/static/teleop.js b/dimos/teleop/quest/web/static/teleop.js index 65608afffe..97d05dc647 100644 --- a/dimos/teleop/quest/web/static/teleop.js +++ b/dimos/teleop/quest/web/static/teleop.js @@ -474,6 +474,13 @@ function processTracking(frame) { } lastSendTime = now; + // Humanoid retargeting needs the headset pose in the same reference space + // as both hands. Other teleop modules ignore the "head" frame. + const viewerPose = frame.getViewerPose(xrRefSpace); + if (viewerPose) { + sendPose('head', viewerPose); + } + // Process controller and hand input sources. for (const inputSource of frame.session.inputSources) { const handedness = inputSource.handedness; @@ -532,8 +539,13 @@ function processTracking(frame) { // [4] = X/A button // [5] = Y/B button // [6] = menu (if exposed) + // Pad to at least 7 entries: the Python side + // (QuestControllerState.from_joy) requires the full layout, + // but browsers only report the buttons the controller has + // (e.g. 6 when no menu/thumbrest is exposed). const buttons = []; - for (let i = 0; i < gamepad.buttons.length; i++) { + const buttonCount = Math.max(gamepad.buttons.length, 7); + for (let i = 0; i < buttonCount; i++) { buttons.push(gamepad.buttons[i]?.pressed ? 1 : 0); } diff --git a/pyproject.toml b/pyproject.toml index f336bab1b8..f5c70adafd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -180,9 +180,6 @@ Changelog = "https://github.com/dimensionalOS/dimos/releases" [project.optional-dependencies] misc = [ - # Core requirements - "python-multipart>=0.0.27", - # Developer Specific "ipykernel", @@ -244,6 +241,7 @@ agents = [ web = [ "fastapi>=0.115.6", + "python-multipart>=0.0.27", "sse-starlette>=2.2.1", "uvicorn>=0.34.0", "jinja2>=3.1.6", diff --git a/uv.lock b/uv.lock index 068aa4da09..5fb4e7cbd3 100644 --- a/uv.lock +++ b/uv.lock @@ -1871,6 +1871,7 @@ base = [ { name = "openai" }, { name = "openevals" }, { name = "pillow" }, + { name = "python-multipart" }, { name = "rerun-sdk" }, { name = "sentencepiece" }, { name = "sounddevice" }, @@ -1937,7 +1938,6 @@ misc = [ { name = "ipykernel" }, { name = "open-clip-torch" }, { name = "portal" }, - { name = "python-multipart" }, { name = "tensorboard" }, { name = "timm" }, { name = "torchreid" }, @@ -1993,6 +1993,7 @@ unitree = [ { name = "openai" }, { name = "openevals" }, { name = "pillow" }, + { name = "python-multipart" }, { name = "rerun-sdk" }, { name = "sentencepiece" }, { name = "sounddevice" }, @@ -2029,6 +2030,7 @@ unitree-dds = [ { name = "openai" }, { name = "openevals" }, { name = "pillow" }, + { name = "python-multipart" }, { name = "rerun-sdk" }, { name = "sentencepiece" }, { name = "sounddevice" }, @@ -2051,6 +2053,7 @@ web = [ { name = "fastapi" }, { name = "ffmpeg-python" }, { name = "jinja2" }, + { name = "python-multipart" }, { name = "soundfile" }, { name = "sse-starlette" }, { name = "uvicorn" }, @@ -2350,7 +2353,7 @@ requires-dist = [ { name = "pymavlink", marker = "extra == 'drone'" }, { name = "pyrealsense2-extended", marker = "sys_platform != 'darwin' and extra == 'manipulation'" }, { name = "python-dotenv" }, - { name = "python-multipart", marker = "extra == 'misc'", specifier = ">=0.0.27" }, + { name = "python-multipart", marker = "extra == 'web'", specifier = ">=0.0.27" }, { name = "pyturbojpeg", specifier = "==1.8.2" }, { name = "pyyaml", marker = "extra == 'manipulation'", specifier = ">=6.0" }, { name = "qpsolvers", extras = ["proxqp"], specifier = ">=4.12.0" }, From 1d0dc6ff6e507068907adfc36e66f1e43f50c79a Mon Sep 17 00:00:00 2001 From: cc Date: Mon, 24 Aug 2026 22:19:54 -0700 Subject: [PATCH 27/57] fix(g1): adapt Quest teleop to trajectory-task base --- .../g1/blueprints/basic/unitree_g1_groot_wbc.py | 3 ++- dimos/robot/unitree/g1/test_g1_teleop.py | 15 +++++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_groot_wbc.py b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_groot_wbc.py index c88f93ca13..959dc4befa 100644 --- a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_groot_wbc.py +++ b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_groot_wbc.py @@ -76,6 +76,7 @@ from dimos.msgs.sensor_msgs.MotorCommandArray import MotorCommandArray from dimos.navigation.movement_manager.movement_manager import MovementManager from dimos.navigation.replanning_a_star.module import ReplanningAStarPlanner +from dimos.robot.assets.model import RobotModel from dimos.robot.unitree.g1.config import G1 from dimos.robot.unitree.g1.g1_rerun import ( G1_RERUN_ROOT, @@ -396,7 +397,7 @@ def _g1_nav_path(path: NavPath) -> Any: } _G1_TELEOP_MODEL = RobotModelConfig( name="g1_arms", - model_path=_G1_URDF_PATH, + model=RobotModel.from_file(_G1_URDF_PATH), joint_names=list(_G1_ARM_JOINT_NAME_MAPPING.values()), base_link="pelvis", joint_name_mapping=_G1_ARM_JOINT_NAME_MAPPING, diff --git a/dimos/robot/unitree/g1/test_g1_teleop.py b/dimos/robot/unitree/g1/test_g1_teleop.py index f7011d7805..a3c834121d 100644 --- a/dimos/robot/unitree/g1/test_g1_teleop.py +++ b/dimos/robot/unitree/g1/test_g1_teleop.py @@ -14,7 +14,7 @@ """Construction and objective tests for shared G1 Quest teleoperation.""" -from typing import Any +from typing import Any, cast import numpy as np import pytest @@ -22,6 +22,7 @@ from dimos.control.coordinator import TaskConfig from dimos.control.tasks.g1_groot_wbc_task.g1_groot_wbc_task import g1_arms from dimos.control.tasks.pose_target_ik import PoseTargetIKTaskConfig +from dimos.control.tasks.trajectory_task.trajectory_task import JOINT_TRAJECTORY_TASK_NAME from dimos.control.teleop_coordinator import TeleopControlCoordinator from dimos.core.coordination.blueprints import Blueprint from dimos.msgs.sensor_msgs.JointState import JointState @@ -50,7 +51,10 @@ def _teleop_task() -> TaskConfig: for atom in unitree_g1_groot_wbc.blueprints if issubclass(atom.module, TeleopControlCoordinator) ) - return next(task for task in coordinator.kwargs["tasks"] if task.type == "teleop_ik") + return cast( + "TaskConfig", + next(task for task in coordinator.kwargs["tasks"] if task.type == "teleop_ik"), + ) def test_g1_blueprint_uses_shared_bimanual_teleop_task() -> None: @@ -70,7 +74,7 @@ def test_g1_blueprint_uses_shared_bimanual_teleop_task() -> None: assert task.params["max_joint_velocity_rad_s"] == pytest.approx(np.deg2rad(120.0)) -def test_g1_blueprint_has_no_static_arm_holder() -> None: +def test_g1_blueprint_keeps_bounded_trajectory_path_below_teleop() -> None: coordinator = next( atom for atom in unitree_g1_groot_wbc.blueprints @@ -81,7 +85,10 @@ def test_g1_blueprint_has_no_static_arm_holder() -> None: task for task in coordinator.kwargs["tasks"] if set(task.joint_names) & set(g1_arms) ] - assert [(task.name, task.type) for task in arm_tasks] == [(G1_TELEOP_TASK_NAME, "teleop_ik")] + assert [(task.name, task.type, task.priority) for task in arm_tasks] == [ + (JOINT_TRAJECTORY_TASK_NAME, "trajectory", 10), + (G1_TELEOP_TASK_NAME, "teleop_ik", 20), + ] def test_g1_teleop_wires_arm_velocity_and_recording_streams() -> None: From f6a799ea837653f66c374f0d2b49e0e39f0a9dd5 Mon Sep 17 00:00:00 2001 From: cc Date: Mon, 24 Aug 2026 22:32:08 -0700 Subject: [PATCH 28/57] fix(teleop): align rebased blueprint config APIs --- dimos/manipulation/planning/spec/test_config.py | 5 +++-- dimos/robot/unitree/g1/blueprints/basic/unitree_g1_teleop.py | 5 +---- dimos/robot/unitree/g1/test_g1_teleop.py | 5 +---- 3 files changed, 5 insertions(+), 10 deletions(-) diff --git a/dimos/manipulation/planning/spec/test_config.py b/dimos/manipulation/planning/spec/test_config.py index 0dd1f59186..c97a43fe74 100644 --- a/dimos/manipulation/planning/spec/test_config.py +++ b/dimos/manipulation/planning/spec/test_config.py @@ -54,5 +54,6 @@ def test_robot_model_survives_blueprint_config_round_trip(tmp_path: Path) -> Non parsed = BlueprintConfigParser(blueprint).parse(environ={}) kwargs = parsed.module_kwargs(blueprint.blueprints[0].name) - assert kwargs["robots"][0]["model"]["_source_path"] == urdf - assert "_loaded" not in kwargs["robots"][0]["model"] + model = kwargs["robots"][0]["model"] + assert isinstance(model, RobotModel) + assert model.source_path == urdf diff --git a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_teleop.py b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_teleop.py index 9f1ce7b42e..9268dafdc3 100644 --- a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_teleop.py +++ b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_teleop.py @@ -60,7 +60,6 @@ from dimos.msgs.geometry_msgs.PoseStamped import PoseStamped from dimos.msgs.sensor_msgs.Image import Image from dimos.robot.unitree.g1.blueprints.basic.unitree_g1_groot_wbc import ( - G1_TELEOP_TASK_NAME, unitree_g1_groot_wbc, ) from dimos.teleop.quest.quest_extensions import MobileVideoArmTeleopModule @@ -107,9 +106,7 @@ def _camera_if_real() -> tuple[Blueprint, ...]: unitree_g1_teleop = ( autoconnect( unitree_g1_groot_wbc, - MobileVideoArmTeleopModule.blueprint( - task_names={"left": G1_TELEOP_TASK_NAME, "right": G1_TELEOP_TASK_NAME} - ), + MobileVideoArmTeleopModule.blueprint(), *_camera_if_real(), EpisodeMonitorModule.blueprint(), # default button_map: toggle=B, discard=Y G1CollectionRecorder.blueprint( diff --git a/dimos/robot/unitree/g1/test_g1_teleop.py b/dimos/robot/unitree/g1/test_g1_teleop.py index a3c834121d..c5ee2c6d12 100644 --- a/dimos/robot/unitree/g1/test_g1_teleop.py +++ b/dimos/robot/unitree/g1/test_g1_teleop.py @@ -94,10 +94,7 @@ def test_g1_blueprint_keeps_bounded_trajectory_path_below_teleop() -> None: def test_g1_teleop_wires_arm_velocity_and_recording_streams() -> None: teleop_kwargs = _module_kwargs(unitree_g1_teleop, MobileVideoArmTeleopModule) - assert teleop_kwargs["task_names"] == { - "left": G1_TELEOP_TASK_NAME, - "right": G1_TELEOP_TASK_NAME, - } + assert "task_names" not in teleop_kwargs assert ( unitree_g1_teleop.remapping_map[(MobileVideoArmTeleopModule.name, "left_controller_output")] == "left_cartesian_command" From cbcac63b733a14e176f2a3209d5bbc04b3e04206 Mon Sep 17 00:00:00 2001 From: cc Date: Tue, 25 Aug 2026 16:13:18 -0700 Subject: [PATCH 29/57] fix(teleop): preserve joystick validity contract --- dimos/teleop/quest/quest_extensions.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/dimos/teleop/quest/quest_extensions.py b/dimos/teleop/quest/quest_extensions.py index a983e5dd82..06b6b2cb89 100644 --- a/dimos/teleop/quest/quest_extensions.py +++ b/dimos/teleop/quest/quest_extensions.py @@ -287,12 +287,14 @@ def __init__(self, **kwargs: Any) -> None: self._cmd_vel_moving = False self._right_stick_pressed = False - def _on_joy_bytes(self, data: bytes) -> None: - super()._on_joy_bytes(data) + def _on_joy_bytes(self, data: bytes) -> bool: + if not super()._on_joy_bytes(data): + return False with self._lock: left = self._controllers.get(Hand.LEFT) right = self._controllers.get(Hand.RIGHT) self._publish_cmd_vel(left, right) + return True def _publish_cmd_vel( self, From 9a2310d1b7e0b05f66b8827cd6c3a181b6d7b1ab Mon Sep 17 00:00:00 2001 From: cc Date: Tue, 25 Aug 2026 16:08:31 -0700 Subject: [PATCH 30/57] fix(sim): restore G1 whole-body adapter contract Co-authored-by: Pim Van den Bosch <49974392+Nabla7@users.noreply.github.com> --- dimos/hardware/test_adapter_registries.py | 2 +- dimos/simulation/adapters/whole_body/g1.py | 5 ++++ .../simulation/adapters/whole_body/test_g1.py | 25 +++++++++++++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 dimos/simulation/adapters/whole_body/test_g1.py diff --git a/dimos/hardware/test_adapter_registries.py b/dimos/hardware/test_adapter_registries.py index 7061cee54c..7e536ded13 100644 --- a/dimos/hardware/test_adapter_registries.py +++ b/dimos/hardware/test_adapter_registries.py @@ -140,7 +140,7 @@ def test_every_sim_whole_body_module_is_declared() -> None: declared_modules = {path.split(":", 1)[0] for path in manifest.ADAPTER_FACTORIES.values()} for root in pkg.__path__: for mod_file in sorted(Path(root).glob("*.py")): - if mod_file.name.startswith(("_", ".")): + if mod_file.name.startswith(("_", ".", "test_")): continue mod_name = f"dimos.simulation.adapters.whole_body.{mod_file.stem}" assert mod_name in declared_modules, ( diff --git a/dimos/simulation/adapters/whole_body/g1.py b/dimos/simulation/adapters/whole_body/g1.py index d29e1b6585..d5011d2c40 100644 --- a/dimos/simulation/adapters/whole_body/g1.py +++ b/dimos/simulation/adapters/whole_body/g1.py @@ -29,6 +29,7 @@ import time from typing import Any +from dimos.hardware.spec import JointLimits from dimos.hardware.whole_body.spec import ( POS_STOP, IMUState, @@ -166,6 +167,10 @@ def read_imu(self) -> IMUState: accelerometer=accel, ) + def get_limits(self) -> JointLimits | None: + """Return no adapter-specific limits for the simulated G1.""" + return None + def write_motor_commands(self, commands: list[MotorCommand]) -> bool: if not self.is_connected(): return False diff --git a/dimos/simulation/adapters/whole_body/test_g1.py b/dimos/simulation/adapters/whole_body/test_g1.py new file mode 100644 index 0000000000..0f0064d237 --- /dev/null +++ b/dimos/simulation/adapters/whole_body/test_g1.py @@ -0,0 +1,25 @@ +# Copyright 2026 Dimensional Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from pathlib import Path + +from dimos.hardware.whole_body.spec import WholeBodyAdapter +from dimos.simulation.adapters.whole_body.g1 import SimMujocoG1WholeBodyAdapter + + +def test_sim_g1_adapter_satisfies_whole_body_protocol() -> None: + adapter = SimMujocoG1WholeBodyAdapter(address=Path("unused.xml")) + + assert isinstance(adapter, WholeBodyAdapter) + assert adapter.get_limits() is None From 9abbf56dce53d595c32509cb301080b29fa19194 Mon Sep 17 00:00:00 2001 From: cc Date: Tue, 25 Aug 2026 23:41:52 -0700 Subject: [PATCH 31/57] Add safe G1 upper-body manipulation workflow --- CONTEXT.md | 14 ++ dimos/cli/hardware/g1.py | 187 ++++++++++++++++++ dimos/cli/hardware/test_g1.py | 123 ++++++++++++ dimos/cli/hardware_cli.py | 2 + .../tasks/g1_groot_wbc_task/_registry.py | 9 +- dimos/robot/assets/model.py | 136 +++++++++++++ dimos/robot/assets/test_model.py | 131 ++++++++++++ .../blueprints/basic/unitree_g1_groot_wbc.py | 9 +- .../g1/blueprints/basic/unitree_g1_teleop.py | 13 ++ dimos/robot/unitree/g1/manip_config.py | 98 +++++++++ dimos/robot/unitree/g1/test_g1_teleop.py | 60 ++++++ dimos/utils/data.py | 14 ++ dimos/utils/test_data.py | 10 + docs/adr/0001-derived-robot-model-views.md | 52 +++++ docs/platforms/humanoid/g1/index.md | 138 ++++++++++++- 15 files changed, 990 insertions(+), 6 deletions(-) create mode 100644 dimos/cli/hardware/g1.py create mode 100644 dimos/cli/hardware/test_g1.py create mode 100644 dimos/robot/unitree/g1/manip_config.py create mode 100644 docs/adr/0001-derived-robot-model-views.md diff --git a/CONTEXT.md b/CONTEXT.md index 514a190138..30508dbef3 100644 --- a/CONTEXT.md +++ b/CONTEXT.md @@ -43,3 +43,17 @@ _Avoid_: Teleoperation behavior, solver implementation **IK control context**: The persistent inverse-kinematics state owned by one control-task instance for one robot model, controlled-joint selection, and target-frame selection, including its Pink task stack. Stateful Pink tasks are never shared between control-task instances. _Avoid_: Planning group, teleoperation session + +## Robot descriptions + +**Robot model source**: +The canonical URDF or Xacro description from which robot model views are derived. +_Avoid_: Generated model, planning model + +**Robot model view**: +A derived representation of a robot model source for a particular consumer, without becoming a second canonical robot description. +_Avoid_: Generated URDF, copied URDF + +**Structural subtree selection**: +A robot model view that retains an existing link and its descendants without reversing joints or changing their transforms. +_Avoid_: Rerooting, kinematic rerooting diff --git a/dimos/cli/hardware/g1.py b/dimos/cli/hardware/g1.py new file mode 100644 index 0000000000..6e9342506a --- /dev/null +++ b/dimos/cli/hardware/g1.py @@ -0,0 +1,187 @@ +# Copyright 2026 Dimensional Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Safe operator commands for a running Unitree G1 teleop stack.""" + +from __future__ import annotations + +import time +from typing import Any, NoReturn, cast + +import typer + +from dimos.control.tasks.trajectory_task.trajectory_task import JOINT_TRAJECTORY_TASK_NAME +from dimos.msgs.sensor_msgs.JointState import JointState +from dimos.porcelain.dimos import Dimos +from dimos.robot.unitree.g1.manip_config import ( + G1_READY_JOINTS, + G1_READY_SPEED_SCALE, + G1_UPPER_BODY_NAME, +) + +app = typer.Typer(help="Operate a running Unitree G1 stack safely") + +_COORDINATOR = "ControlCoordinator" +_MANIPULATION = "G1Manipulation" +_GROOT_TASK = "groot_wbc" +_ARM_POLL_SECONDS = 0.1 + + +def _abort(message: str) -> NoReturn: + typer.echo(f"ERROR: {message}", err=True) + raise typer.Exit(1) + + +def _connect() -> Dimos: + try: + return Dimos.connect() + except Exception as exc: + _abort(f"cannot connect to a running DimOS stack: {exc}") + + +def _groot_state(coordinator: Any) -> dict[str, Any]: + state = coordinator.task_invoke(_GROOT_TASK, "state_snapshot", {}) + if not isinstance(state, dict): + _abort("the running stack does not expose G1 GR00T safety state") + return cast("dict[str, Any]", state) + + +def _require_armed_and_enabled(coordinator: Any) -> dict[str, Any]: + state = _groot_state(coordinator) + if not state.get("armed") or state.get("arming") or state.get("arm_pending"): + _abort("G1 is not fully armed; run `dimos hardware g1 arm` first") + if state.get("dry_run"): + _abort("motor output is still disabled; run `dimos hardware g1 enable` first") + return state + + +@app.command() +def status() -> None: + """Show the G1 safety state, trajectory state, and planning groups.""" + client = _connect() + try: + coordinator = cast("Any", client.get_module(_COORDINATOR)) + state = _groot_state(coordinator) + trajectory = coordinator.task_invoke( + JOINT_TRAJECTORY_TASK_NAME, "get_status", {"t_now": None} + ) + try: + groups = cast("Any", client.get_module(_MANIPULATION)).list_planning_groups() + group_ids = [str(group.id) for group in groups] + except (AttributeError, KeyError): + group_ids = [] + + typer.echo(f"active: {bool(state.get('active'))}") + typer.echo(f"armed: {bool(state.get('armed'))}") + typer.echo(f"arming: {bool(state.get('arming') or state.get('arm_pending'))}") + typer.echo(f"dry_run: {bool(state.get('dry_run'))}") + typer.echo(f"trajectory: {trajectory}") + typer.echo(f"manipulation: {', '.join(group_ids) if group_ids else 'unavailable'}") + except (AttributeError, KeyError, RuntimeError) as exc: + _abort(f"running stack is not a compatible G1 teleop stack: {exc}") + finally: + client.stop() + + +@app.command() +def arm(timeout: float = typer.Option(15.0, min=0.1, help="Arming timeout in seconds.")) -> None: + """Arm in dry-run and wait for the pose ramp to finish.""" + client = _connect() + try: + coordinator = cast("Any", client.get_module(_COORDINATOR)) + coordinator.set_dry_run(True) + coordinator.set_activated(True) + deadline = time.monotonic() + timeout + while time.monotonic() < deadline: + state = _groot_state(coordinator) + if state.get("armed") and not state.get("arming") and not state.get("arm_pending"): + typer.echo( + "G1 armed in dry-run; inspect the robot, then run `dimos hardware g1 enable`." + ) + return + time.sleep(_ARM_POLL_SECONDS) + _abort(f"G1 did not finish arming within {timeout:g}s; motor output remains in dry-run") + except (AttributeError, KeyError, RuntimeError) as exc: + _abort(f"failed to arm G1: {exc}") + finally: + client.stop() + + +@app.command() +def enable() -> None: + """Enable motor output after a completed dry-run arming ramp.""" + client = _connect() + try: + coordinator = cast("Any", client.get_module(_COORDINATOR)) + state = _groot_state(coordinator) + if not state.get("armed") or state.get("arming") or state.get("arm_pending"): + _abort("G1 is not fully armed; run `dimos hardware g1 arm` first") + coordinator.set_dry_run(False) + if _groot_state(coordinator).get("dry_run"): + _abort("G1 remained in dry-run after the enable request") + typer.echo("G1 motor output enabled.") + except (AttributeError, KeyError, RuntimeError) as exc: + _abort(f"failed to enable G1: {exc}") + finally: + client.stop() + + +@app.command() +def ready() -> None: + """Plan and execute the conservative bimanual ready pose.""" + client = _connect() + try: + coordinator = cast("Any", client.get_module(_COORDINATOR)) + _require_armed_and_enabled(coordinator) + manipulation = cast("Any", client.get_module(_MANIPULATION)) + targets = { + f"{G1_UPPER_BODY_NAME}/{group}": JointState(position=list(positions)) + for group, positions in G1_READY_JOINTS.items() + } + planned = manipulation.plan_to_joints(targets, speed_scale=G1_READY_SPEED_SCALE) + if not planned.succeeded: + _abort(f"ready-pose planning failed: {planned}") + executed = manipulation.execute(blocking=True) + if not executed.succeeded: + _abort(f"ready-pose execution failed: {executed}") + typer.echo("G1 reached the ready pose.") + except (AttributeError, KeyError, RuntimeError) as exc: + _abort(f"failed to move G1 to the ready pose: {exc}") + finally: + client.stop() + + +@app.command() +def disable() -> None: + """Cancel arm motion, enter dry-run, and disarm the G1.""" + client = _connect() + failures: list[str] = [] + try: + coordinator = cast("Any", client.get_module(_COORDINATOR)) + for description, operation in ( + ("cancel trajectory", coordinator.cancel_trajectory), + ("enter dry-run", lambda: coordinator.set_dry_run(True)), + ("disarm", lambda: coordinator.set_activated(False)), + ): + try: + operation() + except Exception as exc: + failures.append(f"{description}: {exc}") + if failures: + _abort("; ".join(failures)) + typer.echo("G1 trajectory cancelled, motor output disabled, and controller disarmed.") + except (AttributeError, KeyError, RuntimeError) as exc: + _abort(f"failed to disable G1: {exc}") + finally: + client.stop() diff --git a/dimos/cli/hardware/test_g1.py b/dimos/cli/hardware/test_g1.py new file mode 100644 index 0000000000..174c9a2bc8 --- /dev/null +++ b/dimos/cli/hardware/test_g1.py @@ -0,0 +1,123 @@ +# Copyright 2026 Dimensional Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from types import SimpleNamespace +from unittest.mock import Mock + +from typer.testing import CliRunner + +from dimos.cli import hardware_cli +from dimos.cli.hardware import g1 as g1_cli +from dimos.robot.unitree.g1.manip_config import G1_READY_JOINTS, G1_READY_SPEED_SCALE + +runner = CliRunner() + + +class _Client: + def __init__(self, coordinator: Mock, manipulation: Mock | None = None) -> None: + self.coordinator = coordinator + self.manipulation = manipulation + self.stopped = False + + def get_module(self, name: str) -> Mock: + if name == "ControlCoordinator": + return self.coordinator + if name == "G1Manipulation" and self.manipulation is not None: + return self.manipulation + raise KeyError(name) + + def stop(self) -> None: + self.stopped = True + + +def _state(*, armed: bool, dry_run: bool, arming: bool = False) -> dict[str, object]: + return { + "active": armed, + "armed": armed, + "arming": arming, + "arm_pending": False, + "dry_run": dry_run, + "arming_duration": 10.0, + } + + +def test_hardware_namespace_exposes_g1_operator_commands() -> None: + result = runner.invoke(hardware_cli.app, ["g1", "--help"]) + + assert result.exit_code == 0, result.output + for command in ("status", "arm", "enable", "ready", "disable"): + assert command in result.output + + +def test_arm_forces_dry_run_before_activation_and_waits_for_armed(mocker) -> None: + coordinator = Mock() + coordinator.task_invoke.return_value = _state(armed=True, dry_run=True) + client = _Client(coordinator) + mocker.patch.object(g1_cli.Dimos, "connect", return_value=client) + + result = runner.invoke(g1_cli.app, ["arm"]) + + assert result.exit_code == 0, result.output + assert coordinator.method_calls[:2] == [ + mocker.call.set_dry_run(True), + mocker.call.set_activated(True), + ] + assert "armed in dry-run" in result.output + assert client.stopped + + +def test_enable_rejects_robot_that_has_not_completed_arming(mocker) -> None: + coordinator = Mock() + coordinator.task_invoke.return_value = _state(armed=False, dry_run=True, arming=True) + client = _Client(coordinator) + mocker.patch.object(g1_cli.Dimos, "connect", return_value=client) + + result = runner.invoke(g1_cli.app, ["enable"]) + + assert result.exit_code == 1 + assert "not fully armed" in result.output + coordinator.set_dry_run.assert_not_called() + + +def test_ready_plans_both_arms_at_conservative_speed(mocker) -> None: + coordinator = Mock() + coordinator.task_invoke.return_value = _state(armed=True, dry_run=False) + manipulation = Mock() + manipulation.plan_to_joints.return_value = SimpleNamespace(succeeded=True) + manipulation.execute.return_value = SimpleNamespace(succeeded=True) + client = _Client(coordinator, manipulation) + mocker.patch.object(g1_cli.Dimos, "connect", return_value=client) + + result = runner.invoke(g1_cli.app, ["ready"]) + + assert result.exit_code == 0, result.output + targets = manipulation.plan_to_joints.call_args.args[0] + assert set(targets) == {"g1_upper_body/left_arm", "g1_upper_body/right_arm"} + assert tuple(targets["g1_upper_body/left_arm"].position) == G1_READY_JOINTS["left_arm"] + assert tuple(targets["g1_upper_body/right_arm"].position) == G1_READY_JOINTS["right_arm"] + assert manipulation.plan_to_joints.call_args.kwargs == {"speed_scale": G1_READY_SPEED_SCALE} + manipulation.execute.assert_called_once_with(blocking=True) + + +def test_disable_attempts_every_safety_action(mocker) -> None: + coordinator = Mock() + client = _Client(coordinator) + mocker.patch.object(g1_cli.Dimos, "connect", return_value=client) + + result = runner.invoke(g1_cli.app, ["disable"]) + + assert result.exit_code == 0, result.output + coordinator.cancel_trajectory.assert_called_once_with() + coordinator.set_dry_run.assert_called_once_with(True) + coordinator.set_activated.assert_called_once_with(False) diff --git a/dimos/cli/hardware_cli.py b/dimos/cli/hardware_cli.py index 846cf9d1fe..985ba7746a 100644 --- a/dimos/cli/hardware_cli.py +++ b/dimos/cli/hardware_cli.py @@ -17,6 +17,8 @@ import typer from dimos.cli.hardware.a1z import app as a1z_app +from dimos.cli.hardware.g1 import app as g1_app app = typer.Typer(help="Diagnose and configure robot hardware", no_args_is_help=True) app.add_typer(a1z_app, name="a1z") +app.add_typer(g1_app, name="g1") diff --git a/dimos/control/tasks/g1_groot_wbc_task/_registry.py b/dimos/control/tasks/g1_groot_wbc_task/_registry.py index d38545151a..f9ed534e86 100644 --- a/dimos/control/tasks/g1_groot_wbc_task/_registry.py +++ b/dimos/control/tasks/g1_groot_wbc_task/_registry.py @@ -21,5 +21,12 @@ } TASK_EXPOSES: dict[str, list[str]] = { - "g1_groot_wbc": ["arm", "disarm", "set_dry_run", "reset_runtime_state", "start"], + "g1_groot_wbc": [ + "arm", + "disarm", + "set_dry_run", + "state_snapshot", + "reset_runtime_state", + "start", + ], } diff --git a/dimos/robot/assets/model.py b/dimos/robot/assets/model.py index ca8f393066..1e29fb5051 100644 --- a/dimos/robot/assets/model.py +++ b/dimos/robot/assets/model.py @@ -99,6 +99,8 @@ class RobotModel: _fixed_frames: tuple[_FixedFrame, ...] = () _fixed_joints: tuple[str, ...] = () _joint_position_limits: tuple[_JointPositionLimits, ...] = () + _subtree_root_link: str | None = None + _removed_joint_subtrees: tuple[str, ...] = () @classmethod def from_file( @@ -134,6 +136,30 @@ def with_fixed_frame( _fixed_frames=(*self._fixed_frames, _FixedFrame(name, parent, xyz, rpy)), ) + def with_subtree_rooted_at(self, root_link: str) -> RobotModel: + """Return a view containing an existing link and its descendants. + + This selects an existing structural subtree. It does not reverse joints + or recompute transforms as a kinematic rerooting operation would. + """ + if not root_link: + raise ValueError("Subtree root link must not be empty") + if self._subtree_root_link is not None: + raise ValueError(f"Subtree root link is already selected: {self._subtree_root_link}") + return replace(self, _subtree_root_link=root_link) + + def without_joint_subtrees(self, *joint_names: str) -> RobotModel: + """Return a view without the named joints and their descendant branches.""" + if not joint_names: + raise ValueError("At least one joint subtree must be removed") + if any(not name for name in joint_names): + raise ValueError("Joint subtree names must not be empty") + requested = (*self._removed_joint_subtrees, *joint_names) + if len(set(requested)) != len(requested): + duplicate = next(name for name in requested if requested.count(name) > 1) + raise ValueError(f"Joint subtree already requested for removal: {duplicate}") + return replace(self, _removed_joint_subtrees=requested) + def with_fixed_joints(self, *names: str) -> RobotModel: """Return a model with movable joints fixed at their URDF zero pose.""" if not names: @@ -180,6 +206,16 @@ def _loaded(self) -> LoadedRobotModel: else: xml = source_path.read_text() xml = _resolve_package_uris(xml, package_paths) + if self._subtree_root_link is not None or self._removed_joint_subtrees: + xml = _select_structural_subtree( + xml, + root_link=self._subtree_root_link, + removed_joint_subtrees=self._removed_joint_subtrees, + ) + xml = _resolve_relative_asset_paths( + xml, + search_directories=(source_path.parent, *package_paths.values()), + ) if self._fixed_joints: xml = _set_joints_fixed(xml, self._fixed_joints) if self._joint_position_limits: @@ -230,6 +266,80 @@ def _add_fixed_frames(xml: str, frames: tuple[_FixedFrame, ...]) -> str: return ET.tostring(root, encoding="unicode") +def _select_structural_subtree( + xml: str, + *, + root_link: str | None, + removed_joint_subtrees: tuple[str, ...], +) -> str: + root = ET.fromstring(xml) + links = {link.get("name"): link for link in root.findall("link")} + joints = {joint.get("name"): joint for joint in root.findall("joint")} + if None in links or len(links) != len(root.findall("link")): + raise ValueError("Robot model links must have unique non-empty names") + if None in joints or len(joints) != len(root.findall("joint")): + raise ValueError("Robot model joints must have unique non-empty names") + + topology = _parse_topology(xml) + selected_root = root_link or topology[1] + if selected_root not in links: + raise ValueError(f"Subtree root link not found: {selected_root}") + + children_by_link: dict[str, list[tuple[str, str]]] = {} + joint_children: dict[str, str] = {} + for joint in topology[0]: + if not joint.parent_link or not joint.child_link: + raise ValueError(f"Joint has incomplete topology: {joint.name}") + children_by_link.setdefault(joint.parent_link, []).append((joint.name, joint.child_link)) + joint_children[joint.name] = joint.child_link + + selected_links, selected_joints = _descendant_closure(selected_root, children_by_link) + for joint_name in removed_joint_subtrees: + if joint_name not in joints: + raise ValueError(f"Joint subtree not found: {joint_name}") + if joint_name not in selected_joints: + raise ValueError( + f"Joint subtree is outside selected root '{selected_root}': {joint_name}" + ) + + removed_links: set[str] = set() + removed_joints: set[str] = set() + for joint_name in removed_joint_subtrees: + child_link = joint_children[joint_name] + branch_links, branch_joints = _descendant_closure(child_link, children_by_link) + removed_links.update(branch_links) + removed_joints.add(joint_name) + removed_joints.update(branch_joints) + + kept_links = selected_links - removed_links + kept_joints = selected_joints - removed_joints + for link in list(root.findall("link")): + if link.get("name") not in kept_links: + root.remove(link) + for joint_element in list(root.findall("joint")): + if joint_element.get("name") not in kept_joints: + root.remove(joint_element) + return ET.tostring(root, encoding="unicode") + + +def _descendant_closure( + root_link: str, + children_by_link: Mapping[str, list[tuple[str, str]]], +) -> tuple[set[str], set[str]]: + links: set[str] = set() + joints: set[str] = set() + pending = [root_link] + while pending: + link_name = pending.pop() + if link_name in links: + raise ValueError(f"Robot model topology contains a cycle at link: {link_name}") + links.add(link_name) + for joint_name, child_link in children_by_link.get(link_name, []): + joints.add(joint_name) + pending.append(child_link) + return links, joints + + def _set_joints_fixed(xml: str, names: tuple[str, ...]) -> str: root = ET.fromstring(xml) joints = {joint.get("name"): joint for joint in root.findall("joint")} @@ -346,6 +456,32 @@ def replace_uri(match: re.Match[str]) -> str: return re.sub(pattern, replace_uri, xml) +def _resolve_relative_asset_paths( + xml: str, + *, + search_directories: tuple[Path, ...], +) -> str: + """Resolve URDF assets against the source directory and package roots.""" + root = ET.fromstring(xml) + changed = False + for element in (*root.findall(".//mesh"), *root.findall(".//texture")): + filename = element.get("filename") + if not filename or Path(filename).is_absolute() or "://" in filename: + continue + candidates = list( + dict.fromkeys((directory / filename).resolve() for directory in search_directories) + ) + matches = [candidate for candidate in candidates if candidate.exists()] + if len(matches) == 1: + element.set("filename", str(matches[0])) + changed = True + elif len(matches) > 1: + raise ValueError(f"Ambiguous relative asset path {filename!r}: {matches}") + else: + logger.warning(f"Relative asset not found in {search_directories}: {filename}") + return ET.tostring(root, encoding="unicode") if changed else xml + + def _normalize_package_paths( package_paths: Mapping[str, Path | str | os.PathLike[str]], ) -> dict[str, Path]: diff --git a/dimos/robot/assets/test_model.py b/dimos/robot/assets/test_model.py index f62439b3d8..2d179c6cbd 100644 --- a/dimos/robot/assets/test_model.py +++ b/dimos/robot/assets/test_model.py @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +from collections.abc import Callable from pathlib import Path import pickle import xml.etree.ElementTree as ET @@ -80,6 +81,31 @@ def test_model_load_resolves_package_uris_without_writing_a_derived_urdf( assert set(tmp_path.iterdir()) == {package, urdf} +def test_model_load_resolves_relative_assets_from_source_directory(tmp_path: Path) -> None: + meshes = tmp_path / "meshes" + meshes.mkdir() + mesh = meshes / "link.stl" + mesh.write_text("mesh") + texture = tmp_path / "surface.png" + texture.write_text("texture") + urdf = tmp_path / "robot.urdf" + urdf.write_text( + "" + '' + '' + ) + + loaded = robot_model.RobotModel.from_file(urdf).load() + root = ET.fromstring(loaded.xml) + loaded_mesh = root.find(".//mesh") + loaded_texture = root.find(".//texture") + + assert loaded_mesh is not None + assert loaded_texture is not None + assert loaded_mesh.get("filename") == str(mesh) + assert loaded_texture.get("filename") == str(texture) + + def test_loaded_model_exposes_cached_urdf_topology(tmp_path: Path) -> None: loaded = robot_model.LoadedRobotModel( """ @@ -218,6 +244,111 @@ def test_with_fixed_joints_preserves_topology_and_removes_movable_elements( assert "type='revolute'" in urdf.read_text() +def test_with_subtree_rooted_at_selects_existing_descendants(tmp_path: Path) -> None: + urdf = tmp_path / "robot.urdf" + urdf.write_text( + "" + "" + "" + "" + "" + "" + ) + + loaded = robot_model.RobotModel.from_file(urdf).with_subtree_rooted_at("pelvis").load() + root = ET.fromstring(loaded.xml) + + assert loaded.root_link == "pelvis" + assert [link.get("name") for link in root.findall("link")] == ["pelvis", "leg", "torso"] + assert [joint.get("name") for joint in root.findall("joint")] == ["hip", "waist"] + assert root.find("material[@name='dark']") is not None + assert root.find("gazebo[@reference='leg']") is not None + assert " None: + urdf = tmp_path / "robot.urdf" + urdf.write_text( + "" + "" + "" + "" + "" + "" + ) + + loaded = ( + robot_model.RobotModel.from_file(urdf) + .with_subtree_rooted_at("pelvis") + .without_joint_subtrees("hip_joint") + .load() + ) + root = ET.fromstring(loaded.xml) + + assert loaded.root_link == "pelvis" + assert [link.get("name") for link in root.findall("link")] == ["pelvis", "torso"] + assert [joint.get("name") for joint in root.findall("joint")] == ["waist_joint"] + + +@pytest.mark.parametrize( + ("configure", "message"), + [ + (lambda model: model.with_subtree_rooted_at("missing"), "root link not found"), + (lambda model: model.without_joint_subtrees("missing"), "subtree not found"), + ( + lambda model: model.with_subtree_rooted_at("torso").without_joint_subtrees("hip_joint"), + "outside selected root", + ), + ], +) +def test_structural_model_views_reject_unknown_or_out_of_scope_topology( + tmp_path: Path, + configure: Callable[[robot_model.RobotModel], robot_model.RobotModel], + message: str, +) -> None: + urdf = tmp_path / "robot.urdf" + urdf.write_text( + "" + "" + "" + "" + "" + ) + + with pytest.raises(ValueError, match=message): + configure(robot_model.RobotModel.from_file(urdf)).load() + + +def test_structural_model_view_validates_later_transformations(tmp_path: Path) -> None: + urdf = tmp_path / "robot.urdf" + urdf.write_text( + "" + "" + "" + "" + "" + ) + model = ( + robot_model.RobotModel.from_file(urdf) + .without_joint_subtrees("hip_joint") + .with_fixed_joints("hip_joint") + ) + + with pytest.raises(ValueError, match="Joint not found: hip_joint"): + model.load() + + +def test_structural_model_view_rejects_duplicate_configuration(tmp_path: Path) -> None: + urdf = tmp_path / "robot.urdf" + urdf.write_text("") + model = robot_model.RobotModel.from_file(urdf) + + with pytest.raises(ValueError, match="already selected"): + model.with_subtree_rooted_at("pelvis").with_subtree_rooted_at("pelvis") + with pytest.raises(ValueError, match="already requested"): + model.without_joint_subtrees("hip", "hip") + + @pytest.mark.parametrize( ("joint_xml", "names", "message"), [ diff --git a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_groot_wbc.py b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_groot_wbc.py index 959dc4befa..3f8f43e626 100644 --- a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_groot_wbc.py +++ b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_groot_wbc.py @@ -76,7 +76,6 @@ from dimos.msgs.sensor_msgs.MotorCommandArray import MotorCommandArray from dimos.navigation.movement_manager.movement_manager import MovementManager from dimos.navigation.replanning_a_star.module import ReplanningAStarPlanner -from dimos.robot.assets.model import RobotModel from dimos.robot.unitree.g1.config import G1 from dimos.robot.unitree.g1.g1_rerun import ( G1_RERUN_ROOT, @@ -84,6 +83,10 @@ g1_urdf_joint_state, g1_urdf_static_robot, ) +from dimos.robot.unitree.g1.manip_config import ( + G1_UPPER_BODY_JOINT_NAME_MAPPING, + G1_UPPER_BODY_MODEL, +) from dimos.robot.unitree.g1.teleop_ik import G1PinkPoseTargetSolver from dimos.simulation.scene_assets.spec import ScenePackage from dimos.utils.data import LfsPath @@ -393,11 +396,11 @@ def _g1_nav_path(path: NavPath) -> Any: _G1_URDF_PATH = Path(__file__).resolve().parents[2] / "g1.urdf" G1_TELEOP_TASK_NAME = "teleop_g1" _G1_ARM_JOINT_NAME_MAPPING = { - joint_name: f"{joint_name.partition('/')[2]}_joint" for joint_name in g1_arms + joint_name: G1_UPPER_BODY_JOINT_NAME_MAPPING[joint_name] for joint_name in g1_arms } _G1_TELEOP_MODEL = RobotModelConfig( name="g1_arms", - model=RobotModel.from_file(_G1_URDF_PATH), + model=G1_UPPER_BODY_MODEL, joint_names=list(_G1_ARM_JOINT_NAME_MAPPING.values()), base_link="pelvis", joint_name_mapping=_G1_ARM_JOINT_NAME_MAPPING, diff --git a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_teleop.py b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_teleop.py index 9268dafdc3..589fc49858 100644 --- a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_teleop.py +++ b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_teleop.py @@ -57,11 +57,14 @@ from dimos.core.transport import pSHMTransport from dimos.imitation.collection.episode_monitor import EpisodeMonitorModule from dimos.imitation.collection.recorder import CollectionRecorder +from dimos.manipulation.manipulation_module import ManipulationModule from dimos.msgs.geometry_msgs.PoseStamped import PoseStamped from dimos.msgs.sensor_msgs.Image import Image from dimos.robot.unitree.g1.blueprints.basic.unitree_g1_groot_wbc import ( + _G1GrootCoordinator, unitree_g1_groot_wbc, ) +from dimos.robot.unitree.g1.manip_config import g1_upper_body_model_config from dimos.teleop.quest.quest_extensions import MobileVideoArmTeleopModule @@ -103,10 +106,19 @@ def _camera_if_real() -> tuple[Blueprint, ...]: return (DedicatedRealSenseCamera.blueprint(enable_pointcloud=False),) +class G1ManipulationModule(ManipulationModule): + """Own the fixed, stationary-only G1 upper-body planning model.""" + + def _initialize_planning(self) -> None: + self.config.robots = [g1_upper_body_model_config()] + super()._initialize_planning() + + unitree_g1_teleop = ( autoconnect( unitree_g1_groot_wbc, MobileVideoArmTeleopModule.blueprint(), + G1ManipulationModule.blueprint(instance_name="G1Manipulation"), *_camera_if_real(), EpisodeMonitorModule.blueprint(), # default button_map: toggle=B, discard=Y G1CollectionRecorder.blueprint( @@ -127,6 +139,7 @@ def _camera_if_real() -> tuple[Blueprint, ...]: (MobileVideoArmTeleopModule, "left_controller_output", "left_cartesian_command"), (MobileVideoArmTeleopModule, "right_controller_output", "right_cartesian_command"), (MobileVideoArmTeleopModule, "cmd_vel", "tele_cmd_vel"), + (G1ManipulationModule, "_control_coordinator", _G1GrootCoordinator), ] ) # Camera frames stay off the LCM bus: every consumer (quest module, diff --git a/dimos/robot/unitree/g1/manip_config.py b/dimos/robot/unitree/g1/manip_config.py new file mode 100644 index 0000000000..dca32e472d --- /dev/null +++ b/dimos/robot/unitree/g1/manip_config.py @@ -0,0 +1,98 @@ +# Copyright 2026 Dimensional Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Upper-body planning model for the Unitree G1.""" + +from __future__ import annotations + +from pathlib import Path + +from dimos.control.tasks.g1_groot_wbc_task.g1_groot_wbc_task import g1_arms, g1_legs_waist +from dimos.manipulation.planning.groups.models import PlanningGroupDefinition +from dimos.manipulation.planning.spec.config import RobotModelConfig +from dimos.robot.assets.model import RobotModel +from dimos.utils.data import LfsPath + +G1_URDF_PATH = Path(__file__).resolve().parent / "g1.urdf" +G1_UPPER_BODY_NAME = "g1_upper_body" + +G1_WAIST_JOINTS = tuple(g1_legs_waist[-3:]) +G1_LEFT_ARM_JOINTS = tuple(g1_arms[:7]) +G1_RIGHT_ARM_JOINTS = tuple(g1_arms[7:]) + + +def _urdf_joint_name(coordinator_name: str) -> str: + return f"{coordinator_name.partition('/')[2]}_joint" + + +G1_UPPER_BODY_JOINTS = (*G1_WAIST_JOINTS, *g1_arms) +G1_UPPER_BODY_JOINT_NAME_MAPPING = { + joint_name: _urdf_joint_name(joint_name) for joint_name in G1_UPPER_BODY_JOINTS +} +G1_UPPER_BODY_MODEL = ( + RobotModel.from_file( + G1_URDF_PATH, + package_paths={"g1_description": LfsPath("g1_urdf")}, + ) + .with_subtree_rooted_at("pelvis") + .without_joint_subtrees("left_hip_pitch_joint", "right_hip_pitch_joint") +) + +G1_READY_JOINTS = { + "left_arm": (-0.4, 0.2, 0.0, 1.2, 0.0, 0.0, 0.0), + "right_arm": (-0.4, -0.2, 0.0, 1.2, 0.0, 0.0, 0.0), +} +G1_READY_SPEED_SCALE = 0.25 + + +def g1_upper_body_model_config() -> RobotModelConfig: + """Build the stationary G1 upper-body collision and kinematics model. + + Waist joints remain in the model so measured torso motion is reflected in + collision checks, but only the two arm groups are eligible for planning. + The removed leg branches are therefore outside the collision world; this + model must only be used while the robot is stationary. + """ + local_waist = tuple(_urdf_joint_name(name) for name in G1_WAIST_JOINTS) + local_left = tuple(_urdf_joint_name(name) for name in G1_LEFT_ARM_JOINTS) + local_right = tuple(_urdf_joint_name(name) for name in G1_RIGHT_ARM_JOINTS) + return RobotModelConfig( + name=G1_UPPER_BODY_NAME, + model=G1_UPPER_BODY_MODEL, + joint_names=[*local_waist, *local_left, *local_right], + base_link="pelvis", + planning_groups=[ + PlanningGroupDefinition( + name="left_arm", + joint_names=local_left, + base_link="pelvis", + tip_link="left_rubber_hand", + ), + PlanningGroupDefinition( + name="right_arm", + joint_names=local_right, + base_link="pelvis", + tip_link="right_rubber_hand", + ), + ], + collision_exclusion_pairs=[ + ("torso_link", "left_shoulder_yaw_link"), + ("torso_link", "left_shoulder_roll_link"), + ("torso_link", "right_shoulder_yaw_link"), + ("torso_link", "right_shoulder_roll_link"), + ], + max_velocity=1.0, + max_acceleration=2.0, + joint_name_mapping=G1_UPPER_BODY_JOINT_NAME_MAPPING, + ) diff --git a/dimos/robot/unitree/g1/test_g1_teleop.py b/dimos/robot/unitree/g1/test_g1_teleop.py index c5ee2c6d12..0e52870ceb 100644 --- a/dimos/robot/unitree/g1/test_g1_teleop.py +++ b/dimos/robot/unitree/g1/test_g1_teleop.py @@ -25,18 +25,28 @@ from dimos.control.tasks.trajectory_task.trajectory_task import JOINT_TRAJECTORY_TASK_NAME from dimos.control.teleop_coordinator import TeleopControlCoordinator from dimos.core.coordination.blueprints import Blueprint +from dimos.manipulation.planning.factory import create_world from dimos.msgs.sensor_msgs.JointState import JointState from dimos.robot.unitree.g1.blueprints.basic.unitree_g1_groot_wbc import ( _G1_ARM_JOINT_NAME_MAPPING, _G1_TELEOP_MODEL, _G1_TELEOP_PINK, G1_TELEOP_TASK_NAME, + _G1GrootCoordinator, unitree_g1_groot_wbc, ) from dimos.robot.unitree.g1.blueprints.basic.unitree_g1_teleop import ( G1CollectionRecorder, + G1ManipulationModule, unitree_g1_teleop, ) +from dimos.robot.unitree.g1.manip_config import ( + G1_LEFT_ARM_JOINTS, + G1_RIGHT_ARM_JOINTS, + G1_UPPER_BODY_JOINT_NAME_MAPPING, + G1_WAIST_JOINTS, + g1_upper_body_model_config, +) from dimos.robot.unitree.g1.teleop_ik import G1PinkPoseTargetSolver from dimos.teleop.quest.quest_extensions import MobileVideoArmTeleopModule @@ -113,6 +123,56 @@ def test_g1_teleop_wires_arm_velocity_and_recording_streams() -> None: assert "right_cartesian_command" in G1CollectionRecorder.__annotations__ +def test_g1_upper_body_model_keeps_waist_and_arms_but_removes_legs() -> None: + config = g1_upper_body_model_config() + loaded = config.model.load() + joint_names = {joint.name for joint in loaded.joints} + + assert loaded.root_link == "pelvis" + assert "left_hip_pitch_joint" not in joint_names + assert "right_hip_pitch_joint" not in joint_names + assert {_G1_ARM_JOINT_NAME_MAPPING[name] for name in g1_arms} <= joint_names + assert {G1_UPPER_BODY_JOINT_NAME_MAPPING[name] for name in G1_WAIST_JOINTS} <= joint_names + assert config.max_velocity == 1.0 + assert config.max_acceleration == 2.0 + + +def test_g1_upper_body_plans_arms_without_owning_waist() -> None: + config = g1_upper_body_model_config() + + assert config.joint_names == [ + *(G1_UPPER_BODY_JOINT_NAME_MAPPING[name] for name in G1_WAIST_JOINTS), + *(G1_UPPER_BODY_JOINT_NAME_MAPPING[name] for name in g1_arms), + ] + assert [group.name for group in config.planning_groups] == ["left_arm", "right_arm"] + assert config.planning_groups[0].joint_names == tuple( + G1_UPPER_BODY_JOINT_NAME_MAPPING[name] for name in G1_LEFT_ARM_JOINTS + ) + assert config.planning_groups[1].joint_names == tuple( + G1_UPPER_BODY_JOINT_NAME_MAPPING[name] for name in G1_RIGHT_ARM_JOINTS + ) + + +def test_g1_teleop_wires_manipulation_to_existing_coordinator() -> None: + manipulation_kwargs = _module_kwargs(unitree_g1_teleop, G1ManipulationModule) + + assert manipulation_kwargs["instance_name"] == "G1Manipulation" + assert ( + unitree_g1_teleop.remapping_map[("G1Manipulation", "_control_coordinator")] + is _G1GrootCoordinator + ) + + +@pytest.mark.self_hosted +def test_g1_upper_body_model_builds_a_roboplan_scene() -> None: + world = create_world() + + robot_id = world.add_robot(g1_upper_body_model_config()) + world.finalize() + + assert world.get_robot_ids() == [robot_id] + + @pytest.mark.self_hosted def test_g1_pink_solver_reduces_model_and_uses_g1_objective() -> None: frames = ("left_rubber_hand", "right_rubber_hand") diff --git a/dimos/utils/data.py b/dimos/utils/data.py index ba401ce63b..85196a0097 100644 --- a/dimos/utils/data.py +++ b/dimos/utils/data.py @@ -378,6 +378,20 @@ def __fspath__(self) -> str: """Return filesystem path, downloading from LFS if needed.""" return str(self._ensure_downloaded()) + def __eq__(self, other: object) -> bool: + """Compare lazy handles without downloading their contents.""" + if not isinstance(other, LfsPath): + return NotImplemented + return bool( + object.__getattribute__(self, "_lfs_filename") + == object.__getattribute__(other, "_lfs_filename") + ) + + def __hash__(self) -> int: + """Hash the logical LFS name without downloading its contents.""" + filename = object.__getattribute__(self, "_lfs_filename") + return hash((LfsPath, os.fspath(filename))) + def __truediv__(self, other: object) -> "LfsPath": """Path division operator - returns a new lazy LfsPath (no download).""" filename = object.__getattribute__(self, "_lfs_filename") diff --git a/dimos/utils/test_data.py b/dimos/utils/test_data.py index 44d5e5ee8e..b1b1a86ada 100644 --- a/dimos/utils/test_data.py +++ b/dimos/utils/test_data.py @@ -305,6 +305,16 @@ def test_lfs_path_safe_attributes() -> None: assert callable(ensure_fn) +def test_lfs_path_hash_and_equality_do_not_download() -> None: + first = LfsPath("robot_description") + second = LfsPath("robot_description") + + assert first == second + assert hash(first) == hash(second) + assert object.__getattribute__(first, "_lfs_resolved_cache") is None + assert object.__getattribute__(second, "_lfs_resolved_cache") is None + + def test_lfs_path_no_download_on_creation() -> None: """Test that LfsPath construction doesn't trigger download. diff --git a/docs/adr/0001-derived-robot-model-views.md b/docs/adr/0001-derived-robot-model-views.md new file mode 100644 index 0000000000..d8561fe139 --- /dev/null +++ b/docs/adr/0001-derived-robot-model-views.md @@ -0,0 +1,52 @@ +# ADR 0001: Derive planning models from the canonical robot description + +Status: Accepted + +## Context + +A robot can need several planning scopes without having several independent +descriptions. The G1 whole-body controller uses all 29 actuated joints, Quest +teleoperation controls 14 arm joints, and collision-aware manipulation needs +the pelvis, live waist, torso, and both arms but not the legs. + +Copying or hand-editing an upper-body URDF would create another source of +truth. It could silently drift from the hardware description, joint limits, +meshes, or link transforms. Loading the full floating-base model also gives +manipulation backends a root and collision scope that do not match stationary +upper-body planning. + +## Decision + +`RobotModel` provides two lazy, immutable structural transformations: + +- `with_subtree_rooted_at(link)` selects an existing link and all descendants. +- `without_joint_subtrees(*joints)` removes each named joint and its descendant + link branch. + +These operations record intent. They parse and validate the source only when a +backend calls `load()`, preserving lazy asset checkout. They run before joint +fixing, limit overrides, and fixed-frame additions. + +Materialization also resolves relative mesh and texture references against the +source description's directory. This keeps an in-memory derived model usable +after a backend composes it without the original URDF working directory. + +This is structural selection, not kinematic rerooting. The API never reverses +joints or recomputes transforms. It rejects unknown roots, unknown removal +joints, removals outside the selected subtree, cycles, and duplicate requests. + +The G1 upper-body view starts from the canonical G1 URDF, selects the subtree +rooted at `pelvis`, and removes the branches beginning at +`left_hip_pitch_joint` and `right_hip_pitch_joint`. It retains the three waist +joints as observed state. Only the two seven-joint arm groups are eligible for +planning. + +## Consequences + +- Whole-body control, Quest IK, and manipulation share one robot description. +- Waist motion is represented in upper-body kinematics and collision checks + without giving the manipulation planner ownership of the waist. +- Leg collision geometry is intentionally absent. G1 manipulation planning is + valid only while the robot is stationary on clear, level ground. +- A future use case that needs a true kinematic reroot must introduce a + different operation with explicit transform semantics. diff --git a/docs/platforms/humanoid/g1/index.md b/docs/platforms/humanoid/g1/index.md index f33285f152..ddef846a0a 100644 --- a/docs/platforms/humanoid/g1/index.md +++ b/docs/platforms/humanoid/g1/index.md @@ -76,7 +76,114 @@ Note: this button combination may vary based on the model of the G1 - The robot will be super stiff now. Manually pick it up into a standing position and hold it there. - Press **R2 + A** (will attempt to self-balance) -## 4. Run the Blueprint +## 4. Start G1 teleoperation + +Use a clear, level work area. Keep the Unitree remote in an operator's hands, +keep the emergency stop reachable, and use a gantry or spotter for the first +hardware run. The upper-body planner does not include leg collision geometry; +do not walk while executing planned arm motion. + +The robot must already be standing and balancing in sport mode. Stop any other +program that can publish Unitree low-level commands before starting DimOS. + +On the G1 computer: + +```bash +cd ~/cc/dimos +uv sync --extra all + +LD_PRELOAD=/lib/aarch64-linux-gnu/libgomp.so.1 \ + uv run dimos \ + --viewer none \ + run unitree-g1-teleop \ + --network-interface eth0 +``` + +`--network-interface` is blueprint configuration, so it belongs after the +blueprint name. On the Jetson, preloading `libgomp` avoids the static TLS error +that can occur while importing Pinocchio. + +For an upper-body-only session, omit the mapping and route-planning workers but +keep `MovementManager`, which routes the Quest walking command: + +```bash +LD_PRELOAD=/lib/aarch64-linux-gnu/libgomp.so.1 \ + uv run dimos \ + --viewer none \ + run unitree-g1-teleop \ + --network-interface eth0 \ + --disable point-lio ray-tracing-voxel-map cost-mapper \ + replanning-a-star-planner websocket-vis-module +``` + +Wait for the Quest server to report that it is listening on port 8443. The +process starts unarmed and in dry-run on real hardware. + +### Arm and enable the controller + +Use the hardware commands from a second SSH session. They are the supported +operator interface; `dimos shell` is intended for debugging, not routine robot +startup. + +```bash +# Inspect the interlocks and planner connection. +uv run dimos hardware g1 status + +# Start the 10-second handover ramp while motor output remains in dry-run. +uv run dimos hardware g1 arm + +# Inspect the physical robot and remote, then allow motor commands. +uv run dimos hardware g1 enable + +# Optional: collision-check and execute a conservative bimanual ready pose. +uv run dimos hardware g1 ready +``` + +`ready` moves both shoulders slightly forward, bends both elbows, and uses 25% +of the configured trajectory speed. It refuses to run until arming is complete +and dry-run has been disabled. + +To stop arm motion and return to the safe startup state: + +```bash +uv run dimos hardware g1 disable +``` + +This command cancels the active trajectory, enables dry-run, and disarms the +controller. Keep the Unitree remote available as the independent physical +safety control. + +### Connect the Quest headset + +Open the following address in the Quest browser and accept the self-signed TLS +certificate: + +```text +https://:8443/teleop +``` + +The controls are: + +| Input | Operation | +|---|---| +| Left stick | Move forward or backward; yaw in strafe mode | +| Right stick | Yaw | +| Press right stick | Publish a zero-velocity stop command | +| Hold X + A | Engage both arms from a shared reference pose | +| B | Start or save a recording episode | +| Y | Discard the current episode | + +Quest arm targets preempt a running planned arm trajectory because the Quest IK +task has the higher coordinator priority. Releasing arm tracking does not +resume an old trajectory. + +### Optional Rerun viewer + +The teleoperation UI is the Quest page. Rerun is a separate visualization of +the robot, maps, and trajectories. Start the blueprint with `--viewer rerun` +for a local native viewer, or leave it at `none` for the onboard computer. + +## 5. Legacy navigation viewer example In the ssh terminal `ssh -L 3030:localhost:3030 unitree@192.168.123.164` @@ -113,7 +220,34 @@ uvx dimos-viewer --connect rerun+http://100.88.236.73:9877/proxy --ws-url ws://1 The viewer should open up. It'll run in faster-than-real speed until its caught up with reality, then should show what's happening in real time. -### Troubleshooting +## Troubleshooting + +### `libgomp.so.1: cannot allocate memory in static TLS block` + +Launch with: + +```bash +LD_PRELOAD=/lib/aarch64-linux-gnu/libgomp.so.1 uv run dimos ... +``` + +### A mapping module tries to build with Nix + +Use the upper-body-only launch command above. It disables Point-LIO, voxel +mapping, cost mapping, route planning, and the navigation web view without +removing the Quest camera, arm control, recording, or walking-command router. + +### `dimos hardware g1 status` cannot connect + +The teleop blueprint must still be running, and both terminals must use the +same DimOS transport configuration. Check the primary process with +`uv run dimos status` and `uv run dimos log -f`. + +### Ready-pose planning fails + +Do not bypass the planner. Confirm that the robot is stationary, both arm and +waist joint states are arriving, no object starts in collision with the upper +body, and `status` lists `g1_upper_body/left_arm` and +`g1_upper_body/right_arm`. #### Keyboard Controls Not Working From 1bd969d1636e49fc216d6c6cd8ce3457080531bf Mon Sep 17 00:00:00 2001 From: cc Date: Wed, 26 Aug 2026 00:13:25 -0700 Subject: [PATCH 32/57] fix: camera tf --- .../unitree/g1/blueprints/basic/unitree_g1_teleop.py | 8 +++++--- dimos/robot/unitree/g1/test_g1_teleop.py | 12 ++++++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_teleop.py b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_teleop.py index 589fc49858..3924a96cb3 100644 --- a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_teleop.py +++ b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_teleop.py @@ -123,10 +123,12 @@ def _initialize_planning(self) -> None: EpisodeMonitorModule.blueprint(), # default button_map: toggle=B, discard=Y G1CollectionRecorder.blueprint( db_path=_session_db(), - # Command/status streams have no tf frame to anchor a pose; - # declaring them avoids a per-message no-pose warning at - # teleop rates. + # Collection observations/actions are synchronized by timestamp, + # not localized in the world frame. Declaring them poseless also + # avoids attempting a world-to-camera lookup when nav localization + # is disabled for an upper-body-only session. poseless_streams=[ + "color_image", "status", "left_cartesian_command", "right_cartesian_command", diff --git a/dimos/robot/unitree/g1/test_g1_teleop.py b/dimos/robot/unitree/g1/test_g1_teleop.py index 0e52870ceb..8cbd2e87db 100644 --- a/dimos/robot/unitree/g1/test_g1_teleop.py +++ b/dimos/robot/unitree/g1/test_g1_teleop.py @@ -123,6 +123,18 @@ def test_g1_teleop_wires_arm_velocity_and_recording_streams() -> None: assert "right_cartesian_command" in G1CollectionRecorder.__annotations__ +def test_g1_collection_streams_do_not_require_world_poses() -> None: + recorder_kwargs = _module_kwargs(unitree_g1_teleop, G1CollectionRecorder) + + assert recorder_kwargs["poseless_streams"] == [ + "color_image", + "status", + "left_cartesian_command", + "right_cartesian_command", + "coordinator_joint_state", + ] + + def test_g1_upper_body_model_keeps_waist_and_arms_but_removes_legs() -> None: config = g1_upper_body_model_config() loaded = config.model.load() From 456eeb7c3e0adad1e125760312ccbea5664e05cf Mon Sep 17 00:00:00 2001 From: cc Date: Wed, 26 Aug 2026 00:18:54 -0700 Subject: [PATCH 33/57] feat(g1): expose manipulation visualizer --- .../g1/blueprints/basic/unitree_g1_teleop.py | 6 +- dimos/robot/unitree/g1/test_g1_teleop.py | 2 + docs/platforms/humanoid/g1/index.md | 19 ++ .../humanoid/g1/roboplan-libgomp-handoff.md | 170 ++++++++++++++++++ 4 files changed, 196 insertions(+), 1 deletion(-) create mode 100644 docs/platforms/humanoid/g1/roboplan-libgomp-handoff.md diff --git a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_teleop.py b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_teleop.py index 3924a96cb3..4c662b3709 100644 --- a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_teleop.py +++ b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_teleop.py @@ -58,6 +58,7 @@ from dimos.imitation.collection.episode_monitor import EpisodeMonitorModule from dimos.imitation.collection.recorder import CollectionRecorder from dimos.manipulation.manipulation_module import ManipulationModule +from dimos.manipulation.visualization.viser.config import ViserVisualizationConfig from dimos.msgs.geometry_msgs.PoseStamped import PoseStamped from dimos.msgs.sensor_msgs.Image import Image from dimos.robot.unitree.g1.blueprints.basic.unitree_g1_groot_wbc import ( @@ -118,7 +119,10 @@ def _initialize_planning(self) -> None: autoconnect( unitree_g1_groot_wbc, MobileVideoArmTeleopModule.blueprint(), - G1ManipulationModule.blueprint(instance_name="G1Manipulation"), + G1ManipulationModule.blueprint( + instance_name="G1Manipulation", + visualization=ViserVisualizationConfig(host="0.0.0.0"), + ), *_camera_if_real(), EpisodeMonitorModule.blueprint(), # default button_map: toggle=B, discard=Y G1CollectionRecorder.blueprint( diff --git a/dimos/robot/unitree/g1/test_g1_teleop.py b/dimos/robot/unitree/g1/test_g1_teleop.py index 8cbd2e87db..4c768df839 100644 --- a/dimos/robot/unitree/g1/test_g1_teleop.py +++ b/dimos/robot/unitree/g1/test_g1_teleop.py @@ -26,6 +26,7 @@ from dimos.control.teleop_coordinator import TeleopControlCoordinator from dimos.core.coordination.blueprints import Blueprint from dimos.manipulation.planning.factory import create_world +from dimos.manipulation.visualization.viser.config import ViserVisualizationConfig from dimos.msgs.sensor_msgs.JointState import JointState from dimos.robot.unitree.g1.blueprints.basic.unitree_g1_groot_wbc import ( _G1_ARM_JOINT_NAME_MAPPING, @@ -169,6 +170,7 @@ def test_g1_teleop_wires_manipulation_to_existing_coordinator() -> None: manipulation_kwargs = _module_kwargs(unitree_g1_teleop, G1ManipulationModule) assert manipulation_kwargs["instance_name"] == "G1Manipulation" + assert manipulation_kwargs["visualization"] == ViserVisualizationConfig(host="0.0.0.0") assert ( unitree_g1_teleop.remapping_map[("G1Manipulation", "_control_coordinator")] is _G1GrootCoordinator diff --git a/docs/platforms/humanoid/g1/index.md b/docs/platforms/humanoid/g1/index.md index ddef846a0a..8d4f1062d7 100644 --- a/docs/platforms/humanoid/g1/index.md +++ b/docs/platforms/humanoid/g1/index.md @@ -177,6 +177,20 @@ Quest arm targets preempt a running planned arm trajectory because the Quest IK task has the higher coordinator priority. Releasing arm tracking does not resume an old trajectory. +### Connect the manipulation panel + +The G1 teleop blueprint starts the Viser manipulation panel on all network +interfaces at port `8095`. Open this address from a computer on the robot's +trusted network: + +```text +http://:8095 +``` + +Viser remains available when the global viewer is `none`; it is independent of +Rerun. The panel can plan and execute arm motion, so do not expose port `8095` +to an untrusted network. + ### Optional Rerun viewer The teleoperation UI is the Quest page. Rerun is a separate visualization of @@ -230,6 +244,11 @@ Launch with: LD_PRELOAD=/lib/aarch64-linux-gnu/libgomp.so.1 uv run dimos ... ``` +If the failing path is under `roboplan.libs`, the RoboPlan aarch64 wheel has +loaded a second private `libgomp`; preloading the platform library alone is not +enough. See the [RoboPlan static TLS handoff](roboplan-libgomp-handoff.md) for +the confirmed reproducer, temporary workaround, and wheel acceptance criteria. + ### A mapping module tries to build with Nix Use the upper-body-only launch command above. It disables Point-LIO, voxel diff --git a/docs/platforms/humanoid/g1/roboplan-libgomp-handoff.md b/docs/platforms/humanoid/g1/roboplan-libgomp-handoff.md new file mode 100644 index 0000000000..82fc907f6f --- /dev/null +++ b/docs/platforms/humanoid/g1/roboplan-libgomp-handoff.md @@ -0,0 +1,170 @@ +# Handoff: RoboPlan `libgomp` static TLS failure on G1 + +## Status + +Confirmed on 2026-08-26 on the G1's Ubuntu aarch64 computer with Python 3.12 +and RoboPlan 0.6.0. The failure occurs in a DimOS forkserver worker. RoboPlan +imports successfully in the parent process. + +This is a native-wheel and process-load-order problem. It is not a missing +Python dependency, a DDS failure, or a robot-control failure. + +## Operator impact + +`unitree-g1-teleop` deploys `G1ManipulationModule`, then stops during module +startup. The coordinator performs its normal safe shutdown, including disabling +motor output. Upper-body planning and teleoperation never become available. + +The top-level exception is misleading: + +```text +ImportError: RoboPlanWorld requires the optional roboplan dependency. +Install the manipulation extra before selecting the roboplan backend. +``` + +The chained exception contains the real failure: + +```text +roboplan.libs/libgomp-.so.1.0.0: +cannot allocate memory in static TLS block +``` + +## Confirmed environment + +- Linux aarch64 on the G1 computer +- CPython 3.12 +- RoboPlan 0.6.0 from its manylinux 2.28 aarch64 wheel +- DimOS Python modules run in `multiprocessing` forkserver workers +- Pinocchio uses the platform `libgomp.so.1` +- The RoboPlan wheel carries a renamed private copy of `libgomp` + +The exact private filename contains a build hash. Do not encode that hash in a +permanent script or document. + +## Reproduction + +A clean-process import passes: + +```bash +LD_PRELOAD=/lib/aarch64-linux-gnu/libgomp.so.1 \ + uv run --no-sync python -c \ + 'import roboplan.core; print("roboplan.core: OK")' +``` + +Importing the full manipulation dependency graph in the parent also passes: + +```bash +LD_PRELOAD=/lib/aarch64-linux-gnu/libgomp.so.1 \ + uv run --no-sync python -c \ + 'import dimos.manipulation.manipulation_module; import roboplan.core; print("OK")' +``` + +The following hardware-free test reproduces the failure inside a real DimOS +worker: + +```bash +LD_PRELOAD=/lib/aarch64-linux-gnu/libgomp.so.1 \ +uv run --no-sync python -c 'from dimos.core.coordination.python_worker import PythonWorker; from dimos.core.coordination.worker_messages import CallMethodRequest; from dimos.robot.unitree.g1.blueprints.basic.unitree_g1_teleop import G1ManipulationModule; w=PythonWorker(); w.start_process(); a=w.deploy_module(G1ManipulationModule); print(a._send_request_to_worker(CallMethodRequest(a._module_id, "_initialize_planning", (), {}))); w.shutdown()' +``` + +This test does not connect to DDS or send robot commands. + +## Root cause + +The process loads two OpenMP runtimes: + +```text +Pinocchio ───────────────> /lib/aarch64-linux-gnu/libgomp.so.1 +RoboPlan native extension -> roboplan.libs/libgomp-.so.1.0.0 +``` + +The RoboPlan wheel repair step renamed and bundled its `libgomp`. The dynamic +loader therefore treats it as a second library rather than reusing the platform +copy already loaded for Pinocchio. + +`libgomp` uses static thread-local storage. On aarch64, loading the private copy +late in the forkserver worker exhausts the available static TLS block. A clean +Python process succeeds because it has loaded fewer native libraries before +RoboPlan. + +Preloading only `/lib/aarch64-linux-gnu/libgomp.so.1` cannot fix the worker: +RoboPlan's extension names its private, renamed library as a separate dependency. + +## Temporary workaround + +Preload both copies before starting DimOS. Resolve the private filename from the +active virtual environment instead of copying its wheel hash: + +```bash +cd ~/cc/dimos + +ROBOPLAN_GOMP="$(find "$PWD/.venv/lib/python3.12/site-packages/roboplan.libs" \ + -maxdepth 1 -name 'libgomp-*.so*' -print -quit)" +test -n "$ROBOPLAN_GOMP" + +LD_PRELOAD="$ROBOPLAN_GOMP:/lib/aarch64-linux-gnu/libgomp.so.1" \ + uv run --no-sync dimos \ + --viewer none \ + run unitree-g1-teleop \ + --network-interface eth0 +``` + +This workaround is suitable for diagnosis and short-term robot testing. It is +not the desired operator interface: it exposes a private wheel implementation +detail and may change when RoboPlan is rebuilt. + +Run the worker-only reproducer with the same dual preload before trying hardware. +Success reaches `World finalized` and exits without an exception. + +## Preferred fix + +Publish an aarch64 RoboPlan wheel that depends on the platform +`libgomp.so.1` instead of bundling and renaming a private copy. Pinocchio and +RoboPlan should then share one OpenMP runtime. + +Review the wheel-repair configuration and exclude `libgomp.so.1` from vendoring. +After publishing the corrected wheel, update the RoboPlan constraint in DimOS +and remove the dual-preload workaround. + +### Wheel acceptance criteria + +On Linux aarch64 with Python 3.12: + +1. `roboplan.core` imports without `LD_PRELOAD` in a clean process. +2. The worker-only reproducer reaches `World finalized` without `LD_PRELOAD`. +3. RoboPlan's native extensions depend on `libgomp.so.1`; the wheel contains no + `roboplan.libs/libgomp-*` copy. +4. The G1 teleop stack starts repeatedly without a static TLS error. +5. Planning a representative upper-body motion succeeds. + +## DimOS follow-up + +Fix the optional-dependency guard independently of the wheel. Both +`roboplan_world.py` and `roboplan_planner.py` catch every `ImportError` raised by +`import roboplan.core` and replace it with an installation hint. This masks +native loader failures and missing transitive libraries. + +The guard should distinguish a missing RoboPlan distribution from an import +failure inside an installed distribution. At minimum, include the original +exception text in the top-level error. Add a test that injects a nested +`ImportError` and verifies that its loader detail remains visible. + +Do not solve the permanent problem by globally preloading RoboPlan in every +DimOS worker. That would make an optional manipulation backend part of all +worker startup and would leave the duplicate OpenMP runtimes in place. + +## Investigation notes + +The following hypotheses were eliminated: + +- The `manipulation` extra was absent: `importlib.metadata` reported RoboPlan + 0.6.0. +- RoboPlan lacked an aarch64 wheel: the installed native extension imported in + the parent process. +- The DimOS RoboPlan adapter was invalid: `RoboPlanWorld()` constructed in the + parent process. +- Importing `ManipulationModule` first caused the failure: that ordering also + passed in the parent process. + +The worker-only reproducer exposed the chained static TLS exception and should +remain the primary regression check for this issue. From e6e7455ec1e793550c28bd92eceaae540dbac850 Mon Sep 17 00:00:00 2001 From: cc Date: Wed, 26 Aug 2026 00:28:40 -0700 Subject: [PATCH 34/57] fix(g1): configure manipulation execution target --- dimos/robot/unitree/g1/blueprints/basic/unitree_g1_teleop.py | 5 +---- dimos/robot/unitree/g1/test_g1_teleop.py | 1 + 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_teleop.py b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_teleop.py index 4c662b3709..a179486776 100644 --- a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_teleop.py +++ b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_teleop.py @@ -110,10 +110,6 @@ def _camera_if_real() -> tuple[Blueprint, ...]: class G1ManipulationModule(ManipulationModule): """Own the fixed, stationary-only G1 upper-body planning model.""" - def _initialize_planning(self) -> None: - self.config.robots = [g1_upper_body_model_config()] - super()._initialize_planning() - unitree_g1_teleop = ( autoconnect( @@ -121,6 +117,7 @@ def _initialize_planning(self) -> None: MobileVideoArmTeleopModule.blueprint(), G1ManipulationModule.blueprint( instance_name="G1Manipulation", + robots=[g1_upper_body_model_config()], visualization=ViserVisualizationConfig(host="0.0.0.0"), ), *_camera_if_real(), diff --git a/dimos/robot/unitree/g1/test_g1_teleop.py b/dimos/robot/unitree/g1/test_g1_teleop.py index 4c768df839..838e1e3014 100644 --- a/dimos/robot/unitree/g1/test_g1_teleop.py +++ b/dimos/robot/unitree/g1/test_g1_teleop.py @@ -170,6 +170,7 @@ def test_g1_teleop_wires_manipulation_to_existing_coordinator() -> None: manipulation_kwargs = _module_kwargs(unitree_g1_teleop, G1ManipulationModule) assert manipulation_kwargs["instance_name"] == "G1Manipulation" + assert [robot.name for robot in manipulation_kwargs["robots"]] == ["g1_upper_body"] assert manipulation_kwargs["visualization"] == ViserVisualizationConfig(host="0.0.0.0") assert ( unitree_g1_teleop.remapping_map[("G1Manipulation", "_control_coordinator")] From 92e0daf8b7fbcda52dc4f0909c8a2c5ec605025b Mon Sep 17 00:00:00 2001 From: cc Date: Wed, 26 Aug 2026 00:46:51 -0700 Subject: [PATCH 35/57] fix(g1): repair stacked PR CI contracts --- dimos/control/tasks/test_registry.py | 4 +++- dimos/robot/all_blueprints.py | 1 + docs/platforms/humanoid/g1/index.md | 6 +++--- .../humanoid/g1/roboplan-libgomp-handoff.md | 16 ++++++++-------- 4 files changed, 15 insertions(+), 12 deletions(-) diff --git a/dimos/control/tasks/test_registry.py b/dimos/control/tasks/test_registry.py index df01a9113e..9eb45fe6e0 100644 --- a/dimos/control/tasks/test_registry.py +++ b/dimos/control/tasks/test_registry.py @@ -170,7 +170,9 @@ def test_seeded_cards_load_into_registry() -> None: assert trajectory.exposes == frozenset({"execute", "cancel", "get_state", "get_status"}) g1 = control_task_registry.bindings_for("g1_groot_wbc") assert g1.consumes == (StreamBinding("twist_command", "on_twist_command", Routing.BROADCAST),) - assert g1.exposes == frozenset({"arm", "disarm", "set_dry_run", "reset_runtime_state", "start"}) + assert g1.exposes == frozenset( + {"arm", "disarm", "set_dry_run", "reset_runtime_state", "start", "state_snapshot"} + ) def _scannable_task_classes(task_type: str) -> list[type] | None: diff --git a/dimos/robot/all_blueprints.py b/dimos/robot/all_blueprints.py index 0a573ef147..e45493bb59 100644 --- a/dimos/robot/all_blueprints.py +++ b/dimos/robot/all_blueprints.py @@ -201,6 +201,7 @@ "g1-connection-base": "dimos.robot.unitree.g1.connection.G1ConnectionBase", "g1-high-level-dds-sdk": "dimos.robot.unitree.g1.effectors.high_level.dds_sdk.G1HighLevelDdsSdk", "g1-high-level-web-rtc": "dimos.robot.unitree.g1.effectors.high_level.webrtc.G1HighLevelWebRtc", + "g1-manipulation-module": "dimos.robot.unitree.g1.blueprints.basic.unitree_g1_teleop.G1ManipulationModule", "g1-recorder": "dimos.robot.unitree.g1.g1_recorder.G1Recorder", "g1-sim-connection": "dimos.robot.unitree.g1.mujoco_sim.G1SimConnection", "g1-tf-publisher": "dimos.robot.unitree.g1.g1_tf_publisher.G1TfPublisher", diff --git a/docs/platforms/humanoid/g1/index.md b/docs/platforms/humanoid/g1/index.md index 8d4f1062d7..385dbd0e40 100644 --- a/docs/platforms/humanoid/g1/index.md +++ b/docs/platforms/humanoid/g1/index.md @@ -84,7 +84,7 @@ hardware run. The upper-body planner does not include leg collision geometry; do not walk while executing planned arm motion. The robot must already be standing and balancing in sport mode. Stop any other -program that can publish Unitree low-level commands before starting DimOS. +program that can publish Unitree low-level commands before starting dimOS. On the G1 computer: @@ -246,7 +246,7 @@ LD_PRELOAD=/lib/aarch64-linux-gnu/libgomp.so.1 uv run dimos ... If the failing path is under `roboplan.libs`, the RoboPlan aarch64 wheel has loaded a second private `libgomp`; preloading the platform library alone is not -enough. See the [RoboPlan static TLS handoff](roboplan-libgomp-handoff.md) for +enough. See the [RoboPlan static TLS handoff](/docs/platforms/humanoid/g1/roboplan-libgomp-handoff.md) for the confirmed reproducer, temporary workaround, and wheel acceptance criteria. ### A mapping module tries to build with Nix @@ -258,7 +258,7 @@ removing the Quest camera, arm control, recording, or walking-command router. ### `dimos hardware g1 status` cannot connect The teleop blueprint must still be running, and both terminals must use the -same DimOS transport configuration. Check the primary process with +same dimOS transport configuration. Check the primary process with `uv run dimos status` and `uv run dimos log -f`. ### Ready-pose planning fails diff --git a/docs/platforms/humanoid/g1/roboplan-libgomp-handoff.md b/docs/platforms/humanoid/g1/roboplan-libgomp-handoff.md index 82fc907f6f..202635377e 100644 --- a/docs/platforms/humanoid/g1/roboplan-libgomp-handoff.md +++ b/docs/platforms/humanoid/g1/roboplan-libgomp-handoff.md @@ -3,7 +3,7 @@ ## Status Confirmed on 2026-08-26 on the G1's Ubuntu aarch64 computer with Python 3.12 -and RoboPlan 0.6.0. The failure occurs in a DimOS forkserver worker. RoboPlan +and RoboPlan 0.6.0. The failure occurs in a dimOS forkserver worker. RoboPlan imports successfully in the parent process. This is a native-wheel and process-load-order problem. It is not a missing @@ -34,7 +34,7 @@ cannot allocate memory in static TLS block - Linux aarch64 on the G1 computer - CPython 3.12 - RoboPlan 0.6.0 from its manylinux 2.28 aarch64 wheel -- DimOS Python modules run in `multiprocessing` forkserver workers +- dimOS Python modules run in `multiprocessing` forkserver workers - Pinocchio uses the platform `libgomp.so.1` - The RoboPlan wheel carries a renamed private copy of `libgomp` @@ -59,7 +59,7 @@ LD_PRELOAD=/lib/aarch64-linux-gnu/libgomp.so.1 \ 'import dimos.manipulation.manipulation_module; import roboplan.core; print("OK")' ``` -The following hardware-free test reproduces the failure inside a real DimOS +The following hardware-free test reproduces the failure inside a real dimOS worker: ```bash @@ -92,7 +92,7 @@ RoboPlan's extension names its private, renamed library as a separate dependency ## Temporary workaround -Preload both copies before starting DimOS. Resolve the private filename from the +Preload both copies before starting dimOS. Resolve the private filename from the active virtual environment instead of copying its wheel hash: ```bash @@ -123,7 +123,7 @@ Publish an aarch64 RoboPlan wheel that depends on the platform RoboPlan should then share one OpenMP runtime. Review the wheel-repair configuration and exclude `libgomp.so.1` from vendoring. -After publishing the corrected wheel, update the RoboPlan constraint in DimOS +After publishing the corrected wheel, update the RoboPlan constraint in dimOS and remove the dual-preload workaround. ### Wheel acceptance criteria @@ -137,7 +137,7 @@ On Linux aarch64 with Python 3.12: 4. The G1 teleop stack starts repeatedly without a static TLS error. 5. Planning a representative upper-body motion succeeds. -## DimOS follow-up +## dimOS follow-up Fix the optional-dependency guard independently of the wheel. Both `roboplan_world.py` and `roboplan_planner.py` catch every `ImportError` raised by @@ -150,7 +150,7 @@ exception text in the top-level error. Add a test that injects a nested `ImportError` and verifies that its loader detail remains visible. Do not solve the permanent problem by globally preloading RoboPlan in every -DimOS worker. That would make an optional manipulation backend part of all +dimOS worker. That would make an optional manipulation backend part of all worker startup and would leave the duplicate OpenMP runtimes in place. ## Investigation notes @@ -161,7 +161,7 @@ The following hypotheses were eliminated: 0.6.0. - RoboPlan lacked an aarch64 wheel: the installed native extension imported in the parent process. -- The DimOS RoboPlan adapter was invalid: `RoboPlanWorld()` constructed in the +- The dimOS RoboPlan adapter was invalid: `RoboPlanWorld()` constructed in the parent process. - Importing `ManipulationModule` first caused the failure: that ordering also passed in the parent process. From 11c831208fb6e0faa3b6a20e63d2175b754a821a Mon Sep 17 00:00:00 2001 From: cc Date: Wed, 26 Aug 2026 11:22:13 -0700 Subject: [PATCH 36/57] feat(g1): add guided activation command --- dimos/cli/hardware/g1.py | 136 ++++++++++++++++++------ dimos/cli/hardware/test_g1.py | 156 +++++++++++++++++++++++++++- docs/platforms/humanoid/g1/index.md | 26 +++-- 3 files changed, 280 insertions(+), 38 deletions(-) diff --git a/dimos/cli/hardware/g1.py b/dimos/cli/hardware/g1.py index 6e9342506a..625a634ee3 100644 --- a/dimos/cli/hardware/g1.py +++ b/dimos/cli/hardware/g1.py @@ -35,6 +35,7 @@ _COORDINATOR = "ControlCoordinator" _MANIPULATION = "G1Manipulation" _GROOT_TASK = "groot_wbc" +_TELEOP_TASK = "teleop_g1" _ARM_POLL_SECONDS = 0.1 @@ -66,6 +67,56 @@ def _require_armed_and_enabled(coordinator: Any) -> dict[str, Any]: return state +def _fully_armed(state: dict[str, Any]) -> bool: + return bool(state.get("armed") and not state.get("arming") and not state.get("arm_pending")) + + +def _arm_and_wait(coordinator: Any, timeout: float) -> dict[str, Any]: + coordinator.set_dry_run(True) + coordinator.set_activated(True) + deadline = time.monotonic() + timeout + while time.monotonic() < deadline: + state = _groot_state(coordinator) + if _fully_armed(state): + return state + time.sleep(_ARM_POLL_SECONDS) + _abort(f"G1 did not finish arming within {timeout:g}s; motor output remains in dry-run") + + +def _enable_motor_output( + coordinator: Any, + state: dict[str, Any] | None = None, +) -> dict[str, Any]: + current = state if state is not None else _groot_state(coordinator) + if not _fully_armed(current): + _abort("G1 is not fully armed; run `dimos hardware g1 arm` first") + coordinator.set_dry_run(False) + enabled = _groot_state(coordinator) + if enabled.get("dry_run"): + _abort("G1 remained in dry-run after the enable request") + return enabled + + +def _require_teleop_disengaged(coordinator: Any) -> None: + if _TELEOP_TASK in coordinator.get_active_tasks(): + _abort("G1 teleoperation is active; disengage both hands before moving to ready pose") + + +def _execute_ready_pose(coordinator: Any, manipulation: Any) -> None: + _require_armed_and_enabled(coordinator) + _require_teleop_disengaged(coordinator) + targets = { + f"{G1_UPPER_BODY_NAME}/{group}": JointState(position=list(positions)) + for group, positions in G1_READY_JOINTS.items() + } + planned = manipulation.plan_to_joints(targets, speed_scale=G1_READY_SPEED_SCALE) + if not planned.succeeded: + _abort(f"ready-pose planning failed: {planned}") + executed = manipulation.execute(blocking=True) + if not executed.succeeded: + _abort(f"ready-pose execution failed: {executed}") + + @app.command() def status() -> None: """Show the G1 safety state, trajectory state, and planning groups.""" @@ -96,22 +147,12 @@ def status() -> None: @app.command() def arm(timeout: float = typer.Option(15.0, min=0.1, help="Arming timeout in seconds.")) -> None: - """Arm in dry-run and wait for the pose ramp to finish.""" + """Run the GR00T pose ramp, then keep policy output in dry-run.""" client = _connect() try: coordinator = cast("Any", client.get_module(_COORDINATOR)) - coordinator.set_dry_run(True) - coordinator.set_activated(True) - deadline = time.monotonic() + timeout - while time.monotonic() < deadline: - state = _groot_state(coordinator) - if state.get("armed") and not state.get("arming") and not state.get("arm_pending"): - typer.echo( - "G1 armed in dry-run; inspect the robot, then run `dimos hardware g1 enable`." - ) - return - time.sleep(_ARM_POLL_SECONDS) - _abort(f"G1 did not finish arming within {timeout:g}s; motor output remains in dry-run") + _arm_and_wait(coordinator, timeout) + typer.echo("G1 armed in dry-run; inspect the robot, then run `dimos hardware g1 enable`.") except (AttributeError, KeyError, RuntimeError) as exc: _abort(f"failed to arm G1: {exc}") finally: @@ -124,12 +165,7 @@ def enable() -> None: client = _connect() try: coordinator = cast("Any", client.get_module(_COORDINATOR)) - state = _groot_state(coordinator) - if not state.get("armed") or state.get("arming") or state.get("arm_pending"): - _abort("G1 is not fully armed; run `dimos hardware g1 arm` first") - coordinator.set_dry_run(False) - if _groot_state(coordinator).get("dry_run"): - _abort("G1 remained in dry-run after the enable request") + _enable_motor_output(coordinator) typer.echo("G1 motor output enabled.") except (AttributeError, KeyError, RuntimeError) as exc: _abort(f"failed to enable G1: {exc}") @@ -137,24 +173,64 @@ def enable() -> None: client.stop() +@app.command() +def activate( + timeout: float = typer.Option(15.0, min=0.1, help="Arming timeout in seconds."), + ready: bool = typer.Option( + False, + "--ready", + help="Move both arms to the conservative ready pose after enabling motor output.", + ), +) -> None: + """Arm, confirm physical safety, and enable live GR00T output.""" + client = _connect() + motor_output_enabled = False + try: + coordinator = cast("Any", client.get_module(_COORDINATOR)) + state = _groot_state(coordinator) + if not _fully_armed(state): + state = _arm_and_wait(coordinator, timeout) + + if state.get("dry_run"): + typer.echo( + "Arming ramp complete. Inspect the robot and confirm the remote and E-stop " + "are ready." + ) + if not typer.confirm("Enable live GR00T motor output?", default=False): + typer.echo("Activation cancelled; G1 remains armed in dry-run.") + raise typer.Exit(1) + _enable_motor_output(coordinator, state) + motor_output_enabled = True + typer.echo("G1 motor output enabled.") + else: + motor_output_enabled = True + typer.echo("G1 is already activated.") + + if ready: + manipulation = cast("Any", client.get_module(_MANIPULATION)) + try: + _execute_ready_pose(coordinator, manipulation) + except typer.Exit: + typer.echo("GR00T motor output remains enabled.", err=True) + raise + typer.echo("G1 reached the ready pose.") + elif state.get("dry_run"): + typer.echo("G1 activated.") + except (AttributeError, KeyError, RuntimeError) as exc: + suffix = "; GR00T motor output remains enabled" if motor_output_enabled else "" + _abort(f"failed to activate G1: {exc}{suffix}") + finally: + client.stop() + + @app.command() def ready() -> None: """Plan and execute the conservative bimanual ready pose.""" client = _connect() try: coordinator = cast("Any", client.get_module(_COORDINATOR)) - _require_armed_and_enabled(coordinator) manipulation = cast("Any", client.get_module(_MANIPULATION)) - targets = { - f"{G1_UPPER_BODY_NAME}/{group}": JointState(position=list(positions)) - for group, positions in G1_READY_JOINTS.items() - } - planned = manipulation.plan_to_joints(targets, speed_scale=G1_READY_SPEED_SCALE) - if not planned.succeeded: - _abort(f"ready-pose planning failed: {planned}") - executed = manipulation.execute(blocking=True) - if not executed.succeeded: - _abort(f"ready-pose execution failed: {executed}") + _execute_ready_pose(coordinator, manipulation) typer.echo("G1 reached the ready pose.") except (AttributeError, KeyError, RuntimeError) as exc: _abort(f"failed to move G1 to the ready pose: {exc}") diff --git a/dimos/cli/hardware/test_g1.py b/dimos/cli/hardware/test_g1.py index 174c9a2bc8..27ac146ec3 100644 --- a/dimos/cli/hardware/test_g1.py +++ b/dimos/cli/hardware/test_g1.py @@ -56,7 +56,7 @@ def test_hardware_namespace_exposes_g1_operator_commands() -> None: result = runner.invoke(hardware_cli.app, ["g1", "--help"]) assert result.exit_code == 0, result.output - for command in ("status", "arm", "enable", "ready", "disable"): + for command in ("status", "arm", "enable", "activate", "ready", "disable"): assert command in result.output @@ -90,9 +90,102 @@ def test_enable_rejects_robot_that_has_not_completed_arming(mocker) -> None: coordinator.set_dry_run.assert_not_called() +def test_activate_arms_confirms_and_enables_in_order(mocker) -> None: + coordinator = Mock() + coordinator.task_invoke.side_effect = [ + _state(armed=False, dry_run=True), + _state(armed=True, dry_run=True), + _state(armed=True, dry_run=False), + ] + client = _Client(coordinator) + mocker.patch.object(g1_cli.Dimos, "connect", return_value=client) + confirm = mocker.patch.object(g1_cli.typer, "confirm", return_value=True) + + result = runner.invoke(g1_cli.app, ["activate"]) + + assert result.exit_code == 0, result.output + assert coordinator.method_calls == [ + mocker.call.task_invoke("groot_wbc", "state_snapshot", {}), + mocker.call.set_dry_run(True), + mocker.call.set_activated(True), + mocker.call.task_invoke("groot_wbc", "state_snapshot", {}), + mocker.call.set_dry_run(False), + mocker.call.task_invoke("groot_wbc", "state_snapshot", {}), + ] + confirm.assert_called_once_with("Enable live GR00T motor output?", default=False) + assert "G1 activated" in result.output + assert client.stopped + + +def test_activate_decline_leaves_robot_armed_in_dry_run(mocker) -> None: + coordinator = Mock() + coordinator.task_invoke.side_effect = [ + _state(armed=False, dry_run=True), + _state(armed=True, dry_run=True), + ] + client = _Client(coordinator) + mocker.patch.object(g1_cli.Dimos, "connect", return_value=client) + mocker.patch.object(g1_cli.typer, "confirm", return_value=False) + + result = runner.invoke(g1_cli.app, ["activate"]) + + assert result.exit_code == 1 + assert "remains armed in dry-run" in result.output + assert coordinator.set_dry_run.call_args_list == [mocker.call(True)] + assert client.stopped + + +def test_activate_unavailable_confirmation_leaves_dry_run_enabled(mocker) -> None: + coordinator = Mock() + coordinator.task_invoke.return_value = _state(armed=True, dry_run=True) + client = _Client(coordinator) + mocker.patch.object(g1_cli.Dimos, "connect", return_value=client) + mocker.patch.object(g1_cli.typer, "confirm", side_effect=g1_cli.typer.Abort()) + + result = runner.invoke(g1_cli.app, ["activate"]) + + assert result.exit_code == 1 + coordinator.set_dry_run.assert_not_called() + assert client.stopped + + +def test_activate_timeout_never_confirms_or_enables(mocker) -> None: + coordinator = Mock() + coordinator.task_invoke.return_value = _state(armed=False, dry_run=True, arming=True) + client = _Client(coordinator) + mocker.patch.object(g1_cli.Dimos, "connect", return_value=client) + mocker.patch.object(g1_cli.time, "monotonic", side_effect=[0.0, 16.0]) + confirm = mocker.patch.object(g1_cli.typer, "confirm") + + result = runner.invoke(g1_cli.app, ["activate", "--timeout", "15"]) + + assert result.exit_code == 1 + assert "did not finish arming" in result.output + confirm.assert_not_called() + assert coordinator.set_dry_run.call_args_list == [mocker.call(True)] + assert client.stopped + + +def test_activate_already_enabled_skips_arm_and_confirmation(mocker) -> None: + coordinator = Mock() + coordinator.task_invoke.return_value = _state(armed=True, dry_run=False) + client = _Client(coordinator) + mocker.patch.object(g1_cli.Dimos, "connect", return_value=client) + confirm = mocker.patch.object(g1_cli.typer, "confirm") + + result = runner.invoke(g1_cli.app, ["activate"]) + + assert result.exit_code == 0, result.output + assert "already activated" in result.output + coordinator.set_activated.assert_not_called() + coordinator.set_dry_run.assert_not_called() + confirm.assert_not_called() + + def test_ready_plans_both_arms_at_conservative_speed(mocker) -> None: coordinator = Mock() coordinator.task_invoke.return_value = _state(armed=True, dry_run=False) + coordinator.get_active_tasks.return_value = ["groot_wbc"] manipulation = Mock() manipulation.plan_to_joints.return_value = SimpleNamespace(succeeded=True) manipulation.execute.return_value = SimpleNamespace(succeeded=True) @@ -110,6 +203,67 @@ def test_ready_plans_both_arms_at_conservative_speed(mocker) -> None: manipulation.execute.assert_called_once_with(blocking=True) +def test_activate_ready_enables_before_moving_arms(mocker) -> None: + coordinator = Mock() + coordinator.task_invoke.side_effect = [ + _state(armed=True, dry_run=True), + _state(armed=True, dry_run=False), + _state(armed=True, dry_run=False), + ] + coordinator.get_active_tasks.return_value = ["groot_wbc"] + manipulation = Mock() + manipulation.plan_to_joints.return_value = SimpleNamespace(succeeded=True) + manipulation.execute.return_value = SimpleNamespace(succeeded=True) + client = _Client(coordinator, manipulation) + mocker.patch.object(g1_cli.Dimos, "connect", return_value=client) + mocker.patch.object(g1_cli.typer, "confirm", return_value=True) + + result = runner.invoke(g1_cli.app, ["activate", "--ready"]) + + assert result.exit_code == 0, result.output + coordinator.set_dry_run.assert_called_once_with(False) + manipulation.execute.assert_called_once_with(blocking=True) + assert result.output.index("G1 motor output enabled") < result.output.index( + "G1 reached the ready pose" + ) + + +def test_activate_ready_failure_reports_that_motor_output_remains_enabled(mocker) -> None: + coordinator = Mock() + coordinator.task_invoke.side_effect = [ + _state(armed=True, dry_run=True), + _state(armed=True, dry_run=False), + _state(armed=True, dry_run=False), + ] + coordinator.get_active_tasks.return_value = ["groot_wbc"] + manipulation = Mock() + manipulation.plan_to_joints.return_value = SimpleNamespace(succeeded=False) + client = _Client(coordinator, manipulation) + mocker.patch.object(g1_cli.Dimos, "connect", return_value=client) + mocker.patch.object(g1_cli.typer, "confirm", return_value=True) + + result = runner.invoke(g1_cli.app, ["activate", "--ready"]) + + assert result.exit_code == 1 + assert "GR00T motor output remains enabled" in result.output + manipulation.execute.assert_not_called() + + +def test_ready_rejects_active_teleoperation_before_planning(mocker) -> None: + coordinator = Mock() + coordinator.task_invoke.return_value = _state(armed=True, dry_run=False) + coordinator.get_active_tasks.return_value = ["groot_wbc", "teleop_g1"] + manipulation = Mock() + client = _Client(coordinator, manipulation) + mocker.patch.object(g1_cli.Dimos, "connect", return_value=client) + + result = runner.invoke(g1_cli.app, ["ready"]) + + assert result.exit_code == 1 + assert "disengage both hands" in result.output + manipulation.plan_to_joints.assert_not_called() + + def test_disable_attempts_every_safety_action(mocker) -> None: coordinator = Mock() client = _Client(coordinator) diff --git a/docs/platforms/humanoid/g1/index.md b/docs/platforms/humanoid/g1/index.md index 385dbd0e40..cf3fc6204b 100644 --- a/docs/platforms/humanoid/g1/index.md +++ b/docs/platforms/humanoid/g1/index.md @@ -119,7 +119,7 @@ LD_PRELOAD=/lib/aarch64-linux-gnu/libgomp.so.1 \ Wait for the Quest server to report that it is listening on port 8443. The process starts unarmed and in dry-run on real hardware. -### Arm and enable the controller +### Activate the controller Use the hardware commands from a second SSH session. They are the supported operator interface; `dimos shell` is intended for debugging, not routine robot @@ -129,19 +129,31 @@ startup. # Inspect the interlocks and planner connection. uv run dimos hardware g1 status -# Start the 10-second handover ramp while motor output remains in dry-run. -uv run dimos hardware g1 arm +# Run the GR00T pose ramp, inspect the robot at the prompt, then enable live +# policy output. Add --ready to move both arms after activation. +uv run dimos hardware g1 activate --ready +``` -# Inspect the physical robot and remote, then allow motor commands. -uv run dimos hardware g1 enable +`activate` requires an interactive confirmation after the ramp. It has no flag +for unattended activation. Without `--ready`, it leaves the arms where they +are. + +The arming ramp may move the 12 leg and 3 waist joints toward GR00T's default +pose. Dry-run suppresses steady-state GR00T policy output after that ramp; it +is not a global motor interlock for Quest teleoperation or planned arm motion. -# Optional: collision-check and execute a conservative bimanual ready pose. +The individual stages remain available for diagnostics and recovery: + +```bash +uv run dimos hardware g1 arm +uv run dimos hardware g1 enable uv run dimos hardware g1 ready ``` `ready` moves both shoulders slightly forward, bends both elbows, and uses 25% of the configured trajectory speed. It refuses to run until arming is complete -and dry-run has been disabled. +and dry-run has been disabled. It also refuses to run while Quest arm +teleoperation is engaged. To stop arm motion and return to the safe startup state: From d745984de419a48ea3e31a7f440c27e0229d02b8 Mon Sep 17 00:00:00 2001 From: cc Date: Wed, 26 Aug 2026 12:00:14 -0700 Subject: [PATCH 37/57] refactor(g1): trim teleop runtime stack --- .../blueprints/basic/unitree_g1_groot_wbc.py | 17 +- .../g1/blueprints/basic/unitree_g1_teleop.py | 31 ++-- dimos/robot/unitree/g1/test_g1_teleop.py | 21 ++- docs/platforms/humanoid/g1/index.md | 72 ++++---- .../humanoid/g1/roboplan-libgomp-handoff.md | 170 ------------------ 5 files changed, 84 insertions(+), 227 deletions(-) delete mode 100644 docs/platforms/humanoid/g1/roboplan-libgomp-handoff.md diff --git a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_groot_wbc.py b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_groot_wbc.py index 3f8f43e626..39ca5f2860 100644 --- a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_groot_wbc.py +++ b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_groot_wbc.py @@ -309,10 +309,7 @@ def _precomposed_g1_scene(package: ScenePackage) -> Path | None: ), MovementManager.blueprint(), ) - _remappings = [ - (VoxelGridMapper, "lidar", "pointcloud"), - (_G1GrootCoordinator, "twist_command", "cmd_vel"), - ] + _nav_remappings = [(VoxelGridMapper, "lidar", "pointcloud")] else: from dimos.hardware.sensors.lidar.pointlio.module import PointLio from dimos.mapping.ray_tracing.module import RayTracingVoxelMap @@ -365,7 +362,7 @@ def _precomposed_g1_scene(package: ScenePackage) -> Path | None: ), MovementManager.blueprint(), ) - _remappings = [(_G1GrootCoordinator, "twist_command", "cmd_vel")] + _nav_remappings = [] def _g1_groot_rerun_blueprint() -> Any: @@ -577,8 +574,12 @@ def _viewer() -> Any: } ) -unitree_g1_groot_wbc = ( - autoconnect(_backend, _coordinator, _nav_stack, _viewer()) - .remappings(cast("Any", _remappings)) +_unitree_g1_groot_wbc_core = ( + autoconnect(_backend, _coordinator) + .remappings([(_G1GrootCoordinator, "twist_command", "cmd_vel")]) .global_config(robot_model="unitree_g1", n_workers=_n_workers) ) + +unitree_g1_groot_wbc = autoconnect(_unitree_g1_groot_wbc_core, _nav_stack, _viewer()).remappings( + cast("Any", _nav_remappings) +) diff --git a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_teleop.py b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_teleop.py index a179486776..3afdba03ab 100644 --- a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_teleop.py +++ b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_teleop.py @@ -12,12 +12,13 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Unitree G1 GR00T WBC + Quest teleop + episode recording. +"""Unitree G1 GR00T WBC + Quest teleop + manipulation + recording. -The full ``unitree-g1-groot-wbc`` stack (locomotion policy, nav, viewer, -``--simulation mujoco`` / ``--scene-package`` support) plus the Quest WebXR -retargeting module and the dimos.imitation data-collection stack. Put on the -headset, open ``https://:8443/teleop``, and: +The GR00T locomotion/control core (without navigation, mapping, or the legacy +viewer) plus the Quest WebXR retargeting module, upper-body manipulation, and +the dimos.imitation data-collection stack. ``--simulation mujoco`` and +``--scene-package`` remain supported. Put on the headset, open +``https://:8443/teleop``, and: left stick walk forward/back (+ yaw in strafe mode) right stick yaw (press = zero-Twist e-stop) @@ -26,8 +27,8 @@ Y discard the in-progress episode Controller poses route to the shared ``teleop_g1`` coordinator task declared -in the groot blueprint. Locomotion enters ``MovementManager.tele_cmd_vel`` so -operator input cancels navigation before reaching the GR00T WBC task. +in the groot blueprint. With no autonomous navigation in this stack, Quest +locomotion connects directly to the GR00T WBC task. Recording runs continuously into a timestamped session DB under ``~/.local/state/dimos/recordings/``; B/Y only place episode markers @@ -63,7 +64,7 @@ from dimos.msgs.sensor_msgs.Image import Image from dimos.robot.unitree.g1.blueprints.basic.unitree_g1_groot_wbc import ( _G1GrootCoordinator, - unitree_g1_groot_wbc, + _unitree_g1_groot_wbc_core, ) from dimos.robot.unitree.g1.manip_config import g1_upper_body_model_config from dimos.teleop.quest.quest_extensions import MobileVideoArmTeleopModule @@ -113,7 +114,7 @@ class G1ManipulationModule(ManipulationModule): unitree_g1_teleop = ( autoconnect( - unitree_g1_groot_wbc, + _unitree_g1_groot_wbc_core, MobileVideoArmTeleopModule.blueprint(), G1ManipulationModule.blueprint( instance_name="G1Manipulation", @@ -141,15 +142,15 @@ class G1ManipulationModule(ManipulationModule): [ (MobileVideoArmTeleopModule, "left_controller_output", "left_cartesian_command"), (MobileVideoArmTeleopModule, "right_controller_output", "right_cartesian_command"), - (MobileVideoArmTeleopModule, "cmd_vel", "tele_cmd_vel"), + (MobileVideoArmTeleopModule, "cmd_vel", "cmd_vel"), (G1ManipulationModule, "_control_coordinator", _G1GrootCoordinator), ] ) - # Camera frames stay off the LCM bus: every consumer (quest module, - # recorder, viewer bridge) is on-box, and raw images multicast over LCM - # make each subscribing process pay receive+decode per frame — measured - # at ~31 MB/s and a starved coordinator tick loop on the Orin. SHM is - # zero-copy; an unconsumed stream costs only the producer's write. + # Camera frames stay off the LCM bus: both consumers (quest module and + # recorder) are on-box, and raw images multicast over LCM make each + # subscribing process pay receive+decode per frame — measured at ~31 MB/s + # and a starved coordinator tick loop on the Orin. SHM is zero-copy; an + # unconsumed stream costs only the producer's write. .transports( { ("color_image", Image): pSHMTransport( diff --git a/dimos/robot/unitree/g1/test_g1_teleop.py b/dimos/robot/unitree/g1/test_g1_teleop.py index 838e1e3014..9908b2a200 100644 --- a/dimos/robot/unitree/g1/test_g1_teleop.py +++ b/dimos/robot/unitree/g1/test_g1_teleop.py @@ -117,13 +117,30 @@ def test_g1_teleop_wires_arm_velocity_and_recording_streams() -> None: == "right_cartesian_command" ) assert ( - unitree_g1_teleop.remapping_map[(MobileVideoArmTeleopModule.name, "cmd_vel")] - == "tele_cmd_vel" + unitree_g1_teleop.remapping_map[(MobileVideoArmTeleopModule.name, "cmd_vel")] == "cmd_vel" ) assert "left_cartesian_command" in G1CollectionRecorder.__annotations__ assert "right_cartesian_command" in G1CollectionRecorder.__annotations__ +def test_g1_teleop_excludes_navigation_and_legacy_visualization() -> None: + module_names = {atom.module.__name__ for atom in unitree_g1_teleop.active_blueprints} + + assert module_names.isdisjoint( + { + "PointLio", + "RayTracingVoxelMap", + "VoxelGridMapper", + "CostMapper", + "ReplanningAStarPlanner", + "MovementManager", + "WebsocketVisModule", + "RerunBridgeModule", + "RerunWebSocketServer", + } + ) + + def test_g1_collection_streams_do_not_require_world_poses() -> None: recorder_kwargs = _module_kwargs(unitree_g1_teleop, G1CollectionRecorder) diff --git a/docs/platforms/humanoid/g1/index.md b/docs/platforms/humanoid/g1/index.md index cf3fc6204b..9d1fbdb216 100644 --- a/docs/platforms/humanoid/g1/index.md +++ b/docs/platforms/humanoid/g1/index.md @@ -86,35 +86,48 @@ do not walk while executing planned arm motion. The robot must already be standing and balancing in sport mode. Stop any other program that can publish Unitree low-level commands before starting dimOS. +### Known platform issue: RoboPlan static TLS failure + +The current RoboPlan 0.6.0 aarch64 wheel bundles a private, renamed copy of +`libgomp`. Pinocchio loads the system `libgomp.so.1`, so a dimOS forkserver +worker can load two OpenMP runtimes and fail with: + +```text +cannot allocate memory in static TLS block +``` + +This is a RoboPlan wheel-packaging issue, not a missing Python dependency or a +G1 control failure. A dimOS in-process fix would retain both OpenMP runtimes and +hide the underlying problem. Until RoboPlan publishes a corrected wheel, start +teleoperation with the dual preload below. The private RoboPlan library must +come first. + On the G1 computer: ```bash cd ~/cc/dimos uv sync --extra all -LD_PRELOAD=/lib/aarch64-linux-gnu/libgomp.so.1 \ - uv run dimos \ - --viewer none \ - run unitree-g1-teleop \ - --network-interface eth0 +ROBOPLAN_GOMP="$(find "$PWD/.venv/lib/python3.12/site-packages/roboplan.libs" \ + -maxdepth 1 -name 'libgomp-*.so*' -print -quit)" +test -n "$ROBOPLAN_GOMP" || { + echo "RoboPlan's bundled libgomp was not found" + exit 1 +} + +LD_PRELOAD="$ROBOPLAN_GOMP:/lib/aarch64-linux-gnu/libgomp.so.1" \ + uv run --no-sync dimos run unitree-g1-teleop --network-interface eth0 ``` `--network-interface` is blueprint configuration, so it belongs after the -blueprint name. On the Jetson, preloading `libgomp` avoids the static TLS error -that can occur while importing Pinocchio. +blueprint name. The teleop blueprint intentionally excludes localization, +mapping, autonomous route planning, and the legacy navigation viewer. Quest +walking commands connect directly to the GR00T controller, so no module-disable +arguments are needed. -For an upper-body-only session, omit the mapping and route-planning workers but -keep `MovementManager`, which routes the Quest walking command: - -```bash -LD_PRELOAD=/lib/aarch64-linux-gnu/libgomp.so.1 \ - uv run dimos \ - --viewer none \ - run unitree-g1-teleop \ - --network-interface eth0 \ - --disable point-lio ray-tracing-voxel-map cost-mapper \ - replanning-a-star-planner websocket-vis-module -``` +`--no-sync` prevents uv from replacing the environment after the private +library path has been resolved. This workaround remains necessary until +RoboPlan publishes an aarch64 wheel that uses the system OpenMP runtime. Wait for the Quest server to report that it is listening on port 8443. The process starts unarmed and in dry-run on real hardware. @@ -250,22 +263,17 @@ The viewer should open up. It'll run in faster-than-real speed until its caught ### `libgomp.so.1: cannot allocate memory in static TLS block` -Launch with: - -```bash -LD_PRELOAD=/lib/aarch64-linux-gnu/libgomp.so.1 uv run dimos ... -``` - -If the failing path is under `roboplan.libs`, the RoboPlan aarch64 wheel has -loaded a second private `libgomp`; preloading the platform library alone is not -enough. See the [RoboPlan static TLS handoff](/docs/platforms/humanoid/g1/roboplan-libgomp-handoff.md) for -the confirmed reproducer, temporary workaround, and wheel acceptance criteria. +Use the dual-preload launch command in [Start G1 teleoperation](#4-start-g1-teleoperation). +Preloading only `/lib/aarch64-linux-gnu/libgomp.so.1` is insufficient because +RoboPlan's native extension explicitly requests its renamed private copy. If +the dual preload still fails, confirm that `ROBOPLAN_GOMP` resolves to an +existing file and that it appears first in `LD_PRELOAD`. ### A mapping module tries to build with Nix -Use the upper-body-only launch command above. It disables Point-LIO, voxel -mapping, cost mapping, route planning, and the navigation web view without -removing the Quest camera, arm control, recording, or walking-command router. +Update this branch. The G1 teleop blueprint no longer includes Point-LIO, voxel +mapping, cost mapping, route planning, or the navigation web view. Seeing one +of those modules means the checkout predates the upper-body-only composition. ### `dimos hardware g1 status` cannot connect diff --git a/docs/platforms/humanoid/g1/roboplan-libgomp-handoff.md b/docs/platforms/humanoid/g1/roboplan-libgomp-handoff.md deleted file mode 100644 index 202635377e..0000000000 --- a/docs/platforms/humanoid/g1/roboplan-libgomp-handoff.md +++ /dev/null @@ -1,170 +0,0 @@ -# Handoff: RoboPlan `libgomp` static TLS failure on G1 - -## Status - -Confirmed on 2026-08-26 on the G1's Ubuntu aarch64 computer with Python 3.12 -and RoboPlan 0.6.0. The failure occurs in a dimOS forkserver worker. RoboPlan -imports successfully in the parent process. - -This is a native-wheel and process-load-order problem. It is not a missing -Python dependency, a DDS failure, or a robot-control failure. - -## Operator impact - -`unitree-g1-teleop` deploys `G1ManipulationModule`, then stops during module -startup. The coordinator performs its normal safe shutdown, including disabling -motor output. Upper-body planning and teleoperation never become available. - -The top-level exception is misleading: - -```text -ImportError: RoboPlanWorld requires the optional roboplan dependency. -Install the manipulation extra before selecting the roboplan backend. -``` - -The chained exception contains the real failure: - -```text -roboplan.libs/libgomp-.so.1.0.0: -cannot allocate memory in static TLS block -``` - -## Confirmed environment - -- Linux aarch64 on the G1 computer -- CPython 3.12 -- RoboPlan 0.6.0 from its manylinux 2.28 aarch64 wheel -- dimOS Python modules run in `multiprocessing` forkserver workers -- Pinocchio uses the platform `libgomp.so.1` -- The RoboPlan wheel carries a renamed private copy of `libgomp` - -The exact private filename contains a build hash. Do not encode that hash in a -permanent script or document. - -## Reproduction - -A clean-process import passes: - -```bash -LD_PRELOAD=/lib/aarch64-linux-gnu/libgomp.so.1 \ - uv run --no-sync python -c \ - 'import roboplan.core; print("roboplan.core: OK")' -``` - -Importing the full manipulation dependency graph in the parent also passes: - -```bash -LD_PRELOAD=/lib/aarch64-linux-gnu/libgomp.so.1 \ - uv run --no-sync python -c \ - 'import dimos.manipulation.manipulation_module; import roboplan.core; print("OK")' -``` - -The following hardware-free test reproduces the failure inside a real dimOS -worker: - -```bash -LD_PRELOAD=/lib/aarch64-linux-gnu/libgomp.so.1 \ -uv run --no-sync python -c 'from dimos.core.coordination.python_worker import PythonWorker; from dimos.core.coordination.worker_messages import CallMethodRequest; from dimos.robot.unitree.g1.blueprints.basic.unitree_g1_teleop import G1ManipulationModule; w=PythonWorker(); w.start_process(); a=w.deploy_module(G1ManipulationModule); print(a._send_request_to_worker(CallMethodRequest(a._module_id, "_initialize_planning", (), {}))); w.shutdown()' -``` - -This test does not connect to DDS or send robot commands. - -## Root cause - -The process loads two OpenMP runtimes: - -```text -Pinocchio ───────────────> /lib/aarch64-linux-gnu/libgomp.so.1 -RoboPlan native extension -> roboplan.libs/libgomp-.so.1.0.0 -``` - -The RoboPlan wheel repair step renamed and bundled its `libgomp`. The dynamic -loader therefore treats it as a second library rather than reusing the platform -copy already loaded for Pinocchio. - -`libgomp` uses static thread-local storage. On aarch64, loading the private copy -late in the forkserver worker exhausts the available static TLS block. A clean -Python process succeeds because it has loaded fewer native libraries before -RoboPlan. - -Preloading only `/lib/aarch64-linux-gnu/libgomp.so.1` cannot fix the worker: -RoboPlan's extension names its private, renamed library as a separate dependency. - -## Temporary workaround - -Preload both copies before starting dimOS. Resolve the private filename from the -active virtual environment instead of copying its wheel hash: - -```bash -cd ~/cc/dimos - -ROBOPLAN_GOMP="$(find "$PWD/.venv/lib/python3.12/site-packages/roboplan.libs" \ - -maxdepth 1 -name 'libgomp-*.so*' -print -quit)" -test -n "$ROBOPLAN_GOMP" - -LD_PRELOAD="$ROBOPLAN_GOMP:/lib/aarch64-linux-gnu/libgomp.so.1" \ - uv run --no-sync dimos \ - --viewer none \ - run unitree-g1-teleop \ - --network-interface eth0 -``` - -This workaround is suitable for diagnosis and short-term robot testing. It is -not the desired operator interface: it exposes a private wheel implementation -detail and may change when RoboPlan is rebuilt. - -Run the worker-only reproducer with the same dual preload before trying hardware. -Success reaches `World finalized` and exits without an exception. - -## Preferred fix - -Publish an aarch64 RoboPlan wheel that depends on the platform -`libgomp.so.1` instead of bundling and renaming a private copy. Pinocchio and -RoboPlan should then share one OpenMP runtime. - -Review the wheel-repair configuration and exclude `libgomp.so.1` from vendoring. -After publishing the corrected wheel, update the RoboPlan constraint in dimOS -and remove the dual-preload workaround. - -### Wheel acceptance criteria - -On Linux aarch64 with Python 3.12: - -1. `roboplan.core` imports without `LD_PRELOAD` in a clean process. -2. The worker-only reproducer reaches `World finalized` without `LD_PRELOAD`. -3. RoboPlan's native extensions depend on `libgomp.so.1`; the wheel contains no - `roboplan.libs/libgomp-*` copy. -4. The G1 teleop stack starts repeatedly without a static TLS error. -5. Planning a representative upper-body motion succeeds. - -## dimOS follow-up - -Fix the optional-dependency guard independently of the wheel. Both -`roboplan_world.py` and `roboplan_planner.py` catch every `ImportError` raised by -`import roboplan.core` and replace it with an installation hint. This masks -native loader failures and missing transitive libraries. - -The guard should distinguish a missing RoboPlan distribution from an import -failure inside an installed distribution. At minimum, include the original -exception text in the top-level error. Add a test that injects a nested -`ImportError` and verifies that its loader detail remains visible. - -Do not solve the permanent problem by globally preloading RoboPlan in every -dimOS worker. That would make an optional manipulation backend part of all -worker startup and would leave the duplicate OpenMP runtimes in place. - -## Investigation notes - -The following hypotheses were eliminated: - -- The `manipulation` extra was absent: `importlib.metadata` reported RoboPlan - 0.6.0. -- RoboPlan lacked an aarch64 wheel: the installed native extension imported in - the parent process. -- The dimOS RoboPlan adapter was invalid: `RoboPlanWorld()` constructed in the - parent process. -- Importing `ManipulationModule` first caused the failure: that ordering also - passed in the parent process. - -The worker-only reproducer exposed the chained static TLS exception and should -remain the primary regression check for this issue. From 388af203815e42ef9c2bcd4745848debb564e587 Mon Sep 17 00:00:00 2001 From: cc Date: Wed, 26 Aug 2026 12:03:30 -0700 Subject: [PATCH 38/57] spec: remove --- CONTEXT.md | 59 ---------------------- docs/adr/0001-derived-robot-model-views.md | 52 ------------------- 2 files changed, 111 deletions(-) delete mode 100644 CONTEXT.md delete mode 100644 docs/adr/0001-derived-robot-model-views.md diff --git a/CONTEXT.md b/CONTEXT.md deleted file mode 100644 index 30508dbef3..0000000000 --- a/CONTEXT.md +++ /dev/null @@ -1,59 +0,0 @@ -# DimOS Robotics - -Canonical language for robot capabilities and operator interaction in DimOS. - -## Teleoperation - -**Quest arm teleoperation**: -Arm teleoperation in which tracked Quest controllers provide clutched, relative Cartesian pose commands and gripper input. -_Avoid_: Keyboard teleoperation, leader-follower teleoperation - -**Operator hand**: -The left or right Quest controller as a source of teleoperation intent, independent of the robot arm it controls. -_Avoid_: Hand, side - -**Mixed-arm setup**: -Two independent manipulators teleoperated through separate control tasks, even when presented in one operator session. -_Avoid_: Bimanual robot, dual-arm robot - -**Bimanual robot**: -One coupled robot with two manipulator groups represented by a single kinematic model and controlled by one bimanual task. -_Avoid_: Mixed-arm setup - -**Bimanual engagement**: -A two-hand deadman condition in which a bimanual teleoperation task is active only while both operator hands are engaged; releasing either hand disengages the whole task. -_Avoid_: Partial engagement, independent hand engagement - -## Joint-limit safety - -**Feedback limit tolerance**: -The bounded discrepancy beyond a nominal joint limit that is accepted only when interpreting measured hardware state. -_Avoid_: Command tolerance, expanded joint limit - -**Command limit margin**: -The inward distance from each nominal joint limit within which generated position commands must remain. -_Avoid_: Feedback tolerance, relaxed joint limit - -## Inverse kinematics - -**Pink task stack**: -The ordered, named set of kinematic objectives used by Pink to produce a robot command. Its structure is composed once per IK control context; reserved frame objectives ensure every commanded end effector participates, while subclasses may compose or replace named auxiliary objectives. -_Avoid_: Teleoperation behavior, solver implementation - -**IK control context**: -The persistent inverse-kinematics state owned by one control-task instance for one robot model, controlled-joint selection, and target-frame selection, including its Pink task stack. Stateful Pink tasks are never shared between control-task instances. -_Avoid_: Planning group, teleoperation session - -## Robot descriptions - -**Robot model source**: -The canonical URDF or Xacro description from which robot model views are derived. -_Avoid_: Generated model, planning model - -**Robot model view**: -A derived representation of a robot model source for a particular consumer, without becoming a second canonical robot description. -_Avoid_: Generated URDF, copied URDF - -**Structural subtree selection**: -A robot model view that retains an existing link and its descendants without reversing joints or changing their transforms. -_Avoid_: Rerooting, kinematic rerooting diff --git a/docs/adr/0001-derived-robot-model-views.md b/docs/adr/0001-derived-robot-model-views.md deleted file mode 100644 index d8561fe139..0000000000 --- a/docs/adr/0001-derived-robot-model-views.md +++ /dev/null @@ -1,52 +0,0 @@ -# ADR 0001: Derive planning models from the canonical robot description - -Status: Accepted - -## Context - -A robot can need several planning scopes without having several independent -descriptions. The G1 whole-body controller uses all 29 actuated joints, Quest -teleoperation controls 14 arm joints, and collision-aware manipulation needs -the pelvis, live waist, torso, and both arms but not the legs. - -Copying or hand-editing an upper-body URDF would create another source of -truth. It could silently drift from the hardware description, joint limits, -meshes, or link transforms. Loading the full floating-base model also gives -manipulation backends a root and collision scope that do not match stationary -upper-body planning. - -## Decision - -`RobotModel` provides two lazy, immutable structural transformations: - -- `with_subtree_rooted_at(link)` selects an existing link and all descendants. -- `without_joint_subtrees(*joints)` removes each named joint and its descendant - link branch. - -These operations record intent. They parse and validate the source only when a -backend calls `load()`, preserving lazy asset checkout. They run before joint -fixing, limit overrides, and fixed-frame additions. - -Materialization also resolves relative mesh and texture references against the -source description's directory. This keeps an in-memory derived model usable -after a backend composes it without the original URDF working directory. - -This is structural selection, not kinematic rerooting. The API never reverses -joints or recomputes transforms. It rejects unknown roots, unknown removal -joints, removals outside the selected subtree, cycles, and duplicate requests. - -The G1 upper-body view starts from the canonical G1 URDF, selects the subtree -rooted at `pelvis`, and removes the branches beginning at -`left_hip_pitch_joint` and `right_hip_pitch_joint`. It retains the three waist -joints as observed state. Only the two seven-joint arm groups are eligible for -planning. - -## Consequences - -- Whole-body control, Quest IK, and manipulation share one robot description. -- Waist motion is represented in upper-body kinematics and collision checks - without giving the manipulation planner ownership of the waist. -- Leg collision geometry is intentionally absent. G1 manipulation planning is - valid only while the robot is stationary on clear, level ground. -- A future use case that needs a true kinematic reroot must introduce a - different operation with explicit transform semantics. From 73922322f5fb61d2e6df621e7eb59d1ec9b2be33 Mon Sep 17 00:00:00 2001 From: cc Date: Wed, 26 Aug 2026 12:31:28 -0700 Subject: [PATCH 39/57] fix(g1): address teleop review feedback --- dimos/cli/hardware/g1.py | 87 ++++++++--- dimos/cli/hardware/test_g1.py | 12 ++ .../coordination/blueprint_config/parser.py | 5 +- .../blueprint_config/test_parser.py | 21 --- .../coordination/blueprint_config/values.py | 35 ----- .../planning/kinematics/pink_solver.py | 24 --- .../planning/kinematics/test_pink_ik.py | 21 --- .../blueprints/basic/unitree_g1_groot_wbc.py | 4 +- dimos/robot/unitree/g1/manip_config.py | 3 + dimos/robot/unitree/g1/test_g1_teleop.py | 13 +- docs/platforms/humanoid/g1/index.md | 146 +++++------------- 11 files changed, 135 insertions(+), 236 deletions(-) diff --git a/dimos/cli/hardware/g1.py b/dimos/cli/hardware/g1.py index 625a634ee3..39fe8bd049 100644 --- a/dimos/cli/hardware/g1.py +++ b/dimos/cli/hardware/g1.py @@ -17,13 +17,14 @@ from __future__ import annotations import time -from typing import Any, NoReturn, cast +from typing import Any, NoReturn, Protocol, TypeGuard import typer from dimos.control.tasks.trajectory_task.trajectory_task import JOINT_TRAJECTORY_TASK_NAME from dimos.msgs.sensor_msgs.JointState import JointState from dimos.porcelain.dimos import Dimos +from dimos.porcelain.module_handle import ModuleHandle from dimos.robot.unitree.g1.manip_config import ( G1_READY_JOINTS, G1_READY_SPEED_SCALE, @@ -39,6 +40,20 @@ _ARM_POLL_SECONDS = 0.1 +class _G1CoordinatorHandle(Protocol): + def task_invoke(self, task_name: str, method: str, kwargs: dict[str, Any]) -> Any: ... + def set_dry_run(self, dry_run: bool) -> Any: ... + def set_activated(self, activated: bool) -> Any: ... + def get_active_tasks(self) -> list[str]: ... + def cancel_trajectory(self) -> Any: ... + + +class _G1ManipulationHandle(Protocol): + def list_planning_groups(self) -> list[Any]: ... + def plan_to_joints(self, targets: dict[str, JointState], *, speed_scale: float) -> Any: ... + def execute(self, *, blocking: bool) -> Any: ... + + def _abort(message: str) -> NoReturn: typer.echo(f"ERROR: {message}", err=True) raise typer.Exit(1) @@ -51,14 +66,47 @@ def _connect() -> Dimos: _abort(f"cannot connect to a running DimOS stack: {exc}") -def _groot_state(coordinator: Any) -> dict[str, Any]: +def _has_methods(handle: ModuleHandle, names: tuple[str, ...]) -> bool: + return all(callable(getattr(handle, name, None)) for name in names) + + +def _is_coordinator(handle: ModuleHandle) -> TypeGuard[_G1CoordinatorHandle]: + return _has_methods( + handle, + ("task_invoke", "set_dry_run", "set_activated", "get_active_tasks", "cancel_trajectory"), + ) + + +def _is_manipulation(handle: ModuleHandle) -> TypeGuard[_G1ManipulationHandle]: + return _has_methods(handle, ("list_planning_groups", "plan_to_joints", "execute")) + + +def _coordinator(client: Dimos) -> _G1CoordinatorHandle: + handle = client.get_module(_COORDINATOR) + if not _is_coordinator(handle): + _abort("the running stack does not expose the required G1 coordinator RPCs") + return handle + + +def _manipulation(client: Dimos) -> _G1ManipulationHandle: + handle = client.get_module(_MANIPULATION) + if not _is_manipulation(handle): + _abort("the running stack does not expose the required G1 manipulation RPCs") + return handle + + +def _is_groot_state(value: Any) -> TypeGuard[dict[str, Any]]: + return isinstance(value, dict) + + +def _groot_state(coordinator: _G1CoordinatorHandle) -> dict[str, Any]: state = coordinator.task_invoke(_GROOT_TASK, "state_snapshot", {}) - if not isinstance(state, dict): + if not _is_groot_state(state): _abort("the running stack does not expose G1 GR00T safety state") - return cast("dict[str, Any]", state) + return state -def _require_armed_and_enabled(coordinator: Any) -> dict[str, Any]: +def _require_armed_and_enabled(coordinator: _G1CoordinatorHandle) -> dict[str, Any]: state = _groot_state(coordinator) if not state.get("armed") or state.get("arming") or state.get("arm_pending"): _abort("G1 is not fully armed; run `dimos hardware g1 arm` first") @@ -71,7 +119,7 @@ def _fully_armed(state: dict[str, Any]) -> bool: return bool(state.get("armed") and not state.get("arming") and not state.get("arm_pending")) -def _arm_and_wait(coordinator: Any, timeout: float) -> dict[str, Any]: +def _arm_and_wait(coordinator: _G1CoordinatorHandle, timeout: float) -> dict[str, Any]: coordinator.set_dry_run(True) coordinator.set_activated(True) deadline = time.monotonic() + timeout @@ -84,7 +132,7 @@ def _arm_and_wait(coordinator: Any, timeout: float) -> dict[str, Any]: def _enable_motor_output( - coordinator: Any, + coordinator: _G1CoordinatorHandle, state: dict[str, Any] | None = None, ) -> dict[str, Any]: current = state if state is not None else _groot_state(coordinator) @@ -97,12 +145,15 @@ def _enable_motor_output( return enabled -def _require_teleop_disengaged(coordinator: Any) -> None: +def _require_teleop_disengaged(coordinator: _G1CoordinatorHandle) -> None: if _TELEOP_TASK in coordinator.get_active_tasks(): _abort("G1 teleoperation is active; disengage both hands before moving to ready pose") -def _execute_ready_pose(coordinator: Any, manipulation: Any) -> None: +def _execute_ready_pose( + coordinator: _G1CoordinatorHandle, + manipulation: _G1ManipulationHandle, +) -> None: _require_armed_and_enabled(coordinator) _require_teleop_disengaged(coordinator) targets = { @@ -122,13 +173,13 @@ def status() -> None: """Show the G1 safety state, trajectory state, and planning groups.""" client = _connect() try: - coordinator = cast("Any", client.get_module(_COORDINATOR)) + coordinator = _coordinator(client) state = _groot_state(coordinator) trajectory = coordinator.task_invoke( JOINT_TRAJECTORY_TASK_NAME, "get_status", {"t_now": None} ) try: - groups = cast("Any", client.get_module(_MANIPULATION)).list_planning_groups() + groups = _manipulation(client).list_planning_groups() group_ids = [str(group.id) for group in groups] except (AttributeError, KeyError): group_ids = [] @@ -150,7 +201,7 @@ def arm(timeout: float = typer.Option(15.0, min=0.1, help="Arming timeout in sec """Run the GR00T pose ramp, then keep policy output in dry-run.""" client = _connect() try: - coordinator = cast("Any", client.get_module(_COORDINATOR)) + coordinator = _coordinator(client) _arm_and_wait(coordinator, timeout) typer.echo("G1 armed in dry-run; inspect the robot, then run `dimos hardware g1 enable`.") except (AttributeError, KeyError, RuntimeError) as exc: @@ -164,7 +215,7 @@ def enable() -> None: """Enable motor output after a completed dry-run arming ramp.""" client = _connect() try: - coordinator = cast("Any", client.get_module(_COORDINATOR)) + coordinator = _coordinator(client) _enable_motor_output(coordinator) typer.echo("G1 motor output enabled.") except (AttributeError, KeyError, RuntimeError) as exc: @@ -186,7 +237,7 @@ def activate( client = _connect() motor_output_enabled = False try: - coordinator = cast("Any", client.get_module(_COORDINATOR)) + coordinator = _coordinator(client) state = _groot_state(coordinator) if not _fully_armed(state): state = _arm_and_wait(coordinator, timeout) @@ -207,7 +258,7 @@ def activate( typer.echo("G1 is already activated.") if ready: - manipulation = cast("Any", client.get_module(_MANIPULATION)) + manipulation = _manipulation(client) try: _execute_ready_pose(coordinator, manipulation) except typer.Exit: @@ -228,8 +279,8 @@ def ready() -> None: """Plan and execute the conservative bimanual ready pose.""" client = _connect() try: - coordinator = cast("Any", client.get_module(_COORDINATOR)) - manipulation = cast("Any", client.get_module(_MANIPULATION)) + coordinator = _coordinator(client) + manipulation = _manipulation(client) _execute_ready_pose(coordinator, manipulation) typer.echo("G1 reached the ready pose.") except (AttributeError, KeyError, RuntimeError) as exc: @@ -244,7 +295,7 @@ def disable() -> None: client = _connect() failures: list[str] = [] try: - coordinator = cast("Any", client.get_module(_COORDINATOR)) + coordinator = _coordinator(client) for description, operation in ( ("cancel trajectory", coordinator.cancel_trajectory), ("enter dry-run", lambda: coordinator.set_dry_run(True)), diff --git a/dimos/cli/hardware/test_g1.py b/dimos/cli/hardware/test_g1.py index 27ac146ec3..4243455b17 100644 --- a/dimos/cli/hardware/test_g1.py +++ b/dimos/cli/hardware/test_g1.py @@ -60,6 +60,18 @@ def test_hardware_namespace_exposes_g1_operator_commands() -> None: assert command in result.output +def test_status_rejects_coordinator_without_required_rpcs(mocker) -> None: + coordinator = Mock(spec=["task_invoke"]) + client = _Client(coordinator) + mocker.patch.object(g1_cli.Dimos, "connect", return_value=client) + + result = runner.invoke(g1_cli.app, ["status"]) + + assert result.exit_code == 1 + assert "required G1 coordinator RPCs" in result.output + assert client.stopped + + def test_arm_forces_dry_run_before_activation_and_waits_for_armed(mocker) -> None: coordinator = Mock() coordinator.task_invoke.return_value = _state(armed=True, dry_run=True) diff --git a/dimos/core/coordination/blueprint_config/parser.py b/dimos/core/coordination/blueprint_config/parser.py index ebfcf51f80..ce8338ec66 100644 --- a/dimos/core/coordination/blueprint_config/parser.py +++ b/dimos/core/coordination/blueprint_config/parser.py @@ -75,7 +75,6 @@ plain, plain_mapping, snapshot_mapping, - validated_model_values, ) from dimos.core.coordination.blueprints import ( Blueprint, @@ -422,7 +421,7 @@ def _validate_modules( raise BlueprintConfigError( format_validation_error(module.atom.name, error) ) from error - dumped = validated_model_values(model, exclude_unset=True) + dumped = model.model_dump(mode="python", exclude_unset=True) dumped.pop("g", None) dumped.pop("instance_name", None) parsed[module.atom.name] = dumped @@ -464,7 +463,7 @@ def _validate_transports( ) from error if not models: continue - full = validated_model_values(models[0]) + full = models[0].model_dump(mode="python") if raw_overrides: parsed[transport.name] = extract_shape(full, raw_overrides) return parsed diff --git a/dimos/core/coordination/blueprint_config/test_parser.py b/dimos/core/coordination/blueprint_config/test_parser.py index 115cfb6197..b75ee52707 100644 --- a/dimos/core/coordination/blueprint_config/test_parser.py +++ b/dimos/core/coordination/blueprint_config/test_parser.py @@ -13,7 +13,6 @@ # limitations under the License. from collections.abc import Callable -from dataclasses import dataclass from pathlib import Path from typing import Annotated, Any, Literal @@ -505,26 +504,6 @@ def test_blueprint_pinned_arbitrary_value_survives_filtering() -> None: assert isinstance(parsed.module_kwargs("arbitrarymodule")["scaling"], Anchor) -def test_blueprint_pinned_callable_dataclass_survives_validation() -> None: - @dataclass - class CallableFactory: - result: str - - def __call__(self, _value: Any) -> str: - return self.result - - factory = CallableFactory(result="rendered") - parsed = BlueprintConfigParser(ArbitraryModule.blueprint(handlers={"visual": factory})).parse( - environ={} - ) - - kwargs = parsed.module_kwargs("arbitrarymodule") - validated = ArbitraryConfig.model_validate(kwargs) - - assert isinstance(validated.handlers["visual"], CallableFactory) - assert validated.handlers["visual"](None) == "rendered" - - def test_format_help_uses_nested_parent_default_instance() -> None: class NestedRequiredConfig(BaseModel): value: int diff --git a/dimos/core/coordination/blueprint_config/values.py b/dimos/core/coordination/blueprint_config/values.py index c7a6054064..39cab50442 100644 --- a/dimos/core/coordination/blueprint_config/values.py +++ b/dimos/core/coordination/blueprint_config/values.py @@ -55,41 +55,6 @@ def plain(value: Any) -> Any: return _copy_opaque(value) -def validated_model_values(model: BaseModel, *, exclude_unset: bool = False) -> dict[str, Any]: - """Export validated fields while preserving opaque Python values. - - Pydantic's ``model_dump`` expands dataclass instances, including callable - factories, into dictionaries. Module kwargs cross another validation - boundary in their worker process, where those dictionaries no longer - satisfy callable-typed fields. - """ - included = model.model_fields_set if exclude_unset else type(model).model_fields - return { - name: _validated_value(getattr(model, name), exclude_unset=exclude_unset) - for name in type(model).model_fields - if name in included - } - - -def _validated_value(value: Any, *, exclude_unset: bool) -> Any: - if isinstance(value, BaseModel): - return validated_model_values(value, exclude_unset=exclude_unset) - if isinstance(value, Mapping): - return { - _copy_opaque(key): _validated_value(item, exclude_unset=exclude_unset) - for key, item in value.items() - } - if isinstance(value, list): - return [_validated_value(item, exclude_unset=exclude_unset) for item in value] - if isinstance(value, tuple): - return tuple(_validated_value(item, exclude_unset=exclude_unset) for item in value) - if isinstance(value, set): - return {_validated_value(item, exclude_unset=exclude_unset) for item in value} - if isinstance(value, frozenset): - return frozenset(_validated_value(item, exclude_unset=exclude_unset) for item in value) - return _copy_opaque(value) - - def deep_merge(destination: dict[str, Any], incoming: Mapping[str, Any]) -> None: for key, value in incoming.items(): if key in destination and isinstance(destination[key], dict) and isinstance(value, Mapping): diff --git a/dimos/manipulation/planning/kinematics/pink_solver.py b/dimos/manipulation/planning/kinematics/pink_solver.py index 0236cd55ec..c853769dc2 100644 --- a/dimos/manipulation/planning/kinematics/pink_solver.py +++ b/dimos/manipulation/planning/kinematics/pink_solver.py @@ -222,7 +222,6 @@ def _build_robot_context( description = prepare_urdf_for_drake(config.model.load(), convert_meshes=False) model = pinocchio.buildModelFromXML(description.xml) - model = _reduce_to_controlled_joints(model, config, controlled_joints) data = model.createData() _assert_base_link_is_model_root(model, config.base_link) frame_id = _get_frame_id(model, frame_name) @@ -276,29 +275,6 @@ def _target_in_model_frame( return target_model -def _reduce_to_controlled_joints( - model: pinocchio.Model, - config: RobotModelConfig, - controlled_joints: Sequence[str] | None, -) -> pinocchio.Model: - """Lock joints outside the solve so IK cannot exploit uncommanded motion.""" - dimos_joint_names = tuple(controlled_joints or config.joint_names) - controlled_joint_ids = { - _get_joint_id(model, config.get_urdf_joint_name(joint_name)) - for joint_name in dimos_joint_names - } - locked_joint_ids = [ - joint_id for joint_id in range(1, len(model.joints)) if joint_id not in controlled_joint_ids - ] - if not locked_joint_ids: - return model - return pinocchio.buildReducedModel( - model, - locked_joint_ids, - np.asarray(pinocchio.neutral(model), dtype=np.float64), - ) - - def _build_joint_mapping( model: pinocchio.Model, config: RobotModelConfig, diff --git a/dimos/manipulation/planning/kinematics/test_pink_ik.py b/dimos/manipulation/planning/kinematics/test_pink_ik.py index 1952d715d1..0e39bc49a3 100644 --- a/dimos/manipulation/planning/kinematics/test_pink_ik.py +++ b/dimos/manipulation/planning/kinematics/test_pink_ik.py @@ -350,27 +350,6 @@ def _robot_config() -> RobotModelConfig: ) -def test_reduce_to_controlled_joints_locks_every_other_joint(mocker: MockerFixture) -> None: - modules = _install_fake_modules(mocker) - model = _FakeModel() - reduced = _FakeModel() - modules.pinocchio.neutral = lambda source: np.zeros(source.nq) - build_reduced_model = mocker.Mock(return_value=reduced) - modules.pinocchio.buildReducedModel = build_reduced_model - - result = pink_ik._reduce_to_controlled_joints( - model, - _robot_config(), - ["joint_a"], - ) - - assert result is reduced - args = build_reduced_model.call_args.args - assert args[0] is model - assert args[1] == [1, 3] - assert args[2] == pytest.approx([0.0, 0.0, 0.0]) - - def _streaming_ik(mocker: MockerFixture, converge: bool = True) -> _StreamingTestPinkIK: _install_fake_modules(mocker, converge=converge) return _StreamingTestPinkIK(PinkIKConfig(max_iterations=3)) diff --git a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_groot_wbc.py b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_groot_wbc.py index 39ca5f2860..99423db9ba 100644 --- a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_groot_wbc.py +++ b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_groot_wbc.py @@ -84,8 +84,8 @@ g1_urdf_static_robot, ) from dimos.robot.unitree.g1.manip_config import ( + G1_TELEOP_ARM_MODEL, G1_UPPER_BODY_JOINT_NAME_MAPPING, - G1_UPPER_BODY_MODEL, ) from dimos.robot.unitree.g1.teleop_ik import G1PinkPoseTargetSolver from dimos.simulation.scene_assets.spec import ScenePackage @@ -397,7 +397,7 @@ def _g1_nav_path(path: NavPath) -> Any: } _G1_TELEOP_MODEL = RobotModelConfig( name="g1_arms", - model=G1_UPPER_BODY_MODEL, + model=G1_TELEOP_ARM_MODEL, joint_names=list(_G1_ARM_JOINT_NAME_MAPPING.values()), base_link="pelvis", joint_name_mapping=_G1_ARM_JOINT_NAME_MAPPING, diff --git a/dimos/robot/unitree/g1/manip_config.py b/dimos/robot/unitree/g1/manip_config.py index dca32e472d..0b251add7a 100644 --- a/dimos/robot/unitree/g1/manip_config.py +++ b/dimos/robot/unitree/g1/manip_config.py @@ -48,6 +48,9 @@ def _urdf_joint_name(coordinator_name: str) -> str: .with_subtree_rooted_at("pelvis") .without_joint_subtrees("left_hip_pitch_joint", "right_hip_pitch_joint") ) +G1_TELEOP_ARM_MODEL = G1_UPPER_BODY_MODEL.with_fixed_joints( + *(_urdf_joint_name(name) for name in G1_WAIST_JOINTS) +) G1_READY_JOINTS = { "left_arm": (-0.4, 0.2, 0.0, 1.2, 0.0, 0.0, 0.0), diff --git a/dimos/robot/unitree/g1/test_g1_teleop.py b/dimos/robot/unitree/g1/test_g1_teleop.py index 9908b2a200..ad6b059f78 100644 --- a/dimos/robot/unitree/g1/test_g1_teleop.py +++ b/dimos/robot/unitree/g1/test_g1_teleop.py @@ -44,6 +44,7 @@ from dimos.robot.unitree.g1.manip_config import ( G1_LEFT_ARM_JOINTS, G1_RIGHT_ARM_JOINTS, + G1_TELEOP_ARM_MODEL, G1_UPPER_BODY_JOINT_NAME_MAPPING, G1_WAIST_JOINTS, g1_upper_body_model_config, @@ -153,16 +154,24 @@ def test_g1_collection_streams_do_not_require_world_poses() -> None: ] -def test_g1_upper_body_model_keeps_waist_and_arms_but_removes_legs() -> None: +@pytest.mark.self_hosted +def test_g1_models_separate_live_waist_planning_from_arm_only_teleop() -> None: config = g1_upper_body_model_config() loaded = config.model.load() joint_names = {joint.name for joint in loaded.joints} + teleop_joints = {joint.name: joint.type for joint in G1_TELEOP_ARM_MODEL.load().joints} assert loaded.root_link == "pelvis" assert "left_hip_pitch_joint" not in joint_names assert "right_hip_pitch_joint" not in joint_names assert {_G1_ARM_JOINT_NAME_MAPPING[name] for name in g1_arms} <= joint_names assert {G1_UPPER_BODY_JOINT_NAME_MAPPING[name] for name in G1_WAIST_JOINTS} <= joint_names + assert { + G1_UPPER_BODY_JOINT_NAME_MAPPING[name]: "fixed" for name in G1_WAIST_JOINTS + }.items() <= teleop_joints.items() + assert {_G1_ARM_JOINT_NAME_MAPPING[name] for name in g1_arms} == { + name for name, joint_type in teleop_joints.items() if joint_type != "fixed" + } assert config.max_velocity == 1.0 assert config.max_acceleration == 2.0 @@ -206,7 +215,7 @@ def test_g1_upper_body_model_builds_a_roboplan_scene() -> None: @pytest.mark.self_hosted -def test_g1_pink_solver_reduces_model_and_uses_g1_objective() -> None: +def test_g1_pink_solver_uses_arm_only_model_and_g1_objective() -> None: frames = ("left_rubber_hand", "right_rubber_hand") config = PoseTargetIKTaskConfig( joint_names=tuple(g1_arms), diff --git a/docs/platforms/humanoid/g1/index.md b/docs/platforms/humanoid/g1/index.md index 9d1fbdb216..c0f9a12667 100644 --- a/docs/platforms/humanoid/g1/index.md +++ b/docs/platforms/humanoid/g1/index.md @@ -78,29 +78,10 @@ Note: this button combination may vary based on the model of the G1 ## 4. Start G1 teleoperation -Use a clear, level work area. Keep the Unitree remote in an operator's hands, -keep the emergency stop reachable, and use a gantry or spotter for the first -hardware run. The upper-body planner does not include leg collision geometry; -do not walk while executing planned arm motion. - -The robot must already be standing and balancing in sport mode. Stop any other -program that can publish Unitree low-level commands before starting dimOS. - -### Known platform issue: RoboPlan static TLS failure - -The current RoboPlan 0.6.0 aarch64 wheel bundles a private, renamed copy of -`libgomp`. Pinocchio loads the system `libgomp.so.1`, so a dimOS forkserver -worker can load two OpenMP runtimes and fail with: - -```text -cannot allocate memory in static TLS block -``` - -This is a RoboPlan wheel-packaging issue, not a missing Python dependency or a -G1 control failure. A dimOS in-process fix would retain both OpenMP runtimes and -hide the underlying problem. Until RoboPlan publishes a corrected wheel, start -teleoperation with the dual preload below. The private RoboPlan library must -come first. +The robot must already be standing and balancing in sport mode. Use a clear, +level work area, keep the Unitree remote and emergency stop reachable, and use +a gantry or spotter for the first hardware run. Do not walk while executing +planned arm motion because the upper-body planner excludes leg geometry. On the G1 computer: @@ -119,75 +100,21 @@ LD_PRELOAD="$ROBOPLAN_GOMP:/lib/aarch64-linux-gnu/libgomp.so.1" \ uv run --no-sync dimos run unitree-g1-teleop --network-interface eth0 ``` -`--network-interface` is blueprint configuration, so it belongs after the -blueprint name. The teleop blueprint intentionally excludes localization, -mapping, autonomous route planning, and the legacy navigation viewer. Quest -walking commands connect directly to the GR00T controller, so no module-disable -arguments are needed. - -`--no-sync` prevents uv from replacing the environment after the private -library path has been resolved. This workaround remains necessary until -RoboPlan publishes an aarch64 wheel that uses the system OpenMP runtime. - -Wait for the Quest server to report that it is listening on port 8443. The -process starts unarmed and in dry-run on real hardware. - -### Activate the controller - -Use the hardware commands from a second SSH session. They are the supported -operator interface; `dimos shell` is intended for debugging, not routine robot -startup. +The teleop blueprint excludes navigation and mapping, so no module-disable +arguments are needed. Wait for the Quest server to listen on port `8443`, then +activate the robot from a second SSH session: ```bash -# Inspect the interlocks and planner connection. uv run dimos hardware g1 status - -# Run the GR00T pose ramp, inspect the robot at the prompt, then enable live -# policy output. Add --ready to move both arms after activation. uv run dimos hardware g1 activate --ready ``` -`activate` requires an interactive confirmation after the ramp. It has no flag -for unattended activation. Without `--ready`, it leaves the arms where they -are. - -The arming ramp may move the 12 leg and 3 waist joints toward GR00T's default -pose. Dry-run suppresses steady-state GR00T policy output after that ramp; it -is not a global motor interlock for Quest teleoperation or planned arm motion. +`activate` runs the GR00T pose ramp and requires interactive confirmation before +enabling output. `--ready` then moves both arms to the conservative ready pose. +Routine startup must use these hardware commands rather than `dimos shell`. -The individual stages remain available for diagnostics and recovery: - -```bash -uv run dimos hardware g1 arm -uv run dimos hardware g1 enable -uv run dimos hardware g1 ready -``` - -`ready` moves both shoulders slightly forward, bends both elbows, and uses 25% -of the configured trajectory speed. It refuses to run until arming is complete -and dry-run has been disabled. It also refuses to run while Quest arm -teleoperation is engaged. - -To stop arm motion and return to the safe startup state: - -```bash -uv run dimos hardware g1 disable -``` - -This command cancels the active trajectory, enables dry-run, and disarms the -controller. Keep the Unitree remote available as the independent physical -safety control. - -### Connect the Quest headset - -Open the following address in the Quest browser and accept the self-signed TLS -certificate: - -```text -https://:8443/teleop -``` - -The controls are: +Open `https://:8443/teleop` in the Quest browser and accept the +self-signed certificate. | Input | Operation | |---|---| @@ -198,30 +125,16 @@ The controls are: | B | Start or save a recording episode | | Y | Discard the current episode | -Quest arm targets preempt a running planned arm trajectory because the Quest IK -task has the higher coordinator priority. Releasing arm tracking does not -resume an old trajectory. - -### Connect the manipulation panel +The blueprint also serves the Viser manipulation panel at +`http://:8095`. It can execute arm motion; only expose this port +on a trusted robot network. Quest arm targets preempt planned arm trajectories. -The G1 teleop blueprint starts the Viser manipulation panel on all network -interfaces at port `8095`. Open this address from a computer on the robot's -trusted network: +When finished, cancel arm motion, enter dry-run, and disarm: -```text -http://:8095 +```bash +uv run dimos hardware g1 disable ``` -Viser remains available when the global viewer is `none`; it is independent of -Rerun. The panel can plan and execute arm motion, so do not expose port `8095` -to an untrusted network. - -### Optional Rerun viewer - -The teleoperation UI is the Quest page. Rerun is a separate visualization of -the robot, maps, and trajectories. Start the blueprint with `--viewer rerun` -for a local native viewer, or leave it at `none` for the onboard computer. - ## 5. Legacy navigation viewer example In the ssh terminal `ssh -L 3030:localhost:3030 unitree@192.168.123.164` @@ -263,11 +176,24 @@ The viewer should open up. It'll run in faster-than-real speed until its caught ### `libgomp.so.1: cannot allocate memory in static TLS block` -Use the dual-preload launch command in [Start G1 teleoperation](#4-start-g1-teleoperation). -Preloading only `/lib/aarch64-linux-gnu/libgomp.so.1` is insufficient because -RoboPlan's native extension explicitly requests its renamed private copy. If -the dual preload still fails, confirm that `ROBOPLAN_GOMP` resolves to an -existing file and that it appears first in `LD_PRELOAD`. +RoboPlan 0.6.0's aarch64 wheel bundles a renamed private `libgomp`, while +Pinocchio loads the system copy. Use the dual-preload launch command above; +preloading only the system library is insufficient. If it still fails, confirm +that `ROBOPLAN_GOMP` resolves to a file and appears first in `LD_PRELOAD`. + +### Activation or ready-pose recovery + +Use the individual stages to identify whether the arming ramp, output enable, +or planned ready motion failed: + +```bash +uv run dimos hardware g1 arm +uv run dimos hardware g1 enable +uv run dimos hardware g1 ready +``` + +`ready` requires completed arming, enabled output, and disengaged Quest arm +tracking. Run `uv run dimos hardware g1 disable` before restarting the sequence. ### A mapping module tries to build with Nix From 6bfa61fd6a1b0c33b48fbbeded7b60dcb3639653 Mon Sep 17 00:00:00 2001 From: cc Date: Mon, 24 Aug 2026 23:53:39 -0700 Subject: [PATCH 40/57] refactor(teleop): rename Quest integration to WebXR --- AGENTS.md | 2 +- CONTEXT.md | 6 +- dimos/control/task.py | 2 +- dimos/control/tasks/pose_target_ik.py | 2 +- .../tasks/teleop_ik_task/teleop_ik_task.py | 2 +- .../teleop_ik_task/test_teleop_ik_task.py | 4 +- dimos/control/teleop_coordinator.py | 2 +- dimos/control/test_coordinator_routing.py | 4 +- dimos/imitation/README.md | 8 +- dimos/imitation/collection/blueprint.py | 14 ++-- dimos/imitation/collection/episode_monitor.py | 6 +- dimos/imitation/collection/test_blueprint.py | 14 ++-- .../collection/test_episode_monitor.py | 8 +- dimos/robot/all_blueprints.py | 36 ++++----- .../manipulators/a1z/blueprints/teleop.py | 16 ++-- .../a1z/blueprints/test_teleop.py | 8 +- .../manipulators/openarm/blueprints/teleop.py | 22 +++--- dimos/robot/manipulators/openarm/teleop_ik.py | 2 +- .../openarm/test_openarm_teleop.py | 34 ++++---- dimos/robot/test_all_blueprints.py | 18 ++--- dimos/teleop/README.md | 26 ++++--- dimos/teleop/hosted/arm_command.py | 8 +- dimos/teleop/hosted/test_arm_command.py | 8 +- dimos/teleop/utils/recorder.py | 6 +- dimos/teleop/utils/report.py | 2 +- dimos/teleop/{quest => webxr}/README.md | 26 +++---- dimos/teleop/{quest => webxr}/blueprints.py | 20 ++--- .../controller_types.py} | 20 ++--- .../extensions.py} | 42 +++++----- .../module.py} | 58 +++++++------- .../{quest => webxr}/test_blueprints.py | 30 +++---- .../test_module.py} | 78 +++++++++---------- .../{quest => webxr}/web/static/index.html | 0 .../{quest => webxr}/web/static/teleop.css | 0 .../{quest => webxr}/web/static/teleop.js | 0 .../manipulation/openarm_integration.md | 10 +-- .../manipulation/piper_integration.md | 4 +- 37 files changed, 275 insertions(+), 273 deletions(-) rename dimos/teleop/{quest => webxr}/README.md (83%) rename dimos/teleop/{quest => webxr}/blueprints.py (93%) rename dimos/teleop/{quest/quest_types.py => webxr/controller_types.py} (93%) rename dimos/teleop/{quest/quest_extensions.py => webxr/extensions.py} (90%) rename dimos/teleop/{quest/quest_teleop_module.py => webxr/module.py} (92%) rename dimos/teleop/{quest => webxr}/test_blueprints.py (81%) rename dimos/teleop/{quest/test_quest_teleop_module.py => webxr/test_module.py} (83%) rename dimos/teleop/{quest => webxr}/web/static/index.html (100%) rename dimos/teleop/{quest => webxr}/web/static/teleop.css (100%) rename dimos/teleop/{quest => webxr}/web/static/teleop.js (100%) diff --git a/AGENTS.md b/AGENTS.md index 7f20b6b46d..cd1ecbb706 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -44,7 +44,7 @@ dimos restart # stop + re-run with same original args | `xarm-perception-agent` | xArm | real | gpt-5.6-luna | ✓ | Manipulation + perception + agent | | `xarm-perception-sim-agent` | xArm | sim | gpt-5.6-luna | ✓ | Manipulation + perception + agent, sim | | `xarm7-planner-coordinator` | xArm7 | real | — | — | Trajectory planner coordinator | -| `teleop-quest-xarm7` | xArm7 | real | — | — | Quest VR teleop | +| `teleop-webxr-xarm7` | xArm7 | real | — | — | WebXR teleop | | `dual-xarm6-planner-coordinator` | xArm6×2 | mock | — | — | Dual-arm motion planner | Run `dimos list` for the full list. diff --git a/CONTEXT.md b/CONTEXT.md index 514a190138..b2e19d08a7 100644 --- a/CONTEXT.md +++ b/CONTEXT.md @@ -4,12 +4,12 @@ Canonical language for robot capabilities and operator interaction in DimOS. ## Teleoperation -**Quest arm teleoperation**: -Arm teleoperation in which tracked Quest controllers provide clutched, relative Cartesian pose commands and gripper input. +**WebXR arm teleoperation**: +Arm teleoperation in which tracked WebXR controllers provide clutched, relative Cartesian pose commands and gripper input. _Avoid_: Keyboard teleoperation, leader-follower teleoperation **Operator hand**: -The left or right Quest controller as a source of teleoperation intent, independent of the robot arm it controls. +The left or right WebXR controller as a source of teleoperation intent, independent of the robot arm it controls. _Avoid_: Hand, side **Mixed-arm setup**: diff --git a/dimos/control/task.py b/dimos/control/task.py index 84bbb38896..b0472c37fb 100644 --- a/dimos/control/task.py +++ b/dimos/control/task.py @@ -38,7 +38,7 @@ from dimos.msgs.geometry_msgs.Pose import Pose from dimos.msgs.geometry_msgs.PoseStamped import PoseStamped from dimos.msgs.geometry_msgs.TwistStamped import TwistStamped - from dimos.teleop.quest.quest_types import Buttons + from dimos.teleop.webxr.controller_types import Buttons @dataclass(frozen=True) diff --git a/dimos/control/tasks/pose_target_ik.py b/dimos/control/tasks/pose_target_ik.py index b0087399ab..6132e17e75 100644 --- a/dimos/control/tasks/pose_target_ik.py +++ b/dimos/control/tasks/pose_target_ik.py @@ -166,7 +166,7 @@ def _nonnegative_finite( @attrs.frozen(slots=False) class PoseTargetIKTaskConfig: - """Configuration shared by absolute and Quest pose-target tasks.""" + """Configuration shared by absolute and WebXR pose-target tasks.""" joint_names: tuple[str, ...] = attrs.field( converter=string_tuple_converter, diff --git a/dimos/control/tasks/teleop_ik_task/teleop_ik_task.py b/dimos/control/tasks/teleop_ik_task/teleop_ik_task.py index d87d11181a..9ca3691de4 100644 --- a/dimos/control/tasks/teleop_ik_task/teleop_ik_task.py +++ b/dimos/control/tasks/teleop_ik_task/teleop_ik_task.py @@ -38,7 +38,7 @@ from dimos.msgs.geometry_msgs.Pose import Pose from dimos.msgs.geometry_msgs.PoseStamped import PoseStamped from dimos.protocol.service.spec import BaseConfig -from dimos.teleop.quest.quest_types import Buttons +from dimos.teleop.webxr.controller_types import Buttons if TYPE_CHECKING: from dimos.control.coordinator import TaskConfig diff --git a/dimos/control/tasks/teleop_ik_task/test_teleop_ik_task.py b/dimos/control/tasks/teleop_ik_task/test_teleop_ik_task.py index f947e8c67c..819f8a26be 100644 --- a/dimos/control/tasks/teleop_ik_task/test_teleop_ik_task.py +++ b/dimos/control/tasks/teleop_ik_task/test_teleop_ik_task.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Behavior tests for unified single- and two-hand Quest teleoperation.""" +"""Behavior tests for unified single- and two-hand WebXR teleoperation.""" from pathlib import Path from typing import cast @@ -36,7 +36,7 @@ from dimos.msgs.geometry_msgs.Vector3 import Vector3 from dimos.msgs.sensor_msgs.JointState import JointState from dimos.robot.assets.model import RobotModel -from dimos.teleop.quest.quest_types import Buttons +from dimos.teleop.webxr.controller_types import Buttons def _robot_model() -> RobotModelConfig: diff --git a/dimos/control/teleop_coordinator.py b/dimos/control/teleop_coordinator.py index 63c90bc2af..9d3b7b1caa 100644 --- a/dimos/control/teleop_coordinator.py +++ b/dimos/control/teleop_coordinator.py @@ -18,7 +18,7 @@ from dimos.core.stream import In from dimos.msgs.geometry_msgs.PoseStamped import PoseStamped from dimos.msgs.std_msgs.Float32 import Float32 -from dimos.teleop.quest.quest_types import Buttons +from dimos.teleop.webxr.controller_types import Buttons class TeleopControlCoordinator(ControlCoordinator): diff --git a/dimos/control/test_coordinator_routing.py b/dimos/control/test_coordinator_routing.py index 810b0f79bb..15491ca70f 100644 --- a/dimos/control/test_coordinator_routing.py +++ b/dimos/control/test_coordinator_routing.py @@ -48,7 +48,7 @@ from dimos.msgs.geometry_msgs.Twist import Twist from dimos.msgs.geometry_msgs.TwistStamped import TwistStamped from dimos.msgs.sensor_msgs.JointState import JointState -from dimos.teleop.quest.quest_types import Buttons +from dimos.teleop.webxr.controller_types import Buttons ARM_JOINTS = ["arm/joint1", "arm/joint2"] @@ -207,7 +207,7 @@ class SingleArmControlCoordinator(ControlCoordinator): class DualArmControlCoordinator(ControlCoordinator): - """One cartesian port per arm, as in the dual-arm quest teleop.""" + """One cartesian port per arm, as in the dual-arm webxr teleop.""" left_cartesian: In[PoseStamped] right_cartesian: In[PoseStamped] diff --git a/dimos/imitation/README.md b/dimos/imitation/README.md index 995f372913..0d67a0c839 100644 --- a/dimos/imitation/README.md +++ b/dimos/imitation/README.md @@ -4,7 +4,7 @@ End-to-end: teleoperate an arm, record episodes to a session DB, then convert that DB into a LeRobot or HDF5 dataset for imitation learning. ``` -teleop (Quest) ─▶ CollectionRecorder ─▶ session__.db ─▶ dimos dataprep ─▶ dataset +teleop (WebXR) ─▶ CollectionRecorder ─▶ session__.db ─▶ dimos dataprep ─▶ dataset ``` --- @@ -16,16 +16,16 @@ hardware (a RealSense + the arm). ```bash # XArm7 in sim -dimos --simulation run learning-collect-quest-xarm7 +dimos --simulation run learning-collect-webxr-xarm7 # Piper on real hardware -dimos run learning-collect-quest-piper +dimos run learning-collect-webxr-piper ``` This brings up teleop, a RealSense (real only), the episode monitor, and the recorder, all wired together. -### Controls (Quest) +### Controls (WebXR) | Button | Action | | --- | --- | diff --git a/dimos/imitation/collection/blueprint.py b/dimos/imitation/collection/blueprint.py index 4039e78836..5d060fc795 100644 --- a/dimos/imitation/collection/blueprint.py +++ b/dimos/imitation/collection/blueprint.py @@ -29,9 +29,9 @@ from dimos.hardware.sensors.camera.realsense.camera import RealSenseCamera from dimos.imitation.collection.episode_monitor import EpisodeMonitorModule from dimos.imitation.collection.recorder import CollectionRecorder -from dimos.teleop.quest.blueprints import ( - teleop_quest_piper, - teleop_quest_xarm7, +from dimos.teleop.webxr.blueprints import ( + teleop_webxr_piper, + teleop_webxr_xarm7, ) @@ -54,25 +54,25 @@ def _camera_if_real() -> tuple[Blueprint, ...]: # resolves to a stable / topic shared by producer and recorder. The # recorder captures whatever joints are present, so the coordinator's aggregate # stream is its intended input (see dimos/control/README.md). -learning_collect_quest_xarm7 = autoconnect( +learning_collect_webxr_xarm7 = autoconnect( CollectionRecorder.blueprint( db_path=_session_db("xarm7"), poseless_streams=["color_image", "coordinator_joint_state", "status"], record_tf=False, ), EpisodeMonitorModule.blueprint(), # default button_map: toggle=B, discard=Y - teleop_quest_xarm7, + teleop_webxr_xarm7, *_camera_if_real(), ) -learning_collect_quest_piper = autoconnect( +learning_collect_webxr_piper = autoconnect( CollectionRecorder.blueprint( db_path=_session_db("piper"), poseless_streams=["color_image", "coordinator_joint_state", "status"], record_tf=False, ), EpisodeMonitorModule.blueprint(), # default button_map: toggle=B, discard=Y - teleop_quest_piper, + teleop_webxr_piper, *_camera_if_real(), ) diff --git a/dimos/imitation/collection/episode_monitor.py b/dimos/imitation/collection/episode_monitor.py index 44afbf2371..03e171bbfc 100644 --- a/dimos/imitation/collection/episode_monitor.py +++ b/dimos/imitation/collection/episode_monitor.py @@ -34,7 +34,7 @@ from dimos.core.core import rpc from dimos.core.module import Module, ModuleConfig from dimos.core.stream import In, Out -from dimos.teleop.quest.quest_types import BUTTON_ALIASES, Buttons +from dimos.teleop.webxr.controller_types import BUTTON_ALIASES, Buttons from dimos.utils.logging_config import setup_logger logger = setup_logger() @@ -82,12 +82,12 @@ def _validate_button_map(cls, value: dict[EpisodeCommand, str]) -> dict[EpisodeC } if invalid: raise ValueError( - f"unknown Quest button mappings: {sorted(invalid)}; " + f"unknown WebXR button mappings: {sorted(invalid)}; " f"valid aliases: {sorted(BUTTON_ALIASES)}" ) resolved = [BUTTON_ALIASES.get(button, button) for button in value.values()] if len(resolved) != len(set(resolved)): - raise ValueError("each episode command must use a distinct Quest button") + raise ValueError("each episode command must use a distinct WebXR button") return value diff --git a/dimos/imitation/collection/test_blueprint.py b/dimos/imitation/collection/test_blueprint.py index c517cbfdd9..368609e31c 100644 --- a/dimos/imitation/collection/test_blueprint.py +++ b/dimos/imitation/collection/test_blueprint.py @@ -18,20 +18,20 @@ from dimos.core.coordination.blueprints import Blueprint from dimos.imitation.collection.blueprint import ( - learning_collect_quest_piper, - learning_collect_quest_xarm7, + learning_collect_webxr_piper, + learning_collect_webxr_xarm7, ) from dimos.imitation.collection.episode_monitor import EpisodeMonitorModule from dimos.imitation.collection.recorder import CollectionRecorder from dimos.msgs.sensor_msgs.JointState import JointState -from dimos.teleop.quest.quest_extensions import ArmTeleopModule +from dimos.teleop.webxr.extensions import ArmTeleopModule AGGREGATE = "coordinator_joint_state" @pytest.mark.parametrize( "blueprint", - [learning_collect_quest_xarm7, learning_collect_quest_piper], + [learning_collect_webxr_xarm7, learning_collect_webxr_piper], ) def test_collection_streams_are_poseless(blueprint: Blueprint) -> None: recorder = next(atom for atom in blueprint.blueprints if atom.module is CollectionRecorder) @@ -46,7 +46,7 @@ def test_collection_streams_are_poseless(blueprint: Blueprint) -> None: @pytest.mark.parametrize( "blueprint", - [learning_collect_quest_xarm7, learning_collect_quest_piper], + [learning_collect_webxr_xarm7, learning_collect_webxr_piper], ) def test_collection_recorder_stops_after_producers(blueprint: Blueprint) -> None: assert blueprint.active_blueprints[0].module is CollectionRecorder @@ -54,7 +54,7 @@ def test_collection_recorder_stops_after_producers(blueprint: Blueprint) -> None @pytest.mark.parametrize( "blueprint", - [learning_collect_quest_xarm7, learning_collect_quest_piper], + [learning_collect_webxr_xarm7, learning_collect_webxr_piper], ) def test_episode_monitor_stops_after_input_producers(blueprint: Blueprint) -> None: assert blueprint.active_blueprints[1].module is EpisodeMonitorModule @@ -82,7 +82,7 @@ def _joint_streams(blueprint: Blueprint) -> dict[tuple[str, str], str]: } -@pytest.mark.parametrize("blueprint", [learning_collect_quest_xarm7, learning_collect_quest_piper]) +@pytest.mark.parametrize("blueprint", [learning_collect_webxr_xarm7, learning_collect_webxr_piper]) def test_recorder_reads_aggregate_joint_state(blueprint: Blueprint) -> None: streams = _joint_streams(blueprint) diff --git a/dimos/imitation/collection/test_episode_monitor.py b/dimos/imitation/collection/test_episode_monitor.py index 62349b2389..fb0549c9d2 100644 --- a/dimos/imitation/collection/test_episode_monitor.py +++ b/dimos/imitation/collection/test_episode_monitor.py @@ -36,7 +36,7 @@ KeyPress, ) from dimos.protocol.rpc.pubsubrpc import LCMRPC -from dimos.teleop.quest.quest_types import BUTTON_ALIASES, Buttons +from dimos.teleop.webxr.controller_types import BUTTON_ALIASES, Buttons @pytest.fixture @@ -75,7 +75,7 @@ def _events(monitor: EpisodeMonitorModule) -> list[EpisodeStatus]: def _press(monitor: EpisodeMonitorModule, alias: str) -> None: - """Rising edge: release-then-press the given Quest button alias.""" + """Rising edge: release-then-press the given WebXR button alias.""" attr = BUTTON_ALIASES[alias] released = Buttons() pressed = Buttons() @@ -184,14 +184,14 @@ def test_shutdown_discards_recording(make_monitor: Callable[..., EpisodeMonitorM def test_invalid_button_mapping_fails_at_startup( make_monitor: Callable[..., EpisodeMonitorModule], ) -> None: - with pytest.raises(ValidationError, match="unknown Quest button mappings"): + with pytest.raises(ValidationError, match="unknown WebXR button mappings"): make_monitor(button_map={"toggle": "not_a_button"}) def test_duplicate_button_mapping_fails_at_startup( make_monitor: Callable[..., EpisodeMonitorModule], ) -> None: - with pytest.raises(ValidationError, match="distinct Quest button"): + with pytest.raises(ValidationError, match="distinct WebXR button"): make_monitor(button_map={"toggle": "B", "discard": "right_secondary"}) diff --git a/dimos/robot/all_blueprints.py b/dimos/robot/all_blueprints.py index 671a8baf57..580b7df0cc 100644 --- a/dimos/robot/all_blueprints.py +++ b/dimos/robot/all_blueprints.py @@ -72,8 +72,8 @@ "keyboard-teleop-piper": "dimos.robot.manipulators.piper.blueprints.teleop:keyboard_teleop_piper", "keyboard-teleop-xarm6": "dimos.robot.manipulators.xarm.blueprints.teleop:keyboard_teleop_xarm6", "keyboard-teleop-xarm7": "dimos.robot.manipulators.xarm.blueprints.teleop:keyboard_teleop_xarm7", - "learning-collect-quest-piper": "dimos.imitation.collection.blueprint:learning_collect_quest_piper", - "learning-collect-quest-xarm7": "dimos.imitation.collection.blueprint:learning_collect_quest_xarm7", + "learning-collect-quest-piper": "dimos.imitation.collection.blueprint:learning_collect_webxr_piper", + "learning-collect-quest-xarm7": "dimos.imitation.collection.blueprint:learning_collect_webxr_xarm7", "mid360": "dimos.hardware.sensors.lidar.livox.livox_blueprints:mid360", "mid360-fastlio": "dimos.hardware.sensors.lidar.fastlio2.fastlio_blueprints:mid360_fastlio", "mid360-fastlio-ray-trace": "dimos.hardware.sensors.lidar.fastlio2.fastlio_blueprints:mid360_fastlio_ray_trace", @@ -94,16 +94,16 @@ "teleop-phone": "dimos.teleop.phone.blueprints:teleop_phone", "teleop-phone-go2": "dimos.teleop.phone.blueprints:teleop_phone_go2", "teleop-phone-go2-fleet": "dimos.teleop.phone.blueprints:teleop_phone_go2_fleet", - "teleop-quest-a1z": "dimos.teleop.quest.blueprints:teleop_quest_a1z", - "teleop-quest-dual": "dimos.teleop.quest.blueprints:teleop_quest_dual", - "teleop-quest-go2": "dimos.teleop.quest.blueprints:teleop_quest_go2", - "teleop-quest-hand-xarm7": "dimos.teleop.quest.blueprints:teleop_quest_hand_xarm7", - "teleop-quest-openarm": "dimos.robot.manipulators.openarm.blueprints.teleop:teleop_quest_openarm", - "teleop-quest-piper": "dimos.teleop.quest.blueprints:teleop_quest_piper", - "teleop-quest-rerun": "dimos.teleop.quest.blueprints:teleop_quest_rerun", - "teleop-quest-xarm6": "dimos.teleop.quest.blueprints:teleop_quest_xarm6", - "teleop-quest-xarm7": "dimos.teleop.quest.blueprints:teleop_quest_xarm7", - "teleop-quest-xarm7-video": "dimos.teleop.quest.blueprints:teleop_quest_xarm7_video", + "teleop-webxr-a1z": "dimos.teleop.webxr.blueprints:teleop_webxr_a1z", + "teleop-webxr-dual": "dimos.teleop.webxr.blueprints:teleop_webxr_dual", + "teleop-webxr-go2": "dimos.teleop.webxr.blueprints:teleop_webxr_go2", + "teleop-webxr-hand-xarm7": "dimos.teleop.webxr.blueprints:teleop_webxr_hand_xarm7", + "teleop-webxr-openarm": "dimos.robot.manipulators.openarm.blueprints.teleop:teleop_webxr_openarm", + "teleop-webxr-piper": "dimos.teleop.webxr.blueprints:teleop_webxr_piper", + "teleop-webxr-rerun": "dimos.teleop.webxr.blueprints:teleop_webxr_rerun", + "teleop-webxr-xarm6": "dimos.teleop.webxr.blueprints:teleop_webxr_xarm6", + "teleop-webxr-xarm7": "dimos.teleop.webxr.blueprints:teleop_webxr_xarm7", + "teleop-webxr-xarm7-video": "dimos.teleop.webxr.blueprints:teleop_webxr_xarm7_video", "unitree-g1": "dimos.robot.unitree.g1.blueprints.perceptive.unitree_g1:unitree_g1", "unitree-g1-agentic": "dimos.robot.unitree.g1.blueprints.agentic.unitree_g1_agentic:unitree_g1_agentic", "unitree-g1-agentic-sim": "dimos.robot.unitree.g1.blueprints.agentic.unitree_g1_agentic_sim:unitree_g1_agentic_sim", @@ -164,7 +164,7 @@ "arm-command-module": "dimos.teleop.hosted.arm_command.ArmCommandModule", "arm-pose-coordinator": "dimos.robot.manipulators.common.coordinators.ArmPoseCoordinator", "arm-pose-twist-coordinator": "dimos.robot.manipulators.common.coordinators.ArmPoseTwistCoordinator", - "arm-teleop-module": "dimos.teleop.quest.quest_extensions.ArmTeleopModule", + "arm-teleop-module": "dimos.teleop.webxr.extensions.ArmTeleopModule", "arm-twist-coordinator": "dimos.robot.manipulators.common.coordinators.ArmTwistCoordinator", "b-box-navigation-module": "dimos.navigation.bbox_navigation.BBoxNavigationModule", "b1-connection-module": "dimos.robot.unitree.b1.connection.B1ConnectionModule", @@ -210,14 +210,14 @@ "go2-memory": "dimos.robot.unitree.go2.blueprints.smart.unitree_go2.Go2Memory", "go2-mid360-recorder": "dimos.robot.unitree.go2.go2_mid360_recorder.Go2Mid360Recorder", "go2-mid360-static-tf": "dimos.robot.unitree.go2.go2_mid360_static_transforms.Go2Mid360StaticTf", - "go2-teleop-module": "dimos.teleop.quest.quest_extensions.Go2TeleopModule", + "go2-teleop-module": "dimos.teleop.webxr.extensions.Go2TeleopModule", "go2-zenoh": "dimos.robot.unitree.go2.zenoh.zenohconnection.GO2Zenoh", "google-maps-skill-container": "dimos.agents.skills.google_maps_skill_container.GoogleMapsSkillContainer", "gps-nav-skill-container": "dimos.agents.skills.gps_nav_skill.GpsNavSkillContainer", "grasp-gen-x-module": "dimos.manipulation.grasping.grasp_gen_x.GraspGenXModule", "grasping-module": "dimos.manipulation.grasping.grasping.GraspingModule", "gstreamer-camera-module": "dimos.hardware.sensors.camera.gstreamer.gstreamer_camera.GstreamerCameraModule", - "hand-teleop-module": "dimos.teleop.quest.quest_extensions.HandTeleopModule", + "hand-teleop-module": "dimos.teleop.webxr.extensions.HandTeleopModule", "hosted-stats-module": "dimos.teleop.hosted.hosted_stats.HostedStatsModule", "joint-trajectory-controller": "dimos.manipulation.control.trajectory_controller.joint_trajectory_controller.JointTrajectoryController", "joystick-module": "dimos.robot.unitree.b1.joystick_module.JoystickModule", @@ -259,7 +259,7 @@ "pick-and-place-module": "dimos.manipulation.pick_and_place_module.PickAndPlaceModule", "point-lio": "dimos.hardware.sensors.lidar.pointlio.module.PointLio", "pointlio-recorder": "dimos.hardware.sensors.lidar.pointlio.recorder.PointlioRecorder", - "quest-teleop-module": "dimos.teleop.quest.quest_teleop_module.QuestTeleopModule", + "quest-teleop-module": "dimos.teleop.webxr.module.WebXRTeleopModule", "ray-tracing-voxel-map": "dimos.mapping.ray_tracing.module.RayTracingVoxelMap", "real-sense-camera": "dimos.hardware.sensors.camera.realsense.camera.RealSenseCamera", "receiver-module": "dimos.utils.demo_image_encoding.ReceiverModule", @@ -282,11 +282,11 @@ "teleop-control-coordinator": "dimos.control.teleop_coordinator.TeleopControlCoordinator", "teleop-recorder": "dimos.teleop.utils.recorder.TeleopRecorder", "temporal-memory": "dimos.perception.experimental.temporal_memory.temporal_memory.TemporalMemory", - "twist-teleop-module": "dimos.teleop.quest.quest_extensions.TwistTeleopModule", + "twist-teleop-module": "dimos.teleop.webxr.extensions.TwistTeleopModule", "unitree-g1-skill-container": "dimos.robot.unitree.g1.skill_container.UnitreeG1SkillContainer", "unitree-skill-container": "dimos.robot.unitree.unitree_skill_container.UnitreeSkillContainer", "unity-bridge-module": "dimos.simulation.unity.module.UnityBridgeModule", - "video-arm-teleop-module": "dimos.teleop.quest.quest_extensions.VideoArmTeleopModule", + "video-arm-teleop-module": "dimos.teleop.webxr.extensions.VideoArmTeleopModule", "virtual-mid360": "dimos.hardware.sensors.lidar.virtual_mid360.module.VirtualMid360", "vlm-agent": "dimos.agents.vlm_agent.VLMAgent", "voxel-grid-mapper": "dimos.mapping.voxels.module.VoxelGridMapper", diff --git a/dimos/robot/manipulators/a1z/blueprints/teleop.py b/dimos/robot/manipulators/a1z/blueprints/teleop.py index 597e6834db..d974f12cb2 100644 --- a/dimos/robot/manipulators/a1z/blueprints/teleop.py +++ b/dimos/robot/manipulators/a1z/blueprints/teleop.py @@ -63,22 +63,22 @@ ) -_a1z_quest_hw = a1z_hardware("arm") -_a1z_quest_model = make_a1z_model_config() +_a1z_webxr_hw = a1z_hardware("arm") +_a1z_webxr_model = make_a1z_model_config() coordinator_teleop_a1z = autoconnect( TeleopControlCoordinator.blueprint( instance_name="ControlCoordinator", - hardware=[_a1z_quest_hw], + hardware=[_a1z_webxr_hw], tasks=[ teleop_ik_task( - _a1z_quest_hw, + _a1z_webxr_hw, name="teleop_a1z", - robot_model=_a1z_quest_model, + robot_model=_a1z_webxr_model, bindings=[ { "hand": "left", - "target_frame": _a1z_quest_model.end_effector_link, + "target_frame": _a1z_webxr_model.end_effector_link, } ], priority=20, @@ -91,11 +91,11 @@ priority=20, stream_bind={"gripper_command": "left_gripper_command"}, ), - trajectory_task(_a1z_quest_hw), + trajectory_task(_a1z_webxr_hw), ], ), ManipulationModule.blueprint( - robots=[_a1z_quest_model], + robots=[_a1z_webxr_model], visualization={"backend": "viser"}, ), ) diff --git a/dimos/robot/manipulators/a1z/blueprints/test_teleop.py b/dimos/robot/manipulators/a1z/blueprints/test_teleop.py index 774ff7f279..e08ccb3588 100644 --- a/dimos/robot/manipulators/a1z/blueprints/test_teleop.py +++ b/dimos/robot/manipulators/a1z/blueprints/test_teleop.py @@ -25,7 +25,7 @@ keyboard_teleop_a1z, ) from dimos.robot.manipulators.a1z.config import a1z_hardware -from dimos.teleop.quest.blueprints import teleop_quest_a1z +from dimos.teleop.webxr.blueprints import teleop_webxr_a1z def _coordinator_kwargs(blueprint: Blueprint) -> dict[str, Any]: @@ -51,7 +51,7 @@ def test_trajectory_accepts_gripper_and_gripper_has_dedicated_task( assert (gripper.name, gripper.joint_names) == ("arm_gripper", ["arm/gripper"]) -def test_quest_teleop_uses_mock_a1z_hardware_and_gripper_by_default() -> None: +def test_webxr_teleop_uses_mock_a1z_hardware_and_gripper_by_default() -> None: kwargs = _coordinator_kwargs(coordinator_teleop_a1z) hardware = kwargs["hardware"][0] tasks = cast("list[TaskConfig]", kwargs["tasks"]) @@ -70,8 +70,8 @@ def test_quest_teleop_uses_mock_a1z_hardware_and_gripper_by_default() -> None: assert gripper.stream_bind == {"gripper_command": "left_gripper_command"} -def test_quest_left_controller_routes_to_a1z_teleop() -> None: - assert teleop_quest_a1z.remapping_map == { +def test_webxr_left_controller_routes_to_a1z_teleop() -> None: + assert teleop_webxr_a1z.remapping_map == { ("armteleopmodule", "left_controller_output"): "left_cartesian_command", ("armteleopmodule", "left_gripper_command"): "left_gripper_command", } diff --git a/dimos/robot/manipulators/openarm/blueprints/teleop.py b/dimos/robot/manipulators/openarm/blueprints/teleop.py index f9265034ba..df4168849b 100644 --- a/dimos/robot/manipulators/openarm/blueprints/teleop.py +++ b/dimos/robot/manipulators/openarm/blueprints/teleop.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""OpenArm Quest teleop blueprint.""" +"""OpenArm WebXR teleop blueprint.""" from __future__ import annotations @@ -33,9 +33,9 @@ openarm_hardware, ) from dimos.robot.manipulators.openarm.teleop_ik import OpenArmPinkPoseTargetSolver -from dimos.teleop.quest.quest_extensions import ArmTeleopModule +from dimos.teleop.webxr.extensions import ArmTeleopModule -OPENARM_QUEST_TASK_NAME = "teleop_openarm" +OPENARM_WEBXR_TASK_NAME = "teleop_openarm" _OPENARM_ARM_VELOCITY_PROFILE_RAD_S = (1.0, 1.0, 1.0, 1.0, 2.0, 2.0, 2.0) _OPENARM_JOINT_VELOCITY_LIMITS_RAD_S = { @@ -80,7 +80,7 @@ def _setup_from_config(self) -> None: "robot_model": openarm_bimanual_model_config(), }, ) - if task.name == OPENARM_QUEST_TASK_NAME + if task.name == OPENARM_WEBXR_TASK_NAME else task for task in self.config.tasks ] @@ -101,7 +101,7 @@ def _initialize_planning(self) -> None: super()._initialize_planning() -_openarm_quest_pink = PinkKinematicsConfig( +_openarm_webxr_pink = PinkKinematicsConfig( dt=0.01, position_cost=8.0, orientation_cost=2.0, @@ -110,8 +110,8 @@ def _initialize_planning(self) -> None: lm_damping=0.01, gain=0.25, ) -_openarm_quest_task = TaskConfig( - name=OPENARM_QUEST_TASK_NAME, +_openarm_webxr_task = TaskConfig( + name=OPENARM_WEBXR_TASK_NAME, type="teleop_ik", joint_names=OPENARM_ARM_JOINTS, params={ @@ -126,7 +126,7 @@ def _initialize_planning(self) -> None: }, ], "solver_type": OpenArmPinkPoseTargetSolver, - "pink": _openarm_quest_pink, + "pink": _openarm_webxr_pink, "timeout": 0.5, "max_command_tracking_error_deg": 10.0, "max_joint_velocity_rad_s": 2.0, @@ -137,12 +137,12 @@ def _initialize_planning(self) -> None: # Safe default: both controllers feed one bimanual task backed by in-memory # hardware. Supplying both CAN ports selects the physical adapter. -teleop_quest_openarm = autoconnect( +teleop_webxr_openarm = autoconnect( ArmTeleopModule.blueprint(), OpenArmTeleopCoordinator.blueprint( instance_name="ControlCoordinator", tasks=[ - _openarm_quest_task, + _openarm_webxr_task, TaskConfig( name="left_arm_gripper", type="gripper", @@ -161,7 +161,7 @@ def _initialize_planning(self) -> None: ], ), _OpenArmManipulationModule.blueprint( - kinematics=_openarm_quest_pink, + kinematics=_openarm_webxr_pink, visualization={"backend": "viser"}, ), ).remappings( diff --git a/dimos/robot/manipulators/openarm/teleop_ik.py b/dimos/robot/manipulators/openarm/teleop_ik.py index 18ce337a48..22a3d90992 100644 --- a/dimos/robot/manipulators/openarm/teleop_ik.py +++ b/dimos/robot/manipulators/openarm/teleop_ik.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""OpenArm-specific Pink pose-target solver for Quest teleoperation.""" +"""OpenArm-specific Pink pose-target solver for WebXR teleoperation.""" from __future__ import annotations diff --git a/dimos/robot/manipulators/openarm/test_openarm_teleop.py b/dimos/robot/manipulators/openarm/test_openarm_teleop.py index 3de14e34e9..2c139041e7 100644 --- a/dimos/robot/manipulators/openarm/test_openarm_teleop.py +++ b/dimos/robot/manipulators/openarm/test_openarm_teleop.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Construction and component tests for safe OpenArm Quest teleoperation.""" +"""Construction and component tests for safe OpenArm WebXR teleoperation.""" from typing import Any, cast @@ -33,10 +33,10 @@ from dimos.msgs.std_msgs.Float32 import Float32 from dimos.robot.manipulators.openarm.blueprints.basic import openarm_planner_coordinator from dimos.robot.manipulators.openarm.blueprints.teleop import ( - OPENARM_QUEST_TASK_NAME, + OPENARM_WEBXR_TASK_NAME, OpenArmTeleopCoordinator, _OpenArmManipulationModule, - teleop_quest_openarm, + teleop_webxr_openarm, ) from dimos.robot.manipulators.openarm.config import ( OPENARM_ARM_JOINTS, @@ -46,8 +46,8 @@ openarm_bimanual_model_config, ) from dimos.robot.manipulators.openarm.teleop_ik import OpenArmPinkPoseTargetSolver -from dimos.teleop.quest.quest_extensions import ArmTeleopModule -from dimos.teleop.quest.quest_types import Buttons +from dimos.teleop.webxr.controller_types import Buttons +from dimos.teleop.webxr.extensions import ArmTeleopModule def _module_kwargs(blueprint: Blueprint, module_type: type) -> dict[str, Any]: @@ -74,10 +74,10 @@ def test_openarm_model_uses_canonical_zero_start() -> None: assert OPENARM_HOME_JOINTS == [0.0] * len(OPENARM_ARM_JOINTS) -def test_openarm_quest_blueprint_has_one_bimanual_mock_task() -> None: - coordinator_kwargs = _module_kwargs(teleop_quest_openarm, OpenArmTeleopCoordinator) - teleop_kwargs = _module_kwargs(teleop_quest_openarm, ArmTeleopModule) - manipulation_kwargs = _module_kwargs(teleop_quest_openarm, _OpenArmManipulationModule) +def test_openarm_webxr_blueprint_has_one_bimanual_mock_task() -> None: + coordinator_kwargs = _module_kwargs(teleop_webxr_openarm, OpenArmTeleopCoordinator) + teleop_kwargs = _module_kwargs(teleop_webxr_openarm, ArmTeleopModule) + manipulation_kwargs = _module_kwargs(teleop_webxr_openarm, _OpenArmManipulationModule) tasks = coordinator_kwargs["tasks"] assert "hardware" not in coordinator_kwargs @@ -89,7 +89,7 @@ def test_openarm_quest_blueprint_has_one_bimanual_mock_task() -> None: trajectory = next(task for task in tasks if task.type == "trajectory") grippers = [task for task in tasks if task.type == "gripper"] bindings = task.params["bindings"] - assert task.name == OPENARM_QUEST_TASK_NAME + assert task.name == OPENARM_WEBXR_TASK_NAME assert task.type == "teleop_ik" assert task.joint_names == OPENARM_ARM_JOINTS assert {binding["hand"] for binding in bindings} == {"left", "right"} @@ -132,7 +132,7 @@ def test_openarm_quest_blueprint_has_one_bimanual_mock_task() -> None: assert manipulation_kwargs["kinematics"] == task.params["pink"] assert manipulation_kwargs["visualization"] == {"backend": "viser"} assert teleop_kwargs == {} - assert teleop_quest_openarm.remapping_map == { + assert teleop_webxr_openarm.remapping_map == { (ArmTeleopModule.name, "left_controller_output"): "left_cartesian_command", (ArmTeleopModule.name, "left_gripper_command"): "left_gripper_command", (ArmTeleopModule.name, "right_controller_output"): "right_cartesian_command", @@ -141,7 +141,7 @@ def test_openarm_quest_blueprint_has_one_bimanual_mock_task() -> None: def test_openarm_can_ports_are_blueprint_cli_options() -> None: - for blueprint in (teleop_quest_openarm, openarm_planner_coordinator): + for blueprint in (teleop_webxr_openarm, openarm_planner_coordinator): parsed = BlueprintConfigParser(blueprint).parse( ["--left-can-port", "can1", "--right-can-port", "can0"], environ={}, @@ -152,10 +152,10 @@ def test_openarm_can_ports_are_blueprint_cli_options() -> None: assert coordinator["right_can_port"] == "can0" -def test_openarm_quest_commands_both_arms_and_grippers_through_coordinator( +def test_openarm_webxr_commands_both_arms_and_grippers_through_coordinator( mocker: MockerFixture, ) -> None: - coordinator_kwargs = _module_kwargs(teleop_quest_openarm, OpenArmTeleopCoordinator) + coordinator_kwargs = _module_kwargs(teleop_webxr_openarm, OpenArmTeleopCoordinator) mocker.patch.object(OpenArmPinkPoseTargetSolver, "_validate_frame_targets") frame_poses = mocker.patch.object( OpenArmPinkPoseTargetSolver, @@ -178,7 +178,7 @@ def test_openarm_quest_commands_both_arms_and_grippers_through_coordinator( try: coordinator.start() - task = cast("TeleopIKTask", coordinator._tasks[OPENARM_QUEST_TASK_NAME]) + task = cast("TeleopIKTask", coordinator._tasks[OPENARM_WEBXR_TASK_NAME]) assert task._teleop_config.robot_model.name == "openarm" assert task._teleop_config.max_joint_velocity_rad_s == 2.0 assert task._teleop_config.joint_velocity_limits_rad_s == { @@ -200,11 +200,11 @@ def test_openarm_quest_commands_both_arms_and_grippers_through_coordinator( coordinator._dispatch("right_gripper_command", Float32(data=0.25)) coordinator._dispatch( "left_cartesian_command", - PoseStamped(frame_id=OPENARM_QUEST_TASK_NAME, position=[1.0, 0.0, 0.0]), + PoseStamped(frame_id=OPENARM_WEBXR_TASK_NAME, position=[1.0, 0.0, 0.0]), ) coordinator._dispatch( "right_cartesian_command", - PoseStamped(frame_id=OPENARM_QUEST_TASK_NAME, position=[-1.0, 0.0, 0.0]), + PoseStamped(frame_id=OPENARM_WEBXR_TASK_NAME, position=[-1.0, 0.0, 0.0]), ) assert coordinator._tick_loop is not None diff --git a/dimos/robot/test_all_blueprints.py b/dimos/robot/test_all_blueprints.py index d07b1fbcd3..eccc29303b 100644 --- a/dimos/robot/test_all_blueprints.py +++ b/dimos/robot/test_all_blueprints.py @@ -51,20 +51,20 @@ "coordinator-xarm6", "coordinator-xarm7", "dual-xarm6-planner-coordinator", - "learning-collect-quest-xarm7", + "learning-collect-webxr-xarm7", "openarm-planner-coordinator", "teleop-hosted-go2-multicam", "teleop-hosted-go2-transport", "teleop-hosted-xarm6", "teleop-hosted-xarm7", - "teleop-quest-dual", - "teleop-quest-go2", - "teleop-quest-hand-xarm7", - "teleop-quest-piper", - "teleop-quest-rerun", - "teleop-quest-xarm6", - "teleop-quest-xarm7", - "teleop-quest-xarm7-video", + "teleop-webxr-dual", + "teleop-webxr-go2", + "teleop-webxr-hand-xarm7", + "teleop-webxr-piper", + "teleop-webxr-rerun", + "teleop-webxr-xarm6", + "teleop-webxr-xarm7", + "teleop-webxr-xarm7-video", "xarm-perception", "xarm-perception-agent", "xarm-perception-sim", diff --git a/dimos/teleop/README.md b/dimos/teleop/README.md index 0124a6253e..a669aee08b 100644 --- a/dimos/teleop/README.md +++ b/dimos/teleop/README.md @@ -1,11 +1,12 @@ # Teleop Stack -Teleoperation modules for DimOS. Supports Meta Quest 3 VR controllers and phone motion sensors. +Teleoperation modules for DimOS. Supports browser-based WebXR devices, including +Meta Quest and PICO headsets, plus phone motion sensors. ## Architecture ``` -Quest/Phone Browser +WebXR/Phone Browser │ │ LCM-encoded binary via WebSocket ▼ @@ -13,7 +14,7 @@ Embedded FastAPI Server (HTTPS) │ │ Fingerprint-based message dispatch ▼ -TeleopModule (Quest or Phone) +TeleopModule (WebXR or Phone) │ Frame transforms + pose/twist computation ▼ PoseStamped / TwistStamped / Buttons outputs @@ -26,8 +27,8 @@ Each teleop module embeds a `RobotWebInterface` (FastAPI + uvicorn) that: ## Modules -### QuestTeleopModule -Base Quest teleop module. Gets controller data via WebSocket, computes output poses, and publishes them. Default engage: hold primary button (X/A). Subclass to customize. +### WebXRTeleopModule +Base WebXR teleop module. Gets controller data via WebSocket, computes output poses, and publishes them. Default engage: hold primary button (X/A). Subclass to customize. ### ArmTeleopModule Toggle-based engage — press primary button once to engage, press again to disengage. @@ -43,7 +44,7 @@ Filters to mobile-base axes (linear.x, linear.y, angular.z) and publishes as `Tw ## Subclassing -`QuestTeleopModule` is designed for extension. Override these methods: +`WebXRTeleopModule` is designed for extension. Override these methods: | Method | Purpose | |--------|---------| @@ -63,10 +64,11 @@ Filters to mobile-base axes (linear.x, linear.y, angular.z) and publishes as `Tw ``` teleop/ -├── quest/ -│ ├── quest_teleop_module.py # Base Quest teleop module (local WebSocket) -│ ├── quest_extensions.py # ArmTeleop, TwistTeleop -│ ├── quest_types.py # QuestControllerState, Buttons +├── webxr/ +│ ├── module.py # Base WebXR teleop module (local WebSocket) +│ ├── extensions.py # ArmTeleop, TwistTeleop +│ ├── controller_types.py # WebXRControllerState, Buttons +│ ├── tracking_types.py # Viewer, inputs, and body tracking │ └── web/ │ └── static/index.html # WebXR client ├── hosted/ # Hosted teleop (transport-swap, per-concern modules) @@ -97,10 +99,10 @@ teleop/ ## Quick Start ```bash -dimos run teleop-quest-rerun # Quest teleop + Rerun viz +dimos run teleop-webxr-rerun # WebXR teleop + Rerun viz dimos run teleop-phone-go2 # Phone → Go2 ``` Open `https://:/teleop` on device. Accept the self-signed certificate. -- Quest: port 8443 +- WebXR headset: port 8443 - Phone: port 8444 diff --git a/dimos/teleop/hosted/arm_command.py b/dimos/teleop/hosted/arm_command.py index ab9bbbbeae..b3ca86be9a 100644 --- a/dimos/teleop/hosted/arm_command.py +++ b/dimos/teleop/hosted/arm_command.py @@ -34,16 +34,16 @@ from dimos.msgs.geometry_msgs.TwistStamped import TwistStamped from dimos.msgs.std_msgs.Float32 import Float32 from dimos.teleop.hosted.command_executor import SerializedCommandExecutor -from dimos.teleop.quest.quest_extensions import ArmTeleopModule -from dimos.teleop.quest.quest_teleop_module import QuestTeleopConfig -from dimos.teleop.quest.quest_types import Hand from dimos.teleop.utils.teleop_transforms import webxr_to_robot +from dimos.teleop.webxr.controller_types import Hand +from dimos.teleop.webxr.extensions import ArmTeleopModule +from dimos.teleop.webxr.module import WebXRTeleopConfig from dimos.utils.logging_config import setup_logger logger = setup_logger() -class ArmCommandConfig(QuestTeleopConfig): +class ArmCommandConfig(WebXRTeleopConfig): cmd_stale_after_sec: float = 0.5 enable_ui_scaling: bool = False diff --git a/dimos/teleop/hosted/test_arm_command.py b/dimos/teleop/hosted/test_arm_command.py index be751aab6a..56de06bdde 100644 --- a/dimos/teleop/hosted/test_arm_command.py +++ b/dimos/teleop/hosted/test_arm_command.py @@ -36,14 +36,14 @@ from dimos.msgs.geometry_msgs.PoseStamped import PoseStamped from dimos.msgs.geometry_msgs.TwistStamped import TwistStamped from dimos.teleop.hosted.arm_command import ArmCommandModule -from dimos.teleop.quest.quest_types import Hand, QuestControllerState +from dimos.teleop.webxr.controller_types import Hand, WebXRControllerState from dimos.utils.testing.waiting import wait_until @pytest.fixture def module(monkeypatch: pytest.MonkeyPatch) -> Iterator[ArmCommandModule]: """A real ArmCommandModule with only the framework ``Module.__init__`` - skipped — the quest-layer and command-plane inits (engage state, decoder + skipped — the WebXR base-class and command-plane inits (engage state, decoder table, estop/twist gates) run for real. Ports / coordinator ref / config are mocked; config is seeded by the patched init.""" @@ -102,7 +102,7 @@ def _sent_acks(module: ArmCommandModule) -> list[dict[str, Any]]: def _engage_right(module: ArmCommandModule) -> None: module._on_cmd_raw(_pose_bytes("right")) - module._controllers[Hand.RIGHT] = QuestControllerState(is_left=False, primary=True) + module._controllers[Hand.RIGHT] = WebXRControllerState(is_left=False, primary=True) _tick(module) @@ -249,7 +249,7 @@ def test_engage_publishes_on_hand_port(module: ArmCommandModule) -> None: def test_release_disengages(module: ArmCommandModule) -> None: _engage_right(module) - module._controllers[Hand.RIGHT] = QuestControllerState(is_left=False, primary=False) + module._controllers[Hand.RIGHT] = WebXRControllerState(is_left=False, primary=False) _tick(module) assert not module._is_engaged[Hand.RIGHT] diff --git a/dimos/teleop/utils/recorder.py b/dimos/teleop/utils/recorder.py index b1e810c2fd..30b6544bf8 100644 --- a/dimos/teleop/utils/recorder.py +++ b/dimos/teleop/utils/recorder.py @@ -12,12 +12,12 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Generic teleop stream recorder (quest, phone, hosted). +"""Generic teleop stream recorder (WebXR, phone, hosted). Declares the *superset* of teleop output ports; autoconnect wires whichever the composed blueprint produces, the rest stay empty in the DB. Compose at the CLI:: - dimos run teleop-quest-xarm7 teleop-recorder + dimos run teleop-webxr-xarm7 teleop-recorder dimos run teleop-hosted-go2-transport teleop-recorder """ @@ -31,9 +31,9 @@ from dimos.memory.store.sqlite import SqliteStore from dimos.msgs.geometry_msgs.PoseStamped import PoseStamped from dimos.msgs.geometry_msgs.TwistStamped import TwistStamped -from dimos.teleop.quest.quest_types import Buttons from dimos.teleop.utils.report import generate_report from dimos.teleop.utils.video_stats import VideoStats +from dimos.teleop.webxr.controller_types import Buttons from dimos.utils.logging_config import setup_logger logger = setup_logger() diff --git a/dimos/teleop/utils/report.py b/dimos/teleop/utils/report.py index a46f6f22a1..f8b1cdf6bb 100644 --- a/dimos/teleop/utils/report.py +++ b/dimos/teleop/utils/report.py @@ -35,9 +35,9 @@ from dimos.memory.store.sqlite import SqliteStore from dimos.msgs.geometry_msgs.PoseStamped import PoseStamped from dimos.msgs.geometry_msgs.TwistStamped import TwistStamped -from dimos.teleop.quest.quest_types import Buttons from dimos.teleop.utils.stream_stats import pcts from dimos.teleop.utils.video_stats import VideoStats +from dimos.teleop.webxr.controller_types import Buttons from dimos.utils.logging_config import setup_logger logger = setup_logger() diff --git a/dimos/teleop/quest/README.md b/dimos/teleop/webxr/README.md similarity index 83% rename from dimos/teleop/quest/README.md rename to dimos/teleop/webxr/README.md index 9f7a902b07..d0ca9867c6 100644 --- a/dimos/teleop/quest/README.md +++ b/dimos/teleop/webxr/README.md @@ -19,19 +19,19 @@ Quest Browser ──WebSocket──→ Embedded HTTPS Server ──→ ArmTe ## Running ```bash -dimos run teleop-quest-rerun # Quest teleop + Rerun viz -dimos run teleop-quest-xarm7 # XArm7 -dimos run teleop-quest-hand-xarm7 # XArm7 hand tracking; pinch to toggle -dimos run teleop-quest-piper # Piper -dimos run teleop-quest-a1z # A1Z with mock hardware -dimos run teleop-quest-dual # Mixed XArm6 + Piper, one task per arm -dimos run teleop-quest-openarm # OpenArm, bimanual IK + planner/Viser + mock hardware +dimos run teleop-webxr-rerun # WebXR teleop + Rerun viz +dimos run teleop-webxr-xarm7 # XArm7 +dimos run teleop-webxr-hand-xarm7 # XArm7 hand tracking; pinch to toggle +dimos run teleop-webxr-piper # Piper +dimos run teleop-webxr-a1z # A1Z with mock hardware +dimos run teleop-webxr-dual # Mixed XArm6 + Piper, one task per arm +dimos run teleop-webxr-openarm # OpenArm, bimanual IK + planner/Viser + mock hardware ``` Select a CAN interface explicitly to control real A1Z hardware: ```bash -dimos --can-port a1zcan run teleop-quest-a1z +dimos --can-port a1zcan run teleop-webxr-a1z ``` Open `https://:8443/teleop` on Quest browser. Accept cert, tap Connect. @@ -42,7 +42,7 @@ again to disengage. Pinch the thumb and middle finger to close the gripper; release it to open the gripper. Hand tracking must be enabled for the Quest browser. -`teleop-quest-openarm` is safe by default: it always uses the in-memory +`teleop-webxr-openarm` is safe by default: it always uses the in-memory `mock_whole_body` adapter, regardless of the global simulation setting. It does not select physical OpenArm hardware implicitly. The mock and bimanual model start at the canonical all-zero pose. Since that pose places both joint-4 @@ -54,7 +54,7 @@ Specify both CAN interfaces to select real OpenArm hardware. Supplying only one is rejected: ```bash -dimos run teleop-quest-openarm --left-can-port can1 --right-can-port can0 +dimos run teleop-webxr-openarm --left-can-port can1 --right-can-port can0 ``` The blueprint also includes `ManipulationModule` with the same bimanual model @@ -100,9 +100,9 @@ entire session; both hands must engage again before commands resume. ``` quest/ -├── quest_teleop_module.py # Base module -├── quest_extensions.py # ArmTeleop, TwistTeleop -├── quest_types.py # QuestControllerState, Buttons +├── module.py # Base module +├── extensions.py # ArmTeleop, TwistTeleop +├── controller_types.py # WebXRControllerState, Buttons ├── blueprints.py └── web/static/index.html # WebXR client ``` diff --git a/dimos/teleop/quest/blueprints.py b/dimos/teleop/webxr/blueprints.py similarity index 93% rename from dimos/teleop/quest/blueprints.py rename to dimos/teleop/webxr/blueprints.py index a1e11071bf..24a598e8fb 100644 --- a/dimos/teleop/quest/blueprints.py +++ b/dimos/teleop/webxr/blueprints.py @@ -33,7 +33,7 @@ coordinator_teleop_xarm7, ) from dimos.robot.unitree.go2.connection import GO2Connection -from dimos.teleop.quest.quest_extensions import ( +from dimos.teleop.webxr.extensions import ( ArmTeleopModule, Go2TeleopModule, HandTeleopModule, @@ -42,7 +42,7 @@ from dimos.visualization.vis_module import vis_module # Arm teleop with press-and-hold engage (has rerun viz) -teleop_quest_rerun = autoconnect( +teleop_webxr_rerun = autoconnect( ArmTeleopModule.blueprint(), vis_module("rerun"), ).transports( @@ -54,7 +54,7 @@ # XArm7 teleop (sim with --simulation, real otherwise): right controller -> xarm7 -teleop_quest_xarm7 = autoconnect( +teleop_webxr_xarm7 = autoconnect( ArmTeleopModule.blueprint(), coordinator_teleop_xarm7, ).remappings( @@ -66,7 +66,7 @@ # XArm7 hand teleop: thumb-and-index pinch toggles tracking for each hand. -teleop_quest_hand_xarm7 = autoconnect( +teleop_webxr_hand_xarm7 = autoconnect( HandTeleopModule.blueprint(), coordinator_teleop_xarm7, ).remappings( @@ -78,7 +78,7 @@ # XArm7 teleop + camera streaming into the Quest scene as a panel. -teleop_quest_xarm7_video = ( +teleop_webxr_xarm7_video = ( autoconnect( VideoArmTeleopModule.blueprint(), coordinator_teleop_xarm7, @@ -98,7 +98,7 @@ # Piper teleop (sim with --simulation, real otherwise): left controller -> piper arm -teleop_quest_piper = autoconnect( +teleop_webxr_piper = autoconnect( ArmTeleopModule.blueprint(), coordinator_teleop_piper, ).remappings( @@ -110,7 +110,7 @@ # A1Z mock teleop: left controller -> A1Z arm -teleop_quest_a1z = autoconnect( +teleop_webxr_a1z = autoconnect( ArmTeleopModule.blueprint(), coordinator_teleop_a1z, ).remappings( @@ -122,7 +122,7 @@ # XArm6 teleop (sim with --simulation, real otherwise): right controller -> xarm6 -teleop_quest_xarm6 = autoconnect( +teleop_webxr_xarm6 = autoconnect( ArmTeleopModule.blueprint(), coordinator_teleop_xarm6, ).remappings( @@ -134,7 +134,7 @@ # Dual arm teleop: right -> piper, left -> xarm6 (two independent Quest IK tasks) -teleop_quest_dual = autoconnect( +teleop_webxr_dual = autoconnect( ArmTeleopModule.blueprint(), coordinator_teleop_dual, ).remappings( @@ -148,7 +148,7 @@ # Go2 quadruped: thumbstick velocity teleop + camera streamed to the headset. -teleop_quest_go2 = ( +teleop_webxr_go2 = ( autoconnect( Go2TeleopModule.blueprint(), GO2Connection.blueprint(), diff --git a/dimos/teleop/quest/quest_types.py b/dimos/teleop/webxr/controller_types.py similarity index 93% rename from dimos/teleop/quest/quest_types.py rename to dimos/teleop/webxr/controller_types.py index 66f8fb481c..543368b103 100644 --- a/dimos/teleop/quest/quest_types.py +++ b/dimos/teleop/webxr/controller_types.py @@ -13,7 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Quest controller types with nice API for parsing Joy messages.""" +"""WebXR controller types with nice API for parsing Joy messages.""" from dataclasses import dataclass, field from enum import IntEnum @@ -37,8 +37,8 @@ class ThumbstickState: @dataclass -class QuestControllerState: - """Parsed Quest controller state from Joy message with no data loss. +class WebXRControllerState: + """Parsed WebXR controller state from Joy message with no data loss. Preserves full-fidelity analog values (trigger, grip as floats, thumbstick axes) from the raw Joy message in a readable format. Use this when you need analog @@ -69,12 +69,12 @@ class QuestControllerState: thumbstick: ThumbstickState = field(default_factory=ThumbstickState) @classmethod - def from_joy(cls, joy: Joy, is_left: bool = True) -> "QuestControllerState": - """Create QuestControllerState from Joy message. + def from_joy(cls, joy: Joy, is_left: bool = True) -> "WebXRControllerState": + """Create WebXRControllerState from Joy message. Expected axes: [thumbstick_x, thumbstick_y, trigger_analog, grip_analog] Expected buttons: [trigger, grip, touchpad, thumbstick, X/A, Y/B, menu] Raises: - ValueError: If Joy message doesn't have expected Quest controller format. + ValueError: If Joy message doesn't have expected WebXR controller format. """ buttons = joy.buttons or [] axes = joy.axes or [] @@ -187,10 +187,10 @@ def set_attribute(self, name: str, value: bool) -> None: @classmethod def from_controllers( cls, - left: "QuestControllerState | None", - right: "QuestControllerState | None", + left: "WebXRControllerState | None", + right: "WebXRControllerState | None", ) -> "Buttons": - """Create Buttons from two QuestControllerState instances.""" + """Create Buttons from two WebXRControllerState instances.""" # Safe: cls() calls UInt32.__init__ which sets self.data = 0 before bit ops. buttons = cls() @@ -215,7 +215,7 @@ def from_controllers( return buttons -# Quest controller face-button labels → Buttons attribute names. Callers can +# WebXR controller face-button labels → Buttons attribute names. Callers can # also pass a raw attribute name (e.g. "right_grip") directly where an alias is # accepted. BUTTON_ALIASES: dict[str, str] = { diff --git a/dimos/teleop/quest/quest_extensions.py b/dimos/teleop/webxr/extensions.py similarity index 90% rename from dimos/teleop/quest/quest_extensions.py rename to dimos/teleop/webxr/extensions.py index 75a9dd29a4..5b0c2d3e0e 100644 --- a/dimos/teleop/quest/quest_extensions.py +++ b/dimos/teleop/webxr/extensions.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Quest teleop module extensions and subclasses. +"""WebXR teleop module extensions and subclasses. Available subclasses: - ArmTeleopModule: Per-hand press-and-hold engage (X/A hold to track) @@ -35,8 +35,8 @@ from dimos.msgs.geometry_msgs.Vector3 import Vector3 from dimos.msgs.sensor_msgs.Image import Image from dimos.msgs.std_msgs.Float32 import Float32 -from dimos.teleop.quest.quest_teleop_module import QuestTeleopConfig, QuestTeleopModule -from dimos.teleop.quest.quest_types import Buttons, Hand, QuestControllerState +from dimos.teleop.webxr.module import WebXRTeleopConfig, WebXRTeleopModule +from dimos.teleop.webxr.controller_types import Buttons, Hand, WebXRControllerState from dimos.utils.logging_config import setup_logger logger = setup_logger() @@ -51,11 +51,11 @@ async def _ws_send_jpeg(ws: WebSocket, data: bytes) -> None: pass -def _push_jpeg(module: QuestTeleopModule, msg: Image, quality: int) -> None: +def _push_jpeg(module: WebXRTeleopModule, msg: Image, quality: int) -> None: """JPEG-encode an Image and push it to all of module's connected /ws clients. Runs on the RX thread; sends are scheduled on the asyncio loop captured by - QuestTeleopModule when the first client connected. + WebXRTeleopModule when the first client connected. """ # Snapshot clients under the lock to avoid concurrent set mutation from # the uvicorn thread. Skip the encode entirely if nobody is listening. @@ -77,16 +77,16 @@ def _push_jpeg(module: QuestTeleopModule, msg: Image, quality: int) -> None: asyncio.run_coroutine_threadsafe(_ws_send_jpeg(ws, jpeg), loop) -class TwistTeleopConfig(QuestTeleopConfig): +class TwistTeleopConfig(WebXRTeleopConfig): """Configuration for TwistTeleopModule.""" linear_scale: float = 1.0 angular_scale: float = 1.0 -# Example implementation to show how to extend QuestTeleopModule for different teleop behaviors and outputs. -class TwistTeleopModule(QuestTeleopModule): - """Quest teleop that outputs TwistStamped instead of PoseStamped. +# Example implementation to show how to extend WebXRTeleopModule for different teleop behaviors and outputs. +class TwistTeleopModule(WebXRTeleopModule): + """WebXR teleop that outputs TwistStamped instead of PoseStamped. Config: - linear_scale: Scale factor for linear (position) values. Default 1.0. @@ -125,8 +125,8 @@ def _publish_msg(self, hand: Hand, output_msg: PoseStamped) -> None: self.right_twist.publish(twist) -class ArmTeleopModule(QuestTeleopModule): - """Quest teleop with per-hand press-and-hold engage. +class ArmTeleopModule(WebXRTeleopModule): + """WebXR teleop with per-hand press-and-hold engage. Each controller's primary button (X for left, A for right) engages that hand while held, disengages on release. Each hand's @@ -162,8 +162,8 @@ def _get_output_pose(self, hand: Hand) -> PoseStamped | None: def _publish_button_state( self, - left: QuestControllerState | None, - right: QuestControllerState | None, + left: WebXRControllerState | None, + right: WebXRControllerState | None, ) -> None: """Publish Buttons with analog triggers packed into bits 16-29.""" buttons = Buttons.from_controllers(left, right) @@ -176,8 +176,8 @@ def _publish_button_state( def _publish_gripper_commands( self, - left: QuestControllerState | None, - right: QuestControllerState | None, + left: WebXRControllerState | None, + right: WebXRControllerState | None, ) -> None: """Publish normalized opening for each currently engaged hand.""" controllers = {Hand.LEFT: left, Hand.RIGHT: right} @@ -217,8 +217,8 @@ def _handle_engage(self) -> None: def _publish_button_state( self, - left: QuestControllerState | None, - right: QuestControllerState | None, + left: WebXRControllerState | None, + right: WebXRControllerState | None, ) -> None: """Keep downstream press-and-hold teleop tasks engaged between pinches.""" buttons = Buttons.from_controllers(left, right) @@ -232,7 +232,7 @@ def _publish_button_state( self._publish_gripper_commands(left, right) -class VideoArmTeleopConfig(QuestTeleopConfig): +class VideoArmTeleopConfig(WebXRTeleopConfig): """Configuration for VideoArmTeleopModule.""" video_jpeg_quality: int = 70 @@ -262,7 +262,7 @@ async def handle_color_image(self, msg: Image) -> None: _push_jpeg(self, msg, self.config.video_jpeg_quality) -class Go2TeleopConfig(QuestTeleopConfig): +class Go2TeleopConfig(WebXRTeleopConfig): """Configuration for Go2TeleopModule.""" linear_speed: float = 0.5 # m/s at full stick deflection @@ -271,8 +271,8 @@ class Go2TeleopConfig(QuestTeleopConfig): video_jpeg_quality: int = 70 -class Go2TeleopModule(QuestTeleopModule): - """Quest teleop for the Unitree Go2: thumbstick driving + camera in the headset. +class Go2TeleopModule(WebXRTeleopModule): + """WebXR teleop for the Unitree Go2: thumbstick driving + camera in the headset. Velocity is derived from the controller thumbsticks as each Joy message arrives (left stick → forward/strafe, right stick → yaw) and published on diff --git a/dimos/teleop/quest/quest_teleop_module.py b/dimos/teleop/webxr/module.py similarity index 92% rename from dimos/teleop/quest/quest_teleop_module.py rename to dimos/teleop/webxr/module.py index 031a1aba0a..6ed0e50cf4 100644 --- a/dimos/teleop/quest/quest_teleop_module.py +++ b/dimos/teleop/webxr/module.py @@ -14,9 +14,9 @@ # limitations under the License. """ -Quest Teleoperation Module. +WebXR Teleoperation Module. -Receives VR controller tracking data from the Quest web app via an embedded +Receives VR controller tracking data from the WebXR client via an embedded FastAPI WebSocket server. Transforms from WebXR to robot frame, computes deltas, and publishes PoseStamped commands. """ @@ -46,8 +46,8 @@ from dimos.msgs.geometry_msgs.PoseStamped import PoseStamped from dimos.msgs.sensor_msgs.Joy import Joy -# Hand is re-exported for back-compat; it lives in quest_types. -from dimos.teleop.quest.quest_types import Buttons, Hand, QuestControllerState +# Hand is re-exported for back-compat; it lives in controller_types. +from dimos.teleop.webxr.controller_types import Buttons, Hand, WebXRControllerState from dimos.teleop.utils.teleop_transforms import webxr_to_robot from dimos.utils.logging_config import setup_logger from dimos.web.robot_web_interface import RobotWebInterface @@ -67,7 +67,7 @@ async def _ws_send_text(ws: WebSocket, data: str) -> None: @dataclass -class QuestTeleopStatus: +class WebXRTeleopStatus: """Current teleoperation status.""" left_engaged: bool @@ -77,21 +77,21 @@ class QuestTeleopStatus: buttons: Buttons -class QuestTeleopConfig(ModuleConfig): - """Configuration for Quest Teleoperation Module.""" +class WebXRTeleopConfig(ModuleConfig): + """Configuration for WebXR Teleoperation Module.""" control_loop_hz: float = 50.0 server_port: int = 8443 input_timeout_s: float = Field(default=1.0, gt=0) -_Config = TypeVar("_Config", bound=QuestTeleopConfig) +_Config = TypeVar("_Config", bound=WebXRTeleopConfig) -class QuestTeleopModule(Module): - """Quest Teleoperation Module for Meta Quest controllers. +class WebXRTeleopModule(Module): + """WebXR Teleoperation Module for Meta WebXR controllers. - Receives controller data from the Quest web app via an embedded WebSocket + Receives controller data from the WebXR client via an embedded WebSocket server, computes output poses, and publishes them. Subclass to customize pose computation, output format, and engage behavior. @@ -101,7 +101,7 @@ class QuestTeleopModule(Module): - teleop_buttons: Buttons (button states for both controllers) """ - config: QuestTeleopConfig + config: WebXRTeleopConfig # Outputs: delta poses for each controller left_controller_output: Out[PoseStamped] @@ -116,7 +116,7 @@ def __init__(self, **kwargs: Any) -> None: self._is_engaged: dict[Hand, bool] = {Hand.LEFT: False, Hand.RIGHT: False} self._initial_poses: dict[Hand, PoseStamped | None] = {Hand.LEFT: None, Hand.RIGHT: None} self._current_poses: dict[Hand, PoseStamped | None] = {Hand.LEFT: None, Hand.RIGHT: None} - self._controllers: dict[Hand, QuestControllerState | None] = { + self._controllers: dict[Hand, WebXRControllerState | None] = { Hand.LEFT: None, Hand.RIGHT: None, } @@ -169,10 +169,10 @@ async def websocket_endpoint(ws: WebSocket) -> None: await ws.accept() self._ws_loop = asyncio.get_running_loop() if not self._client_connected(ws): - logger.warning("Rejecting additional Quest control client") - await ws.close(code=1008, reason="A Quest control client is already connected") + logger.warning("Rejecting additional WebXR control client") + await ws.close(code=1008, reason="A WebXR control client is already connected") return - logger.info("Quest client connected") + logger.info("WebXR client connected") try: while True: data = await ws.receive_bytes() @@ -183,7 +183,7 @@ async def websocket_endpoint(ws: WebSocket) -> None: else: logger.warning(f"Unknown message fingerprint: {fingerprint.hex()}") except WebSocketDisconnect: - logger.info("Quest client disconnected") + logger.info("WebXR client disconnected") except Exception: logger.exception("WebSocket error") finally: @@ -209,7 +209,7 @@ def _client_disconnected(self, ws: WebSocket) -> None: self._reset_controller_state() def _broadcast_text(self, data: str) -> None: - """Schedule a text message for the active Quest client.""" + """Schedule a text message for the active WebXR client.""" loop = self._ws_loop if loop is None: return @@ -245,7 +245,7 @@ def start(self) -> None: self._setup_routes() self._start_server() self._start_control_loop() - logger.info("Quest Teleoperation Module started") + logger.info("WebXR Teleoperation Module started") @rpc def stop(self) -> None: @@ -318,11 +318,11 @@ def _disengage(self, hand: Hand | None = None) -> None: self._is_engaged[h] = False logger.info(f"{h.name} disengaged.") - def get_status(self) -> QuestTeleopStatus: + def get_status(self) -> WebXRTeleopStatus: with self._lock: left = self._controllers.get(Hand.LEFT) right = self._controllers.get(Hand.RIGHT) - return QuestTeleopStatus( + return WebXRTeleopStatus( left_engaged=self._is_engaged[Hand.LEFT], right_engaged=self._is_engaged[Hand.RIGHT], left_pose=self._current_poses.get(Hand.LEFT), @@ -348,11 +348,11 @@ def _on_pose_bytes(self, data: bytes) -> None: self._last_pose_update[hand] = time.monotonic() def _on_joy_bytes(self, data: bytes) -> bool: - """Decode LCM bytes into Joy, parse into QuestControllerState.""" + """Decode LCM bytes into Joy, parse into WebXRControllerState.""" msg = Joy.lcm_decode(data) hand = self._resolve_hand(msg.frame_id) try: - controller = QuestControllerState.from_joy(msg, is_left=(hand == Hand.LEFT)) + controller = WebXRControllerState.from_joy(msg, is_left=(hand == Hand.LEFT)) except ValueError: logger.warning( f"Malformed Joy for {hand.name}: axes={len(msg.axes or [])}, buttons={len(msg.buttons or [])}" @@ -381,10 +381,10 @@ def _start_server(self) -> None: target=self._web_server.run, kwargs={"ssl": True, "ssl_certs_dir": DIMOS_PROJECT_ROOT / "assets" / "teleop_certs"}, daemon=True, - name="QuestTeleopWebServer", + name="WebXRTeleopWebServer", ) self._web_server_thread.start() - logger.info(f"Quest teleop web server started on https://0.0.0.0:{self.config.server_port}") + logger.info(f"WebXR teleop web server started on https://0.0.0.0:{self.config.server_port}") def _stop_server(self) -> None: """Shutdown the embedded web server.""" @@ -394,7 +394,7 @@ def _stop_server(self) -> None: if self._web_server_thread is not None: self._web_server_thread.join(timeout=3) self._web_server_thread = None - logger.info("Quest teleop web server stopped") + logger.info("WebXR teleop web server stopped") def _start_control_loop(self) -> None: """Start the control loop thread.""" @@ -405,7 +405,7 @@ def _start_control_loop(self) -> None: self._control_loop_thread = threading.Thread( target=self._control_loop, daemon=True, - name="QuestTeleopControlLoop", + name="WebXRTeleopControlLoop", ) self._control_loop_thread.start() logger.info(f"Control loop started at {self.config.control_loop_hz} Hz") @@ -517,8 +517,8 @@ def _publish_msg(self, hand: Hand, output_msg: PoseStamped) -> None: def _publish_button_state( self, - left: QuestControllerState | None, - right: QuestControllerState | None, + left: WebXRControllerState | None, + right: WebXRControllerState | None, ) -> None: """Publish button states for both controllers. diff --git a/dimos/teleop/quest/test_blueprints.py b/dimos/teleop/webxr/test_blueprints.py similarity index 81% rename from dimos/teleop/quest/test_blueprints.py rename to dimos/teleop/webxr/test_blueprints.py index d87598e075..e7aa8bd460 100644 --- a/dimos/teleop/quest/test_blueprints.py +++ b/dimos/teleop/webxr/test_blueprints.py @@ -19,12 +19,12 @@ from dimos.control.coordinator import ControlCoordinator, TaskConfig from dimos.core.coordination.blueprints import Blueprint from dimos.robot.manipulators.common.blueprints import TeleopBinding -from dimos.teleop.quest.blueprints import ( - teleop_quest_dual, - teleop_quest_hand_xarm7, - teleop_quest_xarm7, +from dimos.teleop.webxr.blueprints import ( + teleop_webxr_dual, + teleop_webxr_hand_xarm7, + teleop_webxr_xarm7, ) -from dimos.teleop.quest.quest_extensions import ArmTeleopModule, HandTeleopModule +from dimos.teleop.webxr.extensions import ArmTeleopModule, HandTeleopModule def _coordinator_tasks(blueprint: Blueprint) -> list[TaskConfig]: @@ -34,7 +34,7 @@ def _coordinator_tasks(blueprint: Blueprint) -> list[TaskConfig]: return cast("list[TaskConfig]", atom.kwargs["tasks"]) -def _quest_tasks(blueprint: Blueprint) -> list[TaskConfig]: +def _webxr_tasks(blueprint: Blueprint) -> list[TaskConfig]: return [task for task in _coordinator_tasks(blueprint) if task.type == "teleop_ik"] @@ -49,34 +49,34 @@ def _binding(task: TaskConfig) -> TeleopBinding: def test_single_arm_blueprint_uses_one_frame_binding_and_right_stream() -> None: - tasks = _quest_tasks(teleop_quest_xarm7) + tasks = _webxr_tasks(teleop_webxr_xarm7) assert len(tasks) == 1 binding = _binding(tasks[0]) assert binding["hand"] == "right" assert binding["target_frame"] == "link_tcp" assert tasks[0].params["robot_model"].name == "arm" - gripper = _gripper_tasks(teleop_quest_xarm7)[0] + gripper = _gripper_tasks(teleop_webxr_xarm7)[0] assert gripper.stream_bind == {"gripper_command": "right_gripper_command"} assert ( - teleop_quest_xarm7.remapping_map[(ArmTeleopModule.name, "right_controller_output")] + teleop_webxr_xarm7.remapping_map[(ArmTeleopModule.name, "right_controller_output")] == "right_cartesian_command" ) assert ( - teleop_quest_xarm7.remapping_map[(ArmTeleopModule.name, "right_gripper_command")] + teleop_webxr_xarm7.remapping_map[(ArmTeleopModule.name, "right_gripper_command")] == "right_gripper_command" ) def test_single_arm_hand_blueprint_uses_right_card_stream() -> None: assert ( - teleop_quest_hand_xarm7.remapping_map[(HandTeleopModule.name, "right_controller_output")] + teleop_webxr_hand_xarm7.remapping_map[(HandTeleopModule.name, "right_controller_output")] == "right_cartesian_command" ) def test_mixed_arm_blueprint_keeps_two_independent_one_binding_tasks() -> None: - tasks = _quest_tasks(teleop_quest_dual) + tasks = _webxr_tasks(teleop_webxr_dual) assert len(tasks) == 2 by_name = {task.name: task for task in tasks} @@ -90,14 +90,14 @@ def test_mixed_arm_blueprint_keeps_two_independent_one_binding_tasks() -> None: "target_frame": "gripper_base", } assert by_name["teleop_piper"].params["robot_model"].name == "piper_arm" - grippers = {task.name: task for task in _gripper_tasks(teleop_quest_dual)} + grippers = {task.name: task for task in _gripper_tasks(teleop_webxr_dual)} assert grippers["xarm_arm_gripper"].stream_bind == {"gripper_command": "left_gripper_command"} assert grippers["piper_arm_gripper"].stream_bind == {"gripper_command": "right_gripper_command"} assert ( - teleop_quest_dual.remapping_map[(ArmTeleopModule.name, "left_controller_output")] + teleop_webxr_dual.remapping_map[(ArmTeleopModule.name, "left_controller_output")] == "left_cartesian_command" ) assert ( - teleop_quest_dual.remapping_map[(ArmTeleopModule.name, "right_controller_output")] + teleop_webxr_dual.remapping_map[(ArmTeleopModule.name, "right_controller_output")] == "right_cartesian_command" ) diff --git a/dimos/teleop/quest/test_quest_teleop_module.py b/dimos/teleop/webxr/test_module.py similarity index 83% rename from dimos/teleop/quest/test_quest_teleop_module.py rename to dimos/teleop/webxr/test_module.py index 2e736e3ff3..098ea431cc 100644 --- a/dimos/teleop/quest/test_quest_teleop_module.py +++ b/dimos/teleop/webxr/test_module.py @@ -23,29 +23,29 @@ from dimos.imitation.collection.episode_monitor import EpisodeStatus from dimos.msgs.geometry_msgs.PoseStamped import PoseStamped -from dimos.teleop.quest.quest_extensions import ArmTeleopModule, Go2TeleopModule, HandTeleopModule -from dimos.teleop.quest.quest_teleop_module import QuestTeleopModule, _ws_send_text -from dimos.teleop.quest.quest_types import ( +from dimos.teleop.webxr.extensions import ArmTeleopModule, Go2TeleopModule, HandTeleopModule +from dimos.teleop.webxr.module import WebXRTeleopModule, _ws_send_text +from dimos.teleop.webxr.controller_types import ( Buttons, Hand, - QuestControllerState, + WebXRControllerState, ThumbstickState, ) @pytest.fixture -def module() -> Iterator[QuestTeleopModule]: - module = QuestTeleopModule(server_port=9443) +def module() -> Iterator[WebXRTeleopModule]: + module = WebXRTeleopModule(server_port=9443) try: yield module finally: module.stop() -def test_quest_web_server_is_initialized_during_start( - module: QuestTeleopModule, mocker: pytest_mock.MockerFixture +def test_webxr_web_server_is_initialized_during_start( + module: WebXRTeleopModule, mocker: pytest_mock.MockerFixture ) -> None: - web_interface = mocker.patch("dimos.teleop.quest.quest_teleop_module.RobotWebInterface") + web_interface = mocker.patch("dimos.teleop.webxr.module.RobotWebInterface") setup_routes = mocker.patch.object(module, "_setup_routes") start_server = mocker.patch.object(module, "_start_server") start_control_loop = mocker.patch.object(module, "_start_control_loop") @@ -59,7 +59,7 @@ def test_quest_web_server_is_initialized_during_start( def test_build_subscribes_to_episode_status( - module: QuestTeleopModule, mocker: pytest_mock.MockerFixture + module: WebXRTeleopModule, mocker: pytest_mock.MockerFixture ) -> None: module.status._transport = mocker.MagicMock() subscribe = mocker.patch.object(module.status, "subscribe", return_value=mocker.MagicMock()) @@ -70,10 +70,10 @@ def test_build_subscribes_to_episode_status( def test_unknown_joy_controller_identity_is_rejected( - module: QuestTeleopModule, mocker: pytest_mock.MockerFixture + module: WebXRTeleopModule, mocker: pytest_mock.MockerFixture ) -> None: mocker.patch( - "dimos.teleop.quest.quest_teleop_module.Joy.lcm_decode", + "dimos.teleop.webxr.module.Joy.lcm_decode", return_value=SimpleNamespace(frame_id="unknown"), ) @@ -82,7 +82,7 @@ def test_unknown_joy_controller_identity_is_rejected( def test_websocket_text_message_is_sent( - module: QuestTeleopModule, mocker: pytest_mock.MockerFixture + module: WebXRTeleopModule, mocker: pytest_mock.MockerFixture ) -> None: ws = mocker.MagicMock() ws.send_text = mocker.AsyncMock() @@ -107,11 +107,11 @@ def _episode_status() -> EpisodeStatus: def test_episode_status_is_cached_and_broadcast( - module: QuestTeleopModule, + module: WebXRTeleopModule, mocker: pytest_mock.MockerFixture, ) -> None: broadcast = mocker.patch.object(module, "_broadcast_text") - mocker.patch("dimos.teleop.quest.quest_teleop_module.time.time", return_value=165.5) + mocker.patch("dimos.teleop.webxr.module.time.time", return_value=165.5) module._on_episode_status(_episode_status()) @@ -130,7 +130,7 @@ def test_episode_status_is_cached_and_broadcast( def test_connected_client_receives_latest_episode_status( - module: QuestTeleopModule, + module: WebXRTeleopModule, mocker: pytest_mock.MockerFixture, ) -> None: module._latest_episode_status = _episode_status() @@ -144,7 +144,7 @@ def test_connected_client_receives_latest_episode_status( def test_connected_client_without_episode_status_does_not_show_collection_hud( - module: QuestTeleopModule, + module: WebXRTeleopModule, mocker: pytest_mock.MockerFixture, ) -> None: broadcast = mocker.patch.object(module, "_broadcast_text") @@ -155,7 +155,7 @@ def test_connected_client_without_episode_status_does_not_show_collection_hud( def test_control_client_disconnect_clears_state( - module: QuestTeleopModule, mocker: pytest_mock.MockerFixture + module: WebXRTeleopModule, mocker: pytest_mock.MockerFixture ) -> None: first = mocker.MagicMock() published: list[Buttons] = [] @@ -167,7 +167,7 @@ def test_control_client_disconnect_clears_state( module._is_engaged[hand] = True module._initial_poses[hand] = pose module._current_poses[hand] = pose - module._controllers[hand] = QuestControllerState(primary=True) + module._controllers[hand] = WebXRControllerState(primary=True) module._client_disconnected(first) @@ -181,7 +181,7 @@ def test_control_client_disconnect_clears_state( def test_websocket_rejects_additional_control_client( - module: QuestTeleopModule, mocker: pytest_mock.MockerFixture + module: WebXRTeleopModule, mocker: pytest_mock.MockerFixture ) -> None: endpoint: Callable[[Any], Awaitable[None]] | None = None app = mocker.MagicMock() @@ -212,18 +212,18 @@ def decorator(fn: Callable[[Any], Awaitable[None]]) -> Callable[[Any], Awaitable ws.accept.assert_awaited_once_with() ws.close.assert_awaited_once_with( - code=1008, reason="A Quest control client is already connected" + code=1008, reason="A WebXR control client is already connected" ) ws.receive_bytes.assert_not_awaited() def test_first_client_connection_rejects_stale_cached_state( - module: QuestTeleopModule, mocker: pytest_mock.MockerFixture + module: WebXRTeleopModule, mocker: pytest_mock.MockerFixture ) -> None: with module._lock: module._is_engaged[Hand.RIGHT] = True module._current_poses[Hand.RIGHT] = mocker.MagicMock(spec=PoseStamped) - module._controllers[Hand.RIGHT] = QuestControllerState(primary=True) + module._controllers[Hand.RIGHT] = WebXRControllerState(primary=True) assert module._client_connected(mocker.MagicMock()) is True @@ -234,7 +234,7 @@ def test_first_client_connection_rejects_stale_cached_state( def test_stale_controller_input_disengages_hand( - module: QuestTeleopModule, mocker: pytest_mock.MockerFixture + module: WebXRTeleopModule, mocker: pytest_mock.MockerFixture ) -> None: pose = mocker.MagicMock(spec=PoseStamped) now = 10.0 @@ -242,7 +242,7 @@ def test_stale_controller_input_disengages_hand( module._is_engaged[Hand.RIGHT] = True module._initial_poses[Hand.RIGHT] = pose module._current_poses[Hand.RIGHT] = pose - module._controllers[Hand.RIGHT] = QuestControllerState(primary=True) + module._controllers[Hand.RIGHT] = WebXRControllerState(primary=True) module._last_pose_update[Hand.RIGHT] = now module._last_controller_update[Hand.RIGHT] = now - module.config.input_timeout_s - 0.1 module._expire_stale_state(now) @@ -254,11 +254,11 @@ def test_stale_controller_input_disengages_hand( def test_stop_publishes_safe_button_state( - module: QuestTeleopModule, mocker: pytest_mock.MockerFixture + module: WebXRTeleopModule, mocker: pytest_mock.MockerFixture ) -> None: published: list[Buttons] = [] module.teleop_buttons.subscribe(published.append) - module._controllers[Hand.RIGHT] = QuestControllerState(primary=True) + module._controllers[Hand.RIGHT] = WebXRControllerState(primary=True) module._is_engaged[Hand.RIGHT] = True mocker.patch.object(module, "_stop_control_loop") mocker.patch.object(module, "_stop_server") @@ -274,7 +274,7 @@ def test_go2_stale_input_publishes_zero_velocity(mocker: pytest_mock.MockerFixtu publish = mocker.patch.object(module.cmd_vel, "publish") try: with module._lock: - module._controllers[Hand.LEFT] = QuestControllerState(primary=True) + module._controllers[Hand.LEFT] = WebXRControllerState(primary=True) module._last_controller_update[Hand.LEFT] = 1.0 module._expire_stale_state(1.0 + module.config.input_timeout_s + 0.1) @@ -292,10 +292,10 @@ def test_go2_malformed_joy_clears_stale_state_and_publishes_zero_velocity( module = Go2TeleopModule() publish = mocker.patch.object(module.cmd_vel, "publish") mocker.patch( - "dimos.teleop.quest.quest_teleop_module.Joy.lcm_decode", + "dimos.teleop.webxr.module.Joy.lcm_decode", return_value=SimpleNamespace(frame_id="left", axes=[], buttons=[]), ) - module._controllers[Hand.LEFT] = QuestControllerState(thumbstick=ThumbstickState(y=-1.0)) + module._controllers[Hand.LEFT] = WebXRControllerState(thumbstick=ThumbstickState(y=-1.0)) try: assert module._on_joy_bytes(b"malformed") is False @@ -315,10 +315,10 @@ def test_go2_unknown_controller_identity_publishes_zero_velocity( module = Go2TeleopModule() publish = mocker.patch.object(module.cmd_vel, "publish") mocker.patch( - "dimos.teleop.quest.quest_teleop_module.Joy.lcm_decode", + "dimos.teleop.webxr.module.Joy.lcm_decode", return_value=SimpleNamespace(frame_id="unknown"), ) - module._controllers[Hand.LEFT] = QuestControllerState(thumbstick=ThumbstickState(y=-1.0)) + module._controllers[Hand.LEFT] = WebXRControllerState(thumbstick=ThumbstickState(y=-1.0)) try: with pytest.raises(ValueError, match="Unexpected frame_id"): module._on_joy_bytes(b"unknown") @@ -332,7 +332,7 @@ def test_go2_unknown_controller_identity_publishes_zero_velocity( module.stop() -def test_translation_scale_changes_pose_delta(module: QuestTeleopModule) -> None: +def test_translation_scale_changes_pose_delta(module: WebXRTeleopModule) -> None: module._initial_poses[Hand.RIGHT] = PoseStamped(position=[1.0, 2.0, 3.0]) module._current_poses[Hand.RIGHT] = PoseStamped(position=[1.2, 1.5, 4.0]) @@ -347,7 +347,7 @@ def test_translation_scale_changes_pose_delta(module: QuestTeleopModule) -> None @pytest.mark.parametrize("translation_scale", [0.0, -1.0, float("inf")]) def test_translation_scale_must_be_positive_and_finite( - module: QuestTeleopModule, translation_scale: float + module: WebXRTeleopModule, translation_scale: float ) -> None: with pytest.raises(ValueError): module._set_translation_scale(translation_scale) @@ -374,8 +374,8 @@ def test_arm_teleop_publishes_normalized_gripper_opening_for_engaged_hand( try: left_publish = mocker.patch.object(module.left_gripper_command, "publish") right_publish = mocker.patch.object(module.right_gripper_command, "publish") - left = QuestControllerState(is_left=True, trigger=0.25) - right = QuestControllerState(is_left=False, trigger=0.75) + left = WebXRControllerState(is_left=True, trigger=0.25) + right = WebXRControllerState(is_left=False, trigger=0.75) module._is_engaged[Hand.LEFT] = True module._publish_button_state(left, right) @@ -391,7 +391,7 @@ def test_hand_teleop_pinch_toggles_engagement(mocker: pytest_mock.MockerFixture) try: publish = mocker.patch.object(module.teleop_buttons, "publish") module._current_poses[Hand.RIGHT] = mocker.Mock() - module._controllers[Hand.RIGHT] = QuestControllerState( + module._controllers[Hand.RIGHT] = WebXRControllerState( is_left=False, primary=True, trigger=1.0 ) @@ -406,11 +406,11 @@ def test_hand_teleop_pinch_toggles_engagement(mocker: pytest_mock.MockerFixture) assert module._is_engaged[Hand.RIGHT] - module._controllers[Hand.RIGHT] = QuestControllerState(is_left=False, primary=False) + module._controllers[Hand.RIGHT] = WebXRControllerState(is_left=False, primary=False) module._handle_engage() module._publish_button_state(None, module._controllers[Hand.RIGHT]) assert publish.call_args.args[0].right_primary - module._controllers[Hand.RIGHT] = QuestControllerState(is_left=False, primary=True) + module._controllers[Hand.RIGHT] = WebXRControllerState(is_left=False, primary=True) module._handle_engage() assert not module._is_engaged[Hand.RIGHT] diff --git a/dimos/teleop/quest/web/static/index.html b/dimos/teleop/webxr/web/static/index.html similarity index 100% rename from dimos/teleop/quest/web/static/index.html rename to dimos/teleop/webxr/web/static/index.html diff --git a/dimos/teleop/quest/web/static/teleop.css b/dimos/teleop/webxr/web/static/teleop.css similarity index 100% rename from dimos/teleop/quest/web/static/teleop.css rename to dimos/teleop/webxr/web/static/teleop.css diff --git a/dimos/teleop/quest/web/static/teleop.js b/dimos/teleop/webxr/web/static/teleop.js similarity index 100% rename from dimos/teleop/quest/web/static/teleop.js rename to dimos/teleop/webxr/web/static/teleop.js diff --git a/docs/capabilities/manipulation/openarm_integration.md b/docs/capabilities/manipulation/openarm_integration.md index e27b60e38d..b3991cb48e 100644 --- a/docs/capabilities/manipulation/openarm_integration.md +++ b/docs/capabilities/manipulation/openarm_integration.md @@ -42,12 +42,12 @@ robots. ```bash dimos run openarm-planner-coordinator # mock hardware -dimos run teleop-quest-openarm # mock Quest teleoperation +dimos run teleop-webxr-openarm # mock WebXR teleoperation dimos hardware can setup can0 dimos hardware can setup can1 dimos run openarm-planner-coordinator --left-can-port can1 --right-can-port can0 -dimos run teleop-quest-openarm --left-can-port can1 --right-can-port can0 +dimos run teleop-webxr-openarm --left-can-port can1 --right-can-port can0 ``` Linux assigns `can0`/`can1` in USB enumeration order. If the arms come up @@ -60,14 +60,14 @@ rejected so physical operation can never depend on USB/CAN enumeration defaults. |---|---| | `coordinator-openarm` | coordinator + trajectory task over both arms | | `openarm-planner-coordinator` | planner (bimanual model) + coordinator | -| `teleop-quest-openarm` | bimanual Quest teleoperation + planner + Viser | +| `teleop-webxr-openarm` | bimanual WebXR teleoperation + planner + Viser | All OpenArm blueprints use the in-memory whole-body adapter by default. Passing both `--left-can-port` and `--right-can-port` selects the physical adapter. -## Quest controls and safety +## WebXR controls and safety -The Quest blueprint drives both arms through one bimanual IK task. Hold both +The WebXR blueprint drives both arms through one bimanual IK task. Hold both controllers' primary buttons to engage it. Releasing either button stops arm output and clears both controller references. Each trigger publishes normalized opening to a dedicated gripper task on the same side. Planned trajectories run diff --git a/docs/capabilities/manipulation/piper_integration.md b/docs/capabilities/manipulation/piper_integration.md index 5f5da54eb2..b681a7a2c9 100644 --- a/docs/capabilities/manipulation/piper_integration.md +++ b/docs/capabilities/manipulation/piper_integration.md @@ -48,10 +48,10 @@ For keyboard Cartesian teleoperation, use: dimos --can-port can0 run keyboard-teleop-piper ``` -The Quest teleoperation composition is available as: +The WebXR teleoperation composition is available as: ```bash -dimos --can-port can0 run teleop-quest-piper +dimos --can-port can0 run teleop-webxr-piper ``` Note that ommitting the `--can-port` argument will fallback the control coordinator to use fake hardware adapter. This is good for testing. From fdf8a9f9a204a622bbea50177891818559438898 Mon Sep 17 00:00:00 2001 From: cc Date: Tue, 25 Aug 2026 23:23:57 -0700 Subject: [PATCH 41/57] docs(teleop): preserve Pico WebXR tracking handoff --- dimos/imitation/collection/test_blueprint.py | 4 +- dimos/robot/all_blueprints.py | 6 +- dimos/teleop/webxr/extensions.py | 2 +- dimos/teleop/webxr/module.py | 2 +- dimos/teleop/webxr/test_module.py | 6 +- docs/research/pico-webxr-body-tracking.md | 134 +++++++++++++++++++ 6 files changed, 144 insertions(+), 10 deletions(-) create mode 100644 docs/research/pico-webxr-body-tracking.md diff --git a/dimos/imitation/collection/test_blueprint.py b/dimos/imitation/collection/test_blueprint.py index 368609e31c..43e352dd10 100644 --- a/dimos/imitation/collection/test_blueprint.py +++ b/dimos/imitation/collection/test_blueprint.py @@ -62,9 +62,9 @@ def test_episode_monitor_stops_after_input_producers(blueprint: Blueprint) -> No @pytest.mark.parametrize( "blueprint", - [learning_collect_quest_xarm7, learning_collect_quest_piper], + [learning_collect_webxr_xarm7, learning_collect_webxr_piper], ) -def test_collection_status_is_wired_to_quest_hud(blueprint: Blueprint) -> None: +def test_collection_status_is_wired_to_webxr_hud(blueprint: Blueprint) -> None: hud = next(atom for atom in blueprint.blueprints if atom.module is ArmTeleopModule) status = next(stream for stream in hud.streams if stream.name == "status") diff --git a/dimos/robot/all_blueprints.py b/dimos/robot/all_blueprints.py index 580b7df0cc..ed0c34b305 100644 --- a/dimos/robot/all_blueprints.py +++ b/dimos/robot/all_blueprints.py @@ -72,8 +72,8 @@ "keyboard-teleop-piper": "dimos.robot.manipulators.piper.blueprints.teleop:keyboard_teleop_piper", "keyboard-teleop-xarm6": "dimos.robot.manipulators.xarm.blueprints.teleop:keyboard_teleop_xarm6", "keyboard-teleop-xarm7": "dimos.robot.manipulators.xarm.blueprints.teleop:keyboard_teleop_xarm7", - "learning-collect-quest-piper": "dimos.imitation.collection.blueprint:learning_collect_webxr_piper", - "learning-collect-quest-xarm7": "dimos.imitation.collection.blueprint:learning_collect_webxr_xarm7", + "learning-collect-webxr-piper": "dimos.imitation.collection.blueprint:learning_collect_webxr_piper", + "learning-collect-webxr-xarm7": "dimos.imitation.collection.blueprint:learning_collect_webxr_xarm7", "mid360": "dimos.hardware.sensors.lidar.livox.livox_blueprints:mid360", "mid360-fastlio": "dimos.hardware.sensors.lidar.fastlio2.fastlio_blueprints:mid360_fastlio", "mid360-fastlio-ray-trace": "dimos.hardware.sensors.lidar.fastlio2.fastlio_blueprints:mid360_fastlio_ray_trace", @@ -259,7 +259,6 @@ "pick-and-place-module": "dimos.manipulation.pick_and_place_module.PickAndPlaceModule", "point-lio": "dimos.hardware.sensors.lidar.pointlio.module.PointLio", "pointlio-recorder": "dimos.hardware.sensors.lidar.pointlio.recorder.PointlioRecorder", - "quest-teleop-module": "dimos.teleop.webxr.module.WebXRTeleopModule", "ray-tracing-voxel-map": "dimos.mapping.ray_tracing.module.RayTracingVoxelMap", "real-sense-camera": "dimos.hardware.sensors.camera.realsense.camera.RealSenseCamera", "receiver-module": "dimos.utils.demo_image_encoding.ReceiverModule", @@ -292,6 +291,7 @@ "voxel-grid-mapper": "dimos.mapping.voxels.module.VoxelGridMapper", "wavefront-frontier-explorer": "dimos.navigation.frontier_exploration.wavefront_frontier_goal_selector.WavefrontFrontierExplorer", "web-input": "dimos.agents.web_human_input.WebInput", + "web-xr-teleop-module": "dimos.teleop.webxr.module.WebXRTeleopModule", "websocket-vis-module": "dimos.web.websocket_vis.websocket_vis_module.WebsocketVisModule", "world-belief-module": "dimos.experimental.world_belief.worldbelief_module.WorldBeliefModule", "world-belief-recorder": "dimos.experimental.world_belief.worldbelief_recorder.WorldBeliefRecorder", diff --git a/dimos/teleop/webxr/extensions.py b/dimos/teleop/webxr/extensions.py index 5b0c2d3e0e..0fbe4d0f5b 100644 --- a/dimos/teleop/webxr/extensions.py +++ b/dimos/teleop/webxr/extensions.py @@ -35,8 +35,8 @@ from dimos.msgs.geometry_msgs.Vector3 import Vector3 from dimos.msgs.sensor_msgs.Image import Image from dimos.msgs.std_msgs.Float32 import Float32 -from dimos.teleop.webxr.module import WebXRTeleopConfig, WebXRTeleopModule from dimos.teleop.webxr.controller_types import Buttons, Hand, WebXRControllerState +from dimos.teleop.webxr.module import WebXRTeleopConfig, WebXRTeleopModule from dimos.utils.logging_config import setup_logger logger = setup_logger() diff --git a/dimos/teleop/webxr/module.py b/dimos/teleop/webxr/module.py index 6ed0e50cf4..057291209b 100644 --- a/dimos/teleop/webxr/module.py +++ b/dimos/teleop/webxr/module.py @@ -45,10 +45,10 @@ from dimos.imitation.collection.episode_monitor import EpisodeStatus from dimos.msgs.geometry_msgs.PoseStamped import PoseStamped from dimos.msgs.sensor_msgs.Joy import Joy +from dimos.teleop.utils.teleop_transforms import webxr_to_robot # Hand is re-exported for back-compat; it lives in controller_types. from dimos.teleop.webxr.controller_types import Buttons, Hand, WebXRControllerState -from dimos.teleop.utils.teleop_transforms import webxr_to_robot from dimos.utils.logging_config import setup_logger from dimos.web.robot_web_interface import RobotWebInterface diff --git a/dimos/teleop/webxr/test_module.py b/dimos/teleop/webxr/test_module.py index 098ea431cc..18ff2de978 100644 --- a/dimos/teleop/webxr/test_module.py +++ b/dimos/teleop/webxr/test_module.py @@ -23,14 +23,14 @@ from dimos.imitation.collection.episode_monitor import EpisodeStatus from dimos.msgs.geometry_msgs.PoseStamped import PoseStamped -from dimos.teleop.webxr.extensions import ArmTeleopModule, Go2TeleopModule, HandTeleopModule -from dimos.teleop.webxr.module import WebXRTeleopModule, _ws_send_text from dimos.teleop.webxr.controller_types import ( Buttons, Hand, - WebXRControllerState, ThumbstickState, + WebXRControllerState, ) +from dimos.teleop.webxr.extensions import ArmTeleopModule, Go2TeleopModule, HandTeleopModule +from dimos.teleop.webxr.module import WebXRTeleopModule, _ws_send_text @pytest.fixture diff --git a/docs/research/pico-webxr-body-tracking.md b/docs/research/pico-webxr-body-tracking.md new file mode 100644 index 0000000000..5af50b9612 --- /dev/null +++ b/docs/research/pico-webxr-body-tracking.md @@ -0,0 +1,134 @@ +# PICO WebXR body tracking handoff + +Research verified on 2026-08-24 with a PICO 4 Ultra and Motion Trackers. + +## Goal + +Add reusable body-joint poses to the existing WebXR teleoperation module without +changing its controller protocol or robot-facing behavior. The WebXR module +should gain one output: + +```python skip +body_tracking: Out[BodyTrackingSnapshot] +``` + +The first implementation is an API test. It proves that PICO Browser can send +Motion Tracker body poses to dimOS. It does not retarget a robot or convert the +poses to SMPL. + +## Verified native path + +```text +PICO Motion Trackers + | + v +PICO Browser WebXR session with "body-tracking" + | + v +XRFrame.body: joint name -> XRSpace + | + v +XRFrame.getPose(jointSpace, bodyReferenceSpace) + | + v +named WebXR joint poses +``` + +The updated headset successfully displayed moving joints in the +[Babylon.js body-tracking testbed](https://drumath2237.github.io/babylon-body-tracking-testbed/). +Its implementation reads `XRFrame.body`, resolves each joint independently, +and keeps every pose that resolves. This behavior matters: one unavailable +joint must not discard the entire body frame. + +The WebXR Body Tracking specification defines `body-tracking` as a session +feature for `immersive-ar` and `immersive-vr`. A session that did not receive +that feature returns `null` from `XRFrame.body`. See the +[initialization algorithm](https://immersive-web.github.io/body-tracking/#initialization) +and [privacy requirements](https://immersive-web.github.io/body-tracking/#privacy-security). + +## Minimal API + +Add a small device-neutral value type next to the existing WebXR controller +types: + +```python skip +@dataclass(frozen=True) +class BodyTrackingSnapshot: + capture_time_s: float + frame_id: str + joints: dict[str, Pose] | None +``` + +The values have these meanings: + +| Value | Meaning | +|---|---| +| `joints is None` | `XRFrame.body` was unavailable. | +| `joints == {}` | A body source existed, but no joint pose resolved. | +| missing key | That individual joint did not resolve in this frame. | +| `frame_id` | The WebXR reference-space type used for every pose. | + +Keep browser-provided joint names. Do not impose a fixed joint order or an +SMPL skeleton in this module. A downstream adapter can map these reusable poses +to SONIC, SMPL, visualization, recording, or another consumer. + +## Integration approach + +Preserve the existing binary WebSocket messages: + +```text +PoseStamped / Joy -> existing decoder -> existing controller outputs +``` + +Add a separate JSON body-snapshot message on the same WebSocket. The server +accepts binary controller messages and this one text-message type. It publishes +decoded snapshots through `body_tracking`; it does not combine viewer, +controller, hand, and body data into an aggregate frame. + +Capture body poses in the existing WebXR animation loop: + +1. Request `body-tracking` as an optional feature for normal teleoperation. +2. When `require_body_tracking=True`, require the feature in `immersive-ar` and + report session-request failure instead of falling back to VR. +3. Request `bounded-floor` for body poses and fall back to the existing + `local-floor` space when unavailable. Keep controller poses in their current + `local-floor` space. +4. Iterate the map returned by `frame.body`. +5. Call `frame.getPose(jointSpace, bodyReferenceSpace)` for each joint. +6. Omit only the joints whose poses do not resolve. +7. Send snapshots at the existing tracking cadence. In required mode, also + send `joints: null` so the API-test monitor can distinguish a live session + from one that has produced no body messages. + +Use one module setting: + +```python skip +require_body_tracking: bool = False +``` + +The default keeps body tracking optional for every existing blueprint. A +dedicated PICO API-test blueprint sets it to `True` and connects +`body_tracking` to a small health monitor over `pLCMTransport`. + +## Acceptance checks + +- Existing controller `PoseStamped`, `Joy`, engagement, timeout, and robot + output tests continue to pass unchanged. +- A body JSON message produces one `BodyTrackingSnapshot` with the same joint + names, positions, orientations, capture time, and reference-space ID. +- Null, empty, partially resolved, and malformed body messages have explicit + tests. +- Normal teleoperation requests body tracking optionally and retains its + current AR-to-VR fallback. +- Required mode requests `immersive-ar` with `body-tracking` required and shows + the browser rejection when the feature cannot be granted. +- The API-test blueprint logs snapshot rate, joint count, and selected joint + positions from the physical PICO setup. + +## Out of scope + +- `OperatorTrackingFrame` or another aggregate operator schema +- controller protocol replacement +- fixed joint arrays or emulated-position quality metadata +- SMPL/SONIC conversion or robot retargeting +- production recording and visualization From fd6dab766a99dcd1f25d935c9a906fe748d47943 Mon Sep 17 00:00:00 2001 From: cc Date: Tue, 25 Aug 2026 23:27:20 -0700 Subject: [PATCH 42/57] spec: remove --- CONTEXT.md | 45 --------------------------------------------- 1 file changed, 45 deletions(-) delete mode 100644 CONTEXT.md diff --git a/CONTEXT.md b/CONTEXT.md deleted file mode 100644 index b2e19d08a7..0000000000 --- a/CONTEXT.md +++ /dev/null @@ -1,45 +0,0 @@ -# DimOS Robotics - -Canonical language for robot capabilities and operator interaction in DimOS. - -## Teleoperation - -**WebXR arm teleoperation**: -Arm teleoperation in which tracked WebXR controllers provide clutched, relative Cartesian pose commands and gripper input. -_Avoid_: Keyboard teleoperation, leader-follower teleoperation - -**Operator hand**: -The left or right WebXR controller as a source of teleoperation intent, independent of the robot arm it controls. -_Avoid_: Hand, side - -**Mixed-arm setup**: -Two independent manipulators teleoperated through separate control tasks, even when presented in one operator session. -_Avoid_: Bimanual robot, dual-arm robot - -**Bimanual robot**: -One coupled robot with two manipulator groups represented by a single kinematic model and controlled by one bimanual task. -_Avoid_: Mixed-arm setup - -**Bimanual engagement**: -A two-hand deadman condition in which a bimanual teleoperation task is active only while both operator hands are engaged; releasing either hand disengages the whole task. -_Avoid_: Partial engagement, independent hand engagement - -## Joint-limit safety - -**Feedback limit tolerance**: -The bounded discrepancy beyond a nominal joint limit that is accepted only when interpreting measured hardware state. -_Avoid_: Command tolerance, expanded joint limit - -**Command limit margin**: -The inward distance from each nominal joint limit within which generated position commands must remain. -_Avoid_: Feedback tolerance, relaxed joint limit - -## Inverse kinematics - -**Pink task stack**: -The ordered, named set of kinematic objectives used by Pink to produce a robot command. Its structure is composed once per IK control context; reserved frame objectives ensure every commanded end effector participates, while subclasses may compose or replace named auxiliary objectives. -_Avoid_: Teleoperation behavior, solver implementation - -**IK control context**: -The persistent inverse-kinematics state owned by one control-task instance for one robot model, controlled-joint selection, and target-frame selection, including its Pink task stack. Stateful Pink tasks are never shared between control-task instances. -_Avoid_: Planning group, teleoperation session From 540f88d2ccdf5dd922e416b07ad980482454f0b3 Mon Sep 17 00:00:00 2001 From: cc <55869557+TomCC7@users.noreply.github.com> Date: Wed, 26 Aug 2026 02:34:45 -0400 Subject: [PATCH 43/57] Delete docs/research/pico-webxr-body-tracking.md --- docs/research/pico-webxr-body-tracking.md | 134 ---------------------- 1 file changed, 134 deletions(-) delete mode 100644 docs/research/pico-webxr-body-tracking.md diff --git a/docs/research/pico-webxr-body-tracking.md b/docs/research/pico-webxr-body-tracking.md deleted file mode 100644 index 5af50b9612..0000000000 --- a/docs/research/pico-webxr-body-tracking.md +++ /dev/null @@ -1,134 +0,0 @@ -# PICO WebXR body tracking handoff - -Research verified on 2026-08-24 with a PICO 4 Ultra and Motion Trackers. - -## Goal - -Add reusable body-joint poses to the existing WebXR teleoperation module without -changing its controller protocol or robot-facing behavior. The WebXR module -should gain one output: - -```python skip -body_tracking: Out[BodyTrackingSnapshot] -``` - -The first implementation is an API test. It proves that PICO Browser can send -Motion Tracker body poses to dimOS. It does not retarget a robot or convert the -poses to SMPL. - -## Verified native path - -```text -PICO Motion Trackers - | - v -PICO Browser WebXR session with "body-tracking" - | - v -XRFrame.body: joint name -> XRSpace - | - v -XRFrame.getPose(jointSpace, bodyReferenceSpace) - | - v -named WebXR joint poses -``` - -The updated headset successfully displayed moving joints in the -[Babylon.js body-tracking testbed](https://drumath2237.github.io/babylon-body-tracking-testbed/). -Its implementation reads `XRFrame.body`, resolves each joint independently, -and keeps every pose that resolves. This behavior matters: one unavailable -joint must not discard the entire body frame. - -The WebXR Body Tracking specification defines `body-tracking` as a session -feature for `immersive-ar` and `immersive-vr`. A session that did not receive -that feature returns `null` from `XRFrame.body`. See the -[initialization algorithm](https://immersive-web.github.io/body-tracking/#initialization) -and [privacy requirements](https://immersive-web.github.io/body-tracking/#privacy-security). - -## Minimal API - -Add a small device-neutral value type next to the existing WebXR controller -types: - -```python skip -@dataclass(frozen=True) -class BodyTrackingSnapshot: - capture_time_s: float - frame_id: str - joints: dict[str, Pose] | None -``` - -The values have these meanings: - -| Value | Meaning | -|---|---| -| `joints is None` | `XRFrame.body` was unavailable. | -| `joints == {}` | A body source existed, but no joint pose resolved. | -| missing key | That individual joint did not resolve in this frame. | -| `frame_id` | The WebXR reference-space type used for every pose. | - -Keep browser-provided joint names. Do not impose a fixed joint order or an -SMPL skeleton in this module. A downstream adapter can map these reusable poses -to SONIC, SMPL, visualization, recording, or another consumer. - -## Integration approach - -Preserve the existing binary WebSocket messages: - -```text -PoseStamped / Joy -> existing decoder -> existing controller outputs -``` - -Add a separate JSON body-snapshot message on the same WebSocket. The server -accepts binary controller messages and this one text-message type. It publishes -decoded snapshots through `body_tracking`; it does not combine viewer, -controller, hand, and body data into an aggregate frame. - -Capture body poses in the existing WebXR animation loop: - -1. Request `body-tracking` as an optional feature for normal teleoperation. -2. When `require_body_tracking=True`, require the feature in `immersive-ar` and - report session-request failure instead of falling back to VR. -3. Request `bounded-floor` for body poses and fall back to the existing - `local-floor` space when unavailable. Keep controller poses in their current - `local-floor` space. -4. Iterate the map returned by `frame.body`. -5. Call `frame.getPose(jointSpace, bodyReferenceSpace)` for each joint. -6. Omit only the joints whose poses do not resolve. -7. Send snapshots at the existing tracking cadence. In required mode, also - send `joints: null` so the API-test monitor can distinguish a live session - from one that has produced no body messages. - -Use one module setting: - -```python skip -require_body_tracking: bool = False -``` - -The default keeps body tracking optional for every existing blueprint. A -dedicated PICO API-test blueprint sets it to `True` and connects -`body_tracking` to a small health monitor over `pLCMTransport`. - -## Acceptance checks - -- Existing controller `PoseStamped`, `Joy`, engagement, timeout, and robot - output tests continue to pass unchanged. -- A body JSON message produces one `BodyTrackingSnapshot` with the same joint - names, positions, orientations, capture time, and reference-space ID. -- Null, empty, partially resolved, and malformed body messages have explicit - tests. -- Normal teleoperation requests body tracking optionally and retains its - current AR-to-VR fallback. -- Required mode requests `immersive-ar` with `body-tracking` required and shows - the browser rejection when the feature cannot be granted. -- The API-test blueprint logs snapshot rate, joint count, and selected joint - positions from the physical PICO setup. - -## Out of scope - -- `OperatorTrackingFrame` or another aggregate operator schema -- controller protocol replacement -- fixed joint arrays or emulated-position quality metadata -- SMPL/SONIC conversion or robot retargeting -- production recording and visualization From a26ae78eb91700494470c8cde4f9e97ede53cffa Mon Sep 17 00:00:00 2001 From: cc Date: Wed, 26 Aug 2026 14:00:28 -0700 Subject: [PATCH 44/57] refactor(teleop): finish WebXR naming cleanup --- CONTEXT.md | 45 +++++++++++++++++++ .../teleop_ik_task/test_teleop_ik_task.py | 22 ++++----- dimos/control/teleop_coordinator.py | 2 +- dimos/teleop/README.md | 3 +- dimos/teleop/hosted/README.md | 4 +- dimos/teleop/hosted/arm_command.py | 2 +- dimos/teleop/utils/teleop_transforms.py | 18 ++++---- dimos/teleop/webxr/README.md | 35 ++++++++------- dimos/teleop/webxr/blueprints.py | 4 +- dimos/teleop/webxr/extensions.py | 4 +- dimos/teleop/webxr/module.py | 6 +-- dimos/teleop/webxr/test_blueprints.py | 2 +- dimos/teleop/webxr/web/static/index.html | 4 +- dimos/teleop/webxr/web/static/teleop.js | 28 ++++++------ docs/capabilities/manipulation/index.md | 2 +- 15 files changed, 114 insertions(+), 67 deletions(-) create mode 100644 CONTEXT.md diff --git a/CONTEXT.md b/CONTEXT.md new file mode 100644 index 0000000000..5b9fa76960 --- /dev/null +++ b/CONTEXT.md @@ -0,0 +1,45 @@ +# DimOS Robotics + +Canonical language for robot capabilities and operator interaction in DimOS. + +## Teleoperation + +**Spatial arm teleoperation**: +Arm teleoperation in which tracked WebXR input sources provide clutched, relative Cartesian pose commands and gripper input. +_Avoid_: Keyboard teleoperation, leader-follower teleoperation + +**Operator hand**: +The left or right WebXR input source as a source of teleoperation intent, independent of the robot arm it controls. +_Avoid_: Hand, side + +**Mixed-arm setup**: +Two independent manipulators teleoperated through separate control tasks, even when presented in one operator session. +_Avoid_: Bimanual robot, dual-arm robot + +**Bimanual robot**: +One coupled robot with two manipulator groups represented by a single kinematic model and controlled by one bimanual task. +_Avoid_: Mixed-arm setup + +**Bimanual engagement**: +A two-hand deadman condition in which a bimanual teleoperation task is active only while both operator hands are engaged; releasing either hand disengages the whole task. +_Avoid_: Partial engagement, independent hand engagement + +## Joint-limit safety + +**Feedback limit tolerance**: +The bounded discrepancy beyond a nominal joint limit that is accepted only when interpreting measured hardware state. +_Avoid_: Command tolerance, expanded joint limit + +**Command limit margin**: +The inward distance from each nominal joint limit within which generated position commands must remain. +_Avoid_: Feedback tolerance, relaxed joint limit + +## Inverse kinematics + +**Pink task stack**: +The ordered, named set of kinematic objectives used by Pink to produce a robot command. Its structure is composed once per IK control context; reserved frame objectives ensure every commanded end effector participates, while subclasses may compose or replace named auxiliary objectives. +_Avoid_: Teleoperation behavior, solver implementation + +**IK control context**: +The persistent inverse-kinematics state owned by one control-task instance for one robot model, controlled-joint selection, and target-frame selection, including its Pink task stack. Stateful Pink tasks are never shared between control-task instances. +_Avoid_: Planning group, teleoperation session diff --git a/dimos/control/tasks/teleop_ik_task/test_teleop_ik_task.py b/dimos/control/tasks/teleop_ik_task/test_teleop_ik_task.py index 819f8a26be..21a99b00bb 100644 --- a/dimos/control/tasks/teleop_ik_task/test_teleop_ik_task.py +++ b/dimos/control/tasks/teleop_ik_task/test_teleop_ik_task.py @@ -150,13 +150,13 @@ def test_binding_configuration_rejects_invalid_collections( message: str, ) -> None: with pytest.raises(ValueError, match=message): - TeleopIKTask("quest", _config(bindings), solver=_solver(mocker)) + TeleopIKTask("teleop", _config(bindings), solver=_solver(mocker)) def test_single_binding_tracks_relative_controller_motion(mocker: MockerFixture) -> None: solver = _solver(mocker) task = TeleopIKTask( - "quest", + "teleop", _config((_binding("right", "right_tool"),)), solver=solver, ) @@ -177,7 +177,7 @@ def test_bimanual_task_requires_both_hands_and_releases_atomically( ) -> None: solver = _solver(mocker) task = TeleopIKTask( - "quest", + "teleop", _config( ( _binding("left", "left_tool"), @@ -207,7 +207,7 @@ def test_deadman_reengagement_reseeds_command_from_feedback( ) -> None: solver = _solver(mocker) task = TeleopIKTask( - "quest", + "teleop", _config((_binding("left", "left_tool"),)), solver=solver, ) @@ -230,7 +230,7 @@ def test_deadman_reengagement_reseeds_command_from_feedback( def test_estop_and_preemption_clear_command_session(mocker: MockerFixture) -> None: solver = _solver(mocker) task = TeleopIKTask( - "quest", + "teleop", _config((_binding("left", "left_tool"),)), solver=solver, ) @@ -255,7 +255,7 @@ def test_bimanual_timeout_clears_both_sides_and_reengagement_recaptures( ) -> None: solver = _solver(mocker) task = TeleopIKTask( - "quest", + "teleop", _config( ( _binding("left", "left_tool"), @@ -299,7 +299,7 @@ def test_stale_deadman_stops_fresh_pose_streams( buttons: Buttons, ) -> None: solver = _solver(mocker) - task = TeleopIKTask("quest", _config(bindings, timeout=0.2), solver=solver) + task = TeleopIKTask("teleop", _config(bindings, timeout=0.2), solver=solver) task.on_teleop_buttons(buttons, 1.0) task.on_left_cartesian_command(_pose(0.1), 1.0) if len(bindings) == 2: @@ -318,7 +318,7 @@ def test_stale_deadman_stops_fresh_pose_streams( def test_fresh_deadman_keeps_pose_stream_active(mocker: MockerFixture) -> None: solver = _solver(mocker) task = TeleopIKTask( - "quest", + "teleop", _config((_binding("left", "left_tool"),), timeout=0.2), solver=solver, ) @@ -338,7 +338,7 @@ def test_bimanual_step_contains_both_targets( ) -> None: solver = _solver(mocker) task = TeleopIKTask( - "quest", + "teleop", _config( ( _binding("left", "left_tool"), @@ -366,7 +366,7 @@ def test_factory_constructs_plain_pose_target_solver_by_default( ) -> None: init = mocker.patch.object(PinkPoseTargetSolver, "__init__", return_value=None) cfg = TaskConfig( - name="quest", + name="teleop", type="teleop_ik", joint_names=["robot/left", "robot/right"], params={ @@ -388,7 +388,7 @@ def test_factory_constructs_plain_pose_target_solver_by_default( def test_factory_constructs_fresh_custom_solver_for_each_task() -> None: _CustomPoseTargetSolver.instances.clear() cfg = TaskConfig( - name="quest", + name="teleop", type="teleop_ik", joint_names=["robot/left", "robot/right"], params={ diff --git a/dimos/control/teleop_coordinator.py b/dimos/control/teleop_coordinator.py index 9d3b7b1caa..c5aca9ae60 100644 --- a/dimos/control/teleop_coordinator.py +++ b/dimos/control/teleop_coordinator.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Control coordinator carrying Quest arm teleoperation inputs.""" +"""Control coordinator carrying spatial arm teleoperation inputs.""" from dimos.control.coordinator import ControlCoordinator from dimos.core.stream import In diff --git a/dimos/teleop/README.md b/dimos/teleop/README.md index a669aee08b..bacd9f6514 100644 --- a/dimos/teleop/README.md +++ b/dimos/teleop/README.md @@ -68,12 +68,11 @@ teleop/ │ ├── module.py # Base WebXR teleop module (local WebSocket) │ ├── extensions.py # ArmTeleop, TwistTeleop │ ├── controller_types.py # WebXRControllerState, Buttons -│ ├── tracking_types.py # Viewer, inputs, and body tracking │ └── web/ │ └── static/index.html # WebXR client ├── hosted/ # Hosted teleop (transport-swap, per-concern modules) │ ├── go2_command.py # Go2CommandModule: command/E-STOP dispatch + drive guard -│ ├── arm_command.py # ArmCommandModule: VR poses / EE-twist → coordinator tasks +│ ├── arm_command.py # ArmCommandModule: tracked poses / EE-twist → coordinator tasks │ ├── command_executor.py # SerializedCommandExecutor: serialized cmds + safety fence │ ├── camera_mux.py # CameraMuxModule: N cameras → one composited video track │ ├── map_compress.py # MapCompressModule: costmap/odom → minimap datachannel diff --git a/dimos/teleop/hosted/README.md b/dimos/teleop/hosted/README.md index b6567c651d..bc279d4f99 100644 --- a/dimos/teleop/hosted/README.md +++ b/dimos/teleop/hosted/README.md @@ -1,7 +1,7 @@ # Remote Teleop Robot dials out to the dimensional-teleop broker — -no inbound ports needed. The browser/VR operator connects through the broker; +no inbound ports needed. The browser/WebXR operator connects through the broker; commands arrive over WebRTC datachannels, robot video goes out as a WebRTC track. @@ -16,7 +16,7 @@ that all run in one worker so everything shares that single session (the - **`go2_command.py`** — `Go2CommandModule`: operator command / E-STOP dispatch and the manual-drive guard. Reaches the driver over `@rpc` (`GO2Connection`). -- **`arm_command.py`** — `ArmCommandModule`: VR controller poses and browser +- **`arm_command.py`** — `ArmCommandModule`: WebXR controller poses and browser EE-twist → ControlCoordinator tasks (stale/reorder/future-stamp guarded). - **`camera_mux.py`** — `CameraMuxModule`: N cameras → one composited, capped video track (operator-selectable views). diff --git a/dimos/teleop/hosted/arm_command.py b/dimos/teleop/hosted/arm_command.py index b3ca86be9a..aaafb2e230 100644 --- a/dimos/teleop/hosted/arm_command.py +++ b/dimos/teleop/hosted/arm_command.py @@ -14,7 +14,7 @@ """Operator command/E-STOP plane for the hosted arm — the arm analog of Go2CommandModule. Actuation runs through the ControlCoordinator over LCM; -VR poses, browser EE-twists, and the gripper/E-STOP JSON plane arrive here +WebXR poses, browser EE-twists, and the gripper/E-STOP JSON plane arrive here from the broker.""" from __future__ import annotations diff --git a/dimos/teleop/utils/teleop_transforms.py b/dimos/teleop/utils/teleop_transforms.py index 2ee2a56a5e..ec28a616ad 100644 --- a/dimos/teleop/utils/teleop_transforms.py +++ b/dimos/teleop/utils/teleop_transforms.py @@ -13,7 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Teleop transform utilities for VR coordinate transforms.""" +"""Teleop transform utilities for WebXR coordinate transforms.""" from __future__ import annotations @@ -28,14 +28,14 @@ if TYPE_CHECKING: from numpy.typing import NDArray -# Coordinate frame transformation from VR (WebXR) to robot frame +# Coordinate frame transformation from WebXR to robot frame # WebXR: X=right, Y=up, Z=back (towards user) # Robot: X=forward, Y=left, Z=up -VR_TO_ROBOT_FRAME: NDArray[np.float64] = np.array( +WEBXR_TO_ROBOT_FRAME: NDArray[np.float64] = np.array( [ - [0, 0, -1, 0], # Robot X = -VR Z (forward) - [-1, 0, 0, 0], # Robot Y = -VR X (left) - [0, 1, 0, 0], # Robot Z = +VR Y (up) + [0, 0, -1, 0], # Robot X = -WebXR Z (forward) + [-1, 0, 0, 0], # Robot Y = -WebXR X (left) + [0, 1, 0, 0], # Robot Z = +WebXR Y (up) [0, 0, 0, 1], ], dtype=np.float64, @@ -48,13 +48,13 @@ def webxr_to_robot( ) -> PoseStamped: """WebXR controller pose → robot frame (left +90° Z, right -90° Z); preserves ts and frame_id.""" - vr_matrix = pose_to_matrix(pose_stamped) + webxr_matrix = pose_to_matrix(pose_stamped) direction = 1 if is_left_controller else -1 z_rotation = R.from_euler("z", 90 * direction, degrees=True).as_matrix() - vr_matrix[:3, :3] = vr_matrix[:3, :3] @ z_rotation + webxr_matrix[:3, :3] = webxr_matrix[:3, :3] @ z_rotation - robot_matrix = VR_TO_ROBOT_FRAME @ vr_matrix + robot_matrix = WEBXR_TO_ROBOT_FRAME @ webxr_matrix robot_pose = matrix_to_pose(robot_matrix) return PoseStamped( diff --git a/dimos/teleop/webxr/README.md b/dimos/teleop/webxr/README.md index d0ca9867c6..bbda7da705 100644 --- a/dimos/teleop/webxr/README.md +++ b/dimos/teleop/webxr/README.md @@ -1,12 +1,13 @@ -# Quest Teleop +# WebXR Teleop -Teleoperation via Meta Quest 3 VR controllers. Dual-hand tracking with WebXR. +Spatial teleoperation through browser WebXR input sources. Supports tracked +controllers and hands on compatible headsets, including Meta Quest and PICO. ## Architecture ``` -Quest Browser ──WebSocket──→ Embedded HTTPS Server ──→ ArmTeleopModule -(WebXR poses + Joy) (port 8443) (absolute PoseStamped) +WebXR Browser ──WebSocket──→ Embedded HTTPS Server ──→ ArmTeleopModule +(poses + Joy) (port 8443) (absolute PoseStamped) │ left/right ▼ TeleopControlCoordinator @@ -34,21 +35,23 @@ Select a CAN interface explicitly to control real A1Z hardware: dimos --can-port a1zcan run teleop-webxr-a1z ``` -Open `https://:8443/teleop` on Quest browser. Accept cert, tap Connect. +Open `https://:8443/teleop` in a WebXR-capable headset browser. Accept +the certificate, then tap Connect. For hand teleop, remove the controllers. Pinch the thumb and index finger on the selected hand to engage it, move the wrist to control the arm, then pinch again to disengage. Pinch the thumb and middle finger to close the gripper; -release it to open the gripper. Hand tracking must be enabled for the Quest +release it to open the gripper. Hand tracking must be enabled in the headset browser. `teleop-webxr-openarm` is safe by default: it always uses the in-memory `mock_whole_body` adapter, regardless of the global simulation setting. It does not select physical OpenArm hardware implicitly. The mock and bimanual model start at the canonical all-zero pose. Since that pose places both joint-4 -coordinates at their lower limits, the OpenArm planner and Quest task share a -Pink joint-limit posture margin that supplies a deterministic inward direction -without changing the measured seed. No random retry runs in the control loop. +coordinates at their lower limits, the OpenArm planner and teleoperation task +share a Pink joint-limit posture margin that supplies a deterministic inward +direction without changing the measured seed. No random retry runs in the +control loop. Specify both CAN interfaces to select real OpenArm hardware. Supplying only one is rejected: @@ -59,8 +62,8 @@ dimos run teleop-webxr-openarm --left-can-port can1 --right-can-port can0 The blueprint also includes `ManipulationModule` with the same bimanual model and Viser visualization. Its coordinator has a joint-trajectory task over both -arms at priority 20; planned execution therefore preempts the priority-10 Quest -task through normal arbitration and clears the teleoperation engagement state. +arms at priority 20; planned execution therefore preempts the priority-10 +teleoperation task through normal arbitration and clears the engagement state. ## Arm task bindings @@ -99,10 +102,10 @@ entire session; both hands must engage again before commands resume. ## File Structure ``` -quest/ -├── module.py # Base module -├── extensions.py # ArmTeleop, TwistTeleop -├── controller_types.py # WebXRControllerState, Buttons +webxr/ +├── module.py # Base module +├── extensions.py # ArmTeleop, TwistTeleop +├── controller_types.py # WebXRControllerState, Buttons ├── blueprints.py -└── web/static/index.html # WebXR client +└── web/static/index.html # WebXR client ``` diff --git a/dimos/teleop/webxr/blueprints.py b/dimos/teleop/webxr/blueprints.py index 24a598e8fb..4cd26a58f4 100644 --- a/dimos/teleop/webxr/blueprints.py +++ b/dimos/teleop/webxr/blueprints.py @@ -77,7 +77,7 @@ ) -# XArm7 teleop + camera streaming into the Quest scene as a panel. +# XArm7 teleop + camera streaming into the WebXR scene as a panel. teleop_webxr_xarm7_video = ( autoconnect( VideoArmTeleopModule.blueprint(), @@ -133,7 +133,7 @@ ) -# Dual arm teleop: right -> piper, left -> xarm6 (two independent Quest IK tasks) +# Dual arm teleop: right -> piper, left -> xarm6 (two independent teleop IK tasks) teleop_webxr_dual = autoconnect( ArmTeleopModule.blueprint(), coordinator_teleop_dual, diff --git a/dimos/teleop/webxr/extensions.py b/dimos/teleop/webxr/extensions.py index 0fbe4d0f5b..1ef45d178d 100644 --- a/dimos/teleop/webxr/extensions.py +++ b/dimos/teleop/webxr/extensions.py @@ -18,7 +18,7 @@ - ArmTeleopModule: Per-hand press-and-hold engage (X/A hold to track) - HandTeleopModule: Pinch-to-toggle arm teleop using WebXR hand tracking - TwistTeleopModule: Outputs Twist instead of PoseStamped - - VideoArmTeleopModule: ArmTeleopModule + JPEG frames pushed to the Quest over /ws + - VideoArmTeleopModule: ArmTeleopModule + JPEG frames pushed to the headset over /ws - Go2TeleopModule: Thumbstick → Twist velocity for the Go2 + camera over /ws """ @@ -239,7 +239,7 @@ class VideoArmTeleopConfig(WebXRTeleopConfig): class VideoArmTeleopModule(ArmTeleopModule): - """ArmTeleopModule + camera frames pushed to the Quest as JPEG over /ws. + """ArmTeleopModule + camera frames pushed to the headset as JPEG over /ws. Subscribes to color_image, JPEG-encodes each frame, and broadcasts raw JPEG bytes to every connected /ws client as a binary message. The client diff --git a/dimos/teleop/webxr/module.py b/dimos/teleop/webxr/module.py index 057291209b..4a4a72d46a 100644 --- a/dimos/teleop/webxr/module.py +++ b/dimos/teleop/webxr/module.py @@ -16,7 +16,7 @@ """ WebXR Teleoperation Module. -Receives VR controller tracking data from the WebXR client via an embedded +Receives spatial input tracking data from the WebXR client via an embedded FastAPI WebSocket server. Transforms from WebXR to robot frame, computes deltas, and publishes PoseStamped commands. """ @@ -47,7 +47,7 @@ from dimos.msgs.sensor_msgs.Joy import Joy from dimos.teleop.utils.teleop_transforms import webxr_to_robot -# Hand is re-exported for back-compat; it lives in controller_types. +# Hand is re-exported for callers; it lives in controller_types. from dimos.teleop.webxr.controller_types import Buttons, Hand, WebXRControllerState from dimos.utils.logging_config import setup_logger from dimos.web.robot_web_interface import RobotWebInterface @@ -89,7 +89,7 @@ class WebXRTeleopConfig(ModuleConfig): class WebXRTeleopModule(Module): - """WebXR Teleoperation Module for Meta WebXR controllers. + """Teleoperation module for browser WebXR input sources. Receives controller data from the WebXR client via an embedded WebSocket server, computes output poses, and publishes them. Subclass to customize diff --git a/dimos/teleop/webxr/test_blueprints.py b/dimos/teleop/webxr/test_blueprints.py index e7aa8bd460..7b45d8dd0a 100644 --- a/dimos/teleop/webxr/test_blueprints.py +++ b/dimos/teleop/webxr/test_blueprints.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Construction assertions for migrated Quest manipulator blueprints.""" +"""Construction assertions for WebXR manipulator blueprints.""" from typing import cast diff --git a/dimos/teleop/webxr/web/static/index.html b/dimos/teleop/webxr/web/static/index.html index b23a8362b1..ee9dcf12f5 100644 --- a/dimos/teleop/webxr/web/static/index.html +++ b/dimos/teleop/webxr/web/static/index.html @@ -3,12 +3,12 @@ - Quest 3 VR Teleop + DimOS WebXR Teleop

-

DimOS Quest-3 Teleop

+

DimOS WebXR Teleop

Ready to connect
diff --git a/dimos/teleop/webxr/web/static/teleop.js b/dimos/teleop/webxr/web/static/teleop.js index 65608afffe..bc79d375fd 100644 --- a/dimos/teleop/webxr/web/static/teleop.js +++ b/dimos/teleop/webxr/web/static/teleop.js @@ -6,7 +6,7 @@ window.onerror = (msg, url, line, col, error) => { import { geometry_msgs, std_msgs, sensor_msgs } from "https://esm.sh/jsr/@dimos/msgs@0.1.4"; -// WebSocket and VR state +// WebSocket and WebXR state let ws = null; let xrSession = null; let xrRefSpace = null; @@ -542,7 +542,7 @@ function processTracking(frame) { } } -// VR render loop +// WebXR render loop function onXRFrame(_time, frame) { if (!xrSession) return; xrSession.requestAnimationFrame(onXRFrame); @@ -571,12 +571,12 @@ function onXRFrame(_time, frame) { } } -// Start VR session with passthrough -async function startVR() { +// Start an immersive WebXR session with passthrough when available. +async function startWebXRSession() { try { setStatus('Initializing WebGL...'); initGL(); - setStatus('Requesting VR session...'); + setStatus('Requesting WebXR session...'); // Try immersive-ar first (true passthrough), fall back to immersive-vr let session = null; @@ -607,11 +607,11 @@ async function startVR() { // Get reference space xrRefSpace = await session.requestReferenceSpace('local-floor'); - setStatus('VR active'); + setStatus('WebXR active'); // Session event handlers session.addEventListener('end', () => { - setStatus('VR session ended'); + setStatus('WebXR session ended'); handSelectActive.clear(); hudPlaced = false; xrSession = null; @@ -635,8 +635,8 @@ async function startVR() { session.requestAnimationFrame(onXRFrame); } catch (error) { - setStatus('VR failed: ' + error.message); - console.error('VR session error:', error); + setStatus('WebXR failed: ' + error.message); + console.error('WebXR session error:', error); throw error; } } @@ -648,14 +648,14 @@ window.connect = async function() { // Check WebXR support if (!navigator.xr) { - throw new Error('WebXR not supported. Use Quest 3 browser.'); + throw new Error('WebXR not supported. Use a WebXR-capable browser.'); } // Setup WebSocket await setupWebSocket(); - // Start VR - await startVR(); + // Start WebXR + await startWebXRSession(); // Update UI connectBtn.classList.add('hidden'); @@ -698,12 +698,12 @@ window.addEventListener('load', async () => { } try { - // Check for AR (passthrough) or VR support + // Check for immersive AR (passthrough) or VR session support. const arSupported = await navigator.xr.isSessionSupported('immersive-ar').catch(() => false); const vrSupported = await navigator.xr.isSessionSupported('immersive-vr').catch(() => false); if (!arSupported && !vrSupported) { - setStatus('VR/AR not supported'); + setStatus('Immersive WebXR not supported'); connectBtn.disabled = true; } } catch (error) { diff --git a/docs/capabilities/manipulation/index.md b/docs/capabilities/manipulation/index.md index 14fedb2452..09e4679f19 100644 --- a/docs/capabilities/manipulation/index.md +++ b/docs/capabilities/manipulation/index.md @@ -433,7 +433,7 @@ warm-starts one bounded Pink update from live coordinator joint state on each tick; it does not require a planning world or expose planning groups to the coordinator. -Cartesian IK accepts one absolute robot-frame target. Quest IK accepts one or +Cartesian IK accepts one absolute robot-frame target. Teleoperation IK accepts one or two controller-to-frame bindings and owns engagement, reference capture, relative target mapping, and optional per-hand gripper commands. The coordinator only routes the distinct left/right pose streams by task name and From f14fc678deab5a99ae771e8ce28454e715c7829d Mon Sep 17 00:00:00 2001 From: cc Date: Wed, 26 Aug 2026 14:24:16 -0700 Subject: [PATCH 45/57] spec: remove --- CONTEXT.md | 45 --------------------------------------------- 1 file changed, 45 deletions(-) delete mode 100644 CONTEXT.md diff --git a/CONTEXT.md b/CONTEXT.md deleted file mode 100644 index 5b9fa76960..0000000000 --- a/CONTEXT.md +++ /dev/null @@ -1,45 +0,0 @@ -# DimOS Robotics - -Canonical language for robot capabilities and operator interaction in DimOS. - -## Teleoperation - -**Spatial arm teleoperation**: -Arm teleoperation in which tracked WebXR input sources provide clutched, relative Cartesian pose commands and gripper input. -_Avoid_: Keyboard teleoperation, leader-follower teleoperation - -**Operator hand**: -The left or right WebXR input source as a source of teleoperation intent, independent of the robot arm it controls. -_Avoid_: Hand, side - -**Mixed-arm setup**: -Two independent manipulators teleoperated through separate control tasks, even when presented in one operator session. -_Avoid_: Bimanual robot, dual-arm robot - -**Bimanual robot**: -One coupled robot with two manipulator groups represented by a single kinematic model and controlled by one bimanual task. -_Avoid_: Mixed-arm setup - -**Bimanual engagement**: -A two-hand deadman condition in which a bimanual teleoperation task is active only while both operator hands are engaged; releasing either hand disengages the whole task. -_Avoid_: Partial engagement, independent hand engagement - -## Joint-limit safety - -**Feedback limit tolerance**: -The bounded discrepancy beyond a nominal joint limit that is accepted only when interpreting measured hardware state. -_Avoid_: Command tolerance, expanded joint limit - -**Command limit margin**: -The inward distance from each nominal joint limit within which generated position commands must remain. -_Avoid_: Feedback tolerance, relaxed joint limit - -## Inverse kinematics - -**Pink task stack**: -The ordered, named set of kinematic objectives used by Pink to produce a robot command. Its structure is composed once per IK control context; reserved frame objectives ensure every commanded end effector participates, while subclasses may compose or replace named auxiliary objectives. -_Avoid_: Teleoperation behavior, solver implementation - -**IK control context**: -The persistent inverse-kinematics state owned by one control-task instance for one robot model, controlled-joint selection, and target-frame selection, including its Pink task stack. Stateful Pink tasks are never shared between control-task instances. -_Avoid_: Planning group, teleoperation session From 80a7d98b810a8899f8137baf794f3608a8c8b7c2 Mon Sep 17 00:00:00 2001 From: cc Date: Tue, 25 Aug 2026 23:51:01 -0700 Subject: [PATCH 46/57] feat(teleop): add PICO WebXR body tracking --- dimos/robot/all_blueprints.py | 2 + dimos/teleop/webxr/blueprints.py | 16 +- dimos/teleop/webxr/body_tracking.py | 77 +++++++++ dimos/teleop/webxr/body_tracking_monitor.py | 111 +++++++++++++ dimos/teleop/webxr/module.py | 69 +++++++- dimos/teleop/webxr/test_blueprints.py | 16 ++ dimos/teleop/webxr/test_body_tracking.py | 87 ++++++++++ .../webxr/test_body_tracking_monitor.py | 118 ++++++++++++++ dimos/teleop/webxr/test_module.py | 139 ++++++++++++++++ dimos/teleop/webxr/web/static/teleop.js | 123 ++++++++++---- dimos/teleop/webxr/web/static/webxr_body.mjs | 20 +++ docs/research/pico-webxr-body-tracking.md | 154 ++++++++++++++++++ 12 files changed, 892 insertions(+), 40 deletions(-) create mode 100644 dimos/teleop/webxr/body_tracking.py create mode 100644 dimos/teleop/webxr/body_tracking_monitor.py create mode 100644 dimos/teleop/webxr/test_body_tracking.py create mode 100644 dimos/teleop/webxr/test_body_tracking_monitor.py create mode 100644 dimos/teleop/webxr/web/static/webxr_body.mjs create mode 100644 docs/research/pico-webxr-body-tracking.md diff --git a/dimos/robot/all_blueprints.py b/dimos/robot/all_blueprints.py index ed0c34b305..f833e087a1 100644 --- a/dimos/robot/all_blueprints.py +++ b/dimos/robot/all_blueprints.py @@ -52,6 +52,7 @@ "demo-mcp-stress-test": "dimos.core.demos.stress_test_blueprint:demo_mcp_stress_test", "demo-object-scene-registration": "dimos.perception.experimental.demo_object_scene_registration:demo_object_scene_registration", "demo-osm": "dimos.mapping.osm.demo_osm:demo_osm", + "demo-pico-body-tracking": "dimos.teleop.webxr.blueprints:demo_pico_body_tracking", "demo-skill": "dimos.agents.skills.demo_skill:demo_skill", "demo-virtual-mid360-fastlio": "dimos.hardware.sensors.lidar.virtual_mid360.blueprints:demo_virtual_mid360_fastlio", "demo-virtual-mid360-pointlio": "dimos.hardware.sensors.lidar.virtual_mid360.blueprints:demo_virtual_mid360_pointlio", @@ -170,6 +171,7 @@ "b1-connection-module": "dimos.robot.unitree.b1.connection.B1ConnectionModule", "basic-path-follower": "dimos.navigation.basic_path_follower.module.BasicPathFollower", "benchmarker": "dimos.control.benchmarking.benchmark.Benchmarker", + "body-tracking-monitor": "dimos.teleop.webxr.body_tracking_monitor.BodyTrackingMonitor", "camera-module": "dimos.hardware.sensors.camera.module.CameraModule", "camera-mux-module": "dimos.teleop.hosted.camera_mux.CameraMuxModule", "cartesian-motion-controller": "dimos.manipulation.control.servo_control.cartesian_motion_controller.CartesianMotionController", diff --git a/dimos/teleop/webxr/blueprints.py b/dimos/teleop/webxr/blueprints.py index 4cd26a58f4..2a602907e9 100644 --- a/dimos/teleop/webxr/blueprints.py +++ b/dimos/teleop/webxr/blueprints.py @@ -21,7 +21,7 @@ from dimos.constants import DEFAULT_CAPACITY_COLOR_IMAGE from dimos.core.coordination.blueprints import autoconnect -from dimos.core.transport import LCMTransport, pSHMTransport +from dimos.core.transport import LCMTransport, pLCMTransport, pSHMTransport from dimos.msgs.geometry_msgs.PoseStamped import PoseStamped from dimos.msgs.geometry_msgs.Twist import Twist from dimos.msgs.sensor_msgs.Image import Image @@ -33,12 +33,15 @@ coordinator_teleop_xarm7, ) from dimos.robot.unitree.go2.connection import GO2Connection +from dimos.teleop.webxr.body_tracking import BodyTrackingSnapshot +from dimos.teleop.webxr.body_tracking_monitor import BodyTrackingMonitor from dimos.teleop.webxr.extensions import ( ArmTeleopModule, Go2TeleopModule, HandTeleopModule, VideoArmTeleopModule, ) +from dimos.teleop.webxr.module import WebXRTeleopModule from dimos.visualization.vis_module import vis_module # Arm teleop with press-and-hold engage (has rerun viz) @@ -163,3 +166,14 @@ ) .global_config(robot_model="unitree_go2") ) + + +# PICO 4 Ultra WebXR API test: require body tracking and report every usable joint. +demo_pico_body_tracking = autoconnect( + WebXRTeleopModule.blueprint(body_tracking_mode="required"), + BodyTrackingMonitor.blueprint(), +).transports( + { + ("body_tracking", BodyTrackingSnapshot): pLCMTransport("/teleop/body_tracking"), + } +) diff --git a/dimos/teleop/webxr/body_tracking.py b/dimos/teleop/webxr/body_tracking.py new file mode 100644 index 0000000000..80886bd825 --- /dev/null +++ b/dimos/teleop/webxr/body_tracking.py @@ -0,0 +1,77 @@ +# Copyright 2026 Dimensional Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Body-joint snapshots received from a WebXR client.""" + +from dataclasses import dataclass +from typing import Annotated, Literal, TypeAlias + +from pydantic import BaseModel, ConfigDict, Field, StringConstraints, ValidationError + +from dimos.msgs.geometry_msgs.Pose import Pose + +BODY_TRACKING_MESSAGE_TYPE = "body_tracking_snapshot" + +BodyTrackingMode: TypeAlias = Literal["off", "optional", "required"] +_FiniteFloat: TypeAlias = Annotated[float, Field(strict=True, allow_inf_nan=False)] +_NonEmptyString: TypeAlias = Annotated[ + str, + StringConstraints(min_length=1, pattern=r".*\S.*"), +] + + +@dataclass(frozen=True) +class BodyTrackingSnapshot: + """Named body-joint poses captured in one WebXR reference space.""" + + capture_time_s: float + frame_id: str + joints: dict[str, Pose] | None + + +class _WirePose(BaseModel): + model_config = ConfigDict(extra="forbid") + + position: tuple[_FiniteFloat, _FiniteFloat, _FiniteFloat] + orientation: tuple[_FiniteFloat, _FiniteFloat, _FiniteFloat, _FiniteFloat] + + +class _WireBodyTrackingSnapshot(BaseModel): + model_config = ConfigDict(extra="forbid") + + type: Literal["body_tracking_snapshot"] + capture_time_s: _FiniteFloat + frame_id: _NonEmptyString + joints: dict[_NonEmptyString, _WirePose] | None + + +def decode_body_tracking_snapshot(payload: str) -> BodyTrackingSnapshot: + """Decode and validate one JSON body-tracking snapshot.""" + try: + wire = _WireBodyTrackingSnapshot.model_validate_json(payload) + except ValidationError as exc: + raise ValueError("invalid body-tracking snapshot") from exc + + joints = None + if wire.joints is not None: + joints = { + name: Pose(position=pose.position, orientation=pose.orientation) + for name, pose in wire.joints.items() + } + + return BodyTrackingSnapshot( + capture_time_s=wire.capture_time_s, + frame_id=wire.frame_id, + joints=joints, + ) diff --git a/dimos/teleop/webxr/body_tracking_monitor.py b/dimos/teleop/webxr/body_tracking_monitor.py new file mode 100644 index 0000000000..017fe401ff --- /dev/null +++ b/dimos/teleop/webxr/body_tracking_monitor.py @@ -0,0 +1,111 @@ +# Copyright 2026 Dimensional Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Live health reporting for the PICO WebXR body-tracking demo.""" + +import time +from typing import Any + +from reactivex.disposable import Disposable + +from dimos.core.core import rpc +from dimos.core.module import Module +from dimos.core.stream import In +from dimos.teleop.webxr.body_tracking import BodyTrackingSnapshot +from dimos.utils.logging_config import setup_logger + +logger = setup_logger() + +REPORT_INTERVAL_S = 5.0 +INSPECTED_BODY_JOINTS = ( + "hips", + "left-hand-wrist", + "right-hand-wrist", + "left-foot-ankle", + "right-foot-ankle", +) + + +def body_tracking_summary( + snapshot: BodyTrackingSnapshot, + *, + snapshot_rate_hz: float, + resolved_joint_ever_seen: bool, +) -> dict[str, Any]: + """Build one compact body-tracking health summary.""" + joints = snapshot.joints + state = "unavailable" if joints is None else "empty" if not joints else "tracking" + positions: dict[str, tuple[float, float, float]] = {} + if joints: + for name in INSPECTED_BODY_JOINTS: + pose = joints.get(name) + if pose is not None: + positions[name] = ( + round(pose.position.x, 3), + round(pose.position.y, 3), + round(pose.position.z, 3), + ) + + return { + "snapshot_rate_hz": round(snapshot_rate_hz, 1), + "state": state, + "reference_space": snapshot.frame_id, + "resolved_joint_count": 0 if joints is None else len(joints), + "resolved_joint_ever_seen": resolved_joint_ever_seen, + "joint_positions": positions, + } + + +class BodyTrackingMonitor(Module): + """Report live PICO body-tracking availability, rate, and joint poses.""" + + body_tracking: In[BodyTrackingSnapshot] + + def __init__(self, **kwargs: Any) -> None: + super().__init__(**kwargs) + self._report_started_at = time.monotonic() + self._snapshots_since_report = 0 + self._resolved_joint_ever_seen = False + + @rpc + def start(self) -> None: + super().start() + self.register_disposable(Disposable(self.body_tracking.subscribe(self._on_body_tracking))) + + def _on_body_tracking(self, snapshot: BodyTrackingSnapshot) -> None: + self._snapshots_since_report += 1 + if snapshot.joints and not self._resolved_joint_ever_seen: + self._resolved_joint_ever_seen = True + logger.info( + "WebXR body tracking acquired", + reference_space=snapshot.frame_id, + resolved_joint_count=len(snapshot.joints), + ) + + now = time.monotonic() + elapsed = now - self._report_started_at + if elapsed < REPORT_INTERVAL_S: + return + + summary = body_tracking_summary( + snapshot, + snapshot_rate_hz=self._snapshots_since_report / elapsed, + resolved_joint_ever_seen=self._resolved_joint_ever_seen, + ) + if snapshot.joints: + logger.info("WebXR body tracking health", **summary) + else: + logger.warning("WebXR body tracking has no resolved joints", **summary) + self._report_started_at = now + self._snapshots_since_report = 0 diff --git a/dimos/teleop/webxr/module.py b/dimos/teleop/webxr/module.py index 4a4a72d46a..53c8b1d809 100644 --- a/dimos/teleop/webxr/module.py +++ b/dimos/teleop/webxr/module.py @@ -46,6 +46,11 @@ from dimos.msgs.geometry_msgs.PoseStamped import PoseStamped from dimos.msgs.sensor_msgs.Joy import Joy from dimos.teleop.utils.teleop_transforms import webxr_to_robot +from dimos.teleop.webxr.body_tracking import ( + BodyTrackingMode, + BodyTrackingSnapshot, + decode_body_tracking_snapshot, +) # Hand is re-exported for callers; it lives in controller_types. from dimos.teleop.webxr.controller_types import Buttons, Hand, WebXRControllerState @@ -83,6 +88,7 @@ class WebXRTeleopConfig(ModuleConfig): control_loop_hz: float = 50.0 server_port: int = 8443 input_timeout_s: float = Field(default=1.0, gt=0) + body_tracking_mode: BodyTrackingMode = "off" _Config = TypeVar("_Config", bound=WebXRTeleopConfig) @@ -99,6 +105,7 @@ class WebXRTeleopModule(Module): - left_controller_output: PoseStamped (output pose for left hand) - right_controller_output: PoseStamped (output pose for right hand) - teleop_buttons: Buttons (button states for both controllers) + - body_tracking: named body-joint poses in their WebXR reference space """ config: WebXRTeleopConfig @@ -108,6 +115,7 @@ class WebXRTeleopModule(Module): right_controller_output: Out[PoseStamped] teleop_buttons: Out[Buttons] status: In[EpisodeStatus] + body_tracking: Out[BodyTrackingSnapshot] def __init__(self, **kwargs: Any) -> None: super().__init__(**kwargs) @@ -159,6 +167,10 @@ async def teleop_index() -> HTMLResponse: index_path = STATIC_DIR / "index.html" return HTMLResponse(content=index_path.read_text()) + @self._web_server.app.get("/teleop/config") + async def teleop_config() -> dict[str, Any]: + return self._webxr_client_config() + if STATIC_DIR.is_dir(): self._web_server.app.mount( "/static", StaticFiles(directory=str(STATIC_DIR)), name="teleop_static" @@ -175,13 +187,16 @@ async def websocket_endpoint(ws: WebSocket) -> None: logger.info("WebXR client connected") try: while True: - data = await ws.receive_bytes() - fingerprint = data[:8] - decoder = self._decoders.get(fingerprint) - if decoder: - decoder(data) - else: - logger.warning(f"Unknown message fingerprint: {fingerprint.hex()}") + message = await ws.receive() + if message["type"] == "websocket.disconnect": + logger.info("WebXR client disconnected") + break + data = message.get("bytes") + text = message.get("text") + if data is not None: + self._dispatch_binary_message(data) + elif text is not None: + self._dispatch_text_message(text) except WebSocketDisconnect: logger.info("WebXR client disconnected") except Exception: @@ -189,6 +204,46 @@ async def websocket_endpoint(ws: WebSocket) -> None: finally: self._client_disconnected(ws) + def _webxr_client_config(self) -> dict[str, Any]: + required_features = ["local-floor"] + optional_features = ["hand-tracking"] + session_modes = ["immersive-ar", "immersive-vr"] + + if self.config.body_tracking_mode != "off": + optional_features.append("bounded-floor") + if self.config.body_tracking_mode == "optional": + optional_features.append("body-tracking") + elif self.config.body_tracking_mode == "required": + required_features.append("body-tracking") + session_modes = ["immersive-ar"] + + return { + "body_tracking_mode": self.config.body_tracking_mode, + "session_modes": session_modes, + "session_options": { + "requiredFeatures": required_features, + "optionalFeatures": optional_features, + }, + } + + def _dispatch_binary_message(self, data: bytes) -> bool: + fingerprint = data[:8] + decoder = self._decoders.get(fingerprint) + if decoder is None: + logger.warning("Unknown WebXR message fingerprint", fingerprint=fingerprint.hex()) + return False + decoder(data) + return True + + def _dispatch_text_message(self, payload: str) -> bool: + try: + snapshot = decode_body_tracking_snapshot(payload) + except ValueError as exc: + logger.warning("Dropping malformed WebXR text message", error=str(exc)) + return False + self.body_tracking.publish(snapshot) + return True + def _client_connected(self, ws: WebSocket) -> bool: with self._clients_lock: if self._connected_clients: diff --git a/dimos/teleop/webxr/test_blueprints.py b/dimos/teleop/webxr/test_blueprints.py index 7b45d8dd0a..a9cb4a4ea5 100644 --- a/dimos/teleop/webxr/test_blueprints.py +++ b/dimos/teleop/webxr/test_blueprints.py @@ -20,11 +20,15 @@ from dimos.core.coordination.blueprints import Blueprint from dimos.robot.manipulators.common.blueprints import TeleopBinding from dimos.teleop.webxr.blueprints import ( + demo_pico_body_tracking, teleop_webxr_dual, teleop_webxr_hand_xarm7, teleop_webxr_xarm7, ) +from dimos.teleop.webxr.body_tracking import BodyTrackingSnapshot +from dimos.teleop.webxr.body_tracking_monitor import BodyTrackingMonitor from dimos.teleop.webxr.extensions import ArmTeleopModule, HandTeleopModule +from dimos.teleop.webxr.module import WebXRTeleopModule def _coordinator_tasks(blueprint: Blueprint) -> list[TaskConfig]: @@ -101,3 +105,15 @@ def test_mixed_arm_blueprint_keeps_two_independent_one_binding_tasks() -> None: teleop_webxr_dual.remapping_map[(ArmTeleopModule.name, "right_controller_output")] == "right_cartesian_command" ) + + +def test_pico_body_tracking_demo_connects_required_webxr_to_monitor() -> None: + modules = {atom.module for atom in demo_pico_body_tracking.blueprints} + webxr = next( + atom for atom in demo_pico_body_tracking.blueprints if atom.module is WebXRTeleopModule + ) + transport = demo_pico_body_tracking.transport_map[("body_tracking", BodyTrackingSnapshot)] + + assert modules == {WebXRTeleopModule, BodyTrackingMonitor} + assert webxr.kwargs["body_tracking_mode"] == "required" + assert transport.channel == "/teleop/body_tracking" diff --git a/dimos/teleop/webxr/test_body_tracking.py b/dimos/teleop/webxr/test_body_tracking.py new file mode 100644 index 0000000000..312d0cc207 --- /dev/null +++ b/dimos/teleop/webxr/test_body_tracking.py @@ -0,0 +1,87 @@ +# Copyright 2026 Dimensional Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import json + +import pytest + +from dimos.teleop.webxr.body_tracking import decode_body_tracking_snapshot + + +def _payload(*, joints) -> str: + return json.dumps( + { + "type": "body_tracking_snapshot", + "capture_time_s": 1234.5, + "frame_id": "bounded-floor", + "joints": joints, + } + ) + + +def test_decode_body_tracking_snapshot_preserves_named_poses() -> None: + snapshot = decode_body_tracking_snapshot( + _payload( + joints={ + "hips": { + "position": [1.0, 2.0, 3.0], + "orientation": [0.1, 0.2, 0.3, 0.9], + }, + "left-foot-ankle": { + "position": [-0.2, 0.1, 0.4], + "orientation": [0.0, 0.0, 0.0, 1.0], + }, + } + ) + ) + + assert snapshot.capture_time_s == 1234.5 + assert snapshot.frame_id == "bounded-floor" + assert snapshot.joints is not None + assert list(snapshot.joints) == ["hips", "left-foot-ankle"] + assert snapshot.joints["hips"].position.to_list() == [1.0, 2.0, 3.0] + assert snapshot.joints["hips"].orientation.to_list() == [0.1, 0.2, 0.3, 0.9] + + +@pytest.mark.parametrize("joints", [None, {}]) +def test_decode_body_tracking_snapshot_preserves_absence_state(joints) -> None: + snapshot = decode_body_tracking_snapshot(_payload(joints=joints)) + + assert snapshot.joints == joints + + +@pytest.mark.parametrize( + "payload", + [ + "not json", + '{"type":"unknown"}', + _payload(joints={"hips": {"position": [1.0, 2.0], "orientation": [0, 0, 0, 1]}}), + _payload(joints={"hips": {"position": [1.0, 2.0, 3.0], "orientation": [0, 0, 1]}}), + _payload(joints={"": {"position": [1.0, 2.0, 3.0], "orientation": [0, 0, 0, 1]}}), + _payload(joints={"hips": {"position": [True, 2.0, 3.0], "orientation": [0, 0, 0, 1]}}), + '{"type":"body_tracking_snapshot","capture_time_s":NaN,"frame_id":"local-floor","joints":{}}', + json.dumps( + { + "type": "body_tracking_snapshot", + "capture_time_s": 1.0, + "frame_id": "local-floor", + "joints": {}, + "unexpected": True, + } + ), + ], +) +def test_decode_body_tracking_snapshot_rejects_malformed_payloads(payload: str) -> None: + with pytest.raises(ValueError, match="invalid body-tracking snapshot"): + decode_body_tracking_snapshot(payload) diff --git a/dimos/teleop/webxr/test_body_tracking_monitor.py b/dimos/teleop/webxr/test_body_tracking_monitor.py new file mode 100644 index 0000000000..6752798c3e --- /dev/null +++ b/dimos/teleop/webxr/test_body_tracking_monitor.py @@ -0,0 +1,118 @@ +# Copyright 2026 Dimensional Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from collections.abc import Iterator + +import pytest + +from dimos.msgs.geometry_msgs.Pose import Pose +from dimos.teleop.webxr.body_tracking import BodyTrackingSnapshot +from dimos.teleop.webxr.body_tracking_monitor import ( + BodyTrackingMonitor, + body_tracking_summary, +) + + +@pytest.fixture +def monitor() -> Iterator[BodyTrackingMonitor]: + module = BodyTrackingMonitor() + try: + yield module + finally: + module.stop() + + +def test_body_tracking_summary_reports_best_effort_joint_positions() -> None: + snapshot = BodyTrackingSnapshot( + capture_time_s=10.0, + frame_id="bounded-floor", + joints={ + "hips": Pose(0.12345, 1.23456, -0.34567), + "vendor-extra-joint": Pose(3.0, 2.0, 1.0), + }, + ) + + summary = body_tracking_summary( + snapshot, + snapshot_rate_hz=79.94, + resolved_joint_ever_seen=True, + ) + + assert summary == { + "snapshot_rate_hz": 79.9, + "state": "tracking", + "reference_space": "bounded-floor", + "resolved_joint_count": 2, + "resolved_joint_ever_seen": True, + "joint_positions": {"hips": (0.123, 1.235, -0.346)}, + } + + +def test_body_tracking_monitor_logs_first_resolved_joint_once( + monitor: BodyTrackingMonitor, + mocker, +) -> None: + mocker.patch( + "dimos.teleop.webxr.body_tracking_monitor.time.monotonic", + side_effect=[monitor._report_started_at + 1.0, monitor._report_started_at + 2.0], + ) + info = mocker.patch("dimos.teleop.webxr.body_tracking_monitor.logger.info") + snapshot = BodyTrackingSnapshot(1.0, "local-floor", {"hips": Pose()}) + + monitor._on_body_tracking(snapshot) + monitor._on_body_tracking(snapshot) + + info.assert_called_once_with( + "WebXR body tracking acquired", + reference_space="local-floor", + resolved_joint_count=1, + ) + + +def test_body_tracking_monitor_warns_when_required_heartbeat_has_no_body( + monitor: BodyTrackingMonitor, + mocker, +) -> None: + mocker.patch( + "dimos.teleop.webxr.body_tracking_monitor.time.monotonic", + return_value=monitor._report_started_at + 5.0, + ) + warning = mocker.patch("dimos.teleop.webxr.body_tracking_monitor.logger.warning") + + monitor._on_body_tracking(BodyTrackingSnapshot(1.0, "local-floor", None)) + + warning.assert_called_once_with( + "WebXR body tracking has no resolved joints", + snapshot_rate_hz=0.2, + state="unavailable", + reference_space="local-floor", + resolved_joint_count=0, + resolved_joint_ever_seen=False, + joint_positions={}, + ) + + +def test_body_tracking_monitor_subscribes_during_start( + monitor: BodyTrackingMonitor, + mocker, +) -> None: + subscribe = mocker.patch.object( + monitor.body_tracking, + "subscribe", + return_value=lambda: None, + ) + + monitor.start() + + subscribe.assert_called_once_with(monitor._on_body_tracking) diff --git a/dimos/teleop/webxr/test_module.py b/dimos/teleop/webxr/test_module.py index 18ff2de978..b59afe08d5 100644 --- a/dimos/teleop/webxr/test_module.py +++ b/dimos/teleop/webxr/test_module.py @@ -18,11 +18,13 @@ from types import SimpleNamespace from typing import Any +from fastapi.testclient import TestClient import pytest import pytest_mock from dimos.imitation.collection.episode_monitor import EpisodeStatus from dimos.msgs.geometry_msgs.PoseStamped import PoseStamped +from dimos.teleop.webxr.body_tracking import BodyTrackingSnapshot from dimos.teleop.webxr.controller_types import ( Buttons, Hand, @@ -31,6 +33,7 @@ ) from dimos.teleop.webxr.extensions import ArmTeleopModule, Go2TeleopModule, HandTeleopModule from dimos.teleop.webxr.module import WebXRTeleopModule, _ws_send_text +from dimos.web.robot_web_interface import RobotWebInterface @pytest.fixture @@ -286,6 +289,71 @@ def test_go2_stale_input_publishes_zero_velocity(mocker: pytest_mock.MockerFixtu module.stop() +def test_default_webxr_config_does_not_request_body_tracking( + module: WebXRTeleopModule, +) -> None: + assert module._webxr_client_config() == { + "body_tracking_mode": "off", + "session_modes": ["immersive-ar", "immersive-vr"], + "session_options": { + "requiredFeatures": ["local-floor"], + "optionalFeatures": ["hand-tracking"], + }, + } + + +@pytest.mark.parametrize( + ("mode", "session_modes", "required_features", "optional_features"), + [ + ( + "optional", + ["immersive-ar", "immersive-vr"], + ["local-floor"], + ["hand-tracking", "bounded-floor", "body-tracking"], + ), + ( + "required", + ["immersive-ar"], + ["local-floor", "body-tracking"], + ["hand-tracking", "bounded-floor"], + ), + ], +) +def test_enabled_webxr_config_requests_body_tracking( + mode, + session_modes, + required_features, + optional_features, +) -> None: + module = WebXRTeleopModule(body_tracking_mode=mode) + try: + assert module._webxr_client_config() == { + "body_tracking_mode": mode, + "session_modes": session_modes, + "session_options": { + "requiredFeatures": required_features, + "optionalFeatures": optional_features, + }, + } + finally: + module.stop() + + +def test_webxr_config_route_exposes_body_tracking_mode() -> None: + module = WebXRTeleopModule(body_tracking_mode="required") + module._web_server = RobotWebInterface(host="127.0.0.1", port=9443) + module._setup_routes() + + try: + with TestClient(module._web_server.app) as client: + response = client.get("/teleop/config") + + assert response.status_code == 200 + assert response.json() == module._webxr_client_config() + finally: + module.stop() + + def test_go2_malformed_joy_clears_stale_state_and_publishes_zero_velocity( mocker: pytest_mock.MockerFixture, ) -> None: @@ -309,6 +377,22 @@ def test_go2_malformed_joy_clears_stale_state_and_publishes_zero_velocity( module.stop() +def test_webxr_body_reader_is_served_as_javascript() -> None: + module = WebXRTeleopModule() + module._web_server = RobotWebInterface(host="127.0.0.1", port=9443) + module._setup_routes() + + try: + with TestClient(module._web_server.app) as client: + response = client.get("/static/webxr_body.mjs") + + assert response.status_code == 200 + assert response.headers["content-type"].startswith("text/javascript") + assert "export function captureBody" in response.text + finally: + module.stop() + + def test_go2_unknown_controller_identity_publishes_zero_velocity( mocker: pytest_mock.MockerFixture, ) -> None: @@ -332,6 +416,61 @@ def test_go2_unknown_controller_identity_publishes_zero_velocity( module.stop() +def test_text_body_tracking_snapshot_is_published( + module: WebXRTeleopModule, + mocker, +) -> None: + publish = mocker.patch.object(module.body_tracking, "publish") + payload = json.dumps( + { + "type": "body_tracking_snapshot", + "capture_time_s": 3.0, + "frame_id": "bounded-floor", + "joints": { + "hips": { + "position": [1.0, 2.0, 3.0], + "orientation": [0.0, 0.0, 0.0, 1.0], + } + }, + } + ) + + accepted = module._dispatch_text_message(payload) + + assert accepted + snapshot = publish.call_args.args[0] + assert isinstance(snapshot, BodyTrackingSnapshot) + assert snapshot.frame_id == "bounded-floor" + assert snapshot.joints is not None + assert snapshot.joints["hips"].position.to_list() == [1.0, 2.0, 3.0] + + +def test_malformed_text_message_is_dropped( + module: WebXRTeleopModule, + mocker, +) -> None: + publish = mocker.patch.object(module.body_tracking, "publish") + + accepted = module._dispatch_text_message('{"type": "unknown"}') + + assert not accepted + publish.assert_not_called() + + +def test_binary_pose_dispatch_remains_on_existing_decoder( + module: WebXRTeleopModule, + mocker, +) -> None: + body_publish = mocker.patch.object(module.body_tracking, "publish") + pose = PoseStamped(ts=1.0, frame_id="left", position=[1.0, 2.0, 3.0]) + + accepted = module._dispatch_binary_message(pose.lcm_encode()) + + assert accepted + assert module._current_poses[Hand.LEFT] is not None + body_publish.assert_not_called() + + def test_translation_scale_changes_pose_delta(module: WebXRTeleopModule) -> None: module._initial_poses[Hand.RIGHT] = PoseStamped(position=[1.0, 2.0, 3.0]) module._current_poses[Hand.RIGHT] = PoseStamped(position=[1.2, 1.5, 4.0]) diff --git a/dimos/teleop/webxr/web/static/teleop.js b/dimos/teleop/webxr/web/static/teleop.js index bc79d375fd..2920733a23 100644 --- a/dimos/teleop/webxr/web/static/teleop.js +++ b/dimos/teleop/webxr/web/static/teleop.js @@ -5,14 +5,19 @@ window.onerror = (msg, url, line, col, error) => { }; import { geometry_msgs, std_msgs, sensor_msgs } from "https://esm.sh/jsr/@dimos/msgs@0.1.4"; +import { captureBody } from "./webxr_body.mjs"; // WebSocket and WebXR state let ws = null; let xrSession = null; let xrRefSpace = null; +let xrBodyRefSpace = null; +let xrBodyRefSpaceType = null; let gl = null; let lastSendTime = 0; const sendInterval = 1000 / 80; // ~80Hz target +let webXRClientConfig = null; +const sessionModeSupport = new Map(); const handSelectActive = new Map(); const GRIPPER_PINCH_DISTANCE_METERS = 0.04; @@ -65,6 +70,20 @@ function setStatus(msg) { statusEl.textContent = msg; } +async function loadWebXRClientConfig() { + const response = await fetch('/teleop/config', { cache: 'no-store' }); + if (!response.ok) { + throw new Error(`Failed to load teleop configuration: HTTP ${response.status}`); + } + return response.json(); +} + +function describeSessionRequestError(mode, error) { + const name = error?.name || 'Error'; + const message = error?.message || String(error); + return `${mode} (${name}: ${message})`; +} + // WebSocket setup (LCM bridge) function setupWebSocket() { return new Promise((resolve, reject) => { @@ -89,7 +108,7 @@ function setupWebSocket() { ws.onclose = () => { hudOffline = true; hudDirty = true; - setStatus('WebSocket closed'); + if (xrSession) setStatus('WebSocket closed'); }; // Defer revoking the previous blob URL by one message — revoking // immediately after setting src can race with the browser's load @@ -466,13 +485,12 @@ function sendJoy(handedness, axes, buttons) { } // Send raw controller and wrist tracking data (no processing - done in Python) -function processTracking(frame) { +function processTracking(time, frame) { // Rate limit tracking data - const now = performance.now(); - if (now - lastSendTime < sendInterval) { + if (time - lastSendTime < sendInterval) { return; } - lastSendTime = now; + lastSendTime = time; // Process controller and hand input sources. for (const inputSource of frame.session.inputSources) { @@ -540,14 +558,27 @@ function processTracking(frame) { sendJoy(handedness, axes, buttons); } } + + if (webXRClientConfig.body_tracking_mode !== 'off') { + const joints = captureBody(frame, xrBodyRefSpace); + const shouldSend = joints !== null || webXRClientConfig.body_tracking_mode === 'required'; + if (shouldSend && ws && ws.readyState === WebSocket.OPEN) { + ws.send(JSON.stringify({ + type: 'body_tracking_snapshot', + capture_time_s: (performance.timeOrigin + time) / 1000, + frame_id: xrBodyRefSpaceType, + joints, + })); + } + } } // WebXR render loop -function onXRFrame(_time, frame) { +function onXRFrame(time, frame) { if (!xrSession) return; xrSession.requestAnimationFrame(onXRFrame); // Process and send tracking data - processTracking(frame); + processTracking(time, frame); const glLayer = xrSession.renderState.baseLayer; gl.bindFramebuffer(gl.FRAMEBUFFER, glLayer.framebuffer); @@ -572,31 +603,32 @@ function onXRFrame(_time, frame) { } // Start an immersive WebXR session with passthrough when available. -async function startWebXRSession() { +async function startWebXRSession(clientConfig) { try { setStatus('Initializing WebGL...'); initGL(); setStatus('Requesting WebXR session...'); - // Try immersive-ar first (true passthrough), fall back to immersive-vr let session = null; - try { - session = await navigator.xr.requestSession('immersive-ar', { - requiredFeatures: ['local-floor'], - optionalFeatures: ['hand-tracking'] - }); - console.log('Started immersive-ar session (passthrough)'); - } catch (arError) { - console.log('immersive-ar not available, trying immersive-vr'); - session = await navigator.xr.requestSession('immersive-vr', { - requiredFeatures: ['local-floor'], - optionalFeatures: ['hand-tracking'] - }); - console.log('Started immersive-vr session'); + const failures = []; + for (const mode of clientConfig.session_modes) { + try { + session = await navigator.xr.requestSession(mode, clientConfig.session_options); + console.log(`Started ${mode} session`); + break; + } catch (error) { + const failure = describeSessionRequestError(mode, error); + failures.push(failure); + console.warn(`WebXR session request failed: ${failure}`); + } + } + if (!session) { + throw new Error(`WebXR session request failed: ${failures.join('; ')}`); } xrSession = session; hudPlaced = false; + lastSendTime = 0; // Setup WebGL layer const glLayer = new XRWebGLLayer(session, gl); @@ -607,7 +639,18 @@ async function startWebXRSession() { // Get reference space xrRefSpace = await session.requestReferenceSpace('local-floor'); - setStatus('WebXR active'); + if (clientConfig.body_tracking_mode !== 'off') { + try { + xrBodyRefSpace = await session.requestReferenceSpace('bounded-floor'); + xrBodyRefSpaceType = 'bounded-floor'; + } catch (error) { + console.warn('bounded-floor unavailable; using local-floor for body poses', error); + xrBodyRefSpace = xrRefSpace; + xrBodyRefSpaceType = 'local-floor'; + } + } + + setStatus(`WebXR active (${session.mode})`); // Session event handlers session.addEventListener('end', () => { @@ -615,6 +658,8 @@ async function startWebXRSession() { handSelectActive.clear(); hudPlaced = false; xrSession = null; + xrBodyRefSpace = null; + xrBodyRefSpaceType = null; window.disconnect(); }); @@ -650,19 +695,26 @@ window.connect = async function() { if (!navigator.xr) { throw new Error('WebXR not supported. Use a WebXR-capable browser.'); } + if (!webXRClientConfig) { + throw new Error('WebXR configuration is unavailable. Reload the page and try again.'); + } // Setup WebSocket await setupWebSocket(); // Start WebXR - await startWebXRSession(); + await startWebXRSession(webXRClientConfig); // Update UI connectBtn.classList.add('hidden'); disconnectBtn.classList.remove('hidden'); } catch (error) { - setStatus('Connection failed'); + const message = error?.message || String(error); + const failedWebSocket = ws; + ws = null; + if (failedWebSocket) failedWebSocket.close(); + setStatus(`Connection failed: ${message}`); console.error('Connection error:', error); connectBtn.disabled = false; } @@ -698,15 +750,22 @@ window.addEventListener('load', async () => { } try { - // Check for immersive AR (passthrough) or VR session support. - const arSupported = await navigator.xr.isSessionSupported('immersive-ar').catch(() => false); - const vrSupported = await navigator.xr.isSessionSupported('immersive-vr').catch(() => false); - - if (!arSupported && !vrSupported) { - setStatus('Immersive WebXR not supported'); + webXRClientConfig = await loadWebXRClientConfig(); + await Promise.all(webXRClientConfig.session_modes.map(async (mode) => { + const supported = await navigator.xr.isSessionSupported(mode).catch(() => false); + sessionModeSupport.set(mode, supported); + })); + + const supported = webXRClientConfig.session_modes.some( + (mode) => sessionModeSupport.get(mode), + ); + if (!supported) { + setStatus(`Session modes unsupported: ${webXRClientConfig.session_modes.join(', ')}`); connectBtn.disabled = true; } } catch (error) { - console.error('WebXR check failed:', error); + setStatus(error?.message || String(error)); + connectBtn.disabled = true; + console.error('WebXR setup failed:', error); } }); diff --git a/dimos/teleop/webxr/web/static/webxr_body.mjs b/dimos/teleop/webxr/web/static/webxr_body.mjs new file mode 100644 index 0000000000..68b57e1ce9 --- /dev/null +++ b/dimos/teleop/webxr/web/static/webxr_body.mjs @@ -0,0 +1,20 @@ +// Capture every body-joint pose that resolves in this animation frame. +// A missing body source is different from a present source with no usable poses. +export function captureBody(frame, referenceSpace) { + const body = frame.body; + if (!body) return null; + + const joints = {}; + for (const [jointName, jointSpace] of body) { + const pose = frame.getPose(jointSpace, referenceSpace); + if (!pose) continue; + + const position = pose.transform.position; + const orientation = pose.transform.orientation; + joints[jointName] = { + position: [position.x, position.y, position.z], + orientation: [orientation.x, orientation.y, orientation.z, orientation.w], + }; + } + return joints; +} diff --git a/docs/research/pico-webxr-body-tracking.md b/docs/research/pico-webxr-body-tracking.md new file mode 100644 index 0000000000..d32cc82443 --- /dev/null +++ b/docs/research/pico-webxr-body-tracking.md @@ -0,0 +1,154 @@ +# PICO WebXR body tracking handoff + +Research verified on 2026-08-24 with a PICO 4 Ultra and Motion Trackers. + +## Goal + +The WebXR teleoperation module exposes reusable body-joint poses without +changing its controller protocol or robot-facing behavior. It provides one +output: + +```python skip +body_tracking: Out[BodyTrackingSnapshot] +``` + +The first consumer is an API-test monitor. It proves that PICO Browser can send +Motion Tracker body poses to dimOS. It does not retarget a robot or convert the +poses to SMPL. + +## Verified native path + +```text +PICO Motion Trackers + | + v +PICO Browser WebXR session with "body-tracking" + | + v +XRFrame.body: joint name -> XRSpace + | + v +XRFrame.getPose(jointSpace, bodyReferenceSpace) + | + v +named WebXR joint poses +``` + +The updated headset successfully displayed moving joints in the +[Babylon.js body-tracking testbed](https://drumath2237.github.io/babylon-body-tracking-testbed/). +Its implementation reads `XRFrame.body`, resolves each joint independently, +and keeps every pose that resolves. This behavior matters: one unavailable +joint must not discard the entire body frame. + +The WebXR Body Tracking specification defines `body-tracking` as a session +feature for `immersive-ar` and `immersive-vr`. A session that did not receive +that feature returns `null` from `XRFrame.body`. See the +[initialization algorithm](https://immersive-web.github.io/body-tracking/#initialization) +and [privacy requirements](https://immersive-web.github.io/body-tracking/#privacy-security). + +## Minimal API + +The module publishes a small, device-neutral value type: + +```python skip +@dataclass(frozen=True) +class BodyTrackingSnapshot: + capture_time_s: float + frame_id: str + joints: dict[str, Pose] | None +``` + +The values have these meanings: + +| Value | Meaning | +|---|---| +| `joints is None` | `XRFrame.body` was unavailable. | +| `joints == {}` | A body source existed, but no joint pose resolved. | +| missing key | That individual joint did not resolve in this frame. | +| `frame_id` | The WebXR reference-space type used for every pose. | + +Keep browser-provided joint names. Do not impose a fixed joint order or an +SMPL skeleton in this module. A downstream adapter can map these reusable poses +to SONIC, SMPL, visualization, recording, or another consumer. + +## Integration approach + +Preserve the existing binary WebSocket messages: + +```text +PoseStamped / Joy -> existing decoder -> existing controller outputs +``` + +Body snapshots use a separate JSON message on the same WebSocket. The server +accepts binary controller messages and this one text-message type. It publishes +decoded snapshots through `body_tracking`; it does not combine viewer, +controller, hand, and body data into an aggregate frame. + +Capture body poses in the existing WebXR animation loop: + +1. Leave body tracking off for normal teleoperation so existing sessions do + not request access to privacy-sensitive body data. +2. In optional mode, request `body-tracking` without changing the existing + AR-to-VR fallback. In required mode, require the feature in `immersive-ar` + and report session-request failure instead of falling back to VR. +3. Request `bounded-floor` for body poses and fall back to the existing + `local-floor` space when unavailable. Keep controller poses in their current + `local-floor` space. +4. Iterate the map returned by `frame.body`. +5. Call `frame.getPose(jointSpace, bodyReferenceSpace)` for each joint. +6. Omit only the joints whose poses do not resolve. +7. Convert the XR animation-frame timestamp to Unix seconds with + `performance.timeOrigin`, then send snapshots at the existing tracking + cadence. In required mode, also send `joints: null` so the API-test monitor + can distinguish a live session from one that has produced no body messages. + +Use one explicit module setting: + +```python skip +body_tracking_mode: Literal["off", "optional", "required"] = "off" +``` + +| Mode | Session behavior | Missing body source | +|---|---|---| +| `off` | Do not request `body-tracking`; preserve existing teleoperation. | No body messages. | +| `optional` | Request the feature and preserve AR-to-VR fallback. | No body messages until a source exists. | +| `required` | Require the feature in `immersive-ar`; do not fall back to VR. | Send `joints: null` heartbeats. | + +The `off` default avoids a new consent prompt in every existing WebXR +blueprint. The dedicated `demo-pico-body-tracking` blueprint selects +`required` and connects `body_tracking` to a live health monitor over +`pLCMTransport`. Run it with: + +```bash +dimos run demo-pico-body-tracking +``` + +The monitor declares success when it receives any non-empty joint map. It logs +the snapshot rate, reference space, joint count, and selected joint positions +without requiring a fixed PICO skeleton. + +## Acceptance checks + +- Existing controller `PoseStamped`, `Joy`, engagement, timeout, and robot + output tests continue to pass unchanged. +- A body JSON message produces one `BodyTrackingSnapshot` with the same joint + names, positions, orientations, capture time, and reference-space ID. +- Null, empty, partially resolved, and malformed body messages have explicit + tests. +- Normal teleoperation leaves body tracking off and retains its current + AR-to-VR fallback without requesting new consent. +- Optional mode requests body tracking while retaining AR-to-VR fallback and + suppresses null snapshots. +- Required mode requests `immersive-ar` with `body-tracking` required and shows + the browser rejection when the feature cannot be granted. +- The API-test blueprint logs success after the first resolved joint, then + reports snapshot rate, joint count, and selected joint positions from the + physical PICO setup. + +## Out of scope + +- `OperatorTrackingFrame` or another aggregate operator schema +- controller protocol replacement +- fixed joint arrays or emulated-position quality metadata +- SMPL/SONIC conversion or robot retargeting +- production recording and visualization From 3d49b9a099855f0d2c2cd6243a6bfc545502b934 Mon Sep 17 00:00:00 2001 From: cc <55869557+TomCC7@users.noreply.github.com> Date: Wed, 26 Aug 2026 02:56:22 -0400 Subject: [PATCH 47/57] Delete docs/research/pico-webxr-body-tracking.md --- docs/research/pico-webxr-body-tracking.md | 154 ---------------------- 1 file changed, 154 deletions(-) delete mode 100644 docs/research/pico-webxr-body-tracking.md diff --git a/docs/research/pico-webxr-body-tracking.md b/docs/research/pico-webxr-body-tracking.md deleted file mode 100644 index d32cc82443..0000000000 --- a/docs/research/pico-webxr-body-tracking.md +++ /dev/null @@ -1,154 +0,0 @@ -# PICO WebXR body tracking handoff - -Research verified on 2026-08-24 with a PICO 4 Ultra and Motion Trackers. - -## Goal - -The WebXR teleoperation module exposes reusable body-joint poses without -changing its controller protocol or robot-facing behavior. It provides one -output: - -```python skip -body_tracking: Out[BodyTrackingSnapshot] -``` - -The first consumer is an API-test monitor. It proves that PICO Browser can send -Motion Tracker body poses to dimOS. It does not retarget a robot or convert the -poses to SMPL. - -## Verified native path - -```text -PICO Motion Trackers - | - v -PICO Browser WebXR session with "body-tracking" - | - v -XRFrame.body: joint name -> XRSpace - | - v -XRFrame.getPose(jointSpace, bodyReferenceSpace) - | - v -named WebXR joint poses -``` - -The updated headset successfully displayed moving joints in the -[Babylon.js body-tracking testbed](https://drumath2237.github.io/babylon-body-tracking-testbed/). -Its implementation reads `XRFrame.body`, resolves each joint independently, -and keeps every pose that resolves. This behavior matters: one unavailable -joint must not discard the entire body frame. - -The WebXR Body Tracking specification defines `body-tracking` as a session -feature for `immersive-ar` and `immersive-vr`. A session that did not receive -that feature returns `null` from `XRFrame.body`. See the -[initialization algorithm](https://immersive-web.github.io/body-tracking/#initialization) -and [privacy requirements](https://immersive-web.github.io/body-tracking/#privacy-security). - -## Minimal API - -The module publishes a small, device-neutral value type: - -```python skip -@dataclass(frozen=True) -class BodyTrackingSnapshot: - capture_time_s: float - frame_id: str - joints: dict[str, Pose] | None -``` - -The values have these meanings: - -| Value | Meaning | -|---|---| -| `joints is None` | `XRFrame.body` was unavailable. | -| `joints == {}` | A body source existed, but no joint pose resolved. | -| missing key | That individual joint did not resolve in this frame. | -| `frame_id` | The WebXR reference-space type used for every pose. | - -Keep browser-provided joint names. Do not impose a fixed joint order or an -SMPL skeleton in this module. A downstream adapter can map these reusable poses -to SONIC, SMPL, visualization, recording, or another consumer. - -## Integration approach - -Preserve the existing binary WebSocket messages: - -```text -PoseStamped / Joy -> existing decoder -> existing controller outputs -``` - -Body snapshots use a separate JSON message on the same WebSocket. The server -accepts binary controller messages and this one text-message type. It publishes -decoded snapshots through `body_tracking`; it does not combine viewer, -controller, hand, and body data into an aggregate frame. - -Capture body poses in the existing WebXR animation loop: - -1. Leave body tracking off for normal teleoperation so existing sessions do - not request access to privacy-sensitive body data. -2. In optional mode, request `body-tracking` without changing the existing - AR-to-VR fallback. In required mode, require the feature in `immersive-ar` - and report session-request failure instead of falling back to VR. -3. Request `bounded-floor` for body poses and fall back to the existing - `local-floor` space when unavailable. Keep controller poses in their current - `local-floor` space. -4. Iterate the map returned by `frame.body`. -5. Call `frame.getPose(jointSpace, bodyReferenceSpace)` for each joint. -6. Omit only the joints whose poses do not resolve. -7. Convert the XR animation-frame timestamp to Unix seconds with - `performance.timeOrigin`, then send snapshots at the existing tracking - cadence. In required mode, also send `joints: null` so the API-test monitor - can distinguish a live session from one that has produced no body messages. - -Use one explicit module setting: - -```python skip -body_tracking_mode: Literal["off", "optional", "required"] = "off" -``` - -| Mode | Session behavior | Missing body source | -|---|---|---| -| `off` | Do not request `body-tracking`; preserve existing teleoperation. | No body messages. | -| `optional` | Request the feature and preserve AR-to-VR fallback. | No body messages until a source exists. | -| `required` | Require the feature in `immersive-ar`; do not fall back to VR. | Send `joints: null` heartbeats. | - -The `off` default avoids a new consent prompt in every existing WebXR -blueprint. The dedicated `demo-pico-body-tracking` blueprint selects -`required` and connects `body_tracking` to a live health monitor over -`pLCMTransport`. Run it with: - -```bash -dimos run demo-pico-body-tracking -``` - -The monitor declares success when it receives any non-empty joint map. It logs -the snapshot rate, reference space, joint count, and selected joint positions -without requiring a fixed PICO skeleton. - -## Acceptance checks - -- Existing controller `PoseStamped`, `Joy`, engagement, timeout, and robot - output tests continue to pass unchanged. -- A body JSON message produces one `BodyTrackingSnapshot` with the same joint - names, positions, orientations, capture time, and reference-space ID. -- Null, empty, partially resolved, and malformed body messages have explicit - tests. -- Normal teleoperation leaves body tracking off and retains its current - AR-to-VR fallback without requesting new consent. -- Optional mode requests body tracking while retaining AR-to-VR fallback and - suppresses null snapshots. -- Required mode requests `immersive-ar` with `body-tracking` required and shows - the browser rejection when the feature cannot be granted. -- The API-test blueprint logs success after the first resolved joint, then - reports snapshot rate, joint count, and selected joint positions from the - physical PICO setup. - -## Out of scope - -- `OperatorTrackingFrame` or another aggregate operator schema -- controller protocol replacement -- fixed joint arrays or emulated-position quality metadata -- SMPL/SONIC conversion or robot retargeting -- production recording and visualization From 6580b8b6c6875a4ac9593e6f0476a5fe936190d3 Mon Sep 17 00:00:00 2001 From: cc Date: Wed, 26 Aug 2026 10:42:43 -0700 Subject: [PATCH 48/57] fix(teleop): accept PICO controller button layout PICO WebXR omits its platform-reserved menu button, so controller packets contain six buttons. Treat the trailing menu slot as optional instead of rejecting otherwise valid joystick input. --- dimos/teleop/webxr/README.md | 3 ++- dimos/teleop/webxr/controller_types.py | 10 +++++----- dimos/teleop/webxr/test_module.py | 23 +++++++++++++++++++++++ 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/dimos/teleop/webxr/README.md b/dimos/teleop/webxr/README.md index bbda7da705..f27f80ce7c 100644 --- a/dimos/teleop/webxr/README.md +++ b/dimos/teleop/webxr/README.md @@ -97,7 +97,8 @@ entire session; both hands must engage again before commands resume. **Axes**: thumbstick X, thumbstick Y, trigger (analog), grip (analog) -**Buttons**: trigger, grip, touchpad, thumbstick, X/A, Y/B, menu +**Buttons**: trigger, grip, touchpad, thumbstick, X/A, Y/B, optional menu. WebXR +omits a platform-reserved menu button on devices such as PICO controllers. ## File Structure diff --git a/dimos/teleop/webxr/controller_types.py b/dimos/teleop/webxr/controller_types.py index 543368b103..1b2ded0abf 100644 --- a/dimos/teleop/webxr/controller_types.py +++ b/dimos/teleop/webxr/controller_types.py @@ -53,7 +53,7 @@ class WebXRControllerState: """ EXPECTED_AXES: ClassVar[int] = 4 - EXPECTED_BUTTONS: ClassVar[int] = 7 + MIN_BUTTONS: ClassVar[int] = 6 is_left: bool = True # Analog values (0.0-1.0) @@ -72,15 +72,15 @@ class WebXRControllerState: def from_joy(cls, joy: Joy, is_left: bool = True) -> "WebXRControllerState": """Create WebXRControllerState from Joy message. Expected axes: [thumbstick_x, thumbstick_y, trigger_analog, grip_analog] - Expected buttons: [trigger, grip, touchpad, thumbstick, X/A, Y/B, menu] + Expected buttons: [trigger, grip, touchpad, thumbstick, X/A, Y/B, optional menu] Raises: ValueError: If Joy message doesn't have expected WebXR controller format. """ buttons = joy.buttons or [] axes = joy.axes or [] - if len(buttons) < cls.EXPECTED_BUTTONS: - raise ValueError(f"Expected {cls.EXPECTED_BUTTONS} buttons, got {len(buttons)}") + if len(buttons) < cls.MIN_BUTTONS: + raise ValueError(f"Expected at least {cls.MIN_BUTTONS} buttons, got {len(buttons)}") if len(axes) < cls.EXPECTED_AXES: raise ValueError(f"Expected {cls.EXPECTED_AXES} axes, got {len(axes)}") @@ -92,7 +92,7 @@ def from_joy(cls, joy: Joy, is_left: bool = True) -> "WebXRControllerState": thumbstick_press=buttons[3] > 0.5, primary=buttons[4] > 0.5, secondary=buttons[5] > 0.5, - menu=buttons[6] > 0.5, + menu=len(buttons) > 6 and buttons[6] > 0.5, thumbstick=ThumbstickState(x=float(axes[0]), y=float(axes[1])), ) diff --git a/dimos/teleop/webxr/test_module.py b/dimos/teleop/webxr/test_module.py index b59afe08d5..d7f1eee00d 100644 --- a/dimos/teleop/webxr/test_module.py +++ b/dimos/teleop/webxr/test_module.py @@ -24,6 +24,7 @@ from dimos.imitation.collection.episode_monitor import EpisodeStatus from dimos.msgs.geometry_msgs.PoseStamped import PoseStamped +from dimos.msgs.sensor_msgs.Joy import Joy from dimos.teleop.webxr.body_tracking import BodyTrackingSnapshot from dimos.teleop.webxr.controller_types import ( Buttons, @@ -354,6 +355,28 @@ def test_webxr_config_route_exposes_body_tracking_mode() -> None: module.stop() +def test_go2_accepts_pico_six_button_joystick( + mocker: pytest_mock.MockerFixture, +) -> None: + module = Go2TeleopModule() + publish = mocker.patch.object(module.cmd_vel, "publish") + joy = Joy( + ts=1.0, + frame_id="left", + axes=[0.25, -0.75, 0.0, 0.0], + buttons=[0, 0, 0, 0, 0, 0], + ) + try: + assert module._on_joy_bytes(joy.lcm_encode()) is True + + twist = publish.call_args.args[0] + assert twist.linear.x == pytest.approx(0.75 * module.config.linear_speed) + assert twist.linear.y == pytest.approx(-0.25 * module.config.linear_speed) + assert twist.angular.z == 0.0 + finally: + module.stop() + + def test_go2_malformed_joy_clears_stale_state_and_publishes_zero_velocity( mocker: pytest_mock.MockerFixture, ) -> None: From 7fc9bd1769728b73c94a91435fd4526de98bf24a Mon Sep 17 00:00:00 2001 From: cc Date: Wed, 26 Aug 2026 12:15:00 -0700 Subject: [PATCH 49/57] fix(webxr): simplify PICO input handling --- dimos/teleop/webxr/README.md | 8 +++ dimos/teleop/webxr/blueprints.py | 7 +-- dimos/teleop/webxr/body_tracking.py | 53 +++++-------------- dimos/teleop/webxr/body_tracking_monitor.py | 23 +++----- dimos/teleop/webxr/controller_types.py | 3 -- dimos/teleop/webxr/module.py | 9 ++-- dimos/teleop/webxr/test_blueprints.py | 4 +- dimos/teleop/webxr/test_body_tracking.py | 21 ++++---- .../webxr/test_body_tracking_monitor.py | 38 ++++++++++--- dimos/teleop/webxr/test_module.py | 35 ++++++++---- 10 files changed, 102 insertions(+), 99 deletions(-) diff --git a/dimos/teleop/webxr/README.md b/dimos/teleop/webxr/README.md index f27f80ce7c..1c84fbdb00 100644 --- a/dimos/teleop/webxr/README.md +++ b/dimos/teleop/webxr/README.md @@ -100,6 +100,14 @@ entire session; both hands must engage again before commands resume. **Buttons**: trigger, grip, touchpad, thumbstick, X/A, Y/B, optional menu. WebXR omits a platform-reserved menu button on devices such as PICO controllers. +## Body Tracking Messages + +The WebSocket carries two frame formats. Controller poses and joystick state use +binary LCM messages. When body tracking is enabled, the browser sends JSON text +frames containing every joint resolved by the headset. A `null` joint map means +the body source is unavailable; an empty map means no joints resolved for that +frame. + ## File Structure ``` diff --git a/dimos/teleop/webxr/blueprints.py b/dimos/teleop/webxr/blueprints.py index 2a602907e9..b5b6176979 100644 --- a/dimos/teleop/webxr/blueprints.py +++ b/dimos/teleop/webxr/blueprints.py @@ -21,7 +21,7 @@ from dimos.constants import DEFAULT_CAPACITY_COLOR_IMAGE from dimos.core.coordination.blueprints import autoconnect -from dimos.core.transport import LCMTransport, pLCMTransport, pSHMTransport +from dimos.core.transport import LCMTransport, pSHMTransport from dimos.msgs.geometry_msgs.PoseStamped import PoseStamped from dimos.msgs.geometry_msgs.Twist import Twist from dimos.msgs.sensor_msgs.Image import Image @@ -33,7 +33,6 @@ coordinator_teleop_xarm7, ) from dimos.robot.unitree.go2.connection import GO2Connection -from dimos.teleop.webxr.body_tracking import BodyTrackingSnapshot from dimos.teleop.webxr.body_tracking_monitor import BodyTrackingMonitor from dimos.teleop.webxr.extensions import ( ArmTeleopModule, @@ -172,8 +171,4 @@ demo_pico_body_tracking = autoconnect( WebXRTeleopModule.blueprint(body_tracking_mode="required"), BodyTrackingMonitor.blueprint(), -).transports( - { - ("body_tracking", BodyTrackingSnapshot): pLCMTransport("/teleop/body_tracking"), - } ) diff --git a/dimos/teleop/webxr/body_tracking.py b/dimos/teleop/webxr/body_tracking.py index 80886bd825..c5a2ec38d6 100644 --- a/dimos/teleop/webxr/body_tracking.py +++ b/dimos/teleop/webxr/body_tracking.py @@ -14,14 +14,9 @@ """Body-joint snapshots received from a WebXR client.""" -from dataclasses import dataclass from typing import Annotated, Literal, TypeAlias -from pydantic import BaseModel, ConfigDict, Field, StringConstraints, ValidationError - -from dimos.msgs.geometry_msgs.Pose import Pose - -BODY_TRACKING_MESSAGE_TYPE = "body_tracking_snapshot" +from pydantic import BaseModel, ConfigDict, Field, StringConstraints BodyTrackingMode: TypeAlias = Literal["off", "optional", "required"] _FiniteFloat: TypeAlias = Annotated[float, Field(strict=True, allow_inf_nan=False)] @@ -31,47 +26,25 @@ ] -@dataclass(frozen=True) -class BodyTrackingSnapshot: - """Named body-joint poses captured in one WebXR reference space.""" - - capture_time_s: float - frame_id: str - joints: dict[str, Pose] | None +class BodyJointPose(BaseModel): + """One body joint's pose in the snapshot's WebXR reference space.""" - -class _WirePose(BaseModel): - model_config = ConfigDict(extra="forbid") + model_config = ConfigDict(extra="forbid", frozen=True) position: tuple[_FiniteFloat, _FiniteFloat, _FiniteFloat] orientation: tuple[_FiniteFloat, _FiniteFloat, _FiniteFloat, _FiniteFloat] -class _WireBodyTrackingSnapshot(BaseModel): - model_config = ConfigDict(extra="forbid") +class BodyTrackingSnapshot(BaseModel): + """Named body-joint poses captured in one WebXR reference space. + + ``joints=None`` means the body source is unavailable. An empty mapping + means the source is available but did not resolve any joints. + """ + + model_config = ConfigDict(extra="forbid", frozen=True) type: Literal["body_tracking_snapshot"] capture_time_s: _FiniteFloat frame_id: _NonEmptyString - joints: dict[_NonEmptyString, _WirePose] | None - - -def decode_body_tracking_snapshot(payload: str) -> BodyTrackingSnapshot: - """Decode and validate one JSON body-tracking snapshot.""" - try: - wire = _WireBodyTrackingSnapshot.model_validate_json(payload) - except ValidationError as exc: - raise ValueError("invalid body-tracking snapshot") from exc - - joints = None - if wire.joints is not None: - joints = { - name: Pose(position=pose.position, orientation=pose.orientation) - for name, pose in wire.joints.items() - } - - return BodyTrackingSnapshot( - capture_time_s=wire.capture_time_s, - frame_id=wire.frame_id, - joints=joints, - ) + joints: dict[_NonEmptyString, BodyJointPose] | None diff --git a/dimos/teleop/webxr/body_tracking_monitor.py b/dimos/teleop/webxr/body_tracking_monitor.py index 017fe401ff..421504eb03 100644 --- a/dimos/teleop/webxr/body_tracking_monitor.py +++ b/dimos/teleop/webxr/body_tracking_monitor.py @@ -28,13 +28,6 @@ logger = setup_logger() REPORT_INTERVAL_S = 5.0 -INSPECTED_BODY_JOINTS = ( - "hips", - "left-hand-wrist", - "right-hand-wrist", - "left-foot-ankle", - "right-foot-ankle", -) def body_tracking_summary( @@ -48,14 +41,14 @@ def body_tracking_summary( state = "unavailable" if joints is None else "empty" if not joints else "tracking" positions: dict[str, tuple[float, float, float]] = {} if joints: - for name in INSPECTED_BODY_JOINTS: - pose = joints.get(name) - if pose is not None: - positions[name] = ( - round(pose.position.x, 3), - round(pose.position.y, 3), - round(pose.position.z, 3), - ) + positions = { + name: ( + round(pose.position[0], 3), + round(pose.position[1], 3), + round(pose.position[2], 3), + ) + for name, pose in joints.items() + } return { "snapshot_rate_hz": round(snapshot_rate_hz, 1), diff --git a/dimos/teleop/webxr/controller_types.py b/dimos/teleop/webxr/controller_types.py index 1b2ded0abf..668a97a3b1 100644 --- a/dimos/teleop/webxr/controller_types.py +++ b/dimos/teleop/webxr/controller_types.py @@ -53,7 +53,6 @@ class WebXRControllerState: """ EXPECTED_AXES: ClassVar[int] = 4 - MIN_BUTTONS: ClassVar[int] = 6 is_left: bool = True # Analog values (0.0-1.0) @@ -79,8 +78,6 @@ def from_joy(cls, joy: Joy, is_left: bool = True) -> "WebXRControllerState": buttons = joy.buttons or [] axes = joy.axes or [] - if len(buttons) < cls.MIN_BUTTONS: - raise ValueError(f"Expected at least {cls.MIN_BUTTONS} buttons, got {len(buttons)}") if len(axes) < cls.EXPECTED_AXES: raise ValueError(f"Expected {cls.EXPECTED_AXES} axes, got {len(axes)}") diff --git a/dimos/teleop/webxr/module.py b/dimos/teleop/webxr/module.py index 53c8b1d809..ca6c689a2c 100644 --- a/dimos/teleop/webxr/module.py +++ b/dimos/teleop/webxr/module.py @@ -35,7 +35,7 @@ from fastapi import WebSocket, WebSocketDisconnect from fastapi.responses import HTMLResponse from fastapi.staticfiles import StaticFiles -from pydantic import Field +from pydantic import Field, ValidationError from reactivex.disposable import Disposable from dimos.constants import DIMOS_PROJECT_ROOT @@ -49,7 +49,6 @@ from dimos.teleop.webxr.body_tracking import ( BodyTrackingMode, BodyTrackingSnapshot, - decode_body_tracking_snapshot, ) # Hand is re-exported for callers; it lives in controller_types. @@ -237,9 +236,9 @@ def _dispatch_binary_message(self, data: bytes) -> bool: def _dispatch_text_message(self, payload: str) -> bool: try: - snapshot = decode_body_tracking_snapshot(payload) - except ValueError as exc: - logger.warning("Dropping malformed WebXR text message", error=str(exc)) + snapshot = BodyTrackingSnapshot.model_validate_json(payload) + except ValidationError as exc: + logger.warning("Dropping malformed WebXR body snapshot", error=str(exc)) return False self.body_tracking.publish(snapshot) return True diff --git a/dimos/teleop/webxr/test_blueprints.py b/dimos/teleop/webxr/test_blueprints.py index a9cb4a4ea5..d23b2d53be 100644 --- a/dimos/teleop/webxr/test_blueprints.py +++ b/dimos/teleop/webxr/test_blueprints.py @@ -112,8 +112,6 @@ def test_pico_body_tracking_demo_connects_required_webxr_to_monitor() -> None: webxr = next( atom for atom in demo_pico_body_tracking.blueprints if atom.module is WebXRTeleopModule ) - transport = demo_pico_body_tracking.transport_map[("body_tracking", BodyTrackingSnapshot)] - assert modules == {WebXRTeleopModule, BodyTrackingMonitor} assert webxr.kwargs["body_tracking_mode"] == "required" - assert transport.channel == "/teleop/body_tracking" + assert ("body_tracking", BodyTrackingSnapshot) not in demo_pico_body_tracking.transport_map diff --git a/dimos/teleop/webxr/test_body_tracking.py b/dimos/teleop/webxr/test_body_tracking.py index 312d0cc207..b7109069fb 100644 --- a/dimos/teleop/webxr/test_body_tracking.py +++ b/dimos/teleop/webxr/test_body_tracking.py @@ -14,9 +14,10 @@ import json +from pydantic import ValidationError import pytest -from dimos.teleop.webxr.body_tracking import decode_body_tracking_snapshot +from dimos.teleop.webxr.body_tracking import BodyTrackingSnapshot def _payload(*, joints) -> str: @@ -30,8 +31,8 @@ def _payload(*, joints) -> str: ) -def test_decode_body_tracking_snapshot_preserves_named_poses() -> None: - snapshot = decode_body_tracking_snapshot( +def test_body_tracking_snapshot_validates_named_poses() -> None: + snapshot = BodyTrackingSnapshot.model_validate_json( _payload( joints={ "hips": { @@ -50,13 +51,13 @@ def test_decode_body_tracking_snapshot_preserves_named_poses() -> None: assert snapshot.frame_id == "bounded-floor" assert snapshot.joints is not None assert list(snapshot.joints) == ["hips", "left-foot-ankle"] - assert snapshot.joints["hips"].position.to_list() == [1.0, 2.0, 3.0] - assert snapshot.joints["hips"].orientation.to_list() == [0.1, 0.2, 0.3, 0.9] + assert snapshot.joints["hips"].position == (1.0, 2.0, 3.0) + assert snapshot.joints["hips"].orientation == (0.1, 0.2, 0.3, 0.9) @pytest.mark.parametrize("joints", [None, {}]) -def test_decode_body_tracking_snapshot_preserves_absence_state(joints) -> None: - snapshot = decode_body_tracking_snapshot(_payload(joints=joints)) +def test_body_tracking_snapshot_preserves_absence_state(joints) -> None: + snapshot = BodyTrackingSnapshot.model_validate_json(_payload(joints=joints)) assert snapshot.joints == joints @@ -82,6 +83,6 @@ def test_decode_body_tracking_snapshot_preserves_absence_state(joints) -> None: ), ], ) -def test_decode_body_tracking_snapshot_rejects_malformed_payloads(payload: str) -> None: - with pytest.raises(ValueError, match="invalid body-tracking snapshot"): - decode_body_tracking_snapshot(payload) +def test_body_tracking_snapshot_rejects_malformed_payloads(payload: str) -> None: + with pytest.raises(ValidationError): + BodyTrackingSnapshot.model_validate_json(payload) diff --git a/dimos/teleop/webxr/test_body_tracking_monitor.py b/dimos/teleop/webxr/test_body_tracking_monitor.py index 6752798c3e..7b57b01052 100644 --- a/dimos/teleop/webxr/test_body_tracking_monitor.py +++ b/dimos/teleop/webxr/test_body_tracking_monitor.py @@ -16,7 +16,6 @@ import pytest -from dimos.msgs.geometry_msgs.Pose import Pose from dimos.teleop.webxr.body_tracking import BodyTrackingSnapshot from dimos.teleop.webxr.body_tracking_monitor import ( BodyTrackingMonitor, @@ -35,11 +34,18 @@ def monitor() -> Iterator[BodyTrackingMonitor]: def test_body_tracking_summary_reports_best_effort_joint_positions() -> None: snapshot = BodyTrackingSnapshot( + type="body_tracking_snapshot", capture_time_s=10.0, frame_id="bounded-floor", joints={ - "hips": Pose(0.12345, 1.23456, -0.34567), - "vendor-extra-joint": Pose(3.0, 2.0, 1.0), + "hips": { + "position": (0.12345, 1.23456, -0.34567), + "orientation": (0.0, 0.0, 0.0, 1.0), + }, + "vendor-extra-joint": { + "position": (3.0, 2.0, 1.0), + "orientation": (0.0, 0.0, 0.0, 1.0), + }, }, ) @@ -55,7 +61,10 @@ def test_body_tracking_summary_reports_best_effort_joint_positions() -> None: "reference_space": "bounded-floor", "resolved_joint_count": 2, "resolved_joint_ever_seen": True, - "joint_positions": {"hips": (0.123, 1.235, -0.346)}, + "joint_positions": { + "hips": (0.123, 1.235, -0.346), + "vendor-extra-joint": (3.0, 2.0, 1.0), + }, } @@ -68,7 +77,17 @@ def test_body_tracking_monitor_logs_first_resolved_joint_once( side_effect=[monitor._report_started_at + 1.0, monitor._report_started_at + 2.0], ) info = mocker.patch("dimos.teleop.webxr.body_tracking_monitor.logger.info") - snapshot = BodyTrackingSnapshot(1.0, "local-floor", {"hips": Pose()}) + snapshot = BodyTrackingSnapshot( + type="body_tracking_snapshot", + capture_time_s=1.0, + frame_id="local-floor", + joints={ + "hips": { + "position": (0.0, 0.0, 0.0), + "orientation": (0.0, 0.0, 0.0, 1.0), + } + }, + ) monitor._on_body_tracking(snapshot) monitor._on_body_tracking(snapshot) @@ -90,7 +109,14 @@ def test_body_tracking_monitor_warns_when_required_heartbeat_has_no_body( ) warning = mocker.patch("dimos.teleop.webxr.body_tracking_monitor.logger.warning") - monitor._on_body_tracking(BodyTrackingSnapshot(1.0, "local-floor", None)) + monitor._on_body_tracking( + BodyTrackingSnapshot( + type="body_tracking_snapshot", + capture_time_s=1.0, + frame_id="local-floor", + joints=None, + ) + ) warning.assert_called_once_with( "WebXR body tracking has no resolved joints", diff --git a/dimos/teleop/webxr/test_module.py b/dimos/teleop/webxr/test_module.py index d7f1eee00d..3f6228013e 100644 --- a/dimos/teleop/webxr/test_module.py +++ b/dimos/teleop/webxr/test_module.py @@ -16,8 +16,9 @@ from collections.abc import Awaitable, Callable, Iterator import json from types import SimpleNamespace -from typing import Any +from typing import Any, cast +from fastapi import FastAPI from fastapi.testclient import TestClient import pytest import pytest_mock @@ -34,7 +35,6 @@ ) from dimos.teleop.webxr.extensions import ArmTeleopModule, Go2TeleopModule, HandTeleopModule from dimos.teleop.webxr.module import WebXRTeleopModule, _ws_send_text -from dimos.web.robot_web_interface import RobotWebInterface @pytest.fixture @@ -46,6 +46,17 @@ def module() -> Iterator[WebXRTeleopModule]: module.stop() +def _setup_test_app( + module: WebXRTeleopModule, + mocker: pytest_mock.MockerFixture, +) -> FastAPI: + app = FastAPI() + web_server = mocker.Mock(app=app) + module._web_server = cast("Any", web_server) + module._setup_routes() + return app + + def test_webxr_web_server_is_initialized_during_start( module: WebXRTeleopModule, mocker: pytest_mock.MockerFixture ) -> None: @@ -340,13 +351,14 @@ def test_enabled_webxr_config_requests_body_tracking( module.stop() -def test_webxr_config_route_exposes_body_tracking_mode() -> None: +def test_webxr_config_route_exposes_body_tracking_mode( + mocker: pytest_mock.MockerFixture, +) -> None: module = WebXRTeleopModule(body_tracking_mode="required") - module._web_server = RobotWebInterface(host="127.0.0.1", port=9443) - module._setup_routes() + app = _setup_test_app(module, mocker) try: - with TestClient(module._web_server.app) as client: + with TestClient(app) as client: response = client.get("/teleop/config") assert response.status_code == 200 @@ -400,13 +412,14 @@ def test_go2_malformed_joy_clears_stale_state_and_publishes_zero_velocity( module.stop() -def test_webxr_body_reader_is_served_as_javascript() -> None: +def test_webxr_body_reader_is_served_as_javascript( + mocker: pytest_mock.MockerFixture, +) -> None: module = WebXRTeleopModule() - module._web_server = RobotWebInterface(host="127.0.0.1", port=9443) - module._setup_routes() + app = _setup_test_app(module, mocker) try: - with TestClient(module._web_server.app) as client: + with TestClient(app) as client: response = client.get("/static/webxr_body.mjs") assert response.status_code == 200 @@ -465,7 +478,7 @@ def test_text_body_tracking_snapshot_is_published( assert isinstance(snapshot, BodyTrackingSnapshot) assert snapshot.frame_id == "bounded-floor" assert snapshot.joints is not None - assert snapshot.joints["hips"].position.to_list() == [1.0, 2.0, 3.0] + assert snapshot.joints["hips"].position == (1.0, 2.0, 3.0) def test_malformed_text_message_is_dropped( From 6bcf67dbef2a957cb9b8658e74b35e8edd6f0788 Mon Sep 17 00:00:00 2001 From: cc Date: Wed, 26 Aug 2026 14:08:03 -0700 Subject: [PATCH 50/57] test(webxr): cover mixed message dispatch --- .../webxr/test_body_tracking_monitor.py | 42 ++++++++++++++++++- dimos/teleop/webxr/test_module.py | 32 ++++++++++++++ 2 files changed, 73 insertions(+), 1 deletion(-) diff --git a/dimos/teleop/webxr/test_body_tracking_monitor.py b/dimos/teleop/webxr/test_body_tracking_monitor.py index 7b57b01052..cf068c6a94 100644 --- a/dimos/teleop/webxr/test_body_tracking_monitor.py +++ b/dimos/teleop/webxr/test_body_tracking_monitor.py @@ -15,8 +15,9 @@ from collections.abc import Iterator import pytest +import pytest_mock -from dimos.teleop.webxr.body_tracking import BodyTrackingSnapshot +from dimos.teleop.webxr.body_tracking import BodyJointPose, BodyTrackingSnapshot from dimos.teleop.webxr.body_tracking_monitor import ( BodyTrackingMonitor, body_tracking_summary, @@ -129,6 +130,45 @@ def test_body_tracking_monitor_warns_when_required_heartbeat_has_no_body( ) +def test_body_tracking_monitor_reports_healthy_tracking( + monitor: BodyTrackingMonitor, + mocker: pytest_mock.MockerFixture, +) -> None: + report_time = monitor._report_started_at + 5.0 + mocker.patch( + "dimos.teleop.webxr.body_tracking_monitor.time.monotonic", + return_value=report_time, + ) + info = mocker.patch("dimos.teleop.webxr.body_tracking_monitor.logger.info") + monitor._resolved_joint_ever_seen = True + + monitor._on_body_tracking( + BodyTrackingSnapshot( + type="body_tracking_snapshot", + capture_time_s=1.0, + frame_id="bounded-floor", + joints={ + "hips": BodyJointPose( + position=(1.0, 2.0, 3.0), + orientation=(0.0, 0.0, 0.0, 1.0), + ) + }, + ) + ) + + info.assert_called_once_with( + "WebXR body tracking health", + snapshot_rate_hz=0.2, + state="tracking", + reference_space="bounded-floor", + resolved_joint_count=1, + resolved_joint_ever_seen=True, + joint_positions={"hips": (1.0, 2.0, 3.0)}, + ) + assert monitor._report_started_at == report_time + assert monitor._snapshots_since_report == 0 + + def test_body_tracking_monitor_subscribes_during_start( monitor: BodyTrackingMonitor, mocker, diff --git a/dimos/teleop/webxr/test_module.py b/dimos/teleop/webxr/test_module.py index 3f6228013e..a964162953 100644 --- a/dimos/teleop/webxr/test_module.py +++ b/dimos/teleop/webxr/test_module.py @@ -232,6 +232,23 @@ def decorator(fn: Callable[[Any], Awaitable[None]]) -> Callable[[Any], Awaitable ws.receive_bytes.assert_not_awaited() +def test_websocket_dispatches_binary_and_text_messages( + module: WebXRTeleopModule, + mocker: pytest_mock.MockerFixture, +) -> None: + app = _setup_test_app(module, mocker) + dispatch_binary = mocker.patch.object(module, "_dispatch_binary_message") + dispatch_text = mocker.patch.object(module, "_dispatch_text_message") + + with TestClient(app) as client: + with client.websocket_connect("/ws") as websocket: + websocket.send_bytes(b"controller") + websocket.send_text('{"type":"body_tracking_snapshot"}') + + dispatch_binary.assert_called_once_with(b"controller") + dispatch_text.assert_called_once_with('{"type":"body_tracking_snapshot"}') + + def test_first_client_connection_rejects_stale_cached_state( module: WebXRTeleopModule, mocker: pytest_mock.MockerFixture ) -> None: @@ -507,6 +524,21 @@ def test_binary_pose_dispatch_remains_on_existing_decoder( body_publish.assert_not_called() +def test_unknown_binary_message_is_dropped( + module: WebXRTeleopModule, + mocker: pytest_mock.MockerFixture, +) -> None: + warning = mocker.patch("dimos.teleop.webxr.module.logger.warning") + + accepted = module._dispatch_binary_message(b"unknown-message") + + assert not accepted + warning.assert_called_once_with( + "Unknown WebXR message fingerprint", + fingerprint=b"unknown-".hex(), + ) + + def test_translation_scale_changes_pose_delta(module: WebXRTeleopModule) -> None: module._initial_poses[Hand.RIGHT] = PoseStamped(position=[1.0, 2.0, 3.0]) module._current_poses[Hand.RIGHT] = PoseStamped(position=[1.2, 1.5, 4.0]) From 82d7bc6e5aa750b66ab5bdbda96e7cda5fcb94e6 Mon Sep 17 00:00:00 2001 From: cc Date: Wed, 26 Aug 2026 14:29:46 -0700 Subject: [PATCH 51/57] fix(webxr): reject short controller packets --- dimos/teleop/webxr/controller_types.py | 5 ++++- dimos/teleop/webxr/test_module.py | 25 +++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/dimos/teleop/webxr/controller_types.py b/dimos/teleop/webxr/controller_types.py index 668a97a3b1..6a34d47840 100644 --- a/dimos/teleop/webxr/controller_types.py +++ b/dimos/teleop/webxr/controller_types.py @@ -49,10 +49,11 @@ class WebXRControllerState: 0: thumbstick X, 1: thumbstick Y, 2: trigger (analog), 3: grip (analog) Button indices (digital, 0 or 1): 0: trigger, 1: grip, 2: touchpad, 3: thumbstick, - 4: X/A, 5: Y/B, 6: menu + 4: X/A, 5: Y/B, 6: menu (optional) """ EXPECTED_AXES: ClassVar[int] = 4 + REQUIRED_BUTTONS: ClassVar[int] = 6 is_left: bool = True # Analog values (0.0-1.0) @@ -80,6 +81,8 @@ def from_joy(cls, joy: Joy, is_left: bool = True) -> "WebXRControllerState": if len(axes) < cls.EXPECTED_AXES: raise ValueError(f"Expected {cls.EXPECTED_AXES} axes, got {len(axes)}") + if len(buttons) < cls.REQUIRED_BUTTONS: + raise ValueError(f"Expected {cls.REQUIRED_BUTTONS} buttons, got {len(buttons)}") return cls( is_left=is_left, diff --git a/dimos/teleop/webxr/test_module.py b/dimos/teleop/webxr/test_module.py index a964162953..781fc6ea8d 100644 --- a/dimos/teleop/webxr/test_module.py +++ b/dimos/teleop/webxr/test_module.py @@ -406,6 +406,31 @@ def test_go2_accepts_pico_six_button_joystick( module.stop() +def test_go2_rejects_short_controller_packet_safely( + mocker: pytest_mock.MockerFixture, +) -> None: + module = Go2TeleopModule() + publish = mocker.patch.object(module.cmd_vel, "publish") + joy = Joy( + ts=1.0, + frame_id="left", + axes=[0.25, -0.75, 0.0, 0.0], + buttons=[0, 0, 0, 0, 0], + ) + module._controllers[Hand.LEFT] = WebXRControllerState(thumbstick=ThumbstickState(y=-1.0)) + try: + assert module._on_joy_bytes(joy.lcm_encode()) is False + + assert module._controllers[Hand.LEFT] is None + publish.assert_called_once() + twist = publish.call_args.args[0] + assert twist.linear.x == 0.0 + assert twist.linear.y == 0.0 + assert twist.angular.z == 0.0 + finally: + module.stop() + + def test_go2_malformed_joy_clears_stale_state_and_publishes_zero_velocity( mocker: pytest_mock.MockerFixture, ) -> None: From 838ca1e5a72f787f3e22ad25e3f5b2d9c476b91c Mon Sep 17 00:00:00 2001 From: cc Date: Wed, 26 Aug 2026 14:42:47 -0700 Subject: [PATCH 52/57] fix(g1): address remaining teleop review feedback --- .../manipulation/planning/spec/test_config.py | 5 +- .../blueprints/basic/unitree_g1_groot_wbc.py | 3 +- dimos/robot/unitree/g1/test_g1_teleop.py | 71 +------------------ dimos/utils/data.py | 14 ---- dimos/utils/test_data.py | 10 --- docs/platforms/humanoid/g1/index.md | 42 ++++++----- 6 files changed, 30 insertions(+), 115 deletions(-) diff --git a/dimos/manipulation/planning/spec/test_config.py b/dimos/manipulation/planning/spec/test_config.py index c97a43fe74..0dd1f59186 100644 --- a/dimos/manipulation/planning/spec/test_config.py +++ b/dimos/manipulation/planning/spec/test_config.py @@ -54,6 +54,5 @@ def test_robot_model_survives_blueprint_config_round_trip(tmp_path: Path) -> Non parsed = BlueprintConfigParser(blueprint).parse(environ={}) kwargs = parsed.module_kwargs(blueprint.blueprints[0].name) - model = kwargs["robots"][0]["model"] - assert isinstance(model, RobotModel) - assert model.source_path == urdf + assert kwargs["robots"][0]["model"]["_source_path"] == urdf + assert "_loaded" not in kwargs["robots"][0]["model"] diff --git a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_groot_wbc.py b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_groot_wbc.py index 99423db9ba..f1622c37de 100644 --- a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_groot_wbc.py +++ b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_groot_wbc.py @@ -391,7 +391,6 @@ def _g1_nav_path(path: NavPath) -> Any: _G1_ROOT = G1_RERUN_ROOT if global_config.simulation == "mujoco" else "world/odometry/g1" _G1_URDF_PATH = Path(__file__).resolve().parents[2] / "g1.urdf" -G1_TELEOP_TASK_NAME = "teleop_g1" _G1_ARM_JOINT_NAME_MAPPING = { joint_name: G1_UPPER_BODY_JOINT_NAME_MAPPING[joint_name] for joint_name in g1_arms } @@ -540,7 +539,7 @@ def _viewer() -> Any: _arm_holder, # Shared bimanual Quest task with G1-only model and objective tuning. TaskConfig( - name=G1_TELEOP_TASK_NAME, + name="teleop_g1", type="teleop_ik", joint_names=g1_arms, priority=20, diff --git a/dimos/robot/unitree/g1/test_g1_teleop.py b/dimos/robot/unitree/g1/test_g1_teleop.py index ad6b059f78..e0d80c2334 100644 --- a/dimos/robot/unitree/g1/test_g1_teleop.py +++ b/dimos/robot/unitree/g1/test_g1_teleop.py @@ -21,18 +21,13 @@ from dimos.control.coordinator import TaskConfig from dimos.control.tasks.g1_groot_wbc_task.g1_groot_wbc_task import g1_arms -from dimos.control.tasks.pose_target_ik import PoseTargetIKTaskConfig from dimos.control.tasks.trajectory_task.trajectory_task import JOINT_TRAJECTORY_TASK_NAME from dimos.control.teleop_coordinator import TeleopControlCoordinator from dimos.core.coordination.blueprints import Blueprint -from dimos.manipulation.planning.factory import create_world from dimos.manipulation.visualization.viser.config import ViserVisualizationConfig -from dimos.msgs.sensor_msgs.JointState import JointState from dimos.robot.unitree.g1.blueprints.basic.unitree_g1_groot_wbc import ( _G1_ARM_JOINT_NAME_MAPPING, _G1_TELEOP_MODEL, - _G1_TELEOP_PINK, - G1_TELEOP_TASK_NAME, _G1GrootCoordinator, unitree_g1_groot_wbc, ) @@ -44,7 +39,6 @@ from dimos.robot.unitree.g1.manip_config import ( G1_LEFT_ARM_JOINTS, G1_RIGHT_ARM_JOINTS, - G1_TELEOP_ARM_MODEL, G1_UPPER_BODY_JOINT_NAME_MAPPING, G1_WAIST_JOINTS, g1_upper_body_model_config, @@ -72,7 +66,7 @@ def _teleop_task() -> TaskConfig: def test_g1_blueprint_uses_shared_bimanual_teleop_task() -> None: task = _teleop_task() - assert task.name == G1_TELEOP_TASK_NAME + assert task.name == "teleop_g1" assert task.joint_names == g1_arms assert task.priority == 20 assert task.params["robot_model"] is _G1_TELEOP_MODEL @@ -99,7 +93,7 @@ def test_g1_blueprint_keeps_bounded_trajectory_path_below_teleop() -> None: assert [(task.name, task.type, task.priority) for task in arm_tasks] == [ (JOINT_TRAJECTORY_TASK_NAME, "trajectory", 10), - (G1_TELEOP_TASK_NAME, "teleop_ik", 20), + ("teleop_g1", "teleop_ik", 20), ] @@ -154,28 +148,6 @@ def test_g1_collection_streams_do_not_require_world_poses() -> None: ] -@pytest.mark.self_hosted -def test_g1_models_separate_live_waist_planning_from_arm_only_teleop() -> None: - config = g1_upper_body_model_config() - loaded = config.model.load() - joint_names = {joint.name for joint in loaded.joints} - teleop_joints = {joint.name: joint.type for joint in G1_TELEOP_ARM_MODEL.load().joints} - - assert loaded.root_link == "pelvis" - assert "left_hip_pitch_joint" not in joint_names - assert "right_hip_pitch_joint" not in joint_names - assert {_G1_ARM_JOINT_NAME_MAPPING[name] for name in g1_arms} <= joint_names - assert {G1_UPPER_BODY_JOINT_NAME_MAPPING[name] for name in G1_WAIST_JOINTS} <= joint_names - assert { - G1_UPPER_BODY_JOINT_NAME_MAPPING[name]: "fixed" for name in G1_WAIST_JOINTS - }.items() <= teleop_joints.items() - assert {_G1_ARM_JOINT_NAME_MAPPING[name] for name in g1_arms} == { - name for name, joint_type in teleop_joints.items() if joint_type != "fixed" - } - assert config.max_velocity == 1.0 - assert config.max_acceleration == 2.0 - - def test_g1_upper_body_plans_arms_without_owning_waist() -> None: config = g1_upper_body_model_config() @@ -202,42 +174,3 @@ def test_g1_teleop_wires_manipulation_to_existing_coordinator() -> None: unitree_g1_teleop.remapping_map[("G1Manipulation", "_control_coordinator")] is _G1GrootCoordinator ) - - -@pytest.mark.self_hosted -def test_g1_upper_body_model_builds_a_roboplan_scene() -> None: - world = create_world() - - robot_id = world.add_robot(g1_upper_body_model_config()) - world.finalize() - - assert world.get_robot_ids() == [robot_id] - - -@pytest.mark.self_hosted -def test_g1_pink_solver_uses_arm_only_model_and_g1_objective() -> None: - frames = ("left_rubber_hand", "right_rubber_hand") - config = PoseTargetIKTaskConfig( - joint_names=tuple(g1_arms), - robot_model=_G1_TELEOP_MODEL, - target_frames=frames, - pink=_G1_TELEOP_PINK, - ) - solver = G1PinkPoseTargetSolver(config) - seed = JointState(name=list(g1_arms), position=[0.0] * len(g1_arms)) - targets = solver.frame_poses(seed, frames) - - command = solver.step(targets, seed, 0.01) - - assert command is not None - assert command.name == g1_arms - context = next(iter(solver._control_contexts.values())) - assert context.robot.model.nq == len(g1_arms) - assert context.tasks is not None - for frame_name in frames: - frame_task = context.tasks[f"frame/{frame_name}"] - assert frame_task.position_cost == pytest.approx([8.0, 8.0, 8.0]) - assert frame_task.orientation_cost == pytest.approx([2.0, 2.0, 2.0]) - posture = context.tasks["posture/current"] - assert posture.cost == pytest.approx(np.tile([4.0, 3.0, 0.1, 3.0, 1.0, 1.0, 0.1], 2) * 0.01) - assert posture.target_q == pytest.approx(np.zeros(len(g1_arms))) diff --git a/dimos/utils/data.py b/dimos/utils/data.py index 85196a0097..ba401ce63b 100644 --- a/dimos/utils/data.py +++ b/dimos/utils/data.py @@ -378,20 +378,6 @@ def __fspath__(self) -> str: """Return filesystem path, downloading from LFS if needed.""" return str(self._ensure_downloaded()) - def __eq__(self, other: object) -> bool: - """Compare lazy handles without downloading their contents.""" - if not isinstance(other, LfsPath): - return NotImplemented - return bool( - object.__getattribute__(self, "_lfs_filename") - == object.__getattribute__(other, "_lfs_filename") - ) - - def __hash__(self) -> int: - """Hash the logical LFS name without downloading its contents.""" - filename = object.__getattribute__(self, "_lfs_filename") - return hash((LfsPath, os.fspath(filename))) - def __truediv__(self, other: object) -> "LfsPath": """Path division operator - returns a new lazy LfsPath (no download).""" filename = object.__getattribute__(self, "_lfs_filename") diff --git a/dimos/utils/test_data.py b/dimos/utils/test_data.py index b1b1a86ada..44d5e5ee8e 100644 --- a/dimos/utils/test_data.py +++ b/dimos/utils/test_data.py @@ -305,16 +305,6 @@ def test_lfs_path_safe_attributes() -> None: assert callable(ensure_fn) -def test_lfs_path_hash_and_equality_do_not_download() -> None: - first = LfsPath("robot_description") - second = LfsPath("robot_description") - - assert first == second - assert hash(first) == hash(second) - assert object.__getattribute__(first, "_lfs_resolved_cache") is None - assert object.__getattribute__(second, "_lfs_resolved_cache") is None - - def test_lfs_path_no_download_on_creation() -> None: """Test that LfsPath construction doesn't trigger download. diff --git a/docs/platforms/humanoid/g1/index.md b/docs/platforms/humanoid/g1/index.md index c0f9a12667..6834423d93 100644 --- a/docs/platforms/humanoid/g1/index.md +++ b/docs/platforms/humanoid/g1/index.md @@ -86,18 +86,8 @@ planned arm motion because the upper-body planner excludes leg geometry. On the G1 computer: ```bash -cd ~/cc/dimos uv sync --extra all - -ROBOPLAN_GOMP="$(find "$PWD/.venv/lib/python3.12/site-packages/roboplan.libs" \ - -maxdepth 1 -name 'libgomp-*.so*' -print -quit)" -test -n "$ROBOPLAN_GOMP" || { - echo "RoboPlan's bundled libgomp was not found" - exit 1 -} - -LD_PRELOAD="$ROBOPLAN_GOMP:/lib/aarch64-linux-gnu/libgomp.so.1" \ - uv run --no-sync dimos run unitree-g1-teleop --network-interface eth0 +uv run dimos run unitree-g1-teleop --network-interface eth0 ``` The teleop blueprint excludes navigation and mapping, so no module-disable @@ -106,12 +96,15 @@ activate the robot from a second SSH session: ```bash uv run dimos hardware g1 status -uv run dimos hardware g1 activate --ready +uv run dimos hardware g1 activate +uv run dimos hardware g1 status +uv run dimos hardware g1 ready ``` `activate` runs the GR00T pose ramp and requires interactive confirmation before -enabling output. `--ready` then moves both arms to the conservative ready pose. -Routine startup must use these hardware commands rather than `dimos shell`. +enabling output. Check the status before `ready` moves both arms to the +conservative ready pose. Routine startup must use these hardware commands rather +than `dimos shell`. `activate --ready` remains available as a combined shortcut. Open `https://:8443/teleop` in the Quest browser and accept the self-signed certificate. @@ -177,9 +170,24 @@ The viewer should open up. It'll run in faster-than-real speed until its caught ### `libgomp.so.1: cannot allocate memory in static TLS block` RoboPlan 0.6.0's aarch64 wheel bundles a renamed private `libgomp`, while -Pinocchio loads the system copy. Use the dual-preload launch command above; -preloading only the system library is insufficient. If it still fails, confirm -that `ROBOPLAN_GOMP` resolves to a file and appears first in `LD_PRELOAD`. +Pinocchio loads the system copy. On affected systems, start the blueprint with +both libraries preloaded: + +```bash +ROBOPLAN_GOMP="$(find "$PWD/.venv/lib/python3.12/site-packages/roboplan.libs" \ + -maxdepth 1 -name 'libgomp-*.so*' -print -quit)" +test -n "$ROBOPLAN_GOMP" || { + echo "RoboPlan's bundled libgomp was not found" + exit 1 +} + +LD_PRELOAD="$ROBOPLAN_GOMP:/lib/aarch64-linux-gnu/libgomp.so.1" \ + uv run --no-sync dimos run unitree-g1-teleop --network-interface eth0 +``` + +Preloading only the system library is insufficient. If startup still fails, +confirm that `ROBOPLAN_GOMP` resolves to a file and appears first in +`LD_PRELOAD`. ### Activation or ready-pose recovery From 635174e0c3a7d758eec867712936bb9349b17eb9 Mon Sep 17 00:00:00 2001 From: cc Date: Wed, 26 Aug 2026 14:43:37 -0700 Subject: [PATCH 53/57] fix(teleop): keep Quest pose stream controller-only --- dimos/teleop/quest/quest_teleop_module.py | 9 +-------- dimos/teleop/quest/web/static/teleop.js | 7 ------- 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/dimos/teleop/quest/quest_teleop_module.py b/dimos/teleop/quest/quest_teleop_module.py index 56f0462e57..031a1aba0a 100644 --- a/dimos/teleop/quest/quest_teleop_module.py +++ b/dimos/teleop/quest/quest_teleop_module.py @@ -339,15 +339,8 @@ def _resolve_hand(frame_id: str) -> Hand: raise ValueError(f"Unexpected frame_id: {frame_id!r}, expected 'left' or 'right'") def _on_pose_bytes(self, data: bytes) -> None: - """Decode LCM bytes into PoseStamped, transform to robot frame. - - Poses that aren't controller poses (e.g. the "head" viewer pose the - web client also streams) are ignored here; subclasses that want them - override this method. Raising instead would kill the websocket. - """ + """Decode LCM bytes into PoseStamped, transform to robot frame.""" msg = PoseStamped.lcm_decode(data) - if msg.frame_id not in ("left", "right"): - return hand = self._resolve_hand(msg.frame_id) robot_pose = webxr_to_robot(msg, is_left_controller=(hand == Hand.LEFT)) with self._lock: diff --git a/dimos/teleop/quest/web/static/teleop.js b/dimos/teleop/quest/web/static/teleop.js index 97d05dc647..21f48b30ae 100644 --- a/dimos/teleop/quest/web/static/teleop.js +++ b/dimos/teleop/quest/web/static/teleop.js @@ -474,13 +474,6 @@ function processTracking(frame) { } lastSendTime = now; - // Humanoid retargeting needs the headset pose in the same reference space - // as both hands. Other teleop modules ignore the "head" frame. - const viewerPose = frame.getViewerPose(xrRefSpace); - if (viewerPose) { - sendPose('head', viewerPose); - } - // Process controller and hand input sources. for (const inputSource of frame.session.inputSources) { const handedness = inputSource.handedness; From 91fda141eb75054cdfbeeaf1514b60c632b96aab Mon Sep 17 00:00:00 2001 From: cc Date: Wed, 26 Aug 2026 16:45:38 -0700 Subject: [PATCH 54/57] test(webxr): isolate body monitor timing --- dimos/teleop/webxr/body_tracking_monitor.py | 6 ++-- .../webxr/test_body_tracking_monitor.py | 34 +++++++++++-------- 2 files changed, 22 insertions(+), 18 deletions(-) diff --git a/dimos/teleop/webxr/body_tracking_monitor.py b/dimos/teleop/webxr/body_tracking_monitor.py index 421504eb03..0784c068a2 100644 --- a/dimos/teleop/webxr/body_tracking_monitor.py +++ b/dimos/teleop/webxr/body_tracking_monitor.py @@ -14,7 +14,7 @@ """Live health reporting for the PICO WebXR body-tracking demo.""" -import time +from time import monotonic from typing import Any from reactivex.disposable import Disposable @@ -67,7 +67,7 @@ class BodyTrackingMonitor(Module): def __init__(self, **kwargs: Any) -> None: super().__init__(**kwargs) - self._report_started_at = time.monotonic() + self._report_started_at = monotonic() self._snapshots_since_report = 0 self._resolved_joint_ever_seen = False @@ -86,7 +86,7 @@ def _on_body_tracking(self, snapshot: BodyTrackingSnapshot) -> None: resolved_joint_count=len(snapshot.joints), ) - now = time.monotonic() + now = monotonic() elapsed = now - self._report_started_at if elapsed < REPORT_INTERVAL_S: return diff --git a/dimos/teleop/webxr/test_body_tracking_monitor.py b/dimos/teleop/webxr/test_body_tracking_monitor.py index cf068c6a94..554487123e 100644 --- a/dimos/teleop/webxr/test_body_tracking_monitor.py +++ b/dimos/teleop/webxr/test_body_tracking_monitor.py @@ -17,6 +17,7 @@ import pytest import pytest_mock +from dimos.teleop.webxr import body_tracking_monitor as body_tracking_monitor_module from dimos.teleop.webxr.body_tracking import BodyJointPose, BodyTrackingSnapshot from dimos.teleop.webxr.body_tracking_monitor import ( BodyTrackingMonitor, @@ -71,13 +72,14 @@ def test_body_tracking_summary_reports_best_effort_joint_positions() -> None: def test_body_tracking_monitor_logs_first_resolved_joint_once( monitor: BodyTrackingMonitor, - mocker, + mocker: pytest_mock.MockerFixture, ) -> None: - mocker.patch( - "dimos.teleop.webxr.body_tracking_monitor.time.monotonic", + mocker.patch.object( + body_tracking_monitor_module, + "monotonic", side_effect=[monitor._report_started_at + 1.0, monitor._report_started_at + 2.0], ) - info = mocker.patch("dimos.teleop.webxr.body_tracking_monitor.logger.info") + logger = mocker.patch.object(body_tracking_monitor_module, "logger") snapshot = BodyTrackingSnapshot( type="body_tracking_snapshot", capture_time_s=1.0, @@ -93,7 +95,7 @@ def test_body_tracking_monitor_logs_first_resolved_joint_once( monitor._on_body_tracking(snapshot) monitor._on_body_tracking(snapshot) - info.assert_called_once_with( + logger.info.assert_called_once_with( "WebXR body tracking acquired", reference_space="local-floor", resolved_joint_count=1, @@ -102,13 +104,14 @@ def test_body_tracking_monitor_logs_first_resolved_joint_once( def test_body_tracking_monitor_warns_when_required_heartbeat_has_no_body( monitor: BodyTrackingMonitor, - mocker, + mocker: pytest_mock.MockerFixture, ) -> None: - mocker.patch( - "dimos.teleop.webxr.body_tracking_monitor.time.monotonic", + mocker.patch.object( + body_tracking_monitor_module, + "monotonic", return_value=monitor._report_started_at + 5.0, ) - warning = mocker.patch("dimos.teleop.webxr.body_tracking_monitor.logger.warning") + logger = mocker.patch.object(body_tracking_monitor_module, "logger") monitor._on_body_tracking( BodyTrackingSnapshot( @@ -119,7 +122,7 @@ def test_body_tracking_monitor_warns_when_required_heartbeat_has_no_body( ) ) - warning.assert_called_once_with( + logger.warning.assert_called_once_with( "WebXR body tracking has no resolved joints", snapshot_rate_hz=0.2, state="unavailable", @@ -135,11 +138,12 @@ def test_body_tracking_monitor_reports_healthy_tracking( mocker: pytest_mock.MockerFixture, ) -> None: report_time = monitor._report_started_at + 5.0 - mocker.patch( - "dimos.teleop.webxr.body_tracking_monitor.time.monotonic", + mocker.patch.object( + body_tracking_monitor_module, + "monotonic", return_value=report_time, ) - info = mocker.patch("dimos.teleop.webxr.body_tracking_monitor.logger.info") + logger = mocker.patch.object(body_tracking_monitor_module, "logger") monitor._resolved_joint_ever_seen = True monitor._on_body_tracking( @@ -156,7 +160,7 @@ def test_body_tracking_monitor_reports_healthy_tracking( ) ) - info.assert_called_once_with( + logger.info.assert_called_once_with( "WebXR body tracking health", snapshot_rate_hz=0.2, state="tracking", @@ -171,7 +175,7 @@ def test_body_tracking_monitor_reports_healthy_tracking( def test_body_tracking_monitor_subscribes_during_start( monitor: BodyTrackingMonitor, - mocker, + mocker: pytest_mock.MockerFixture, ) -> None: subscribe = mocker.patch.object( monitor.body_tracking, From 6c916543bd7b1b558cb057e71ab3aab80a03ddc9 Mon Sep 17 00:00:00 2001 From: cc Date: Wed, 26 Aug 2026 17:18:07 -0700 Subject: [PATCH 55/57] fix(manipulation): constrain locked IK joints in QP --- dimos/control/tasks/pose_target_ik.py | 1 - .../planning/kinematics/pink_ik.py | 8 +- .../planning/kinematics/pink_solver.py | 35 ++++- .../planning/kinematics/test_pink_ik.py | 133 +++++++++++++++++- 4 files changed, 166 insertions(+), 11 deletions(-) diff --git a/dimos/control/tasks/pose_target_ik.py b/dimos/control/tasks/pose_target_ik.py index b0087399ab..d1a7a0f345 100644 --- a/dimos/control/tasks/pose_target_ik.py +++ b/dimos/control/tasks/pose_target_ik.py @@ -402,7 +402,6 @@ def _step_frame_targets( self._update_frame_task_targets(tasks, targets) self._update_current_posture_target(tasks, configuration) self._step_configuration( - robot_context=robot_context, configuration=configuration, tasks=tasks, dt=step_dt, diff --git a/dimos/manipulation/planning/kinematics/pink_ik.py b/dimos/manipulation/planning/kinematics/pink_ik.py index e1eb5694c2..412c270ea5 100644 --- a/dimos/manipulation/planning/kinematics/pink_ik.py +++ b/dimos/manipulation/planning/kinematics/pink_ik.py @@ -374,6 +374,11 @@ def _solve_targets( ) -> IKResult: robot_context = targets[0][0] configuration, tasks = self._configuration_and_tasks(targets, seed_q) + constraints = self._locked_joint_constraints( + robot_context, + seed_q, + locked_joint_positions, + ) final_position_error = float("inf") final_orientation_error = float("inf") for iteration in range(self.config.max_iterations): @@ -395,11 +400,10 @@ def _solve_targets( iteration + 1, ) self._step_configuration( - robot_context=robot_context, configuration=configuration, tasks=tasks, dt=self.config.dt, - locked_joint_positions=locked_joint_positions, + constraints=constraints, ) joint_positions = self._q_to_dimos_positions(robot_context, configuration.q) if not _within_limits(joint_positions, lower_limits, upper_limits): diff --git a/dimos/manipulation/planning/kinematics/pink_solver.py b/dimos/manipulation/planning/kinematics/pink_solver.py index c853769dc2..d24c070504 100644 --- a/dimos/manipulation/planning/kinematics/pink_solver.py +++ b/dimos/manipulation/planning/kinematics/pink_solver.py @@ -190,11 +190,10 @@ def _update_current_posture_target( def _step_configuration( self, - robot_context: _PinkRobotContext, configuration: pink.Configuration, tasks: Mapping[str, pink.Task], dt: float, - locked_joint_positions: Mapping[int, float] | None = None, + constraints: Sequence[pink.Task] = (), ) -> None: self._before_solve(tasks, configuration, dt) velocity = pink.solve_ik( @@ -204,14 +203,36 @@ def _step_configuration( solver=self.config.solver, damping=self.config.damping, safety_break=self.config.safety_break, + constraints=constraints or None, ) self._after_solve(tasks, velocity, dt) configuration.integrate_inplace(velocity, dt) - if locked_joint_positions: - locked_q = configuration.q.copy() - for local_index, value in locked_joint_positions.items(): - locked_q[robot_context.mapping.idx_q[local_index]] = value - configuration.update(locked_q) + + def _locked_joint_constraints( + self, + robot_context: _PinkRobotContext, + seed_q: NDArray[np.float64], + locked_joint_positions: Mapping[int, float] | None, + ) -> tuple[pink.Task, ...]: + if not locked_joint_positions: + return () + + reference_q = seed_q.copy() + constraint_matrix = np.zeros( + (len(locked_joint_positions), robot_context.model.nv), + dtype=np.float64, + ) + for row, (local_index, position) in enumerate(locked_joint_positions.items()): + reference_q[robot_context.mapping.idx_q[local_index]] = position + constraint_matrix[row, robot_context.mapping.idx_v[local_index]] = 1.0 + + return ( + pink.tasks.LinearHolonomicTask( + A=constraint_matrix, + b=np.zeros(len(locked_joint_positions), dtype=np.float64), + q_0=reference_q, + ), + ) def _build_robot_context( self, diff --git a/dimos/manipulation/planning/kinematics/test_pink_ik.py b/dimos/manipulation/planning/kinematics/test_pink_ik.py index 0e39bc49a3..97b5d9409d 100644 --- a/dimos/manipulation/planning/kinematics/test_pink_ik.py +++ b/dimos/manipulation/planning/kinematics/test_pink_ik.py @@ -60,9 +60,30 @@ from dimos.msgs.geometry_msgs.Vector3 import Vector3 from dimos.msgs.sensor_msgs.JointState import JointState from dimos.robot.assets.model import RobotModel +from dimos.utils.transform_utils import matrix_to_pose _TRACKING_ERROR_RAD = np.deg2rad(10.0) +_LOCKED_WAIST_CHAIN_URDF = """\ + + + + + + + + + + + + + + + + + +""" + class _StreamingTestPinkIK(PinkPoseTargetSolver): """Expose private control-side streaming primitives for unit tests.""" @@ -218,6 +239,13 @@ def set_target_from_configuration(self, configuration: _FakeConfiguration) -> No self.target = configuration.q.copy() +class _FakeLinearHolonomicTask: + def __init__(self, A: np.ndarray, b: np.ndarray, q_0: np.ndarray) -> None: + self.A = A + self.b = b + self.q_0 = q_0 + + class _AuxiliaryTask: def __init__(self, value: float) -> None: self.value = value @@ -302,7 +330,11 @@ def update_frame_placements(model: _FakeModel, data: _FakeData) -> None: pink = ModuleType("pink") pink.Configuration = _FakeConfiguration # type: ignore[attr-defined] - pink.tasks = SimpleNamespace(FrameTask=_FakeFrameTask, PostureTask=_FakePostureTask) + pink.tasks = SimpleNamespace( + FrameTask=_FakeFrameTask, + LinearHolonomicTask=_FakeLinearHolonomicTask, + PostureTask=_FakePostureTask, + ) def solve_ik( configuration: _FakeConfiguration, @@ -1174,6 +1206,105 @@ def test_solve_targets_reports_non_convergence(mocker: MockerFixture) -> None: assert "did not converge" in result.message +def test_pose_target_solve_constrains_joints_outside_planning_group(tmp_path: Path) -> None: + model_path = tmp_path / "locked_waist_chain.urdf" + model_path.write_text(_LOCKED_WAIST_CHAIN_URDF) + joint_names = [ + "waist_yaw", + "waist_roll", + "waist_pitch", + "shoulder_pitch", + "shoulder_roll", + "shoulder_yaw", + "elbow", + "wrist_roll", + "wrist_pitch", + "wrist_yaw", + ] + arm_names = joint_names[3:] + config = RobotModelConfig( + name="chain", + model=RobotModel.from_file(model_path), + joint_names=joint_names, + base_link="pelvis", + planning_groups=[ + PlanningGroupDefinition( + name="arm", + joint_names=tuple(arm_names), + base_link="pelvis", + tip_link="tool", + ) + ], + ) + group = PlanningGroup( + id="chain/arm", + robot_name="chain", + group_name="arm", + joint_names=tuple(f"chain/{name}" for name in arm_names), + local_joint_names=tuple(arm_names), + base_link="pelvis", + tip_link="tool", + ) + seed_positions = np.array([0.0, 0.0, 0.0, -0.4, 0.2, 0.0, 1.2, 0.0, 0.0, 0.0]) + seed = JointState(name=joint_names, position=seed_positions.tolist()) + lower_limits = np.array( + [-2.618, -0.52, -0.52, -3.0892, -1.5882, -2.618, -1.0472, -1.9722, -1.6144, -1.6144] + ) + upper_limits = np.array( + [2.618, 0.52, 0.52, 2.6704, 2.2515, 2.618, 2.0944, 1.9722, 1.6144, 1.6144] + ) + + class World: + is_finalized = True + + def get_robot_ids(self) -> list[str]: + return ["robot"] + + def get_robot_config(self, robot_id: str) -> RobotModelConfig: + return config + + def get_joint_limits(self, robot_id: str) -> tuple[np.ndarray, np.ndarray]: + return lower_limits, upper_limits + + def scratch_context(self) -> nullcontext[None]: + return nullcontext(None) + + def get_joint_state(self, ctx: object, robot_id: str) -> JointState: + return seed + + def check_config_collision_free(self, robot_id: str, joint_state: JointState) -> bool: + return True + + def set_joint_state(self, ctx: object, robot_id: str, joint_state: JointState) -> None: + pass + + def is_collision_free(self, ctx: object, robot_id: str) -> bool: + return True + + ik = PinkIK(PinkIKConfig(max_iterations=100)) + context = ik._build_robot_context(config, "tool") + target_positions = seed_positions.copy() + target_positions[3:] += np.array( + [0.05003819, 0.15888552, 0.11027428, -0.10991712, -0.07993349, 0.14942138, -0.19789388] + ) + target_q = ik._q_from_dimos_positions(context, target_positions) + target_pose = matrix_to_pose(ik._current_frame_matrix(context, target_q)) + + result = ik.solve_pose_targets( + cast("Any", World()), + {group: PoseStamped(position=target_pose.position, orientation=target_pose.orientation)}, + seed=seed, + check_collision=False, + max_attempts=1, + ) + + assert result.status == IKStatus.SUCCESS + assert result.joint_state is not None + assert result.joint_state.name == [f"chain/{name}" for name in arm_names] + assert result.position_error <= 0.001 + assert result.orientation_error <= 0.01 + + def test_solve_rejects_collision_candidate(mocker: MockerFixture) -> None: ik = _pink_ik(mocker, converge=True) context = _context() From c9774ee34cdf740eba8296496087d77ea1061fcc Mon Sep 17 00:00:00 2001 From: cc Date: Wed, 26 Aug 2026 22:15:50 -0700 Subject: [PATCH 56/57] feat(g1): add PICO SONIC WebXR teleoperation --- CONTEXT.md | 45 ++++ .../codebase_checks/test_blueprint_kwargs.py | 26 +- dimos/control/coordinator.py | 37 ++- .../tasks/g1_sonic_wbc_task/_registry.py | 47 ++-- .../g1_sonic_wbc_task/g1_sonic_teleop_task.py | 241 +++++++++++++++++ .../g1_sonic_wbc_task/g1_sonic_wbc_task.py | 235 ++++++++++------- .../test_g1_sonic_teleop_task.py | 221 ++++++++++++++++ .../test_g1_sonic_wbc_task.py | 147 +++++++++++ .../test_webxr_retargeting.py | 112 ++++++++ .../g1_sonic_wbc_task/webxr_retargeting.py | 246 ++++++++++++++++++ dimos/control/test_control.py | 26 +- .../coordination/blueprint_config/fields.py | 4 +- .../coordination/blueprint_config/parser.py | 8 + .../blueprint_config/test_parser.py | 19 ++ dimos/hardware/whole_body/mock/adapter.py | 12 +- .../hardware/whole_body/mock/test_adapter.py | 4 +- dimos/hardware/whole_body/spec.py | 2 + .../hardware/whole_body/transport/adapter.py | 19 +- dimos/robot/all_blueprints.py | 1 + dimos/robot/test_all_blueprints.py | 33 ++- .../basic/unitree_g1_coordinator.py | 1 - .../blueprints/basic/unitree_g1_groot_wbc.py | 2 +- .../blueprints/basic/unitree_g1_sonic_wbc.py | 160 +++++++----- .../basic/unitree_g1_sonic_webxr_teleop.py | 46 ++++ .../unitree/g1/test_wholebody_connection.py | 19 ++ .../robot/unitree/g1/wholebody_connection.py | 34 ++- dimos/simulation/adapters/whole_body/g1.py | 17 +- .../simulation/adapters/whole_body/test_g1.py | 22 +- dimos/simulation/engines/mujoco_engine.py | 10 +- dimos/simulation/engines/mujoco_sim_module.py | 14 + .../engines/test_mujoco_sim_module.py | 31 ++- dimos/simulation/mujoco/model.py | 4 + dimos/simulation/mujoco/test_model.py | 32 +++ dimos/teleop/webxr/README.md | 20 ++ ...01-preserve-native-sonic-pose-semantics.md | 3 + ...002-use-deterministic-sonic-retargeting.md | 7 + ...ator-motion-as-the-engaged-sonic-source.md | 3 + ...route-webxr-to-a-specialized-sonic-task.md | 3 + ...require-live-pico-simulation-acceptance.md | 3 + 39 files changed, 1709 insertions(+), 207 deletions(-) create mode 100644 CONTEXT.md create mode 100644 dimos/control/tasks/g1_sonic_wbc_task/g1_sonic_teleop_task.py create mode 100644 dimos/control/tasks/g1_sonic_wbc_task/test_g1_sonic_teleop_task.py create mode 100644 dimos/control/tasks/g1_sonic_wbc_task/test_g1_sonic_wbc_task.py create mode 100644 dimos/control/tasks/g1_sonic_wbc_task/test_webxr_retargeting.py create mode 100644 dimos/control/tasks/g1_sonic_wbc_task/webxr_retargeting.py create mode 100644 dimos/robot/unitree/g1/blueprints/basic/unitree_g1_sonic_webxr_teleop.py create mode 100644 dimos/simulation/mujoco/test_model.py create mode 100644 docs/adr/0001-preserve-native-sonic-pose-semantics.md create mode 100644 docs/adr/0002-use-deterministic-sonic-retargeting.md create mode 100644 docs/adr/0003-use-operator-motion-as-the-engaged-sonic-source.md create mode 100644 docs/adr/0004-route-webxr-to-a-specialized-sonic-task.md create mode 100644 docs/adr/0005-require-live-pico-simulation-acceptance.md diff --git a/CONTEXT.md b/CONTEXT.md new file mode 100644 index 0000000000..700cea3070 --- /dev/null +++ b/CONTEXT.md @@ -0,0 +1,45 @@ +# Teleoperation + +This context defines the operator-tracking language used when human motion guides a robot through dimOS. + +## Language + +**Full-body SONIC teleoperation**: +An operating mode in which tracked motion of the operator's legs, pelvis, torso, arms, wrists, and head guides the G1 through SONIC. Articulated fingers are excluded. +_Avoid_: Full-body tracking, three-point teleoperation + +**WebXR body snapshot**: +A set of named operator-joint poses observed together in one WebXR reference space. +_Avoid_: SMPL frame, SONIC pose + +**Native-equivalent SONIC pose**: +An operator pose whose meaning matches the native SONIC PICO input, independently of the transport used to deliver it. +_Avoid_: Partial SONIC pose, policy-minimal pose + +**SONIC retargeting**: +The dimOS-owned interpretation of a WebXR body snapshot as a native-equivalent SONIC pose. +_Avoid_: Packet packing, vendor conversion + +**Motion Tracker calibration**: +The PICO-managed process that establishes the operator skeleton and tracker relationship before a WebXR session. +_Avoid_: Teleoperation alignment + +**Teleoperation alignment**: +The per-engagement association between a complete operator skeleton and the G1 heading. It does not reshape or rescale the operator. +_Avoid_: Calibration, body normalization + +**Full-body engagement**: +The interval while the operator holds the WebXR deadman control and fresh, complete body poses guide SONIC. Ending engagement returns SONIC to planner control without disarming the policy. +_Avoid_: Policy arming, robot activation + +**Complete operator pose**: +A WebXR body snapshot containing every joint required to produce one native-equivalent SONIC pose. Partial snapshots do not advance the robot target. +_Avoid_: Best-effort pose, partial target + +**Operator motion source**: +The engaged operator pose as SONIC's sole whole-body motion reference. Planner locomotion resumes after full-body engagement ends. +_Avoid_: Hybrid locomotion, simultaneous planner control + +**Live PICO simulation test**: +An acceptance session in which a physical PICO and Motion Trackers guide the MuJoCo G1 through the production WebXR path. +_Avoid_: Synthetic replay, converter smoke test diff --git a/dimos/codebase_checks/test_blueprint_kwargs.py b/dimos/codebase_checks/test_blueprint_kwargs.py index 08af584fd8..58946e5881 100644 --- a/dimos/codebase_checks/test_blueprint_kwargs.py +++ b/dimos/codebase_checks/test_blueprint_kwargs.py @@ -15,6 +15,8 @@ from __future__ import annotations import inspect +import subprocess +import sys from typing import Any, get_type_hints from pydantic import BaseModel @@ -28,6 +30,7 @@ OPTIONAL_DEPENDENCIES, OPTIONAL_ERROR_SUBSTRINGS, SELF_HOSTED_BLUEPRINTS, + SIMULATION_ONLY_SELF_HOSTED_BLUEPRINTS, ) @@ -78,16 +81,14 @@ def _allowed_kwarg_names(module: type[ModuleBase]) -> set[str]: def _blueprint_params() -> list[str | pytest.ParameterSet]: - self_hosted = set(SELF_HOSTED_BLUEPRINTS) + self_hosted = set(SELF_HOSTED_BLUEPRINTS) | set(SIMULATION_ONLY_SELF_HOSTED_BLUEPRINTS) return [ pytest.param(name, marks=pytest.mark.self_hosted) if name in self_hosted else name for name in sorted(all_blueprints) ] -@pytest.mark.parametrize("blueprint_name", _blueprint_params()) -def test_blueprint_atom_kwargs_match_module_config(blueprint_name: str) -> None: - """Fail when blueprint kwargs cannot be consumed by their target module.""" +def _assert_blueprint_atom_kwargs_match_module_config(blueprint_name: str) -> None: blueprint = _get_blueprint_or_skip(blueprint_name) violations: list[str] = [] @@ -107,3 +108,20 @@ def test_blueprint_atom_kwargs_match_module_config(blueprint_name: str) -> None: "for legacy modules with direct constructor parameters, use the declared " "`__init__` keyword names." ) + + +@pytest.mark.parametrize("blueprint_name", _blueprint_params()) +def test_blueprint_atom_kwargs_match_module_config(blueprint_name: str) -> None: + """Fail when blueprint kwargs cannot be consumed by their target module.""" + if blueprint_name in SIMULATION_ONLY_SELF_HOSTED_BLUEPRINTS: + code = ( + "from dimos.core.global_config import global_config; " + 'global_config.update(simulation="mujoco", viewer="none"); ' + "from dimos.codebase_checks.test_blueprint_kwargs import " + "_assert_blueprint_atom_kwargs_match_module_config; " + f'_assert_blueprint_atom_kwargs_match_module_config("{blueprint_name}")' + ) + subprocess.run([sys.executable, "-c", code], check=True) + return + + _assert_blueprint_atom_kwargs_match_module_config(blueprint_name) diff --git a/dimos/control/coordinator.py b/dimos/control/coordinator.py index a01d327841..d59d77de82 100644 --- a/dimos/control/coordinator.py +++ b/dimos/control/coordinator.py @@ -205,7 +205,13 @@ def __init__(self, *args: Any, **kwargs: Any) -> None: logger.info(f"ControlCoordinator initialized at {self.config.tick_rate}Hz") def _setup_from_config(self) -> None: - """Create hardware and tasks from config (called on start).""" + """Create hardware and tasks, then hand control to prepared adapters. + + Connecting hardware is intentionally separate from activating it. Task + construction can load large policy models; enabling actuators before + that work completes leaves a robot without a command producer during + the most vulnerable part of startup. + """ hardware_added: list[str] = [] tasks_added: list[TaskName] = [] @@ -221,6 +227,10 @@ def _setup_from_config(self) -> None: if task_cfg.auto_start: self.task_invoke(task.name, "start") + for component in self.config.hardware: + if component.auto_enable: + self._activate_hardware(component.hardware_id) + except Exception: # Roll back everything this call added, tasks first: an active task # blocks removal of the hardware whose joints it claims. @@ -233,7 +243,7 @@ def _setup_from_config(self) -> None: raise def _setup_hardware(self, component: HardwareComponent) -> None: - """Connect and add a single hardware adapter.""" + """Connect and register an adapter without enabling actuation.""" adapter: ManipulatorAdapter | TwistBaseAdapter | WholeBodyAdapter if component.hardware_type == HardwareType.WHOLE_BODY: adapter = self._create_whole_body_adapter(component) @@ -246,19 +256,22 @@ def _setup_hardware(self, component: HardwareComponent) -> None: raise RuntimeError(f"Failed to connect to {component.adapter_type} adapter") try: - if component.auto_enable: - activate = getattr(adapter, "activate", None) - if callable(activate): - if activate() is False: - raise RuntimeError(f"Failed to activate hardware {component.hardware_id}") - elif hasattr(adapter, "write_enable"): - adapter.write_enable(True) - self.add_hardware(adapter, component) except Exception: adapter.disconnect() raise + def _activate_hardware(self, hardware_id: HardwareId) -> None: + interface = self._hardware[hardware_id] + adapter = interface.adapter + activate = getattr(adapter, "activate", None) + if callable(activate): + if activate() is False: + raise RuntimeError(f"Failed to activate hardware {hardware_id}") + return + if hasattr(adapter, "write_enable"): + adapter.write_enable(True) + def _create_adapter(self, component: HardwareComponent) -> ManipulatorAdapter: """Create a manipulator adapter from component config.""" from dimos.hardware.manipulators.registry import adapter_registry @@ -961,7 +974,7 @@ def stop(self) -> None: with self._hardware_lock: for hw_id, interface in self._hardware.items(): deactivate = getattr(interface.adapter, "deactivate", None) - if not callable(deactivate): + if not callable(deactivate) or not interface.adapter.is_connected(): continue try: if deactivate() is False: @@ -972,6 +985,8 @@ def stop(self) -> None: # Disconnect all hardware adapters with self._hardware_lock: for hw_id, interface in self._hardware.items(): + if not interface.adapter.is_connected(): + continue try: interface.disconnect() logger.info(f"Disconnected hardware {hw_id}") diff --git a/dimos/control/tasks/g1_sonic_wbc_task/_registry.py b/dimos/control/tasks/g1_sonic_wbc_task/_registry.py index be40565874..e2aba105e2 100644 --- a/dimos/control/tasks/g1_sonic_wbc_task/_registry.py +++ b/dimos/control/tasks/g1_sonic_wbc_task/_registry.py @@ -14,30 +14,39 @@ TASK_FACTORIES = { "g1_sonic_wbc": "dimos.control.tasks.g1_sonic_wbc_task.g1_sonic_wbc_task:create_task", + "g1_sonic_teleop": ("dimos.control.tasks.g1_sonic_wbc_task.g1_sonic_teleop_task:create_task"), } TASK_CONSUMES: dict[str, dict[str, tuple[str, str]]] = { "g1_sonic_wbc": {"twist_command": ("on_twist_command", "broadcast")}, + "g1_sonic_teleop": { + "body_tracking": ("on_body_tracking", "direct"), + "teleop_buttons": ("on_teleop_buttons", "direct"), + "twist_command": ("on_twist_command", "broadcast"), + }, } +_SONIC_EXPOSES = [ + "arm", + "disarm", + "set_dry_run", + "reset_runtime_state", + "start", + "set_velocity_command", + "set_locomotion_mode", + "list_locomotion_modes", + "set_base_height", + "set_upper_body", + "clear_upper_body", + "state_snapshot", + "play_motion_clip", + "set_vr_3point", + "clear_vr_3point", + "stop_motion_clip", + "list_motion_clips", +] + TASK_EXPOSES: dict[str, list[str]] = { - "g1_sonic_wbc": [ - "arm", - "disarm", - "set_dry_run", - "reset_runtime_state", - "start", - "set_velocity_command", - "set_locomotion_mode", - "list_locomotion_modes", - "set_base_height", - "set_upper_body", - "clear_upper_body", - "state_snapshot", - "play_motion_clip", - "set_vr_3point", - "clear_vr_3point", - "stop_motion_clip", - "list_motion_clips", - ], + "g1_sonic_wbc": _SONIC_EXPOSES, + "g1_sonic_teleop": _SONIC_EXPOSES, } diff --git a/dimos/control/tasks/g1_sonic_wbc_task/g1_sonic_teleop_task.py b/dimos/control/tasks/g1_sonic_wbc_task/g1_sonic_teleop_task.py new file mode 100644 index 0000000000..b43c620701 --- /dev/null +++ b/dimos/control/tasks/g1_sonic_wbc_task/g1_sonic_teleop_task.py @@ -0,0 +1,241 @@ +# Copyright 2025-2026 Dimensional Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""PICO WebXR specialization of the G1 SONIC whole-body task.""" + +from __future__ import annotations + +import threading +from typing import TYPE_CHECKING, Any, cast + +from dimos.control.task import CoordinatorState, JointCommandOutput +from dimos.control.tasks.g1_sonic_wbc_task.g1_sonic_wbc_task import ( + G1SonicWBCTask, + G1SonicWBCTaskConfig, + _create_task, +) +from dimos.control.tasks.g1_sonic_wbc_task.webxr_retargeting import ( + IncompleteBodyPoseError, + WebXRSonicRetargeter, +) +from dimos.teleop.webxr.body_tracking import BodyTrackingSnapshot +from dimos.teleop.webxr.controller_types import Buttons +from dimos.utils.logging_config import setup_logger + +if TYPE_CHECKING: + from dimos.hardware.whole_body.spec import WholeBodyAdapter + from dimos.msgs.geometry_msgs.Twist import Twist + +logger = setup_logger() + +_BODY_HOLD_SECONDS = 0.15 + + +class G1SonicTeleopTask(G1SonicWBCTask): + """Drive SONIC from complete WebXR body frames while X+A are held. + + Partial body frames retain the last complete pose for 150 ms. Tracking + loss, a changed WebXR reference space, a stale complete pose, or release + of either deadman button returns SONIC to its planner source. + """ + + def __init__( + self, + name: str, + config: G1SonicWBCTaskConfig, + adapter: WholeBodyAdapter, + ) -> None: + super().__init__(name, config, adapter) + self._teleop_lock = threading.Lock() + self._retargeter = WebXRSonicRetargeter() + self._latest_complete: BodyTrackingSnapshot | None = None + self._latest_complete_time = 0.0 + self._latest_sequence = 0 + self._applied_sequence = 0 + self._stream_frame_index = 0 + self._tracking_frame_id: str | None = None + self._deadman_held = False + self._engaged = False + self._blocked_until_release = False + self._last_disengage_reason = "not_engaged" + self._yaw_rate = 0.0 + self._last_yaw_time = 0.0 + + def on_body_tracking(self, msg: BodyTrackingSnapshot, t_now: float) -> None: + with self._teleop_lock: + if msg.joints is None: + self._disengage_locked("body_tracking_unavailable", require_release=True) + self._latest_complete = None + return + + if not self._retargeter.is_complete(msg): + return + + if self._tracking_frame_id is not None and msg.frame_id != self._tracking_frame_id: + self._disengage_locked("tracking_reference_changed", require_release=True) + self._tracking_frame_id = msg.frame_id + self._latest_complete = msg + self._latest_complete_time = t_now + self._latest_sequence += 1 + self._try_engage_locked(t_now) + + def on_teleop_buttons(self, msg: Buttons, t_now: float) -> None: + held = bool(msg.left_primary and msg.right_primary) + with self._teleop_lock: + self._deadman_held = held + if not held: + self._blocked_until_release = False + self._disengage_locked("deadman_released", require_release=False) + return + self._try_engage_locked(t_now) + + def on_twist_command(self, msg: Twist, t_now: float) -> None: + with self._teleop_lock: + if self._engaged: + self._yaw_rate = float(msg.angular.z) + self._last_yaw_time = t_now + return + super().on_twist_command(msg, t_now) + + def compute(self, state: CoordinatorState) -> JointCommandOutput | None: + with self._teleop_lock: + if self.policy_active: + self._try_engage_locked(state.t_now) + self._prepare_teleop_frame_locked(state.t_now, state.dt) + output = super().compute(state) + # Initialization may have entered CONTROL in this tick. Select + # WebXR now so the next policy inference sees the pose reference. + if self.policy_active: + self._try_engage_locked(state.t_now) + return output + + def start(self) -> None: + with self._teleop_lock: + self._reset_teleop_locked() + super().start() + + def stop(self) -> None: + with self._teleop_lock: + self._reset_teleop_locked() + super().stop() + + def reset_runtime_state(self, reactivate: bool | None = None) -> bool: + with self._teleop_lock: + self._reset_teleop_locked() + return super().reset_runtime_state(reactivate) + + def state_snapshot(self) -> dict[str, Any]: + with self._teleop_lock: + snapshot = super().state_snapshot() + last_complete_received_at = None + if self._latest_complete is not None: + last_complete_received_at = self._latest_complete_time + snapshot["webxr_teleop"] = { + "engaged": self._engaged, + "deadman_held": self._deadman_held, + "blocked_until_release": self._blocked_until_release, + "tracking_frame_id": self._tracking_frame_id, + "last_complete_received_at": last_complete_received_at, + "last_disengage_reason": self._last_disengage_reason, + } + snapshot["reference_source"] = "webxr_pose" if self._engaged else "planner" + return snapshot + + def _try_engage_locked(self, t_now: float) -> None: + if ( + self._engaged + or not self.policy_active + or not self._deadman_held + or self._blocked_until_release + or self._latest_complete is None + or (t_now - self._latest_complete_time) > _BODY_HOLD_SECONDS + ): + return + self._engaged = True + self._last_disengage_reason = "" + self._retargeter.reset() + self._select_stream_reference(True) + self.set_velocity_command(0.0, 0.0, 0.0) + logger.info("G1 SONIC WebXR teleop engaged", task=self._name) + + def _prepare_teleop_frame_locked(self, t_now: float, dt: float) -> None: + if not self._engaged: + return + if ( + self._latest_complete is None + or (t_now - self._latest_complete_time) > _BODY_HOLD_SECONDS + ): + self._disengage_locked("body_tracking_stale", require_release=True) + return + + if self._latest_sequence != self._applied_sequence: + try: + frame = self._retargeter.retarget( + self._latest_complete, + frame_index=self._stream_frame_index, + t_now=t_now, + ) + except IncompleteBodyPoseError: + self._disengage_locked("invalid_body_pose", require_release=True) + return + self._select_stream_reference(True) + result = self._pipeline.apply_pose_message(frame.fields) + if "error" in result: + self._disengage_locked("sonic_pose_rejected", require_release=True) + return + self._stream_frame_index += 1 + self._applied_sequence = self._latest_sequence + + yaw_is_fresh = self._last_yaw_time > 0.0 and ( + self._config.timeout <= 0.0 or (t_now - self._last_yaw_time) <= self._config.timeout + ) + if yaw_is_fresh: + self._pipeline.apply_heading_increment(self._yaw_rate * dt) + + def _disengage_locked(self, reason: str, *, require_release: bool) -> None: + was_engaged = self._engaged + self._engaged = False + self._blocked_until_release = self._blocked_until_release or require_release + self._last_disengage_reason = reason + self._yaw_rate = 0.0 + self._last_yaw_time = 0.0 + if was_engaged: + self._retargeter.reset() + self._pipeline.clear_vr_3point() + self._return_to_planner_reference() + self.set_velocity_command(0.0, 0.0, 0.0) + logger.info( + "G1 SONIC WebXR teleop disengaged", + task=self._name, + reason=reason, + ) + + def _reset_teleop_locked(self) -> None: + self._latest_complete = None + self._latest_complete_time = 0.0 + self._latest_sequence = 0 + self._applied_sequence = 0 + self._stream_frame_index = 0 + self._tracking_frame_id = None + self._deadman_held = False + self._engaged = False + self._blocked_until_release = False + self._last_disengage_reason = "not_engaged" + self._yaw_rate = 0.0 + self._last_yaw_time = 0.0 + self._retargeter.reset() + + +def create_task(cfg: Any, hardware: Any) -> G1SonicTeleopTask: + return cast("G1SonicTeleopTask", _create_task(cfg, hardware, G1SonicTeleopTask)) diff --git a/dimos/control/tasks/g1_sonic_wbc_task/g1_sonic_wbc_task.py b/dimos/control/tasks/g1_sonic_wbc_task/g1_sonic_wbc_task.py index 85ea78169d..519b9f8e92 100644 --- a/dimos/control/tasks/g1_sonic_wbc_task/g1_sonic_wbc_task.py +++ b/dimos/control/tasks/g1_sonic_wbc_task/g1_sonic_wbc_task.py @@ -31,6 +31,7 @@ from __future__ import annotations from dataclasses import dataclass +from enum import Enum from pathlib import Path import threading import time @@ -86,17 +87,23 @@ class G1SonicWBCTaskConfig: zmq_enabled: bool = True zmq_sub_endpoint: str = "tcp://127.0.0.1:5556" zmq_pub_endpoint: str = "tcp://*:5557" - auto_arm: bool = False + auto_start_policy: bool = False auto_dry_run: bool = False - default_ramp_seconds: float = 10.0 + initialization_seconds: float = 3.0 + + +class SonicControlState(str, Enum): + STOPPED = "stopped" + INITIALIZING = "initializing" + READY = "ready" + CONTROL = "control" class G1SonicWBCTask(BaseControlTask): """GEAR-SONIC unified 29-DOF whole-body policy as a coordinator task. - State machine, caches, and safety semantics mirror G1GrootWBCTask: - active-but-unarmed echoes measured positions (pure damping), arm() - ramps to the SONIC default pose, dry-run computes without emitting. + The task mirrors SONIC's native controller lifecycle: initialize to the + default pose, wait ready, then run the balancing policy continuously. """ def __init__( @@ -138,13 +145,14 @@ def __init__( self._state_seen = False self._active = False - self._armed = False - self._arming = False - self._arm_pending = False + self._control_state = SonicControlState.STOPPED + self._start_requested = False self._dry_run = bool(config.auto_dry_run) - self._arming_duration = 0.0 - self._arming_start_t = 0.0 + self._initialization_duration = max(0.0, float(config.initialization_seconds)) + self._initialization_start_t = 0.0 + self._initialization_started = False self._ramp_start: NDArray[np.float32] | None = None + self._stream_source_requested = False self._last_dry_run_log_t = 0.0 self._last_diag_log_t = 0.0 @@ -177,6 +185,14 @@ def claim(self) -> ResourceClaim: def is_active(self) -> bool: return self._active + @property + def control_state(self) -> SonicControlState: + return self._control_state + + @property + def policy_active(self) -> bool: + return self._control_state is SonicControlState.CONTROL + def _refresh_state_caches(self, state: CoordinatorState) -> bool: all_present = True for i, jname in enumerate(self._joint_names_list): @@ -207,56 +223,52 @@ def compute(self, state: CoordinatorState) -> JointCommandOutput | None: current_29 = self._cached_q_29.copy() - if self._arm_pending: - self._ramp_start = current_29.copy() - self._arming_start_t = state.t_now - if self._arming_duration > 0.0: - self._arming = True - self._armed = False + if self._control_state is SonicControlState.INITIALIZING: + if not self._initialization_started: + self._initialization_started = True + self._ramp_start = current_29.copy() + self._initialization_start_t = state.t_now logger.info( - "G1SonicWBCTask arming: ramp to SONIC default pose", + "G1SonicWBCTask initializing to SONIC default pose", task=self._name, - ramp_seconds=self._arming_duration, + initialization_seconds=self._initialization_duration, ) - else: - self._arming = False - self._armed = True - self._reset_policy_state() - logger.info("G1SonicWBCTask armed (no ramp)", task=self._name) - self._arm_pending = False - if not self._armed and not self._arming: - self._last_targets = current_29.tolist() - return JointCommandOutput( - joint_names=self._joint_names_list, - positions=self._last_targets, - mode=ControlMode.SERVO_POSITION, - ) - - if self._arming: assert self._ramp_start is not None - elapsed = state.t_now - self._arming_start_t + elapsed = state.t_now - self._initialization_start_t alpha = ( - 1.0 if self._arming_duration <= 0.0 else min(1.0, elapsed / self._arming_duration) + 1.0 + if self._initialization_duration <= 0.0 + else min(1.0, elapsed / self._initialization_duration) ) target = self._ramp_start + alpha * (self._default_29 - self._ramp_start) self._last_targets = target.tolist() if alpha >= 1.0: - self._arming = False - self._armed = True + self._control_state = SonicControlState.READY self._reset_policy_state() - logger.info( - "G1SonicWBCTask ramp complete - policy armed", - task=self._name, - mode="dry-run" if self._dry_run else "live", - ) + logger.info("G1SonicWBCTask initialization complete", task=self._name) + if self._start_requested: + self._enter_control() + return JointCommandOutput( + joint_names=self._joint_names_list, + positions=self._last_targets, + mode=ControlMode.SERVO_POSITION, + ) + + if self._control_state is SonicControlState.READY: + self._last_targets = self._default_29.tolist() + if self._start_requested: + self._enter_control() return JointCommandOutput( joint_names=self._joint_names_list, positions=self._last_targets, mode=ControlMode.SERVO_POSITION, ) - # Armed: run the pipeline at the decimated rate. + if self._control_state is not SonicControlState.CONTROL: + return None + + # CONTROL: run the balancing policy continuously at the decimated rate. self._tick_count += 1 if self._tick_count % self._config.decimation != 0: if self._dry_run or self._last_targets is None: @@ -372,6 +384,7 @@ def play_motion_clip(self, name: str) -> dict[str, Any]: timesteps=len(jp), ) self._pipeline.play_clip(motion) + self._stream_source_requested = True logger.info( "G1SonicWBCTask playing clip", task=self._name, @@ -413,7 +426,7 @@ def clear_vr_3point(self) -> bool: return True def stop_motion_clip(self) -> bool: - self._pipeline.stop_clip() + self._return_to_planner_reference() return True def list_motion_clips(self) -> list[str]: @@ -543,11 +556,11 @@ def _zmq_poll(self, t_now: float) -> None: def _on_wire_command(self, cmd: CommandUpdate) -> None: # C++ semantics: start/stop pulses OR-accumulated; planner flag # selects planner vs streamed-motion source. - self._pipeline.set_source_stream(not cmd.planner) + self._select_stream_reference(not cmd.planner) if cmd.stop: self.disarm() elif cmd.start: - self.arm(0.0) + self.arm() if cmd.delta_heading is not None: # C++ command-topic semantics: incremental yaw pulses folded into # HeadingState.delta_heading (gamepad delta_left/right are +/-0.1). @@ -607,11 +620,16 @@ def _zmq_publish_state( def start(self) -> None: self._active = True - self._armed = False - self._arming = False - self._arm_pending = False + self._control_state = SonicControlState.INITIALIZING + self._start_requested = bool(self._config.auto_start_policy) self._dry_run = bool(self._config.auto_dry_run) + self._initialization_duration = max(0.0, float(self._config.initialization_seconds)) + self._initialization_start_t = 0.0 + self._initialization_started = False + self._ramp_start = None + self._stream_source_requested = False self._last_targets = None + self._state_seen = False self._reset_policy_state() with self._cmd_lock: self._cmd[:] = 0.0 @@ -619,17 +637,18 @@ def start(self) -> None: logger.info( "G1SonicWBCTask started", task=self._name, - armed=False, + control_state=self._control_state.value, + auto_start_policy=self._start_requested, dry_run=self._dry_run, ) - if self._config.auto_arm: - self.arm(self._config.default_ramp_seconds) def stop(self) -> None: self._active = False - self._armed = False - self._arming = False - self._arm_pending = False + self._control_state = SonicControlState.STOPPED + self._start_requested = False + self._initialization_started = False + self._ramp_start = None + self._stream_source_requested = False self._last_targets = None logger.info("G1SonicWBCTask stopped", task=self._name) @@ -637,40 +656,54 @@ def arm(self, ramp_seconds: float | None = None) -> bool: if not self._active: logger.warning("G1SonicWBCTask arm() before start(); ignoring", task=self._name) return False - if self._armed or self._arming or self._arm_pending: + if self._control_state is SonicControlState.CONTROL or self._start_requested: return False - ramp = ramp_seconds if ramp_seconds is not None else self._config.default_ramp_seconds - self._arming_duration = max(0.0, float(ramp)) - self._arm_pending = True + if ramp_seconds is not None: + if self._initialization_started: + logger.warning( + "Ignoring initialization override after ramp started", + task=self._name, + ramp_seconds=ramp_seconds, + ) + else: + self._initialization_duration = max(0.0, float(ramp_seconds)) + self._start_requested = True logger.info( - "G1SonicWBCTask arm requested", + "G1SonicWBCTask policy start requested", task=self._name, - ramp_seconds=self._arming_duration, + control_state=self._control_state.value, ) return True def disarm(self) -> bool: - if not self._armed and not self._arming and not self._arm_pending: + if not self._start_requested and self._control_state is not SonicControlState.CONTROL: return False - self._armed = False - self._arming = False - self._arm_pending = False - self._ramp_start = None - self._reset_policy_state() - logger.info("G1SonicWBCTask disarmed (holding current pose)", task=self._name) + self._start_requested = False + self._stream_source_requested = False + if self._control_state is SonicControlState.CONTROL: + self._control_state = SonicControlState.READY + self._reset_policy_state() + logger.info( + "G1SonicWBCTask policy stopped", + task=self._name, + control_state=self._control_state.value, + ) return True def reset_runtime_state(self, reactivate: bool | None = None) -> bool: - was_armed = self._armed or self._arming or self._arm_pending - should_reactivate = was_armed if reactivate is None else bool(reactivate) + was_requested = self._start_requested or self._control_state is SonicControlState.CONTROL + should_reactivate = was_requested if reactivate is None else bool(reactivate) - self._armed = False - self._arming = False - self._arm_pending = False + self._control_state = ( + SonicControlState.INITIALIZING if self._active else SonicControlState.STOPPED + ) + self._start_requested = self._active and should_reactivate self._ramp_start = None - self._arming_start_t = 0.0 + self._initialization_start_t = 0.0 + self._initialization_started = False self._last_targets = None self._state_seen = False + self._stream_source_requested = False self._cached_q_29[:] = self._default_29 self._cached_dq_29[:] = 0.0 self._reset_policy_state() @@ -678,10 +711,6 @@ def reset_runtime_state(self, reactivate: bool | None = None) -> bool: self._cmd[:] = 0.0 self._last_cmd_time = 0.0 - if self._active and should_reactivate: - self._arming_duration = 0.0 - self._arm_pending = True - logger.info( "G1SonicWBCTask runtime state reset", task=self._name, @@ -700,13 +729,13 @@ def set_dry_run(self, enabled: bool) -> None: def state_snapshot(self) -> dict[str, Any]: snap: dict[str, Any] = { "active": self._active, - "armed": self._armed, - "arming": self._arming, - "arm_pending": self._arm_pending, + "control_state": self._control_state.value, + "policy_start_requested": self._start_requested, "dry_run": self._dry_run, - "arming_duration": self._arming_duration, + "initialization_seconds": self._initialization_duration, } snap.update(self._pipeline.snapshot()) + snap["reference_source"] = "stream" if snap.get("stream_active") else "planner" snap["zmq"] = dict(self._zmq_stats) snap["debug_q_leg"] = [round(float(v), 4) for v in self._cached_q_29[:6]] snap["debug_dq_leg"] = [round(float(v), 4) for v in self._cached_dq_29[:6]] @@ -724,6 +753,26 @@ def _reset_policy_state(self) -> None: self._pipeline.reset() self._tick_count = 0 + def _enter_control(self) -> None: + self._control_state = SonicControlState.CONTROL + self._reset_policy_state() + self._pipeline.set_source_stream(self._stream_source_requested) + logger.info( + "G1SonicWBCTask policy control active", + task=self._name, + reference_source="stream" if self._stream_source_requested else "planner", + mode="dry-run" if self._dry_run else "live", + ) + + def _select_stream_reference(self, use_stream: bool) -> None: + self._stream_source_requested = bool(use_stream) + if self.policy_active: + self._pipeline.set_source_stream(self._stream_source_requested) + + def _return_to_planner_reference(self) -> None: + self._stream_source_requested = False + self._pipeline.stop_clip() + @staticmethod def _projected_gravity(quaternion: tuple[float, ...]) -> NDArray[np.float32]: w, x, y, z = quaternion @@ -738,13 +787,18 @@ class G1SonicWBCTaskParams(BaseConfig): decoder_onnx: str | Path planner_onnx: str | Path hardware_id: str - auto_arm: bool = False + auto_start_policy: bool = False auto_dry_run: bool = False - default_ramp_seconds: float = 10.0 + initialization_seconds: float = 3.0 decimation: int | None = None + zmq_enabled: bool = True -def create_task(cfg: Any, hardware: Any) -> G1SonicWBCTask: +def _create_task( + cfg: Any, + hardware: Any, + task_class: type[G1SonicWBCTask], +) -> G1SonicWBCTask: params = G1SonicWBCTaskParams.model_validate(cfg.params) hw = hardware.get(params.hardware_id) if hardware else None if hw is None: @@ -765,14 +819,19 @@ def create_task(cfg: Any, hardware: Any) -> G1SonicWBCTask: planner_onnx=params.planner_onnx, joint_names=cfg.joint_names, priority=cfg.priority, - auto_arm=params.auto_arm, + auto_start_policy=params.auto_start_policy, auto_dry_run=params.auto_dry_run, - default_ramp_seconds=params.default_ramp_seconds, + initialization_seconds=params.initialization_seconds, + zmq_enabled=params.zmq_enabled, ) if params.decimation is not None: kwargs["decimation"] = params.decimation - return G1SonicWBCTask( + return task_class( cfg.name, G1SonicWBCTaskConfig(**kwargs), adapter=hw.adapter, ) + + +def create_task(cfg: Any, hardware: Any) -> G1SonicWBCTask: + return _create_task(cfg, hardware, G1SonicWBCTask) diff --git a/dimos/control/tasks/g1_sonic_wbc_task/test_g1_sonic_teleop_task.py b/dimos/control/tasks/g1_sonic_wbc_task/test_g1_sonic_teleop_task.py new file mode 100644 index 0000000000..df5525d277 --- /dev/null +++ b/dimos/control/tasks/g1_sonic_wbc_task/test_g1_sonic_teleop_task.py @@ -0,0 +1,221 @@ +# Copyright 2025-2026 Dimensional Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from collections.abc import Iterator +from pathlib import Path +from typing import Any + +import numpy as np +import pytest + +from dimos.control.task import CoordinatorState, JointStateSnapshot +from dimos.control.tasks.g1_sonic_wbc_task.g1_sonic_teleop_task import G1SonicTeleopTask +from dimos.control.tasks.g1_sonic_wbc_task.g1_sonic_wbc_task import ( + G1SonicWBCTaskConfig, + SonicControlState, +) +from dimos.control.tasks.g1_sonic_wbc_task.webxr_retargeting import SMPL_WEBXR_JOINTS +from dimos.hardware.whole_body.spec import IMUState +from dimos.msgs.geometry_msgs.Twist import Twist +from dimos.msgs.geometry_msgs.Vector3 import Vector3 +from dimos.teleop.webxr.body_tracking import BodyJointPose, BodyTrackingSnapshot +from dimos.teleop.webxr.controller_types import Buttons + +_JOINT_NAMES = [f"joint_{index}" for index in range(29)] + + +def _body_snapshot( + *, + frame_id: str = "local-floor", + omitted: frozenset[str] = frozenset(), + available: bool = True, +) -> BodyTrackingSnapshot: + joints = None + if available: + joints = { + name: BodyJointPose( + position=(0.0, float(index) * 0.01, 0.0), + orientation=(0.0, 0.0, 0.0, 1.0), + ) + for index, name in enumerate(SMPL_WEBXR_JOINTS) + if name not in omitted + } + return BodyTrackingSnapshot( + type="body_tracking_snapshot", + capture_time_s=1.0, + frame_id=frame_id, + joints=joints, + ) + + +def _deadman(held: bool) -> Buttons: + buttons = Buttons() + buttons.left_primary = held + buttons.right_primary = held + return buttons + + +def _state(t_now: float, dt: float = 0.02) -> CoordinatorState: + joints = JointStateSnapshot( + joint_positions=dict.fromkeys(_JOINT_NAMES, 0.0), + joint_velocities=dict.fromkeys(_JOINT_NAMES, 0.0), + ) + return CoordinatorState(joints=joints, imu={"g1": IMUState()}, t_now=t_now, dt=dt) + + +@pytest.fixture +def task_and_pipeline(mocker: Any) -> Iterator[tuple[G1SonicTeleopTask, Any]]: + pipeline_class = mocker.patch( + "dimos.control.tasks.g1_sonic_wbc_task.g1_sonic_wbc_task.SonicPipeline" + ) + pipeline = pipeline_class.return_value + pipeline.apply_pose_message.return_value = {"frames": 1, "encode_mode": 2} + pipeline.step.return_value = np.zeros(29, dtype=np.float32) + pipeline.snapshot.return_value = {} + adapter = mocker.MagicMock() + adapter.read_imu.return_value = IMUState() + config = G1SonicWBCTaskConfig( + encoder_onnx=Path("encoder.onnx"), + decoder_onnx=Path("decoder.onnx"), + planner_onnx=Path("planner.onnx"), + joint_names=_JOINT_NAMES, + auto_start_policy=True, + initialization_seconds=0.0, + zmq_enabled=False, + ) + task = G1SonicTeleopTask("sonic_teleop", config, adapter) + task.start() + task.compute(_state(0.5)) + task.compute(_state(0.52)) + + yield task, pipeline + + task.stop() + + +def test_deadman_engages_full_body_stream(task_and_pipeline: tuple[Any, Any]) -> None: + task, pipeline = task_and_pipeline + task.on_body_tracking(_body_snapshot(), t_now=1.0) + task.on_teleop_buttons(_deadman(True), t_now=1.0) + + task.compute(_state(1.01)) + + pose_fields = pipeline.apply_pose_message.call_args.args[0] + assert pose_fields["smpl_joints"].shape == (1, 24, 3) + pipeline.set_source_stream.assert_called_with(True) + assert task.state_snapshot()["webxr_teleop"]["engaged"] is True + + +def test_deadman_release_returns_to_planner_without_stopping_policy( + task_and_pipeline: tuple[Any, Any], +) -> None: + task, pipeline = task_and_pipeline + task.on_body_tracking(_body_snapshot(), t_now=1.0) + task.on_teleop_buttons(_deadman(True), t_now=1.0) + task.compute(_state(1.01)) + policy_steps_before_release = pipeline.step.call_count + + task.on_teleop_buttons(_deadman(False), t_now=1.02) + task.compute(_state(1.03)) + + assert task.control_state is SonicControlState.CONTROL + assert pipeline.step.call_count == policy_steps_before_release + 1 + pipeline.stop_clip.assert_called_once_with() + assert task.state_snapshot()["reference_source"] == "planner" + + +def test_engaged_twist_ignores_translation_and_applies_yaw( + task_and_pipeline: tuple[Any, Any], +) -> None: + task, pipeline = task_and_pipeline + task.on_body_tracking(_body_snapshot(), t_now=1.0) + task.on_teleop_buttons(_deadman(True), t_now=1.0) + task.on_twist_command( + Twist(linear=Vector3(1.0, 2.0, 0.0), angular=Vector3(0.0, 0.0, 0.5)), + t_now=1.0, + ) + + task.compute(_state(1.01, dt=0.02)) + + pipeline.set_velocity.assert_called_with(0.0, 0.0, 0.0) + pipeline.apply_heading_increment.assert_called_once_with(0.01) + + +def test_partial_frame_holds_last_complete_pose_for_150ms( + task_and_pipeline: tuple[Any, Any], +) -> None: + task, pipeline = task_and_pipeline + task.on_body_tracking(_body_snapshot(), t_now=1.0) + task.on_teleop_buttons(_deadman(True), t_now=1.0) + task.compute(_state(1.01)) + task.on_body_tracking(_body_snapshot(omitted=frozenset({"head"})), t_now=1.05) + + task.compute(_state(1.14)) + + assert pipeline.apply_pose_message.call_count == 1 + assert task.state_snapshot()["webxr_teleop"]["engaged"] is True + + +def test_stale_body_disengages_and_requires_deadman_repress( + task_and_pipeline: tuple[Any, Any], +) -> None: + task, pipeline = task_and_pipeline + task.on_body_tracking(_body_snapshot(), t_now=1.0) + task.on_teleop_buttons(_deadman(True), t_now=1.0) + task.compute(_state(1.01)) + + task.compute(_state(1.16)) + task.on_body_tracking(_body_snapshot(), t_now=1.17) + + teleop = task.state_snapshot()["webxr_teleop"] + assert teleop["engaged"] is False + assert teleop["blocked_until_release"] is True + pipeline.stop_clip.assert_called_once_with() + + +def test_tracking_unavailable_disengages_immediately( + task_and_pipeline: tuple[Any, Any], +) -> None: + task, pipeline = task_and_pipeline + task.on_body_tracking(_body_snapshot(), t_now=1.0) + task.on_teleop_buttons(_deadman(True), t_now=1.0) + task.compute(_state(1.01)) + + task.on_body_tracking(_body_snapshot(available=False), t_now=1.02) + + assert task.state_snapshot()["webxr_teleop"]["engaged"] is False + pipeline.stop_clip.assert_called_once_with() + + +def test_invalid_complete_pose_disengages_instead_of_crashing_tick( + task_and_pipeline: tuple[Any, Any], +) -> None: + task, pipeline = task_and_pipeline + snapshot = _body_snapshot() + assert snapshot.joints is not None + joints = dict(snapshot.joints) + joints["head"] = BodyJointPose( + position=joints["head"].position, + orientation=(0.0, 0.0, 0.0, 0.0), + ) + invalid = snapshot.model_copy(update={"joints": joints}) + task.on_body_tracking(invalid, t_now=1.0) + task.on_teleop_buttons(_deadman(True), t_now=1.0) + + task.compute(_state(1.01)) + + teleop = task.state_snapshot()["webxr_teleop"] + assert teleop["engaged"] is False + assert teleop["last_disengage_reason"] == "invalid_body_pose" + pipeline.stop_clip.assert_called_once_with() diff --git a/dimos/control/tasks/g1_sonic_wbc_task/test_g1_sonic_wbc_task.py b/dimos/control/tasks/g1_sonic_wbc_task/test_g1_sonic_wbc_task.py new file mode 100644 index 0000000000..c68d8ffca3 --- /dev/null +++ b/dimos/control/tasks/g1_sonic_wbc_task/test_g1_sonic_wbc_task.py @@ -0,0 +1,147 @@ +# Copyright 2026 Dimensional Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from pathlib import Path +from typing import Any + +import numpy as np +import pytest + +from dimos.control.task import CoordinatorState, JointStateSnapshot +from dimos.control.tasks.g1_sonic_wbc_task.g1_sonic_wbc_task import ( + G1SonicWBCTask, + G1SonicWBCTaskConfig, + SonicControlState, +) +from dimos.control.tasks.g1_sonic_wbc_task.sonic_pipeline import DEFAULT_ANGLES_DDS +from dimos.hardware.whole_body.spec import IMUState + +_JOINT_NAMES = [f"joint_{index}" for index in range(29)] + + +def _state(t_now: float, positions: float = 0.0) -> CoordinatorState: + return CoordinatorState( + joints=JointStateSnapshot( + joint_positions=dict.fromkeys(_JOINT_NAMES, positions), + joint_velocities=dict.fromkeys(_JOINT_NAMES, 0.0), + ), + imu={"g1": IMUState()}, + t_now=t_now, + dt=0.02, + ) + + +@pytest.fixture +def make_task(mocker: Any): + pipeline_class = mocker.patch( + "dimos.control.tasks.g1_sonic_wbc_task.g1_sonic_wbc_task.SonicPipeline" + ) + pipeline = pipeline_class.return_value + pipeline.step.return_value = np.zeros(29, dtype=np.float32) + pipeline.snapshot.return_value = {"stream_active": False} + + def factory(*, auto_start: bool, initialization_seconds: float) -> G1SonicWBCTask: + config = G1SonicWBCTaskConfig( + encoder_onnx=Path("encoder.onnx"), + decoder_onnx=Path("decoder.onnx"), + planner_onnx=Path("planner.onnx"), + joint_names=_JOINT_NAMES, + auto_start_policy=auto_start, + initialization_seconds=initialization_seconds, + zmq_enabled=False, + ) + return G1SonicWBCTask("sonic", config, mocker.MagicMock()) + + return factory, pipeline + + +def test_auto_start_finishes_initialization_before_first_policy_step(make_task: Any) -> None: + factory, pipeline = make_task + task = factory(auto_start=True, initialization_seconds=0.0) + task.start() + + initialization_output = task.compute(_state(1.0)) + + assert task.control_state is SonicControlState.CONTROL + assert initialization_output is not None + assert initialization_output.positions == pytest.approx(DEFAULT_ANGLES_DDS.tolist()) + pipeline.step.assert_not_called() + + task.compute(_state(1.02)) + + pipeline.step.assert_called_once() + + +def test_initialization_ramps_before_latched_start_enters_control(make_task: Any) -> None: + factory, pipeline = make_task + task = factory(auto_start=True, initialization_seconds=3.0) + task.start() + + first = task.compute(_state(10.0)) + halfway = task.compute(_state(11.5)) + complete = task.compute(_state(13.0)) + + assert first is not None and first.positions == pytest.approx([0.0] * 29) + assert halfway is not None + assert halfway.positions == pytest.approx((DEFAULT_ANGLES_DDS * 0.5).tolist()) + assert complete is not None and complete.positions == pytest.approx(DEFAULT_ANGLES_DDS.tolist()) + assert task.control_state is SonicControlState.CONTROL + pipeline.step.assert_not_called() + + +def test_manual_arm_starts_policy_only_after_ready(make_task: Any) -> None: + factory, pipeline = make_task + task = factory(auto_start=False, initialization_seconds=0.0) + task.start() + task.compute(_state(1.0)) + + assert task.control_state is SonicControlState.READY + assert task.arm() + + task.compute(_state(1.02)) + assert task.control_state is SonicControlState.CONTROL + pipeline.step.assert_not_called() + + task.compute(_state(1.04)) + pipeline.step.assert_called_once() + + +def test_disarm_returns_to_ready_and_planner_without_reinitializing(make_task: Any) -> None: + factory, pipeline = make_task + task = factory(auto_start=True, initialization_seconds=0.0) + task.start() + task.compute(_state(1.0)) + task.compute(_state(1.02)) + task._select_stream_reference(True) + + assert task.disarm() + + snapshot = task.state_snapshot() + assert snapshot["control_state"] == "ready" + assert snapshot["reference_source"] == "planner" + assert not snapshot["policy_start_requested"] + pipeline.reset.assert_called() + + +def test_reset_reactivate_replays_initialization(make_task: Any) -> None: + factory, _pipeline = make_task + task = factory(auto_start=True, initialization_seconds=0.0) + task.start() + task.compute(_state(1.0)) + + assert task.reset_runtime_state(reactivate=True) + + snapshot = task.state_snapshot() + assert snapshot["control_state"] == "initializing" + assert snapshot["policy_start_requested"] is True diff --git a/dimos/control/tasks/g1_sonic_wbc_task/test_webxr_retargeting.py b/dimos/control/tasks/g1_sonic_wbc_task/test_webxr_retargeting.py new file mode 100644 index 0000000000..b8f7d33fe7 --- /dev/null +++ b/dimos/control/tasks/g1_sonic_wbc_task/test_webxr_retargeting.py @@ -0,0 +1,112 @@ +# Copyright 2025-2026 Dimensional Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import numpy as np +import pytest +from scipy.spatial.transform import Rotation + +from dimos.control.tasks.g1_sonic_wbc_task.sonic_pipeline import ( + DEFAULT_ANGLES_ONNX, + WRIST_ONNX_INDICES, +) +from dimos.control.tasks.g1_sonic_wbc_task.streamed_motion import StreamedMotionMerger +from dimos.control.tasks.g1_sonic_wbc_task.webxr_retargeting import ( + SMPL_WEBXR_JOINTS, + WEBXR_TO_SONIC, + IncompleteBodyPoseError, + WebXRSonicRetargeter, +) +from dimos.teleop.webxr.body_tracking import BodyJointPose, BodyTrackingSnapshot + + +def _webxr_quaternion_for_sonic_rotation(rotation: Rotation) -> tuple[float, ...]: + matrix = WEBXR_TO_SONIC.T @ rotation.as_matrix() @ WEBXR_TO_SONIC + return tuple(float(value) for value in Rotation.from_matrix(matrix).as_quat()) + + +def _snapshot( + *, + overrides: dict[str, Rotation] | None = None, + omitted: frozenset[str] = frozenset(), +) -> BodyTrackingSnapshot: + rotations = overrides or {} + joints = { + name: BodyJointPose( + position=(float(index), float(2 * index), float(-3 * index)), + orientation=_webxr_quaternion_for_sonic_rotation( + rotations.get(name, Rotation.identity()) + ), + ) + for index, name in enumerate(SMPL_WEBXR_JOINTS) + if name not in omitted + } + return BodyTrackingSnapshot( + type="body_tracking_snapshot", + capture_time_s=10.0, + frame_id="local-floor", + joints=joints, + ) + + +def test_retarget_produces_protocol_v3_full_body_frame() -> None: + frame = WebXRSonicRetargeter().retarget(_snapshot(), frame_index=7, t_now=1.0).fields + + assert frame["frame_index"].tolist() == [7] + assert frame["joint_pos"].shape == (1, 29) + assert frame["joint_vel"].shape == (1, 29) + assert frame["body_quat_w"].tolist() == [[1.0, 0.0, 0.0, 0.0]] + assert frame["smpl_joints"].shape == (1, 24, 3) + assert frame["smpl_pose"].shape == (1, 21, 3) + np.testing.assert_allclose(frame["smpl_joints"][0, 0], [0.0, 0.0, 0.0]) + np.testing.assert_allclose(frame["smpl_joints"][0, 1], [3.0, -1.0, 2.0]) + np.testing.assert_allclose(frame["smpl_pose"], 0.0, atol=1e-7) + np.testing.assert_allclose(frame["joint_pos"][0], DEFAULT_ANGLES_ONNX) + + merged = StreamedMotionMerger().merge(frame, current_playback_frame=0) + assert merged.error is None + assert merged.motion is not None + assert merged.motion.encode_mode == 2 + + +def test_retarget_derives_wrist_targets_and_velocity() -> None: + retargeter = WebXRSonicRetargeter() + retargeter.retarget(_snapshot(), frame_index=0, t_now=1.0) + moved = _snapshot(overrides={"left-hand-wrist": Rotation.from_euler("x", 0.3)}) + + frame = retargeter.retarget(moved, frame_index=1, t_now=1.1).fields + + assert frame["joint_pos"][0, WRIST_ONNX_INDICES[0]] == pytest.approx(0.3) + assert frame["joint_vel"][0, WRIST_ONNX_INDICES[0]] == pytest.approx(3.0) + np.testing.assert_allclose(frame["joint_pos"][0, WRIST_ONNX_INDICES[1:]], 0.0) + + +def test_retarget_rejects_incomplete_body_frame() -> None: + snapshot = _snapshot(omitted=frozenset({"head"})) + + with pytest.raises(IncompleteBodyPoseError, match="head"): + WebXRSonicRetargeter().retarget(snapshot, frame_index=0, t_now=1.0) + + +def test_retarget_rejects_invalid_orientation() -> None: + snapshot = _snapshot() + assert snapshot.joints is not None + joints = dict(snapshot.joints) + joints["head"] = BodyJointPose( + position=joints["head"].position, + orientation=(0.0, 0.0, 0.0, 0.0), + ) + invalid = snapshot.model_copy(update={"joints": joints}) + + with pytest.raises(IncompleteBodyPoseError, match="head"): + WebXRSonicRetargeter().retarget(invalid, frame_index=0, t_now=1.0) diff --git a/dimos/control/tasks/g1_sonic_wbc_task/webxr_retargeting.py b/dimos/control/tasks/g1_sonic_wbc_task/webxr_retargeting.py new file mode 100644 index 0000000000..ecfecd55b6 --- /dev/null +++ b/dimos/control/tasks/g1_sonic_wbc_task/webxr_retargeting.py @@ -0,0 +1,246 @@ +# Copyright 2025-2026 Dimensional Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Deterministic WebXR body-skeleton conversion for SONIC SMPL mode.""" + +from __future__ import annotations + +from dataclasses import dataclass +from typing import Any, Final + +import numpy as np +from numpy.typing import NDArray +from scipy.spatial.transform import Rotation + +from dimos.control.tasks.g1_sonic_wbc_task.sonic_pipeline import ( + DEFAULT_ANGLES_ONNX, + NUM_JOINTS, + WRIST_ONNX_INDICES, +) +from dimos.teleop.webxr.body_tracking import BodyTrackingSnapshot + +# Standard SMPL 24-joint order. The PICO body role order follows the same +# skeleton; the WebXR names are the device-neutral boundary exposed by DimOS. +SMPL_WEBXR_JOINTS: Final[tuple[str, ...]] = ( + "hips", + "left-upper-leg", + "right-upper-leg", + "spine-lower", + "left-lower-leg", + "right-lower-leg", + "spine-middle", + "left-foot-ankle", + "right-foot-ankle", + "spine-upper", + "left-foot-ball", + "right-foot-ball", + "neck", + "left-shoulder", + "right-shoulder", + "head", + "left-arm-upper", + "right-arm-upper", + "left-arm-lower", + "right-arm-lower", + "left-hand-wrist", + "right-hand-wrist", + "left-hand-palm", + "right-hand-palm", +) + +SMPL_PARENTS: Final[tuple[int, ...]] = ( + -1, + 0, + 0, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 9, + 9, + 12, + 13, + 14, + 16, + 17, + 18, + 19, + 20, + 21, +) + +# Per-role rotation from the WebXR joint frame to the corresponding SMPL +# joint frame, aligned with SMPL_WEBXR_JOINTS. PICO's standardized body roles +# currently expose the same rest axes, so every correction is identity. Keep +# the table explicit: a headset/runtime-specific axis change belongs here, +# rather than in the live retargeting logic. +SMPL_REST_BASIS_XYZW: Final[tuple[tuple[float, float, float, float], ...]] = ( + (0.0, 0.0, 0.0, 1.0), # hips + (0.0, 0.0, 0.0, 1.0), # left-upper-leg + (0.0, 0.0, 0.0, 1.0), # right-upper-leg + (0.0, 0.0, 0.0, 1.0), # spine-lower + (0.0, 0.0, 0.0, 1.0), # left-lower-leg + (0.0, 0.0, 0.0, 1.0), # right-lower-leg + (0.0, 0.0, 0.0, 1.0), # spine-middle + (0.0, 0.0, 0.0, 1.0), # left-foot-ankle + (0.0, 0.0, 0.0, 1.0), # right-foot-ankle + (0.0, 0.0, 0.0, 1.0), # spine-upper + (0.0, 0.0, 0.0, 1.0), # left-foot-ball + (0.0, 0.0, 0.0, 1.0), # right-foot-ball + (0.0, 0.0, 0.0, 1.0), # neck + (0.0, 0.0, 0.0, 1.0), # left-shoulder + (0.0, 0.0, 0.0, 1.0), # right-shoulder + (0.0, 0.0, 0.0, 1.0), # head + (0.0, 0.0, 0.0, 1.0), # left-arm-upper + (0.0, 0.0, 0.0, 1.0), # right-arm-upper + (0.0, 0.0, 0.0, 1.0), # left-arm-lower + (0.0, 0.0, 0.0, 1.0), # right-arm-lower + (0.0, 0.0, 0.0, 1.0), # left-hand-wrist + (0.0, 0.0, 0.0, 1.0), # right-hand-wrist + (0.0, 0.0, 0.0, 1.0), # left-hand-palm + (0.0, 0.0, 0.0, 1.0), # right-hand-palm +) + +# WebXR: +X right, +Y up, -Z forward. SONIC: +X forward, +Y left, +Z up. +WEBXR_TO_SONIC: Final[NDArray[np.float64]] = np.array( + [[0.0, 0.0, -1.0], [-1.0, 0.0, 0.0], [0.0, 1.0, 0.0]], + dtype=np.float64, +) + +_WRIST_LIMITS: Final[NDArray[np.float64]] = np.array([1.972, 1.615, 1.615], dtype=np.float64) + + +class IncompleteBodyPoseError(ValueError): + """A WebXR snapshot cannot produce a complete SONIC reference.""" + + +@dataclass(frozen=True) +class RetargetedSonicFrame: + """One packed-message-equivalent SONIC protocol-v3 frame.""" + + fields: dict[str, NDArray[Any]] + + +class WebXRSonicRetargeter: + """Convert complete WebXR snapshots into root-local SONIC SMPL frames.""" + + def __init__(self) -> None: + self._previous_joint_pos: NDArray[np.float32] | None = None + self._previous_time: float | None = None + + @staticmethod + def missing_joints(snapshot: BodyTrackingSnapshot) -> tuple[str, ...]: + joints = snapshot.joints + if joints is None: + return SMPL_WEBXR_JOINTS + return tuple(name for name in SMPL_WEBXR_JOINTS if name not in joints) + + @classmethod + def is_complete(cls, snapshot: BodyTrackingSnapshot) -> bool: + return not cls.missing_joints(snapshot) + + def reset(self) -> None: + self._previous_joint_pos = None + self._previous_time = None + + def retarget( + self, + snapshot: BodyTrackingSnapshot, + *, + frame_index: int, + t_now: float, + ) -> RetargetedSonicFrame: + missing = self.missing_joints(snapshot) + if missing: + raise IncompleteBodyPoseError(f"missing WebXR body joints: {', '.join(missing)}") + assert snapshot.joints is not None + + positions = np.empty((24, 3), dtype=np.float64) + world_rotations: list[Rotation] = [] + for index, name in enumerate(SMPL_WEBXR_JOINTS): + pose = snapshot.joints[name] + position = WEBXR_TO_SONIC @ np.asarray(pose.position, dtype=np.float64) + quaternion = np.asarray(pose.orientation, dtype=np.float64) + norm = float(np.linalg.norm(quaternion)) + if not np.isfinite(position).all() or not np.isfinite(quaternion).all() or norm < 1e-8: + raise IncompleteBodyPoseError(f"invalid WebXR body pose for {name!r}") + quaternion /= norm + webxr_rotation = Rotation.from_quat(quaternion) + sonic_matrix = ( + WEBXR_TO_SONIC + @ webxr_rotation.as_matrix() + @ WEBXR_TO_SONIC.T + @ Rotation.from_quat(SMPL_REST_BASIS_XYZW[index]).as_matrix() + ) + positions[index] = position + world_rotations.append(Rotation.from_matrix(sonic_matrix)) + + root_position = positions[0].copy() + root_rotation = world_rotations[0] + root_matrix = root_rotation.as_matrix() + heading = np.arctan2(root_matrix[1, 0], root_matrix[0, 0]) + heading_inverse = Rotation.from_euler("z", -heading) + root_local_positions = heading_inverse.apply(positions - root_position) + + # SONIC's native message carries 21 SMPL body rotations: all joints + # after the root through the wrists, excluding the two terminal hands. + body_pose = np.empty((21, 3), dtype=np.float64) + local_rotations: list[Rotation] = [Rotation.identity()] + for index in range(1, 24): + parent_rotation = world_rotations[SMPL_PARENTS[index]] + local_rotation = parent_rotation.inv() * world_rotations[index] + local_rotations.append(local_rotation) + if index <= 21: + body_pose[index - 1] = local_rotation.as_rotvec() + + left_wrist = np.clip(local_rotations[20].as_euler("XYZ"), -_WRIST_LIMITS, _WRIST_LIMITS) + right_wrist = np.clip(local_rotations[21].as_euler("XYZ"), -_WRIST_LIMITS, _WRIST_LIMITS) + joint_pos = DEFAULT_ANGLES_ONNX.astype(np.float32, copy=True) + joint_pos[WRIST_ONNX_INDICES] = np.asarray( + [ + left_wrist[0], + right_wrist[0], + left_wrist[1], + right_wrist[1], + left_wrist[2], + right_wrist[2], + ], + dtype=np.float32, + ) + joint_vel = np.zeros(NUM_JOINTS, dtype=np.float32) + if self._previous_joint_pos is not None and self._previous_time is not None: + dt = t_now - self._previous_time + if dt > 1e-6: + joint_vel[WRIST_ONNX_INDICES] = ( + joint_pos[WRIST_ONNX_INDICES] - self._previous_joint_pos[WRIST_ONNX_INDICES] + ) / dt + self._previous_joint_pos = joint_pos.copy() + self._previous_time = t_now + + root_quaternion = root_rotation.as_quat() + fields: dict[str, NDArray[Any]] = { + "frame_index": np.array([frame_index], dtype=np.int64), + "joint_pos": joint_pos.reshape(1, NUM_JOINTS), + "joint_vel": joint_vel.reshape(1, NUM_JOINTS), + "body_quat_w": np.array([[root_quaternion[3], *root_quaternion[:3]]], dtype=np.float32), + "smpl_joints": root_local_positions.astype(np.float32).reshape(1, 24, 3), + "smpl_pose": body_pose.astype(np.float32).reshape(1, 21, 3), + } + return RetargetedSonicFrame(fields=fields) diff --git a/dimos/control/test_control.py b/dimos/control/test_control.py index 8bc014e97a..41bff119a8 100644 --- a/dimos/control/test_control.py +++ b/dimos/control/test_control.py @@ -424,20 +424,42 @@ def disconnect(self) -> None: super().disconnect() adapter_registry.register("lifecycle_test", LifecycleAdapter) + + class OrderedCoordinator(ControlCoordinator): + def _create_task_from_config(self, config: TaskConfig): + LifecycleAdapter.events.append("task_created") + return super()._create_task_from_config(config) + component = HardwareComponent( hardware_id="arm", hardware_type=HardwareType.MANIPULATOR, joints=make_joints("arm", 6), adapter_type="lifecycle_test", ) - coordinator = ControlCoordinator(publish_joint_state=False, hardware=[component]) + task = TaskConfig( + name=JOINT_TRAJECTORY_TASK_NAME, + type="trajectory", + joint_names=make_joints("arm", 6), + ) + coordinator = OrderedCoordinator( + publish_joint_state=False, + hardware=[component], + tasks=[task], + ) try: coordinator.start() finally: coordinator.stop() + coordinator.stop() - assert LifecycleAdapter.events == ["connect", "activate", "deactivate", "disconnect"] + assert LifecycleAdapter.events == [ + "connect", + "task_created", + "activate", + "deactivate", + "disconnect", + ] def test_start_stop_with_adapter_without_lifecycle_methods(self): """Adapters without activate/deactivate (e.g. twist bases) start and stop cleanly.""" diff --git a/dimos/core/coordination/blueprint_config/fields.py b/dimos/core/coordination/blueprint_config/fields.py index 1df771bc53..6a34aa1dbf 100644 --- a/dimos/core/coordination/blueprint_config/fields.py +++ b/dimos/core/coordination/blueprint_config/fields.py @@ -79,7 +79,7 @@ def leaf_fields( continue if _contains_runtime_type(info.annotation): continue - if not _is_cli_settable(info.annotation): + if not is_cli_settable(info.annotation): continue leaves[path] = info.annotation return list(leaves.items()) @@ -129,7 +129,7 @@ def scalar_annotation_types(annotation: Any) -> set[Any]: } -def _is_cli_settable(annotation: Any) -> bool: +def is_cli_settable(annotation: Any) -> bool: """Whether pydantic can build some union member from CLI-provided data. Arbitrary classes (permitted via ``arbitrary_types_allowed``) validate by diff --git a/dimos/core/coordination/blueprint_config/parser.py b/dimos/core/coordination/blueprint_config/parser.py index ce8338ec66..39b5a7251f 100644 --- a/dimos/core/coordination/blueprint_config/parser.py +++ b/dimos/core/coordination/blueprint_config/parser.py @@ -38,6 +38,7 @@ display_annotation, field_has_required_parent, field_is_required, + is_cli_settable, leaf_fields, module_config_cls, nested_get, @@ -422,6 +423,13 @@ def _validate_modules( format_validation_error(module.atom.name, error) ) from error dumped = model.model_dump(mode="python", exclude_unset=True) + # Pydantic serializes callable dataclass instances as dictionaries. + # Runtime-only fields cannot be populated by config sources, so retain + # their validated Python objects from blueprint-pinned kwargs. + for name in model.model_fields_set: + field = module.config_cls.model_fields[name] + if not is_cli_settable(field.annotation): + dumped[name] = getattr(model, name) dumped.pop("g", None) dumped.pop("instance_name", None) parsed[module.atom.name] = dumped diff --git a/dimos/core/coordination/blueprint_config/test_parser.py b/dimos/core/coordination/blueprint_config/test_parser.py index b75ee52707..749a845fcf 100644 --- a/dimos/core/coordination/blueprint_config/test_parser.py +++ b/dimos/core/coordination/blueprint_config/test_parser.py @@ -13,6 +13,7 @@ # limitations under the License. from collections.abc import Callable +from dataclasses import dataclass from pathlib import Path from typing import Annotated, Any, Literal @@ -504,6 +505,24 @@ def test_blueprint_pinned_arbitrary_value_survives_filtering() -> None: assert isinstance(parsed.module_kwargs("arbitrarymodule")["scaling"], Anchor) +def test_blueprint_pinned_callable_dataclass_survives_validation() -> None: + @dataclass + class CallableHandler: + label: str + + def __call__(self, value: Any) -> str: + return f"{self.label}: {value}" + + handler = CallableHandler(label="rerun") + parsed = BlueprintConfigParser( + ArbitraryModule.blueprint(handlers={"world/robot": handler}) + ).parse(environ={}) + + parsed_handler = parsed.module_kwargs("arbitrarymodule")["handlers"]["world/robot"] + assert isinstance(parsed_handler, CallableHandler) + assert parsed_handler("ready") == "rerun: ready" + + def test_format_help_uses_nested_parent_default_instance() -> None: class NestedRequiredConfig(BaseModel): value: int diff --git a/dimos/hardware/whole_body/mock/adapter.py b/dimos/hardware/whole_body/mock/adapter.py index f014d60503..b703aa6cdc 100644 --- a/dimos/hardware/whole_body/mock/adapter.py +++ b/dimos/hardware/whole_body/mock/adapter.py @@ -37,6 +37,7 @@ def __init__( self._states = [MotorState(q=position) for position in positions] self._limits = limits self._connected = False + self._active = False def connect(self) -> bool: self._connected = True @@ -44,15 +45,20 @@ def connect(self) -> bool: def disconnect(self) -> None: self._connected = False + self._active = False def is_connected(self) -> bool: return self._connected def activate(self) -> bool: - return self._connected + self._active = self._connected + return self._active def deactivate(self) -> bool: - return self._connected + if not self._connected: + return False + self._active = False + return True def read_motor_states(self) -> list[MotorState]: return list(self._states) @@ -67,7 +73,7 @@ def get_limits(self) -> JointLimits | None: return self._limits def write_motor_commands(self, commands: list[MotorCommand]) -> bool: - if not self._connected or len(commands) != len(self._states): + if not self._active or len(commands) != len(self._states): return False self._states = [ MotorState(q=command.q, dq=command.dq, tau=command.tau) for command in commands diff --git a/dimos/hardware/whole_body/mock/test_adapter.py b/dimos/hardware/whole_body/mock/test_adapter.py index 21b3b76fe4..35199df595 100644 --- a/dimos/hardware/whole_body/mock/test_adapter.py +++ b/dimos/hardware/whole_body/mock/test_adapter.py @@ -19,9 +19,10 @@ from dimos.hardware.whole_body.spec import IMUState, MotorCommand, MotorState -def test_write_motor_commands_connected_adapter_applies_ordered_commands() -> None: +def test_write_motor_commands_active_adapter_applies_ordered_commands() -> None: adapter = MockWholeBodyAdapter(dof=2, initial_positions=[0.1, 0.2]) assert adapter.connect() + assert adapter.activate() assert adapter.write_motor_commands( [ @@ -40,6 +41,7 @@ def test_write_motor_commands_connected_adapter_applies_ordered_commands() -> No def test_write_motor_commands_wrong_command_count_rejects_without_state_change() -> None: adapter = MockWholeBodyAdapter(dof=2) assert adapter.connect() + assert adapter.activate() assert not adapter.write_motor_commands([MotorCommand(q=0.3)]) assert adapter.read_motor_states() == [MotorState(), MotorState()] diff --git a/dimos/hardware/whole_body/spec.py b/dimos/hardware/whole_body/spec.py index d7c6555834..0102c0d22b 100644 --- a/dimos/hardware/whole_body/spec.py +++ b/dimos/hardware/whole_body/spec.py @@ -86,6 +86,8 @@ class WholeBodyAdapter(Protocol): def connect(self) -> bool: ... def disconnect(self) -> None: ... def is_connected(self) -> bool: ... + def activate(self) -> bool: ... + def deactivate(self) -> bool: ... def read_motor_states(self) -> list[MotorState]: ... def has_motor_states(self) -> bool: ... def read_imu(self) -> IMUState: ... diff --git a/dimos/hardware/whole_body/transport/adapter.py b/dimos/hardware/whole_body/transport/adapter.py index 32c5ab6492..1a30551235 100644 --- a/dimos/hardware/whole_body/transport/adapter.py +++ b/dimos/hardware/whole_body/transport/adapter.py @@ -59,6 +59,7 @@ def __init__( self._motor_states_unsub: Any = None self._imu_unsub: Any = None self._connected = False + self._active = False def connect(self) -> bool: ms_topic = f"/{self._prefix}/motor_states" @@ -73,6 +74,7 @@ def connect(self) -> bool: self._imu_unsub = self._imu_transport.subscribe(self._on_imu) self._connected = True + self._active = False logger.info( f"TransportWholeBodyAdapter connected: motor_states={ms_topic}, " f"imu={imu_topic}, motor_command={cmd_topic}" @@ -103,11 +105,24 @@ def disconnect(self) -> None: self._latest_imu = None self._connected = False + self._active = False logger.info("TransportWholeBodyAdapter disconnected") def is_connected(self) -> bool: return self._connected + def activate(self) -> bool: + if not self._connected: + return False + self._active = True + return True + + def deactivate(self) -> bool: + if not self._connected: + return False + self._active = False + return True + def read_motor_states(self) -> list[MotorState]: with self._lock: if self._latest_motor_states is None: @@ -129,8 +144,8 @@ def get_limits(self) -> JointLimits | None: return None def write_motor_commands(self, commands: list[MotorCommand]) -> bool: - if self._motor_command_transport is None: - logger.warning("write_motor_commands called before connect()") + if self._motor_command_transport is None or not self._active: + logger.warning("write_motor_commands called before activation") return False msg = MotorCommandArray( diff --git a/dimos/robot/all_blueprints.py b/dimos/robot/all_blueprints.py index 5ebcaa6584..66448538e4 100644 --- a/dimos/robot/all_blueprints.py +++ b/dimos/robot/all_blueprints.py @@ -121,6 +121,7 @@ "unitree-g1-shm": "dimos.robot.unitree.g1.blueprints.perceptive.unitree_g1_shm:unitree_g1_shm", "unitree-g1-sim": "dimos.robot.unitree.g1.blueprints.perceptive.unitree_g1_sim:unitree_g1_sim", "unitree-g1-sonic-wbc": "dimos.robot.unitree.g1.blueprints.basic.unitree_g1_sonic_wbc:unitree_g1_sonic_wbc", + "unitree-g1-sonic-webxr-teleop": "dimos.robot.unitree.g1.blueprints.basic.unitree_g1_sonic_webxr_teleop:unitree_g1_sonic_webxr_teleop", "unitree-g1-teleop": "dimos.robot.unitree.g1.blueprints.basic.unitree_g1_teleop:unitree_g1_teleop", "unitree-go2": "dimos.robot.unitree.go2.blueprints.smart.unitree_go2:unitree_go2", "unitree-go2-agentic": "dimos.robot.unitree.go2.blueprints.agentic.unitree_go2_agentic:unitree_go2_agentic", diff --git a/dimos/robot/test_all_blueprints.py b/dimos/robot/test_all_blueprints.py index 518e5ff4c4..b632fcee59 100644 --- a/dimos/robot/test_all_blueprints.py +++ b/dimos/robot/test_all_blueprints.py @@ -12,6 +12,9 @@ # See the License for the specific language governing permissions and # limitations under the License. +import subprocess +import sys + import pytest from dimos.core.coordination.blueprints import Blueprint @@ -75,8 +78,17 @@ } ) -UBUNTU_BLUEPRINTS = sorted(set(all_blueprints) - SELF_HOSTED_BLUEPRINTS) +SIMULATION_ONLY_SELF_HOSTED_BLUEPRINTS = frozenset( + { + "unitree-g1-sonic-webxr-teleop", + } +) + +UBUNTU_BLUEPRINTS = sorted( + set(all_blueprints) - SELF_HOSTED_BLUEPRINTS - SIMULATION_ONLY_SELF_HOSTED_BLUEPRINTS +) SELF_HOSTED_BLUEPRINTS = sorted(SELF_HOSTED_BLUEPRINTS) +SIMULATION_ONLY_SELF_HOSTED_BLUEPRINTS = sorted(SIMULATION_ONLY_SELF_HOSTED_BLUEPRINTS) def _check_blueprint(blueprint_name: str) -> None: @@ -98,7 +110,8 @@ def _check_blueprint(blueprint_name: str) -> None: def test_old_self_hosted_blueprints() -> None: """Validate no non-existent name in SELF_HOSTED_BLUEPRINTS.""" - unused_names = set(SELF_HOSTED_BLUEPRINTS) - set(all_blueprints) + expected = set(SELF_HOSTED_BLUEPRINTS) | set(SIMULATION_ONLY_SELF_HOSTED_BLUEPRINTS) + unused_names = expected - set(all_blueprints) assert not unused_names @@ -113,3 +126,19 @@ def test_blueprint_is_valid(blueprint_name: str) -> None: def test_self_hosted_blueprint_is_valid(blueprint_name: str) -> None: """Validate blueprints that need heavy deps or LFS — self-hosted runner only.""" _check_blueprint(blueprint_name) + + +@pytest.mark.self_hosted +@pytest.mark.parametrize("blueprint_name", SIMULATION_ONLY_SELF_HOSTED_BLUEPRINTS) +def test_simulation_only_self_hosted_blueprint_is_valid(blueprint_name: str) -> None: + """Import simulation-only blueprints in a fresh MuJoCo-configured process.""" + code = ( + "from dimos.core.global_config import global_config; " + 'global_config.update(simulation="mujoco", viewer="none"); ' + "from dimos.robot.get_all_blueprints import get_blueprint_by_name; " + "from dimos.core.coordination.blueprints import Blueprint; " + f'blueprint = get_blueprint_by_name("{blueprint_name}"); ' + "assert isinstance(blueprint, Blueprint)" + ) + + subprocess.run([sys.executable, "-c", code], check=True) diff --git a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_coordinator.py b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_coordinator.py index 35408e812b..cf6697b277 100644 --- a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_coordinator.py +++ b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_coordinator.py @@ -44,7 +44,6 @@ class _G1Coordinator(ControlCoordinator): unitree_g1_coordinator = ( autoconnect( G1WholeBodyConnection.blueprint( - release_sport_mode=True, network_interface=os.getenv("ROBOT_INTERFACE", ""), ), _G1Coordinator.blueprint( diff --git a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_groot_wbc.py b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_groot_wbc.py index f1622c37de..714fd1b5d2 100644 --- a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_groot_wbc.py +++ b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_groot_wbc.py @@ -316,7 +316,7 @@ def _precomposed_g1_scene(package: ScenePackage) -> Path | None: from dimos.robot.unitree.g1.wholebody_connection import G1WholeBodyConnection # Real-hw backend: DDS connection module + transport_lcm adapter. - _backend = G1WholeBodyConnection.blueprint(release_sport_mode=True) + _backend = G1WholeBodyConnection.blueprint() _adapter_type = "transport_lcm" _adapter_address = "" # The onboard Jetson can't sustain a 500 Hz tick; it collapses to ~90 Hz diff --git a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_sonic_wbc.py b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_sonic_wbc.py index 6202e65216..a0dfcbc921 100644 --- a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_sonic_wbc.py +++ b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_sonic_wbc.py @@ -38,10 +38,14 @@ from dimos.control.components import HardwareComponent, HardwareType from dimos.control.coordinator import ControlCoordinator, TaskConfig from dimos.control.tasks.g1_groot_wbc_task.g1_groot_wbc_task import g1_joints -from dimos.control.tasks.g1_sonic_wbc_task.sonic_pipeline import SONIC_KD, SONIC_KP +from dimos.control.tasks.g1_sonic_wbc_task.sonic_pipeline import ( + DEFAULT_ANGLES_DDS, + SONIC_KD, + SONIC_KP, +) from dimos.core.coordination.blueprints import autoconnect from dimos.core.global_config import global_config -from dimos.core.stream import Out +from dimos.core.stream import In, Out from dimos.core.transport import LCMTransport from dimos.hardware.whole_body.spec import WholeBodyConfig from dimos.mapping.costmapper import CostMapper @@ -58,6 +62,8 @@ g1_urdf_joint_state, g1_urdf_static_robot, ) +from dimos.teleop.webxr.body_tracking import BodyTrackingSnapshot +from dimos.teleop.webxr.controller_types import Buttons from dimos.utils.data import LfsPath from dimos.visualization.vis_module import vis_module @@ -144,18 +150,23 @@ _backend = MujocoSimModule.blueprint( address=_MJCF_PATH, - headless=True, + # This simulation is an operator-facing teleop stack. Keep MuJoCo's + # native viewer attached to the live physics state; Rerun remains an + # independent optional visualization selected by --viewer. + headless=False, dof=_G1_NUM_MOTORS, inject_legacy_assets=True, robot_sim_spec=_g1_sim_spec, + reset_joint_positions=DEFAULT_ANGLES_DDS.tolist(), + wait_for_control_command=True, **_MUJOCO_LIDAR_KWARGS, ) _adapter_type = "sim_mujoco_g1" _adapter_address = _MJCF_PATH _tick_rate = 50.0 - _auto_arm = True + _auto_start_policy = True _auto_dry_run = False - _default_ramp_seconds = 0.0 + _initialization_seconds = 0.0 _decimation = 1 _n_workers = 2 _nav_stack = autoconnect( @@ -178,13 +189,13 @@ else: from dimos.robot.unitree.g1.wholebody_connection import G1WholeBodyConnection - _backend = G1WholeBodyConnection.blueprint(release_sport_mode=True) + _backend = G1WholeBodyConnection.blueprint() _adapter_type = "transport_lcm" _adapter_address = "" _tick_rate = 100.0 - _auto_arm = False + _auto_start_policy = False _auto_dry_run = True - _default_ramp_seconds = 10.0 + _initialization_seconds = 3.0 _decimation = 2 # 100 Hz tick / 2 = 50 Hz policy _n_workers = 10 from dimos.hardware.sensors.lidar.pointlio.module import PointLio @@ -218,48 +229,58 @@ class _G1SonicCoordinator(ControlCoordinator): g1_joints: Out[JointState] + body_tracking: In[BodyTrackingSnapshot] + teleop_buttons: In[Buttons] + + +def _g1_sonic_coordinator( + *, + task_type: str, + task_name: str, + zmq_enabled: bool, +) -> Any: + coordinator = _G1SonicCoordinator.blueprint( + instance_name="ControlCoordinator", + publish_robot_joint_states=True, + tick_rate=_tick_rate, + hardware=[ + HardwareComponent( + hardware_id="g1", + hardware_type=HardwareType.WHOLE_BODY, + joints=g1_joints, + adapter_type=_adapter_type, + address=_adapter_address, + wb_config=WholeBodyConfig(kp=tuple(SONIC_KP), kd=tuple(SONIC_KD)), + ), + ], + tasks=[ + TaskConfig( + name=task_name, + type=task_type, + joint_names=g1_joints, + priority=50, + auto_start=True, + params={ + "encoder_onnx": str(_SONIC_RELEASE_DIR / "model_encoder.onnx"), + "decoder_onnx": str(_SONIC_RELEASE_DIR / "model_decoder.onnx"), + "planner_onnx": str(_SONIC_PLANNER_PATH), + "hardware_id": "g1", + "auto_start_policy": _auto_start_policy, + "auto_dry_run": _auto_dry_run, + "initialization_seconds": _initialization_seconds, + "decimation": _decimation, + "zmq_enabled": zmq_enabled, + }, + ), + ], + ) - -_coordinator = _G1SonicCoordinator.blueprint( - instance_name="ControlCoordinator", - publish_robot_joint_states=True, - tick_rate=_tick_rate, - hardware=[ - HardwareComponent( - hardware_id="g1", - hardware_type=HardwareType.WHOLE_BODY, - joints=g1_joints, - adapter_type=_adapter_type, - address=_adapter_address, - wb_config=WholeBodyConfig(kp=tuple(SONIC_KP), kd=tuple(SONIC_KD)), - ), - ], - tasks=[ - TaskConfig( - name="sonic_wbc", - type="g1_sonic_wbc", - joint_names=g1_joints, - priority=50, - auto_start=True, - params={ - "encoder_onnx": str(_SONIC_RELEASE_DIR / "model_encoder.onnx"), - "decoder_onnx": str(_SONIC_RELEASE_DIR / "model_decoder.onnx"), - "planner_onnx": str(_SONIC_PLANNER_PATH), - "hardware_id": "g1", - "auto_arm": _auto_arm, - "auto_dry_run": _auto_dry_run, - "default_ramp_seconds": _default_ramp_seconds, - "decimation": _decimation, - }, - ), - ], -) - -# Real hardware speaks LCM to G1WholeBodyConnection on fixed topics. In sim, -# leave transports to the runtime default (works under both lcm and zenoh); -# pinning LCMTransport here would silently break under DIMOS_TRANSPORT=zenoh. -if not global_config.simulation: - _coordinator = _coordinator.transports( + # Real hardware speaks LCM to G1WholeBodyConnection on fixed topics. In + # sim, leave transports to the runtime default (works under both lcm and + # zenoh); pinning LCM here would silently break zenoh. + if global_config.simulation: + return coordinator + return coordinator.transports( { ("joint_command", JointState): LCMTransport("/g1/joint_command", JointState), ("g1_joints", JointState): LCMTransport("/g1/joints", JointState), @@ -269,9 +290,26 @@ class _G1SonicCoordinator(ControlCoordinator): ("motor_command", MotorCommandArray): LCMTransport( "/g1/motor_command", MotorCommandArray ), - } + }, ) + +def _g1_sonic_control_blueprint( + *, + task_type: str, + task_name: str, + zmq_enabled: bool, +) -> Any: + coordinator = _g1_sonic_coordinator( + task_type=task_type, + task_name=task_name, + zmq_enabled=zmq_enabled, + ) + return autoconnect(_backend, coordinator).remappings( + cast("Any", [(_G1SonicCoordinator, "twist_command", "cmd_vel")]) + ) + + _G1_JOINTS_ENTITY = "world/g1_joints" @@ -309,20 +347,26 @@ def _g1_sonic_rerun_blueprint() -> Any: "static": {G1_RERUN_ROOT: g1_urdf_static_robot(root_path=G1_RERUN_ROOT)}, } -_remappings = [*_nav_remap, (_G1SonicCoordinator, "twist_command", "cmd_vel")] + +def _g1_sonic_visualization() -> Any: + return vis_module( + viewer_backend=global_config.viewer, + rerun_config=None if global_config.transport == "zenoh" else _rerun_config, + ) + unitree_g1_sonic_wbc = ( autoconnect( - _backend, - _coordinator, + _g1_sonic_control_blueprint( + task_type="g1_sonic_wbc", + task_name="sonic_wbc", + zmq_enabled=True, + ), _nav_stack, # rerun_config with callable factories does not survive the zenoh # deploy path (msgpack turns them into dicts); pass it only under LCM. - vis_module( - viewer_backend=global_config.viewer, - rerun_config=None if global_config.transport == "zenoh" else _rerun_config, - ), + _g1_sonic_visualization(), ) - .remappings(cast("Any", _remappings)) + .remappings(cast("Any", _nav_remap)) .global_config(robot_model="unitree_g1", n_workers=_n_workers) ) diff --git a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_sonic_webxr_teleop.py b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_sonic_webxr_teleop.py new file mode 100644 index 0000000000..bb46b51124 --- /dev/null +++ b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_sonic_webxr_teleop.py @@ -0,0 +1,46 @@ +# Copyright 2025-2026 Dimensional Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""PICO WebXR full-body teleoperation of SONIC G1 in MuJoCo. + +Run with: + + dimos --simulation mujoco run unitree-g1-sonic-webxr-teleop + +Hold X on the left controller and A on the right controller to engage. +""" + +from dimos.core.coordination.blueprints import autoconnect +from dimos.core.global_config import global_config +from dimos.robot.unitree.g1.blueprints.basic.unitree_g1_sonic_wbc import ( + _g1_sonic_control_blueprint, + _g1_sonic_visualization, +) +from dimos.teleop.webxr.extensions import MobileVideoArmTeleopModule + +if global_config.simulation != "mujoco": + raise ValueError( + "unitree-g1-sonic-webxr-teleop is simulation-only; run with --simulation mujoco" + ) + + +unitree_g1_sonic_webxr_teleop = autoconnect( + MobileVideoArmTeleopModule.blueprint(body_tracking_mode="required"), + _g1_sonic_control_blueprint( + task_type="g1_sonic_teleop", + task_name="sonic_teleop", + zmq_enabled=False, + ), + _g1_sonic_visualization(), +).global_config(robot_model="unitree_g1", n_workers=3) diff --git a/dimos/robot/unitree/g1/test_wholebody_connection.py b/dimos/robot/unitree/g1/test_wholebody_connection.py index 35c41badab..23f746511e 100644 --- a/dimos/robot/unitree/g1/test_wholebody_connection.py +++ b/dimos/robot/unitree/g1/test_wholebody_connection.py @@ -64,6 +64,7 @@ def _wire(connection, soft_start_seconds): ) connection._crc = SimpleNamespace(Crc=lambda _cmd: 0) connection._mode_machine = 5 + connection._sport_mode_released = True return connection._publisher @@ -123,6 +124,24 @@ def test_wrong_joint_count_is_dropped(connection: G1WholeBodyConnection): assert publisher.frames == [] +def test_sport_mode_handoff_waits_for_first_complete_command( + connection: G1WholeBodyConnection, + mocker, +): + publisher = _wire(connection, soft_start_seconds=0.0) + release = mocker.patch.object(connection, "_release_sport_mode") + connection._sport_mode_released = False + + connection._on_motor_command(MotorCommandArray(q=[0.0] * 5)) + release.assert_not_called() + + connection._on_motor_command(_command()) + connection._on_motor_command(_command()) + + release.assert_called_once_with() + assert len(publisher.frames) == 2 + + @pytest.mark.parametrize("value", [float("inf"), float("-inf"), float("nan")]) def test_non_finite_soft_start_is_rejected(value): # inf satisfies a bare ge=0.0, and every finite elapsed time over inf is diff --git a/dimos/robot/unitree/g1/wholebody_connection.py b/dimos/robot/unitree/g1/wholebody_connection.py index 2f185d62e8..1a466cf9c5 100644 --- a/dimos/robot/unitree/g1/wholebody_connection.py +++ b/dimos/robot/unitree/g1/wholebody_connection.py @@ -84,7 +84,6 @@ def _imu_from_unitree_wxyz( class G1WholeBodyConnectionConfig(ModuleConfig): network_interface: str = Field(default="") - release_sport_mode: bool = True publish_rate_hz: float = 500.0 frame_id: str = "g1_pelvis" mode_machine: int = _MODE_MACHINE_G1 @@ -146,6 +145,8 @@ def __init__(self, **kwargs: Any) -> None: # Soft-start clock, armed by the first motor command after start(). self._soft_start_t0: float | None = None self._soft_start_done = False + self._handoff_lock = threading.Lock() + self._sport_mode_released = False @rpc def start(self) -> None: @@ -198,13 +199,11 @@ def start(self) -> None: self._crc = CRC() - if self.config.release_sport_mode: - logger.info("Releasing sport mode...") - self._release_sport_mode() - else: - logger.info("Skipping sport mode release (release_sport_mode=False)") - - logger.info("G1WholeBodyConnection connected", mode_machine=self._mode_machine) + self._sport_mode_released = False + logger.info( + "G1WholeBodyConnection connected; sport-mode handoff deferred until first command", + mode_machine=self._mode_machine, + ) # Fresh soft-start every time control is (re)acquired. self._soft_start_t0 = None @@ -399,6 +398,8 @@ def _on_motor_command(self, msg: MotorCommandArray) -> None: if msg.num_joints != _NUM_MOTORS: logger.warning(f"Expected {_NUM_MOTORS} motor commands, got {msg.num_joints}; ignoring") return + if not self._ensure_low_level_control(): + return with self._lock: if ( @@ -428,6 +429,23 @@ def _on_motor_command(self, msg: MotorCommandArray) -> None: self._low_cmd.crc = self._crc.Crc(self._low_cmd) self._publisher.Write(self._low_cmd) + def _ensure_low_level_control(self) -> bool: + """Release the native controller exactly once, when commands are ready.""" + if self._sport_mode_released: + return True + with self._handoff_lock: + if self._sport_mode_released: + return True + try: + logger.info("First prepared command received; releasing sport mode...") + self._release_sport_mode() + except Exception: + logger.exception("Failed to release sport mode; dropping motor command") + return False + self._sport_mode_released = True + logger.info("Sport-mode handoff complete") + return True + def _release_sport_mode(self) -> None: """Loop ReleaseMode until MotionSwitcher reports no active controller. diff --git a/dimos/simulation/adapters/whole_body/g1.py b/dimos/simulation/adapters/whole_body/g1.py index d5011d2c40..9c259d1926 100644 --- a/dimos/simulation/adapters/whole_body/g1.py +++ b/dimos/simulation/adapters/whole_body/g1.py @@ -79,6 +79,7 @@ def __init__( self._shm_key = shm_key_from_path(address) self._shm: ManipShmReader | None = None self._connected = False + self._active = False # Lifecycle @@ -116,6 +117,7 @@ def connect(self) -> bool: time.sleep(_READY_WAIT_POLL_S) self._connected = True + self._active = False logger.info( "SimMujocoG1WholeBodyAdapter connected", num_motors=_NUM_MOTORS, @@ -130,10 +132,23 @@ def disconnect(self) -> None: self._shm.cleanup() self._shm = None self._connected = False + self._active = False def is_connected(self) -> bool: return self._connected and self._shm is not None + def activate(self) -> bool: + if not self.is_connected(): + return False + self._active = True + return True + + def deactivate(self) -> bool: + if not self.is_connected(): + return False + self._active = False + return True + # IO (WholeBodyAdapter protocol) def read_motor_states(self) -> list[MotorState]: @@ -172,7 +187,7 @@ def get_limits(self) -> JointLimits | None: return None def write_motor_commands(self, commands: list[MotorCommand]) -> bool: - if not self.is_connected(): + if not self.is_connected() or not self._active: return False assert self._shm is not None if len(commands) != _NUM_MOTORS: diff --git a/dimos/simulation/adapters/whole_body/test_g1.py b/dimos/simulation/adapters/whole_body/test_g1.py index 0f0064d237..7532fa85ac 100644 --- a/dimos/simulation/adapters/whole_body/test_g1.py +++ b/dimos/simulation/adapters/whole_body/test_g1.py @@ -13,8 +13,9 @@ # limitations under the License. from pathlib import Path +from typing import Any -from dimos.hardware.whole_body.spec import WholeBodyAdapter +from dimos.hardware.whole_body.spec import MotorCommand, WholeBodyAdapter from dimos.simulation.adapters.whole_body.g1 import SimMujocoG1WholeBodyAdapter @@ -23,3 +24,22 @@ def test_sim_g1_adapter_satisfies_whole_body_protocol() -> None: assert isinstance(adapter, WholeBodyAdapter) assert adapter.get_limits() is None + + +def test_sim_g1_adapter_rejects_commands_until_activated(mocker: Any) -> None: + shm_class = mocker.patch("dimos.simulation.adapters.whole_body.g1.ManipShmReader") + shm = shm_class.return_value + shm.is_ready.return_value = True + adapter = SimMujocoG1WholeBodyAdapter(address=Path("unused.xml")) + + try: + assert adapter.connect() + commands = [MotorCommand(q=0.1, kp=10.0, kd=1.0)] * 29 + + assert adapter.write_motor_commands(commands) is False + assert adapter.activate() + assert adapter.write_motor_commands(commands) is True + + shm.write_pd_tau_command.assert_called_once() + finally: + adapter.disconnect() diff --git a/dimos/simulation/engines/mujoco_engine.py b/dimos/simulation/engines/mujoco_engine.py index feb65fe79e..4354fb69fa 100644 --- a/dimos/simulation/engines/mujoco_engine.py +++ b/dimos/simulation/engines/mujoco_engine.py @@ -46,6 +46,7 @@ # Step hook signature: called with the engine instance inside the sim thread. StepHook = Callable[["MujocoEngine"], None] +StepGate = Callable[[], bool] _MJJNT_FREE = int(mujoco.mjtJoint.mjJNT_FREE) # type: ignore[attr-defined] _RESET_WAIT_TIMEOUT_S = 5.0 @@ -161,6 +162,7 @@ def __init__( raycast_lidars: list[RaycastLidarConfig] | None = None, on_before_step: StepHook | None = None, on_after_step: StepHook | None = None, + should_step: StepGate | None = None, assets: dict[str, bytes] | None = None, model: mujoco.MjModel | None = None, robot_sim_spec: RobotSimSpec | None = None, @@ -172,6 +174,7 @@ def __init__( super().__init__(config_path=config_path, headless=headless) self._on_before_step: StepHook | None = on_before_step self._on_after_step: StepHook | None = on_after_step + self._should_step: StepGate | None = should_step self._spawn_xy = spawn_xy self._spawn_z = spawn_z self._spawn_yaw = spawn_yaw @@ -250,6 +253,7 @@ def set_step_hooks( self, before: StepHook | None = None, after: StepHook | None = None, + should_step: StepGate | None = None, ) -> None: """Install pre/post step hooks after construction. @@ -258,6 +262,7 @@ def set_step_hooks( """ self._on_before_step = before self._on_after_step = after + self._should_step = should_step def _resolve_model_path(self, config_path: Path) -> Path: if config_path is None: @@ -621,8 +626,9 @@ def _step_once(sync_viewer: bool) -> None: self._on_before_step(self) except Exception as exc: logger.error("on_before_step failed", error=str(exc)) - self._apply_control() - mujoco.mj_step(self._model, self._data) + if self._should_step is None or self._should_step(): + self._apply_control() + mujoco.mj_step(self._model, self._data) if sync_viewer: m_viewer.sync() self._update_joint_state() diff --git a/dimos/simulation/engines/mujoco_sim_module.py b/dimos/simulation/engines/mujoco_sim_module.py index d53f1e7feb..71b9bbbd0e 100644 --- a/dimos/simulation/engines/mujoco_sim_module.py +++ b/dimos/simulation/engines/mujoco_sim_module.py @@ -216,6 +216,14 @@ def post_step(self, engine: MujocoEngine) -> None: if self._gripper_idx < len(positions): shm.write_gripper_state(positions[self._gripper_idx]) + def ready_for_physics(self) -> bool: + """Whether a complete whole-body command has been latched.""" + return ( + self._latest_pd_pos_target is not None + and self._latest_pd_kp is not None + and self._latest_pd_kd is not None + ) + def clear_latched_commands(self) -> None: self._latest_pd_pos_target = None self._latest_pd_kp = None @@ -251,6 +259,7 @@ class MujocoSimModuleConfig(ModuleConfig, DepthCameraConfig): spawn_z: float | None = None spawn_yaw: float | None = None reset_joint_positions: list[float] | None = None + wait_for_control_command: bool = False headless: bool = False dof: int = 7 @@ -562,6 +571,11 @@ def add_camera( self._engine.set_step_hooks( before=self._sim_hooks.pre_step, after=self._publish_shm_and_lcm, + should_step=( + self._sim_hooks.ready_for_physics + if self.config.wait_for_control_command + else None + ), ) # Start physics (sim thread spawned inside engine.connect()). diff --git a/dimos/simulation/engines/test_mujoco_sim_module.py b/dimos/simulation/engines/test_mujoco_sim_module.py index 3fa20048b5..a817d11775 100644 --- a/dimos/simulation/engines/test_mujoco_sim_module.py +++ b/dimos/simulation/engines/test_mujoco_sim_module.py @@ -26,7 +26,12 @@ from dimos.msgs.sensor_msgs.CameraInfo import CameraInfo from dimos.simulation.engines.mujoco_engine import CameraFrame, MujocoEngine -from dimos.simulation.engines.mujoco_sim_module import MujocoSimModule, MujocoSimModuleConfig +from dimos.simulation.engines.mujoco_shm import CMD_MODE_PD_TAU +from dimos.simulation.engines.mujoco_sim_module import ( + MujocoSimModule, + MujocoSimModuleConfig, + _WholeBodySimHooks, +) class _FakeData: @@ -82,6 +87,30 @@ def clear_latched_commands(self) -> None: self.cleared = True +def test_whole_body_physics_waits_for_complete_pd_command(mocker: Any) -> None: + shm = mocker.MagicMock() + shm.read_command_mode.return_value = CMD_MODE_PD_TAU + shm.read_position_command.return_value = None + shm.read_velocity_command.return_value = None + shm.read_kp_command.return_value = None + shm.read_kd_command.return_value = None + shm.read_tau_command.return_value = None + engine = mocker.MagicMock() + engine.joint_positions = [0.0, 0.0] + engine.joint_velocities = [0.0, 0.0] + hooks = _WholeBodySimHooks(shm, dof=2) + + hooks.pre_step(engine) + assert hooks.ready_for_physics() is False + + shm.read_position_command.return_value = np.array([0.1, 0.2]) + shm.read_kp_command.return_value = np.array([10.0, 10.0]) + shm.read_kd_command.return_value = np.array([1.0, 1.0]) + hooks.pre_step(engine) + + assert hooks.ready_for_physics() is True + + def test_ready_signal_happens_after_joint_state_and_imu_write() -> None: events: list[str] = [] module = MujocoSimModule() diff --git a/dimos/simulation/mujoco/model.py b/dimos/simulation/mujoco/model.py index bc309b7307..da8c41059c 100644 --- a/dimos/simulation/mujoco/model.py +++ b/dimos/simulation/mujoco/model.py @@ -46,6 +46,10 @@ def get_assets() -> dict[str, bytes]: mjx_env.update_assets(assets, data_dir / "scene_office1/office_split", "*.obj") mjx_env.update_assets(assets, mjx_env.MENAGERIE_PATH / "unitree_go1" / "assets") mjx_env.update_assets(assets, mjx_env.MENAGERIE_PATH / "unitree_g1" / "assets") + # The 29-DOF G1 WBC MJCF references the DimOS hand-inclusive meshes by + # bare filename. They are not part of MuJoCo Menagerie's G1 model. + g1_meshes = epath.Path(str(get_data("g1_urdf/meshes"))) + mjx_env.update_assets(assets, g1_meshes, "*.STL") # From: https://sketchfab.com/3d-models/jeong-seun-34-42956ca979404a038b8e0d3e496160fd person_dir = epath.Path(str(get_data("person"))) diff --git a/dimos/simulation/mujoco/test_model.py b/dimos/simulation/mujoco/test_model.py new file mode 100644 index 0000000000..c29e887ed5 --- /dev/null +++ b/dimos/simulation/mujoco/test_model.py @@ -0,0 +1,32 @@ +# Copyright 2025-2026 Dimensional Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import mujoco +import pytest + +from dimos.simulation.mujoco.model import get_assets + + +@pytest.mark.self_hosted +def test_legacy_assets_include_hand_inclusive_g1_meshes() -> None: + xml = """ + + + + + """ + + model = mujoco.MjModel.from_xml_string(xml, assets=get_assets()) + + assert model.nmesh == 1 diff --git a/dimos/teleop/webxr/README.md b/dimos/teleop/webxr/README.md index 1c84fbdb00..ec5ebc975d 100644 --- a/dimos/teleop/webxr/README.md +++ b/dimos/teleop/webxr/README.md @@ -38,6 +38,26 @@ dimos --can-port a1zcan run teleop-webxr-a1z Open `https://:8443/teleop` in a WebXR-capable headset browser. Accept the certificate, then tap Connect. +### G1 SONIC full-body simulation + +Calibrate the PICO Motion Trackers, then start the MuJoCo blueprint: + +```bash +dimos --simulation mujoco run unitree-g1-sonic-webxr-teleop +``` + +Use `--viewer none` to skip Rerun and inspect the live simulation in the +native MuJoCo window. + +Open `https://:8443/teleop` on the PICO and tap Connect. Hold X and A +together to guide the G1 with your body. Release either button to return SONIC +to planner control. While engaged, body motion supplies the whole-body +reference; the thumbsticks cannot command translation, but the right stick can +adjust heading. + +Tracking loss ends engagement. After tracking returns, release and hold X+A +again. Partial body frames keep the last complete pose for at most 150 ms. + For hand teleop, remove the controllers. Pinch the thumb and index finger on the selected hand to engage it, move the wrist to control the arm, then pinch again to disengage. Pinch the thumb and middle finger to close the gripper; diff --git a/docs/adr/0001-preserve-native-sonic-pose-semantics.md b/docs/adr/0001-preserve-native-sonic-pose-semantics.md new file mode 100644 index 0000000000..91244cbc90 --- /dev/null +++ b/docs/adr/0001-preserve-native-sonic-pose-semantics.md @@ -0,0 +1,3 @@ +# Preserve native SONIC pose semantics for WebXR teleoperation + +The first simulator milestone will convert WebXR tracking into a native-equivalent SONIC pose instead of populating only the fields currently read by the Python policy. This requires more conversion work up front, but it keeps dimOS behavior comparable with the native PICO sender and avoids defining an integration contract around incidental details of the current encoder implementation. Internal typed streams may replace the native ZMQ transport, but the pose semantics must remain equivalent; articulated fingers are outside this decision's scope. diff --git a/docs/adr/0002-use-deterministic-sonic-retargeting.md b/docs/adr/0002-use-deterministic-sonic-retargeting.md new file mode 100644 index 0000000000..0e05027320 --- /dev/null +++ b/docs/adr/0002-use-deterministic-sonic-retargeting.md @@ -0,0 +1,7 @@ +# Use deterministic kinematic conversion for SONIC retargeting + +dimOS will derive the native-equivalent SONIC pose from WebXR joint positions and orientations through fixed joint mappings, coordinate-basis changes, parent-relative rotations, and bounded wrist decomposition. The live path will not fit an SMPL body model with an iterative optimizer: WebXR already supplies an oriented skeleton, and deterministic conversion provides predictable latency, explicit failure behavior, and fixtures that can pin every transform at SONIC's input rate. + +## Consequences + +The retargeter must own and test the WebXR-to-SMPL rest-basis table. Operator body-shape estimation and runtime optimization are outside the first simulator milestone. diff --git a/docs/adr/0003-use-operator-motion-as-the-engaged-sonic-source.md b/docs/adr/0003-use-operator-motion-as-the-engaged-sonic-source.md new file mode 100644 index 0000000000..534a9a4a03 --- /dev/null +++ b/docs/adr/0003-use-operator-motion-as-the-engaged-sonic-source.md @@ -0,0 +1,3 @@ +# Use operator motion as the engaged SONIC motion source + +While full-body SONIC teleoperation is engaged, the operator pose is the sole whole-body motion source; physical stepping and turning drive the robot, and planner velocity resumes after disengagement. The current SONIC policy selects streamed SMPL motion or planner motion rather than fusing them, so simultaneous thumbstick locomotion would require a separate policy-interface design. Supported heading adjustment may still accompany the operator stream. diff --git a/docs/adr/0004-route-webxr-to-a-specialized-sonic-task.md b/docs/adr/0004-route-webxr-to-a-specialized-sonic-task.md new file mode 100644 index 0000000000..d429533ce3 --- /dev/null +++ b/docs/adr/0004-route-webxr-to-a-specialized-sonic-task.md @@ -0,0 +1,3 @@ +# Route WebXR directly to a specialized SONIC task + +The WebXR teleoperation blueprint will use one `G1SonicTeleopTask` that extends `G1SonicWBCTask` and replaces the base task in that blueprint. The coordinator will route body snapshots, controller buttons, and twist input directly to the specialized task; deterministic retargeting remains a pure helper owned by the task. The existing non-teleoperation blueprint continues to use the base task. This avoids loading two whole-body policies, conflicting 29-joint claims, an adapter worker, an intermediate transport type, and an internal ZMQ round trip. diff --git a/docs/adr/0005-require-live-pico-simulation-acceptance.md b/docs/adr/0005-require-live-pico-simulation-acceptance.md new file mode 100644 index 0000000000..f4118b12eb --- /dev/null +++ b/docs/adr/0005-require-live-pico-simulation-acceptance.md @@ -0,0 +1,3 @@ +# Require live PICO simulation acceptance + +Full-body SONIC teleoperation is not complete when synthetic fixtures or recorded frames pass alone. Acceptance requires a physical PICO and Motion Trackers to drive the MuJoCo G1 through the production WebXR browser, coordinator, specialized SONIC task, and policy path. Automated conversion, routing, and replay tests remain required preconditions, but they establish readiness for the live test rather than completion. From 61f59a66a2b2783050b6888a9015d3d638157378 Mon Sep 17 00:00:00 2001 From: cc Date: Wed, 26 Aug 2026 22:50:42 -0700 Subject: [PATCH 57/57] fix(g1): align SONIC hardware lifecycle --- dimos/cli/hardware/g1.py | 137 ++++++++++++----- dimos/cli/hardware/test_g1.py | 142 +++++++++++++++--- .../codebase_checks/test_blueprint_kwargs.py | 19 +-- .../g1_sonic_wbc_task/g1_sonic_teleop_task.py | 13 +- .../g1_sonic_wbc_task/g1_sonic_wbc_task.py | 115 ++++++++------ .../test_g1_sonic_teleop_task.py | 35 ++++- .../test_g1_sonic_wbc_task.py | 90 ++++++++--- dimos/robot/test_all_blueprints.py | 34 +---- .../test_unitree_g1_sonic_webxr_teleop.py | 55 +++++++ .../blueprints/basic/unitree_g1_sonic_wbc.py | 12 +- .../basic/unitree_g1_sonic_webxr_teleop.py | 10 +- dimos/teleop/webxr/README.md | 54 ++++++- docs/platforms/humanoid/g1/index.md | 33 ++++ 13 files changed, 556 insertions(+), 193 deletions(-) create mode 100644 dimos/robot/unitree/g1/blueprints/basic/test_unitree_g1_sonic_webxr_teleop.py diff --git a/dimos/cli/hardware/g1.py b/dimos/cli/hardware/g1.py index 39fe8bd049..1183927824 100644 --- a/dimos/cli/hardware/g1.py +++ b/dimos/cli/hardware/g1.py @@ -35,12 +35,17 @@ _COORDINATOR = "ControlCoordinator" _MANIPULATION = "G1Manipulation" -_GROOT_TASK = "groot_wbc" _TELEOP_TASK = "teleop_g1" _ARM_POLL_SECONDS = 0.1 +_LIFECYCLE_COMMANDS = frozenset({"arm", "disarm", "set_dry_run", "state_snapshot"}) +_LIFECYCLE_STATE_FIELDS = frozenset( + {"active", "armed", "arming", "arm_pending", "dry_run", "arming_duration"} +) class _G1CoordinatorHandle(Protocol): + def list_tasks(self) -> list[str]: ... + def describe_task(self, task_name: str) -> dict[str, Any] | None: ... def task_invoke(self, task_name: str, method: str, kwargs: dict[str, Any]) -> Any: ... def set_dry_run(self, dry_run: bool) -> Any: ... def set_activated(self, activated: bool) -> Any: ... @@ -73,7 +78,15 @@ def _has_methods(handle: ModuleHandle, names: tuple[str, ...]) -> bool: def _is_coordinator(handle: ModuleHandle) -> TypeGuard[_G1CoordinatorHandle]: return _has_methods( handle, - ("task_invoke", "set_dry_run", "set_activated", "get_active_tasks", "cancel_trajectory"), + ( + "list_tasks", + "describe_task", + "task_invoke", + "set_dry_run", + "set_activated", + "get_active_tasks", + "cancel_trajectory", + ), ) @@ -89,29 +102,48 @@ def _coordinator(client: Dimos) -> _G1CoordinatorHandle: def _manipulation(client: Dimos) -> _G1ManipulationHandle: - handle = client.get_module(_MANIPULATION) + try: + handle = client.get_module(_MANIPULATION) + except (AttributeError, KeyError): + _abort("the running stack does not expose the required G1 manipulation RPCs") if not _is_manipulation(handle): _abort("the running stack does not expose the required G1 manipulation RPCs") return handle -def _is_groot_state(value: Any) -> TypeGuard[dict[str, Any]]: - return isinstance(value, dict) +def _lifecycle_task(coordinator: _G1CoordinatorHandle) -> str: + matches: list[str] = [] + for task_name in coordinator.list_tasks(): + description = coordinator.describe_task(task_name) + if not isinstance(description, dict): + continue + commands = description.get("commands") + if isinstance(commands, dict) and _LIFECYCLE_COMMANDS <= commands.keys(): + matches.append(task_name) + if not matches: + _abort("the running stack has no G1 policy task with lifecycle controls") + if len(matches) > 1: + _abort(f"the running stack has multiple G1 policy lifecycle tasks: {', '.join(matches)}") + return matches[0] + + +def _is_lifecycle_state(value: Any) -> TypeGuard[dict[str, Any]]: + return isinstance(value, dict) and _LIFECYCLE_STATE_FIELDS <= value.keys() -def _groot_state(coordinator: _G1CoordinatorHandle) -> dict[str, Any]: - state = coordinator.task_invoke(_GROOT_TASK, "state_snapshot", {}) - if not _is_groot_state(state): - _abort("the running stack does not expose G1 GR00T safety state") +def _policy_state(coordinator: _G1CoordinatorHandle, task_name: str) -> dict[str, Any]: + state = coordinator.task_invoke(task_name, "state_snapshot", {}) + if not _is_lifecycle_state(state): + _abort(f"G1 policy task {task_name!r} returned an invalid lifecycle state") return state -def _require_armed_and_enabled(coordinator: _G1CoordinatorHandle) -> dict[str, Any]: - state = _groot_state(coordinator) +def _require_armed_and_enabled(coordinator: _G1CoordinatorHandle, task_name: str) -> dict[str, Any]: + state = _policy_state(coordinator, task_name) if not state.get("armed") or state.get("arming") or state.get("arm_pending"): _abort("G1 is not fully armed; run `dimos hardware g1 arm` first") if state.get("dry_run"): - _abort("motor output is still disabled; run `dimos hardware g1 enable` first") + _abort("learned-policy output is still in dry-run; run `dimos hardware g1 enable` first") return state @@ -119,12 +151,14 @@ def _fully_armed(state: dict[str, Any]) -> bool: return bool(state.get("armed") and not state.get("arming") and not state.get("arm_pending")) -def _arm_and_wait(coordinator: _G1CoordinatorHandle, timeout: float) -> dict[str, Any]: +def _arm_and_wait( + coordinator: _G1CoordinatorHandle, task_name: str, timeout: float +) -> dict[str, Any]: coordinator.set_dry_run(True) coordinator.set_activated(True) deadline = time.monotonic() + timeout while time.monotonic() < deadline: - state = _groot_state(coordinator) + state = _policy_state(coordinator, task_name) if _fully_armed(state): return state time.sleep(_ARM_POLL_SECONDS) @@ -133,13 +167,14 @@ def _arm_and_wait(coordinator: _G1CoordinatorHandle, timeout: float) -> dict[str def _enable_motor_output( coordinator: _G1CoordinatorHandle, + task_name: str, state: dict[str, Any] | None = None, ) -> dict[str, Any]: - current = state if state is not None else _groot_state(coordinator) + current = state if state is not None else _policy_state(coordinator, task_name) if not _fully_armed(current): _abort("G1 is not fully armed; run `dimos hardware g1 arm` first") coordinator.set_dry_run(False) - enabled = _groot_state(coordinator) + enabled = _policy_state(coordinator, task_name) if enabled.get("dry_run"): _abort("G1 remained in dry-run after the enable request") return enabled @@ -152,9 +187,10 @@ def _require_teleop_disengaged(coordinator: _G1CoordinatorHandle) -> None: def _execute_ready_pose( coordinator: _G1CoordinatorHandle, + task_name: str, manipulation: _G1ManipulationHandle, ) -> None: - _require_armed_and_enabled(coordinator) + _require_armed_and_enabled(coordinator, task_name) _require_teleop_disengaged(coordinator) targets = { f"{G1_UPPER_BODY_NAME}/{group}": JointState(position=list(positions)) @@ -174,20 +210,35 @@ def status() -> None: client = _connect() try: coordinator = _coordinator(client) - state = _groot_state(coordinator) - trajectory = coordinator.task_invoke( - JOINT_TRAJECTORY_TASK_NAME, "get_status", {"t_now": None} - ) + task_name = _lifecycle_task(coordinator) + state = _policy_state(coordinator, task_name) + if JOINT_TRAJECTORY_TASK_NAME in coordinator.list_tasks(): + trajectory = coordinator.task_invoke( + JOINT_TRAJECTORY_TASK_NAME, "get_status", {"t_now": None} + ) + else: + trajectory = "unavailable" try: - groups = _manipulation(client).list_planning_groups() + manipulation = client.get_module(_MANIPULATION) + if not _is_manipulation(manipulation): + raise KeyError(_MANIPULATION) + groups = manipulation.list_planning_groups() group_ids = [str(group.id) for group in groups] except (AttributeError, KeyError): group_ids = [] + typer.echo(f"controller: {task_name}") typer.echo(f"active: {bool(state.get('active'))}") typer.echo(f"armed: {bool(state.get('armed'))}") typer.echo(f"arming: {bool(state.get('arming') or state.get('arm_pending'))}") typer.echo(f"dry_run: {bool(state.get('dry_run'))}") + if "control_state" in state: + typer.echo(f"control: {state['control_state']}") + if "reference_source" in state: + typer.echo(f"reference: {state['reference_source']}") + webxr = state.get("webxr_teleop") + if isinstance(webxr, dict): + typer.echo(f"webxr: {'engaged' if webxr.get('engaged') else 'disengaged'}") typer.echo(f"trajectory: {trajectory}") typer.echo(f"manipulation: {', '.join(group_ids) if group_ids else 'unavailable'}") except (AttributeError, KeyError, RuntimeError) as exc: @@ -198,11 +249,12 @@ def status() -> None: @app.command() def arm(timeout: float = typer.Option(15.0, min=0.1, help="Arming timeout in seconds.")) -> None: - """Run the GR00T pose ramp, then keep policy output in dry-run.""" + """Run the policy pose ramp, then keep learned-policy output in dry-run.""" client = _connect() try: coordinator = _coordinator(client) - _arm_and_wait(coordinator, timeout) + task_name = _lifecycle_task(coordinator) + _arm_and_wait(coordinator, task_name, timeout) typer.echo("G1 armed in dry-run; inspect the robot, then run `dimos hardware g1 enable`.") except (AttributeError, KeyError, RuntimeError) as exc: _abort(f"failed to arm G1: {exc}") @@ -212,12 +264,13 @@ def arm(timeout: float = typer.Option(15.0, min=0.1, help="Arming timeout in sec @app.command() def enable() -> None: - """Enable motor output after a completed dry-run arming ramp.""" + """Enable learned-policy output after a completed dry-run arming ramp.""" client = _connect() try: coordinator = _coordinator(client) - _enable_motor_output(coordinator) - typer.echo("G1 motor output enabled.") + task_name = _lifecycle_task(coordinator) + _enable_motor_output(coordinator, task_name) + typer.echo("G1 live policy output enabled.") except (AttributeError, KeyError, RuntimeError) as exc: _abort(f"failed to enable G1: {exc}") finally: @@ -233,42 +286,44 @@ def activate( help="Move both arms to the conservative ready pose after enabling motor output.", ), ) -> None: - """Arm, confirm physical safety, and enable live GR00T output.""" + """Arm, confirm physical safety, and enable live policy output.""" client = _connect() motor_output_enabled = False try: coordinator = _coordinator(client) - state = _groot_state(coordinator) + manipulation = _manipulation(client) if ready else None + task_name = _lifecycle_task(coordinator) + state = _policy_state(coordinator, task_name) if not _fully_armed(state): - state = _arm_and_wait(coordinator, timeout) + state = _arm_and_wait(coordinator, task_name, timeout) if state.get("dry_run"): typer.echo( "Arming ramp complete. Inspect the robot and confirm the remote and E-stop " "are ready." ) - if not typer.confirm("Enable live GR00T motor output?", default=False): + if not typer.confirm("Enable live G1 policy motor output?", default=False): typer.echo("Activation cancelled; G1 remains armed in dry-run.") raise typer.Exit(1) - _enable_motor_output(coordinator, state) + _enable_motor_output(coordinator, task_name, state) motor_output_enabled = True - typer.echo("G1 motor output enabled.") + typer.echo("G1 live policy output enabled.") else: motor_output_enabled = True typer.echo("G1 is already activated.") if ready: - manipulation = _manipulation(client) + assert manipulation is not None try: - _execute_ready_pose(coordinator, manipulation) + _execute_ready_pose(coordinator, task_name, manipulation) except typer.Exit: - typer.echo("GR00T motor output remains enabled.", err=True) + typer.echo("G1 policy motor output remains enabled.", err=True) raise typer.echo("G1 reached the ready pose.") elif state.get("dry_run"): typer.echo("G1 activated.") except (AttributeError, KeyError, RuntimeError) as exc: - suffix = "; GR00T motor output remains enabled" if motor_output_enabled else "" + suffix = "; G1 policy motor output remains enabled" if motor_output_enabled else "" _abort(f"failed to activate G1: {exc}{suffix}") finally: client.stop() @@ -280,8 +335,9 @@ def ready() -> None: client = _connect() try: coordinator = _coordinator(client) + task_name = _lifecycle_task(coordinator) manipulation = _manipulation(client) - _execute_ready_pose(coordinator, manipulation) + _execute_ready_pose(coordinator, task_name, manipulation) typer.echo("G1 reached the ready pose.") except (AttributeError, KeyError, RuntimeError) as exc: _abort(f"failed to move G1 to the ready pose: {exc}") @@ -307,7 +363,10 @@ def disable() -> None: failures.append(f"{description}: {exc}") if failures: _abort("; ".join(failures)) - typer.echo("G1 trajectory cancelled, motor output disabled, and controller disarmed.") + typer.echo( + "G1 trajectory cancelled and policy disarmed into current-pose hold. " + "Run `dimos stop` to stop low-level motor commands." + ) except (AttributeError, KeyError, RuntimeError) as exc: _abort(f"failed to disable G1: {exc}") finally: diff --git a/dimos/cli/hardware/test_g1.py b/dimos/cli/hardware/test_g1.py index 4243455b17..e7702c2070 100644 --- a/dimos/cli/hardware/test_g1.py +++ b/dimos/cli/hardware/test_g1.py @@ -52,6 +52,25 @@ def _state(*, armed: bool, dry_run: bool, arming: bool = False) -> dict[str, obj } +def _coordinator(task_name: str = "groot_wbc") -> Mock: + coordinator = Mock() + coordinator.list_tasks.return_value = [task_name, "joint_trajectory"] + coordinator.describe_task.side_effect = lambda name: { + "task": name, + "commands": ( + { + "arm": {}, + "disarm": {}, + "set_dry_run": {}, + "state_snapshot": {}, + } + if name == task_name + else {"get_status": {}} + ), + } + return coordinator + + def test_hardware_namespace_exposes_g1_operator_commands() -> None: result = runner.invoke(hardware_cli.app, ["g1", "--help"]) @@ -72,8 +91,67 @@ def test_status_rejects_coordinator_without_required_rpcs(mocker) -> None: assert client.stopped +def test_status_discovers_sonic_lifecycle_task(mocker) -> None: + coordinator = _coordinator("sonic_teleop") + coordinator.task_invoke.side_effect = [ + { + **_state(armed=False, dry_run=True), + "control_state": "unarmed", + "reference_source": "planner", + "webxr_teleop": {"engaged": False}, + }, + {"state": "idle"}, + ] + client = _Client(coordinator) + mocker.patch.object(g1_cli.Dimos, "connect", return_value=client) + + result = runner.invoke(g1_cli.app, ["status"]) + + assert result.exit_code == 0, result.output + assert "controller: sonic_teleop" in result.output + assert "control: unarmed" in result.output + assert "webxr: disengaged" in result.output + coordinator.task_invoke.assert_any_call("sonic_teleop", "state_snapshot", {}) + + +def test_arm_rejects_stack_without_lifecycle_task(mocker) -> None: + coordinator = _coordinator() + coordinator.list_tasks.return_value = ["joint_trajectory"] + client = _Client(coordinator) + mocker.patch.object(g1_cli.Dimos, "connect", return_value=client) + + result = runner.invoke(g1_cli.app, ["arm"]) + + assert result.exit_code == 1 + assert "no G1 policy task" in result.output + coordinator.set_activated.assert_not_called() + + +def test_arm_rejects_multiple_lifecycle_tasks(mocker) -> None: + coordinator = _coordinator() + coordinator.list_tasks.return_value = ["groot_wbc", "sonic_teleop"] + lifecycle = { + "arm": {}, + "disarm": {}, + "set_dry_run": {}, + "state_snapshot": {}, + } + coordinator.describe_task.side_effect = lambda name: { + "task": name, + "commands": lifecycle, + } + client = _Client(coordinator) + mocker.patch.object(g1_cli.Dimos, "connect", return_value=client) + + result = runner.invoke(g1_cli.app, ["arm"]) + + assert result.exit_code == 1 + assert "multiple G1 policy lifecycle tasks" in result.output + coordinator.set_activated.assert_not_called() + + def test_arm_forces_dry_run_before_activation_and_waits_for_armed(mocker) -> None: - coordinator = Mock() + coordinator = _coordinator() coordinator.task_invoke.return_value = _state(armed=True, dry_run=True) client = _Client(coordinator) mocker.patch.object(g1_cli.Dimos, "connect", return_value=client) @@ -81,16 +159,15 @@ def test_arm_forces_dry_run_before_activation_and_waits_for_armed(mocker) -> Non result = runner.invoke(g1_cli.app, ["arm"]) assert result.exit_code == 0, result.output - assert coordinator.method_calls[:2] == [ - mocker.call.set_dry_run(True), - mocker.call.set_activated(True), - ] + assert coordinator.method_calls.index(mocker.call.set_dry_run(True)) < ( + coordinator.method_calls.index(mocker.call.set_activated(True)) + ) assert "armed in dry-run" in result.output assert client.stopped def test_enable_rejects_robot_that_has_not_completed_arming(mocker) -> None: - coordinator = Mock() + coordinator = _coordinator() coordinator.task_invoke.return_value = _state(armed=False, dry_run=True, arming=True) client = _Client(coordinator) mocker.patch.object(g1_cli.Dimos, "connect", return_value=client) @@ -103,7 +180,7 @@ def test_enable_rejects_robot_that_has_not_completed_arming(mocker) -> None: def test_activate_arms_confirms_and_enables_in_order(mocker) -> None: - coordinator = Mock() + coordinator = _coordinator() coordinator.task_invoke.side_effect = [ _state(armed=False, dry_run=True), _state(armed=True, dry_run=True), @@ -116,7 +193,18 @@ def test_activate_arms_confirms_and_enables_in_order(mocker) -> None: result = runner.invoke(g1_cli.app, ["activate"]) assert result.exit_code == 0, result.output - assert coordinator.method_calls == [ + lifecycle_calls = [ + call + for call in coordinator.method_calls + if call + in ( + mocker.call.task_invoke("groot_wbc", "state_snapshot", {}), + mocker.call.set_dry_run(True), + mocker.call.set_activated(True), + mocker.call.set_dry_run(False), + ) + ] + assert lifecycle_calls == [ mocker.call.task_invoke("groot_wbc", "state_snapshot", {}), mocker.call.set_dry_run(True), mocker.call.set_activated(True), @@ -124,13 +212,13 @@ def test_activate_arms_confirms_and_enables_in_order(mocker) -> None: mocker.call.set_dry_run(False), mocker.call.task_invoke("groot_wbc", "state_snapshot", {}), ] - confirm.assert_called_once_with("Enable live GR00T motor output?", default=False) + confirm.assert_called_once_with("Enable live G1 policy motor output?", default=False) assert "G1 activated" in result.output assert client.stopped def test_activate_decline_leaves_robot_armed_in_dry_run(mocker) -> None: - coordinator = Mock() + coordinator = _coordinator() coordinator.task_invoke.side_effect = [ _state(armed=False, dry_run=True), _state(armed=True, dry_run=True), @@ -148,7 +236,7 @@ def test_activate_decline_leaves_robot_armed_in_dry_run(mocker) -> None: def test_activate_unavailable_confirmation_leaves_dry_run_enabled(mocker) -> None: - coordinator = Mock() + coordinator = _coordinator() coordinator.task_invoke.return_value = _state(armed=True, dry_run=True) client = _Client(coordinator) mocker.patch.object(g1_cli.Dimos, "connect", return_value=client) @@ -162,7 +250,7 @@ def test_activate_unavailable_confirmation_leaves_dry_run_enabled(mocker) -> Non def test_activate_timeout_never_confirms_or_enables(mocker) -> None: - coordinator = Mock() + coordinator = _coordinator() coordinator.task_invoke.return_value = _state(armed=False, dry_run=True, arming=True) client = _Client(coordinator) mocker.patch.object(g1_cli.Dimos, "connect", return_value=client) @@ -179,7 +267,7 @@ def test_activate_timeout_never_confirms_or_enables(mocker) -> None: def test_activate_already_enabled_skips_arm_and_confirmation(mocker) -> None: - coordinator = Mock() + coordinator = _coordinator() coordinator.task_invoke.return_value = _state(armed=True, dry_run=False) client = _Client(coordinator) mocker.patch.object(g1_cli.Dimos, "connect", return_value=client) @@ -195,7 +283,7 @@ def test_activate_already_enabled_skips_arm_and_confirmation(mocker) -> None: def test_ready_plans_both_arms_at_conservative_speed(mocker) -> None: - coordinator = Mock() + coordinator = _coordinator() coordinator.task_invoke.return_value = _state(armed=True, dry_run=False) coordinator.get_active_tasks.return_value = ["groot_wbc"] manipulation = Mock() @@ -216,7 +304,7 @@ def test_ready_plans_both_arms_at_conservative_speed(mocker) -> None: def test_activate_ready_enables_before_moving_arms(mocker) -> None: - coordinator = Mock() + coordinator = _coordinator() coordinator.task_invoke.side_effect = [ _state(armed=True, dry_run=True), _state(armed=True, dry_run=False), @@ -235,13 +323,27 @@ def test_activate_ready_enables_before_moving_arms(mocker) -> None: assert result.exit_code == 0, result.output coordinator.set_dry_run.assert_called_once_with(False) manipulation.execute.assert_called_once_with(blocking=True) - assert result.output.index("G1 motor output enabled") < result.output.index( + assert result.output.index("G1 live policy output enabled") < result.output.index( "G1 reached the ready pose" ) +def test_activate_ready_requires_manipulation_before_enabling(mocker) -> None: + coordinator = _coordinator("sonic_teleop") + client = _Client(coordinator) + mocker.patch.object(g1_cli.Dimos, "connect", return_value=client) + + result = runner.invoke(g1_cli.app, ["activate", "--ready"]) + + assert result.exit_code == 1 + assert "required G1 manipulation RPCs" in result.output + coordinator.task_invoke.assert_not_called() + coordinator.set_dry_run.assert_not_called() + coordinator.set_activated.assert_not_called() + + def test_activate_ready_failure_reports_that_motor_output_remains_enabled(mocker) -> None: - coordinator = Mock() + coordinator = _coordinator() coordinator.task_invoke.side_effect = [ _state(armed=True, dry_run=True), _state(armed=True, dry_run=False), @@ -257,12 +359,12 @@ def test_activate_ready_failure_reports_that_motor_output_remains_enabled(mocker result = runner.invoke(g1_cli.app, ["activate", "--ready"]) assert result.exit_code == 1 - assert "GR00T motor output remains enabled" in result.output + assert "G1 policy motor output remains enabled" in result.output manipulation.execute.assert_not_called() def test_ready_rejects_active_teleoperation_before_planning(mocker) -> None: - coordinator = Mock() + coordinator = _coordinator() coordinator.task_invoke.return_value = _state(armed=True, dry_run=False) coordinator.get_active_tasks.return_value = ["groot_wbc", "teleop_g1"] manipulation = Mock() @@ -277,7 +379,7 @@ def test_ready_rejects_active_teleoperation_before_planning(mocker) -> None: def test_disable_attempts_every_safety_action(mocker) -> None: - coordinator = Mock() + coordinator = _coordinator() client = _Client(coordinator) mocker.patch.object(g1_cli.Dimos, "connect", return_value=client) diff --git a/dimos/codebase_checks/test_blueprint_kwargs.py b/dimos/codebase_checks/test_blueprint_kwargs.py index 58946e5881..00f969bf62 100644 --- a/dimos/codebase_checks/test_blueprint_kwargs.py +++ b/dimos/codebase_checks/test_blueprint_kwargs.py @@ -15,8 +15,6 @@ from __future__ import annotations import inspect -import subprocess -import sys from typing import Any, get_type_hints from pydantic import BaseModel @@ -30,7 +28,6 @@ OPTIONAL_DEPENDENCIES, OPTIONAL_ERROR_SUBSTRINGS, SELF_HOSTED_BLUEPRINTS, - SIMULATION_ONLY_SELF_HOSTED_BLUEPRINTS, ) @@ -81,9 +78,10 @@ def _allowed_kwarg_names(module: type[ModuleBase]) -> set[str]: def _blueprint_params() -> list[str | pytest.ParameterSet]: - self_hosted = set(SELF_HOSTED_BLUEPRINTS) | set(SIMULATION_ONLY_SELF_HOSTED_BLUEPRINTS) return [ - pytest.param(name, marks=pytest.mark.self_hosted) if name in self_hosted else name + pytest.param(name, marks=pytest.mark.self_hosted) + if name in SELF_HOSTED_BLUEPRINTS + else name for name in sorted(all_blueprints) ] @@ -113,15 +111,4 @@ def _assert_blueprint_atom_kwargs_match_module_config(blueprint_name: str) -> No @pytest.mark.parametrize("blueprint_name", _blueprint_params()) def test_blueprint_atom_kwargs_match_module_config(blueprint_name: str) -> None: """Fail when blueprint kwargs cannot be consumed by their target module.""" - if blueprint_name in SIMULATION_ONLY_SELF_HOSTED_BLUEPRINTS: - code = ( - "from dimos.core.global_config import global_config; " - 'global_config.update(simulation="mujoco", viewer="none"); ' - "from dimos.codebase_checks.test_blueprint_kwargs import " - "_assert_blueprint_atom_kwargs_match_module_config; " - f'_assert_blueprint_atom_kwargs_match_module_config("{blueprint_name}")' - ) - subprocess.run([sys.executable, "-c", code], check=True) - return - _assert_blueprint_atom_kwargs_match_module_config(blueprint_name) diff --git a/dimos/control/tasks/g1_sonic_wbc_task/g1_sonic_teleop_task.py b/dimos/control/tasks/g1_sonic_wbc_task/g1_sonic_teleop_task.py index b43c620701..ccbbe86edb 100644 --- a/dimos/control/tasks/g1_sonic_wbc_task/g1_sonic_teleop_task.py +++ b/dimos/control/tasks/g1_sonic_wbc_task/g1_sonic_teleop_task.py @@ -57,7 +57,9 @@ def __init__( adapter: WholeBodyAdapter, ) -> None: super().__init__(name, config, adapter) - self._teleop_lock = threading.Lock() + # ZMQ command handling runs inside compute() and can synchronously + # invoke disarm(), so lifecycle cleanup must be re-entrant here. + self._teleop_lock = threading.RLock() self._retargeter = WebXRSonicRetargeter() self._latest_complete: BodyTrackingSnapshot | None = None self._latest_complete_time = 0.0 @@ -130,6 +132,11 @@ def stop(self) -> None: self._reset_teleop_locked() super().stop() + def disarm(self) -> bool: + with self._teleop_lock: + self._reset_teleop_locked() + return super().disarm() + def reset_runtime_state(self, reactivate: bool | None = None) -> bool: with self._teleop_lock: self._reset_teleop_locked() @@ -222,6 +229,10 @@ def _disengage_locked(self, reason: str, *, require_release: bool) -> None: ) def _reset_teleop_locked(self) -> None: + if self._engaged: + self._pipeline.clear_vr_3point() + self._return_to_planner_reference() + self.set_velocity_command(0.0, 0.0, 0.0) self._latest_complete = None self._latest_complete_time = 0.0 self._latest_sequence = 0 diff --git a/dimos/control/tasks/g1_sonic_wbc_task/g1_sonic_wbc_task.py b/dimos/control/tasks/g1_sonic_wbc_task/g1_sonic_wbc_task.py index 519b9f8e92..4a3b8c75b3 100644 --- a/dimos/control/tasks/g1_sonic_wbc_task/g1_sonic_wbc_task.py +++ b/dimos/control/tasks/g1_sonic_wbc_task/g1_sonic_wbc_task.py @@ -87,13 +87,14 @@ class G1SonicWBCTaskConfig: zmq_enabled: bool = True zmq_sub_endpoint: str = "tcp://127.0.0.1:5556" zmq_pub_endpoint: str = "tcp://*:5557" - auto_start_policy: bool = False + auto_arm: bool = False auto_dry_run: bool = False - initialization_seconds: float = 3.0 + default_ramp_seconds: float = 3.0 class SonicControlState(str, Enum): STOPPED = "stopped" + UNARMED = "unarmed" INITIALIZING = "initializing" READY = "ready" CONTROL = "control" @@ -102,8 +103,8 @@ class SonicControlState(str, Enum): class G1SonicWBCTask(BaseControlTask): """GEAR-SONIC unified 29-DOF whole-body policy as a coordinator task. - The task mirrors SONIC's native controller lifecycle: initialize to the - default pose, wait ready, then run the balancing policy continuously. + Startup holds the measured pose. arm() snapshots that pose on the next + control tick, ramps to SONIC's default, then runs the balancing policy. """ def __init__( @@ -146,9 +147,9 @@ def __init__( self._active = False self._control_state = SonicControlState.STOPPED - self._start_requested = False + self._arm_pending = False self._dry_run = bool(config.auto_dry_run) - self._initialization_duration = max(0.0, float(config.initialization_seconds)) + self._arming_duration = max(0.0, float(config.default_ramp_seconds)) self._initialization_start_t = 0.0 self._initialization_started = False self._ramp_start: NDArray[np.float32] | None = None @@ -223,6 +224,17 @@ def compute(self, state: CoordinatorState) -> JointCommandOutput | None: current_29 = self._cached_q_29.copy() + if self._control_state is SonicControlState.UNARMED: + if not self._arm_pending: + self._last_targets = current_29.tolist() + return JointCommandOutput( + joint_names=self._joint_names_list, + positions=self._last_targets, + mode=ControlMode.SERVO_POSITION, + ) + self._arm_pending = False + self._control_state = SonicControlState.INITIALIZING + if self._control_state is SonicControlState.INITIALIZING: if not self._initialization_started: self._initialization_started = True @@ -231,15 +243,13 @@ def compute(self, state: CoordinatorState) -> JointCommandOutput | None: logger.info( "G1SonicWBCTask initializing to SONIC default pose", task=self._name, - initialization_seconds=self._initialization_duration, + ramp_seconds=self._arming_duration, ) assert self._ramp_start is not None elapsed = state.t_now - self._initialization_start_t alpha = ( - 1.0 - if self._initialization_duration <= 0.0 - else min(1.0, elapsed / self._initialization_duration) + 1.0 if self._arming_duration <= 0.0 else min(1.0, elapsed / self._arming_duration) ) target = self._ramp_start + alpha * (self._default_29 - self._ramp_start) self._last_targets = target.tolist() @@ -247,8 +257,7 @@ def compute(self, state: CoordinatorState) -> JointCommandOutput | None: self._control_state = SonicControlState.READY self._reset_policy_state() logger.info("G1SonicWBCTask initialization complete", task=self._name) - if self._start_requested: - self._enter_control() + self._enter_control() return JointCommandOutput( joint_names=self._joint_names_list, positions=self._last_targets, @@ -257,8 +266,7 @@ def compute(self, state: CoordinatorState) -> JointCommandOutput | None: if self._control_state is SonicControlState.READY: self._last_targets = self._default_29.tolist() - if self._start_requested: - self._enter_control() + self._enter_control() return JointCommandOutput( joint_names=self._joint_names_list, positions=self._last_targets, @@ -620,10 +628,10 @@ def _zmq_publish_state( def start(self) -> None: self._active = True - self._control_state = SonicControlState.INITIALIZING - self._start_requested = bool(self._config.auto_start_policy) + self._control_state = SonicControlState.UNARMED + self._arm_pending = False self._dry_run = bool(self._config.auto_dry_run) - self._initialization_duration = max(0.0, float(self._config.initialization_seconds)) + self._arming_duration = max(0.0, float(self._config.default_ramp_seconds)) self._initialization_start_t = 0.0 self._initialization_started = False self._ramp_start = None @@ -634,18 +642,20 @@ def start(self) -> None: with self._cmd_lock: self._cmd[:] = 0.0 self._last_cmd_time = 0.0 + if self._config.auto_arm: + self.arm() logger.info( "G1SonicWBCTask started", task=self._name, control_state=self._control_state.value, - auto_start_policy=self._start_requested, + auto_arm=self._config.auto_arm, dry_run=self._dry_run, ) def stop(self) -> None: self._active = False self._control_state = SonicControlState.STOPPED - self._start_requested = False + self._arm_pending = False self._initialization_started = False self._ramp_start = None self._stream_source_requested = False @@ -656,33 +666,42 @@ def arm(self, ramp_seconds: float | None = None) -> bool: if not self._active: logger.warning("G1SonicWBCTask arm() before start(); ignoring", task=self._name) return False - if self._control_state is SonicControlState.CONTROL or self._start_requested: + if ( + self._control_state + in ( + SonicControlState.INITIALIZING, + SonicControlState.READY, + SonicControlState.CONTROL, + ) + or self._arm_pending + ): return False if ramp_seconds is not None: - if self._initialization_started: - logger.warning( - "Ignoring initialization override after ramp started", - task=self._name, - ramp_seconds=ramp_seconds, - ) - else: - self._initialization_duration = max(0.0, float(ramp_seconds)) - self._start_requested = True + self._arming_duration = max(0.0, float(ramp_seconds)) + else: + self._arming_duration = max(0.0, float(self._config.default_ramp_seconds)) + self._arm_pending = True logger.info( - "G1SonicWBCTask policy start requested", + "G1SonicWBCTask arm requested", task=self._name, control_state=self._control_state.value, ) return True def disarm(self) -> bool: - if not self._start_requested and self._control_state is not SonicControlState.CONTROL: + if not self._arm_pending and self._control_state not in ( + SonicControlState.INITIALIZING, + SonicControlState.READY, + SonicControlState.CONTROL, + ): return False - self._start_requested = False + self._arm_pending = False self._stream_source_requested = False - if self._control_state is SonicControlState.CONTROL: - self._control_state = SonicControlState.READY - self._reset_policy_state() + self._control_state = SonicControlState.UNARMED + self._initialization_started = False + self._ramp_start = None + self._last_targets = None + self._reset_policy_state() logger.info( "G1SonicWBCTask policy stopped", task=self._name, @@ -691,13 +710,17 @@ def disarm(self) -> bool: return True def reset_runtime_state(self, reactivate: bool | None = None) -> bool: - was_requested = self._start_requested or self._control_state is SonicControlState.CONTROL - should_reactivate = was_requested if reactivate is None else bool(reactivate) + was_armed = self._arm_pending or self._control_state in ( + SonicControlState.INITIALIZING, + SonicControlState.READY, + SonicControlState.CONTROL, + ) + should_reactivate = was_armed if reactivate is None else bool(reactivate) self._control_state = ( - SonicControlState.INITIALIZING if self._active else SonicControlState.STOPPED + SonicControlState.UNARMED if self._active else SonicControlState.STOPPED ) - self._start_requested = self._active and should_reactivate + self._arm_pending = self._active and should_reactivate self._ramp_start = None self._initialization_start_t = 0.0 self._initialization_started = False @@ -729,10 +752,12 @@ def set_dry_run(self, enabled: bool) -> None: def state_snapshot(self) -> dict[str, Any]: snap: dict[str, Any] = { "active": self._active, + "armed": self._control_state is SonicControlState.CONTROL, + "arming": self._control_state is SonicControlState.INITIALIZING, + "arm_pending": self._arm_pending, + "arming_duration": self._arming_duration, "control_state": self._control_state.value, - "policy_start_requested": self._start_requested, "dry_run": self._dry_run, - "initialization_seconds": self._initialization_duration, } snap.update(self._pipeline.snapshot()) snap["reference_source"] = "stream" if snap.get("stream_active") else "planner" @@ -787,9 +812,9 @@ class G1SonicWBCTaskParams(BaseConfig): decoder_onnx: str | Path planner_onnx: str | Path hardware_id: str - auto_start_policy: bool = False + auto_arm: bool = False auto_dry_run: bool = False - initialization_seconds: float = 3.0 + default_ramp_seconds: float = 3.0 decimation: int | None = None zmq_enabled: bool = True @@ -819,9 +844,9 @@ def _create_task( planner_onnx=params.planner_onnx, joint_names=cfg.joint_names, priority=cfg.priority, - auto_start_policy=params.auto_start_policy, + auto_arm=params.auto_arm, auto_dry_run=params.auto_dry_run, - initialization_seconds=params.initialization_seconds, + default_ramp_seconds=params.default_ramp_seconds, zmq_enabled=params.zmq_enabled, ) if params.decimation is not None: diff --git a/dimos/control/tasks/g1_sonic_wbc_task/test_g1_sonic_teleop_task.py b/dimos/control/tasks/g1_sonic_wbc_task/test_g1_sonic_teleop_task.py index df5525d277..d7dd2841ae 100644 --- a/dimos/control/tasks/g1_sonic_wbc_task/test_g1_sonic_teleop_task.py +++ b/dimos/control/tasks/g1_sonic_wbc_task/test_g1_sonic_teleop_task.py @@ -90,8 +90,8 @@ def task_and_pipeline(mocker: Any) -> Iterator[tuple[G1SonicTeleopTask, Any]]: decoder_onnx=Path("decoder.onnx"), planner_onnx=Path("planner.onnx"), joint_names=_JOINT_NAMES, - auto_start_policy=True, - initialization_seconds=0.0, + auto_arm=True, + default_ramp_seconds=0.0, zmq_enabled=False, ) task = G1SonicTeleopTask("sonic_teleop", config, adapter) @@ -117,6 +117,37 @@ def test_deadman_engages_full_body_stream(task_and_pipeline: tuple[Any, Any]) -> assert task.state_snapshot()["webxr_teleop"]["engaged"] is True +def test_webxr_cannot_engage_while_policy_is_unarmed( + task_and_pipeline: tuple[Any, Any], +) -> None: + task, pipeline = task_and_pipeline + assert task.disarm() + pipeline.apply_pose_message.reset_mock() + + task.on_body_tracking(_body_snapshot(), t_now=1.0) + task.on_teleop_buttons(_deadman(True), t_now=1.0) + task.compute(_state(1.01)) + + assert task.control_state is SonicControlState.UNARMED + assert task.state_snapshot()["webxr_teleop"]["engaged"] is False + pipeline.apply_pose_message.assert_not_called() + + +def test_disarm_clears_webxr_engagement(task_and_pipeline: tuple[Any, Any]) -> None: + task, pipeline = task_and_pipeline + task.on_body_tracking(_body_snapshot(), t_now=1.0) + task.on_teleop_buttons(_deadman(True), t_now=1.0) + task.compute(_state(1.01)) + + assert task.disarm() + + teleop = task.state_snapshot()["webxr_teleop"] + assert teleop["engaged"] is False + assert teleop["deadman_held"] is False + assert task.state_snapshot()["reference_source"] == "planner" + pipeline.stop_clip.assert_called() + + def test_deadman_release_returns_to_planner_without_stopping_policy( task_and_pipeline: tuple[Any, Any], ) -> None: diff --git a/dimos/control/tasks/g1_sonic_wbc_task/test_g1_sonic_wbc_task.py b/dimos/control/tasks/g1_sonic_wbc_task/test_g1_sonic_wbc_task.py index c68d8ffca3..624febba58 100644 --- a/dimos/control/tasks/g1_sonic_wbc_task/test_g1_sonic_wbc_task.py +++ b/dimos/control/tasks/g1_sonic_wbc_task/test_g1_sonic_wbc_task.py @@ -51,14 +51,20 @@ def make_task(mocker: Any): pipeline.step.return_value = np.zeros(29, dtype=np.float32) pipeline.snapshot.return_value = {"stream_active": False} - def factory(*, auto_start: bool, initialization_seconds: float) -> G1SonicWBCTask: + def factory( + *, + auto_arm: bool, + default_ramp_seconds: float, + auto_dry_run: bool = False, + ) -> G1SonicWBCTask: config = G1SonicWBCTaskConfig( encoder_onnx=Path("encoder.onnx"), decoder_onnx=Path("decoder.onnx"), planner_onnx=Path("planner.onnx"), joint_names=_JOINT_NAMES, - auto_start_policy=auto_start, - initialization_seconds=initialization_seconds, + auto_arm=auto_arm, + auto_dry_run=auto_dry_run, + default_ramp_seconds=default_ramp_seconds, zmq_enabled=False, ) return G1SonicWBCTask("sonic", config, mocker.MagicMock()) @@ -66,9 +72,9 @@ def factory(*, auto_start: bool, initialization_seconds: float) -> G1SonicWBCTas return factory, pipeline -def test_auto_start_finishes_initialization_before_first_policy_step(make_task: Any) -> None: +def test_auto_arm_finishes_ramp_before_first_policy_step(make_task: Any) -> None: factory, pipeline = make_task - task = factory(auto_start=True, initialization_seconds=0.0) + task = factory(auto_arm=True, default_ramp_seconds=0.0) task.start() initialization_output = task.compute(_state(1.0)) @@ -83,30 +89,53 @@ def test_auto_start_finishes_initialization_before_first_policy_step(make_task: pipeline.step.assert_called_once() -def test_initialization_ramps_before_latched_start_enters_control(make_task: Any) -> None: +def test_start_without_auto_arm_holds_measured_pose(make_task: Any) -> None: factory, pipeline = make_task - task = factory(auto_start=True, initialization_seconds=3.0) + task = factory(auto_arm=False, default_ramp_seconds=3.0) task.start() - first = task.compute(_state(10.0)) - halfway = task.compute(_state(11.5)) - complete = task.compute(_state(13.0)) + output = task.compute(_state(10.0, positions=0.25)) - assert first is not None and first.positions == pytest.approx([0.0] * 29) + assert task.control_state is SonicControlState.UNARMED + assert output is not None and output.positions == pytest.approx([0.25] * 29) + snapshot = task.state_snapshot() + assert snapshot["active"] is True + assert snapshot["armed"] is False + assert snapshot["arming"] is False + assert snapshot["arm_pending"] is False + assert snapshot["dry_run"] is False + assert snapshot["arming_duration"] == 3.0 + pipeline.step.assert_not_called() + + +def test_arm_snapshots_current_pose_then_ramps_to_default(make_task: Any) -> None: + factory, pipeline = make_task + task = factory(auto_arm=False, default_ramp_seconds=3.0) + task.start() + task.compute(_state(9.0, positions=0.25)) + assert task.arm() + assert task.state_snapshot()["arm_pending"] is True + + first = task.compute(_state(10.0, positions=0.25)) + halfway = task.compute(_state(11.5, positions=0.25)) + complete = task.compute(_state(13.0, positions=0.25)) + + assert first is not None and first.positions == pytest.approx([0.25] * 29) assert halfway is not None - assert halfway.positions == pytest.approx((DEFAULT_ANGLES_DDS * 0.5).tolist()) + expected_halfway = 0.25 + 0.5 * (DEFAULT_ANGLES_DDS - 0.25) + assert halfway.positions == pytest.approx(expected_halfway.tolist()) assert complete is not None and complete.positions == pytest.approx(DEFAULT_ANGLES_DDS.tolist()) assert task.control_state is SonicControlState.CONTROL pipeline.step.assert_not_called() -def test_manual_arm_starts_policy_only_after_ready(make_task: Any) -> None: +def test_manual_arm_starts_policy_only_after_ramp(make_task: Any) -> None: factory, pipeline = make_task - task = factory(auto_start=False, initialization_seconds=0.0) + task = factory(auto_arm=False, default_ramp_seconds=0.0) task.start() task.compute(_state(1.0)) - assert task.control_state is SonicControlState.READY + assert task.control_state is SonicControlState.UNARMED assert task.arm() task.compute(_state(1.02)) @@ -117,31 +146,46 @@ def test_manual_arm_starts_policy_only_after_ready(make_task: Any) -> None: pipeline.step.assert_called_once() -def test_disarm_returns_to_ready_and_planner_without_reinitializing(make_task: Any) -> None: +def test_disarm_returns_to_measured_pose_hold_and_planner(make_task: Any) -> None: factory, pipeline = make_task - task = factory(auto_start=True, initialization_seconds=0.0) + task = factory(auto_arm=True, default_ramp_seconds=0.0) task.start() task.compute(_state(1.0)) task.compute(_state(1.02)) task._select_stream_reference(True) assert task.disarm() + hold = task.compute(_state(2.0, positions=0.3)) snapshot = task.state_snapshot() - assert snapshot["control_state"] == "ready" + assert snapshot["control_state"] == "unarmed" + assert snapshot["armed"] is False assert snapshot["reference_source"] == "planner" - assert not snapshot["policy_start_requested"] + assert hold is not None and hold.positions == pytest.approx([0.3] * 29) pipeline.reset.assert_called() -def test_reset_reactivate_replays_initialization(make_task: Any) -> None: +def test_reset_reactivate_replays_arm_ramp(make_task: Any) -> None: factory, _pipeline = make_task - task = factory(auto_start=True, initialization_seconds=0.0) + task = factory(auto_arm=True, default_ramp_seconds=0.0) task.start() task.compute(_state(1.0)) assert task.reset_runtime_state(reactivate=True) snapshot = task.state_snapshot() - assert snapshot["control_state"] == "initializing" - assert snapshot["policy_start_requested"] is True + assert snapshot["control_state"] == "unarmed" + assert snapshot["arm_pending"] is True + + +def test_dry_run_outputs_arm_ramp_but_suppresses_policy_output(make_task: Any) -> None: + factory, pipeline = make_task + task = factory(auto_arm=True, default_ramp_seconds=0.0, auto_dry_run=True) + task.start() + + ramp_output = task.compute(_state(1.0)) + policy_output = task.compute(_state(1.02)) + + assert ramp_output is not None + assert policy_output is None + pipeline.step.assert_called_once() diff --git a/dimos/robot/test_all_blueprints.py b/dimos/robot/test_all_blueprints.py index b632fcee59..51326d5c84 100644 --- a/dimos/robot/test_all_blueprints.py +++ b/dimos/robot/test_all_blueprints.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -import subprocess -import sys - import pytest from dimos.core.coordination.blueprints import Blueprint @@ -69,6 +66,7 @@ "teleop-webxr-xarm7", "teleop-webxr-xarm7-video", "unitree-g1-sonic-wbc", + "unitree-g1-sonic-webxr-teleop", "xarm-perception", "xarm-perception-agent", "xarm-perception-sim", @@ -78,17 +76,8 @@ } ) -SIMULATION_ONLY_SELF_HOSTED_BLUEPRINTS = frozenset( - { - "unitree-g1-sonic-webxr-teleop", - } -) - -UBUNTU_BLUEPRINTS = sorted( - set(all_blueprints) - SELF_HOSTED_BLUEPRINTS - SIMULATION_ONLY_SELF_HOSTED_BLUEPRINTS -) +UBUNTU_BLUEPRINTS = sorted(set(all_blueprints) - SELF_HOSTED_BLUEPRINTS) SELF_HOSTED_BLUEPRINTS = sorted(SELF_HOSTED_BLUEPRINTS) -SIMULATION_ONLY_SELF_HOSTED_BLUEPRINTS = sorted(SIMULATION_ONLY_SELF_HOSTED_BLUEPRINTS) def _check_blueprint(blueprint_name: str) -> None: @@ -110,8 +99,7 @@ def _check_blueprint(blueprint_name: str) -> None: def test_old_self_hosted_blueprints() -> None: """Validate no non-existent name in SELF_HOSTED_BLUEPRINTS.""" - expected = set(SELF_HOSTED_BLUEPRINTS) | set(SIMULATION_ONLY_SELF_HOSTED_BLUEPRINTS) - unused_names = expected - set(all_blueprints) + unused_names = set(SELF_HOSTED_BLUEPRINTS) - set(all_blueprints) assert not unused_names @@ -126,19 +114,3 @@ def test_blueprint_is_valid(blueprint_name: str) -> None: def test_self_hosted_blueprint_is_valid(blueprint_name: str) -> None: """Validate blueprints that need heavy deps or LFS — self-hosted runner only.""" _check_blueprint(blueprint_name) - - -@pytest.mark.self_hosted -@pytest.mark.parametrize("blueprint_name", SIMULATION_ONLY_SELF_HOSTED_BLUEPRINTS) -def test_simulation_only_self_hosted_blueprint_is_valid(blueprint_name: str) -> None: - """Import simulation-only blueprints in a fresh MuJoCo-configured process.""" - code = ( - "from dimos.core.global_config import global_config; " - 'global_config.update(simulation="mujoco", viewer="none"); ' - "from dimos.robot.get_all_blueprints import get_blueprint_by_name; " - "from dimos.core.coordination.blueprints import Blueprint; " - f'blueprint = get_blueprint_by_name("{blueprint_name}"); ' - "assert isinstance(blueprint, Blueprint)" - ) - - subprocess.run([sys.executable, "-c", code], check=True) diff --git a/dimos/robot/unitree/g1/blueprints/basic/test_unitree_g1_sonic_webxr_teleop.py b/dimos/robot/unitree/g1/blueprints/basic/test_unitree_g1_sonic_webxr_teleop.py new file mode 100644 index 0000000000..adc9f3c5be --- /dev/null +++ b/dimos/robot/unitree/g1/blueprints/basic/test_unitree_g1_sonic_webxr_teleop.py @@ -0,0 +1,55 @@ +# Copyright 2026 Dimensional Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import subprocess +import sys + +import pytest + + +@pytest.mark.self_hosted +@pytest.mark.parametrize( + ("simulation", "backend", "auto_arm", "auto_dry_run", "ramp_seconds", "decimation"), + [ + ("", "G1WholeBodyConnection", False, True, 3.0, 2), + ("mujoco", "MujocoSimModule", True, False, 0.0, 1), + ], +) +def test_webxr_blueprint_resolves_safe_lifecycle_defaults( + simulation: str, + backend: str, + auto_arm: bool, + auto_dry_run: bool, + ramp_seconds: float, + decimation: int, +) -> None: + code = f""" +from dimos.core.global_config import global_config +global_config.update(simulation={simulation!r}, viewer="none") +from dimos.robot.get_all_blueprints import get_blueprint_by_name + +blueprint = get_blueprint_by_name("unitree-g1-sonic-webxr-teleop") +atoms = blueprint.blueprints +assert any(atom.module.__name__ == {backend!r} for atom in atoms) +coordinator = next(atom for atom in atoms if atom.module.__name__ == "_G1SonicCoordinator") +task = coordinator.kwargs["tasks"][0] +assert task.name == "sonic_teleop" +assert task.type == "g1_sonic_teleop" +assert task.params["auto_arm"] is {auto_arm!r} +assert task.params["auto_dry_run"] is {auto_dry_run!r} +assert task.params["default_ramp_seconds"] == {ramp_seconds!r} +assert task.params["decimation"] == {decimation!r} +assert task.params["zmq_enabled"] is False +""" + subprocess.run([sys.executable, "-c", code], check=True) diff --git a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_sonic_wbc.py b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_sonic_wbc.py index a0dfcbc921..607876a9c2 100644 --- a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_sonic_wbc.py +++ b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_sonic_wbc.py @@ -164,9 +164,9 @@ _adapter_type = "sim_mujoco_g1" _adapter_address = _MJCF_PATH _tick_rate = 50.0 - _auto_start_policy = True + _auto_arm = True _auto_dry_run = False - _initialization_seconds = 0.0 + _default_ramp_seconds = 0.0 _decimation = 1 _n_workers = 2 _nav_stack = autoconnect( @@ -193,9 +193,9 @@ _adapter_type = "transport_lcm" _adapter_address = "" _tick_rate = 100.0 - _auto_start_policy = False + _auto_arm = False _auto_dry_run = True - _initialization_seconds = 3.0 + _default_ramp_seconds = 3.0 _decimation = 2 # 100 Hz tick / 2 = 50 Hz policy _n_workers = 10 from dimos.hardware.sensors.lidar.pointlio.module import PointLio @@ -265,9 +265,9 @@ def _g1_sonic_coordinator( "decoder_onnx": str(_SONIC_RELEASE_DIR / "model_decoder.onnx"), "planner_onnx": str(_SONIC_PLANNER_PATH), "hardware_id": "g1", - "auto_start_policy": _auto_start_policy, + "auto_arm": _auto_arm, "auto_dry_run": _auto_dry_run, - "initialization_seconds": _initialization_seconds, + "default_ramp_seconds": _default_ramp_seconds, "decimation": _decimation, "zmq_enabled": zmq_enabled, }, diff --git a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_sonic_webxr_teleop.py b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_sonic_webxr_teleop.py index bb46b51124..b246d5fb91 100644 --- a/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_sonic_webxr_teleop.py +++ b/dimos/robot/unitree/g1/blueprints/basic/unitree_g1_sonic_webxr_teleop.py @@ -12,29 +12,23 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""PICO WebXR full-body teleoperation of SONIC G1 in MuJoCo. +"""PICO WebXR full-body teleoperation of SONIC G1. Run with: dimos --simulation mujoco run unitree-g1-sonic-webxr-teleop + dimos --viewer none run unitree-g1-sonic-webxr-teleop --network-interface Hold X on the left controller and A on the right controller to engage. """ from dimos.core.coordination.blueprints import autoconnect -from dimos.core.global_config import global_config from dimos.robot.unitree.g1.blueprints.basic.unitree_g1_sonic_wbc import ( _g1_sonic_control_blueprint, _g1_sonic_visualization, ) from dimos.teleop.webxr.extensions import MobileVideoArmTeleopModule -if global_config.simulation != "mujoco": - raise ValueError( - "unitree-g1-sonic-webxr-teleop is simulation-only; run with --simulation mujoco" - ) - - unitree_g1_sonic_webxr_teleop = autoconnect( MobileVideoArmTeleopModule.blueprint(body_tracking_mode="required"), _g1_sonic_control_blueprint( diff --git a/dimos/teleop/webxr/README.md b/dimos/teleop/webxr/README.md index ec5ebc975d..59a732e96a 100644 --- a/dimos/teleop/webxr/README.md +++ b/dimos/teleop/webxr/README.md @@ -38,9 +38,9 @@ dimos --can-port a1zcan run teleop-webxr-a1z Open `https://:8443/teleop` in a WebXR-capable headset browser. Accept the certificate, then tap Connect. -### G1 SONIC full-body simulation +### G1 SONIC full-body teleoperation -Calibrate the PICO Motion Trackers, then start the MuJoCo blueprint: +Calibrate the PICO Motion Trackers, then test the complete workflow in MuJoCo: ```bash dimos --simulation mujoco run unitree-g1-sonic-webxr-teleop @@ -58,6 +58,56 @@ adjust heading. Tracking loss ends engagement. After tracking returns, release and hold X+A again. Partial body frames keep the last complete pose for at most 150 ms. +The same blueprint controls a 29-DoF G1 EDU on hardware. The first hardware +session requires the official overhead gantry, with the robot loosely +supported and both feet touching the floor. Use three people: a robot operator +with the Unitree remote and physical stop, a headset operator, and a computer +operator. Do not attempt an untethered or free-floor session during this first +test. + +Only DimOS may own the G1 low-level command channel. Stop the native +`g1_deploy_onnx_ref` SONIC process before starting this blueprint. On the robot +computer, select the network interface connected to the G1: + +```bash +uv run dimos --viewer none run unitree-g1-sonic-webxr-teleop \ + --network-interface +``` + +The controller starts unarmed and holds the measured joint pose. In a second +terminal, inspect and activate it through the same G1 lifecycle CLI used by +GR00T: + +```bash +uv run dimos hardware g1 status +uv run dimos hardware g1 arm +uv run dimos hardware g1 status +uv run dimos hardware g1 enable +uv run dimos hardware g1 status +``` + +`arm` moves from the measured pose to SONIC's default pose over three seconds, +then runs the balancing policy with learned-policy output in dry-run. The pose +ramp itself is a real motor command. Before `enable`, the robot operator must +verify body alignment, foot contact, gantry support, and immediate access to +the physical stop. + +Open `https://:8443/teleop` on the PICO, connect, and only then +hold X+A. Releasing either button returns SONIC to planner control; it is a +teleoperation deadman, not an emergency stop. The Unitree physical stop remains +the authoritative emergency control. + +Shut down in this order: + +```bash +uv run dimos hardware g1 disable +uv run dimos stop +``` + +`disable` cancels trajectories, selects dry-run, and disarms SONIC into +current-pose hold. It does not stop low-level motor commands; `dimos stop` +performs that final step. + For hand teleop, remove the controllers. Pinch the thumb and index finger on the selected hand to engage it, move the wrist to control the arm, then pinch again to disengage. Pinch the thumb and middle finger to close the gripper; diff --git a/docs/platforms/humanoid/g1/index.md b/docs/platforms/humanoid/g1/index.md index 6834423d93..d44e6585cc 100644 --- a/docs/platforms/humanoid/g1/index.md +++ b/docs/platforms/humanoid/g1/index.md @@ -126,8 +126,41 @@ When finished, cancel arm motion, enter dry-run, and disarm: ```bash uv run dimos hardware g1 disable +uv run dimos stop ``` +`disable` is a soft policy disarm into current-pose hold. It is not an +emergency stop and does not terminate low-level commands; use the Unitree +physical stop for emergencies and `dimos stop` for routine shutdown. + +### SONIC full-body PICO teleoperation + +SONIC uses the same `dimos hardware g1` lifecycle commands, discovered from +the running controller's task card. Start the real-hardware blueprint with: + +```bash +uv run dimos --viewer none run unitree-g1-sonic-webxr-teleop \ + --network-interface +``` + +The first hardware test requires the official overhead gantry, both feet in +contact with the floor, and three operators: one at the Unitree remote and +physical stop, one wearing the PICO, and one at the DimOS terminal. Do not run +the native `g1_deploy_onnx_ref` process at the same time, and do not attempt +untethered walking during the first session. + +The startup sequence is: + +```text +UNARMED/current hold -> arm/default-pose ramp -> CONTROL/dry-run + -> enable/live policy -> hold X+A/WebXR reference +``` + +Run `status`, `arm`, `status`, `enable`, and `status` as separate commands so +the team can inspect the robot between transitions. X+A only gates the WebXR +reference and is not an emergency stop. Finish with `dimos hardware g1 +disable`, followed by `dimos stop`. + ## 5. Legacy navigation viewer example In the ssh terminal `ssh -L 3030:localhost:3030 unitree@192.168.123.164`