Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
134 commits
Select commit Hold shift + click to select a range
fe7a7de
spec: openspec init
TomCC7 Jun 4, 2026
d67a770
spec: openspec init
TomCC7 Jun 4, 2026
9991662
feat: add dm motor openarm adapter
TomCC7 Jun 5, 2026
b2aa7dc
refactor: share damiao arm adapter base
TomCC7 Jun 5, 2026
d409fcc
fix: use can motor control package
TomCC7 Jun 6, 2026
61aae76
[autofix.ci] apply automated fixes
autofix-ci[bot] Jun 6, 2026
a0ed670
fix: refresh dm motor state reads
TomCC7 Jun 6, 2026
2fa597a
refactor: scope openarm rs adapter
TomCC7 Jun 6, 2026
892e0f2
refactor: type damiao binding adapter
TomCC7 Jun 7, 2026
7b9f1f6
refactor: use normal pinocchio imports
TomCC7 Jun 7, 2026
9eda02b
feat: lazily discover manipulator adapters
TomCC7 Jun 7, 2026
3a2dda9
refactor: simplify damiao binding adapter
TomCC7 Jun 7, 2026
e555cf3
ci: update can lib with stubs
TomCC7 Jun 7, 2026
c3bf25a
fix: simplify openarm rs bringup
TomCC7 Jun 8, 2026
b5a0e2c
fix: harden openarm rs adapter
TomCC7 Jun 8, 2026
13618f1
refactor: drop unused FloatArray alias
paul-nechifor Jun 8, 2026
8b9468f
refactor: drop unused OpenArmRSMotorSpecConfig alias
paul-nechifor Jun 8, 2026
872fc43
refactor: hoist time import in openarm adapter test
paul-nechifor Jun 8, 2026
cc738dc
refactor: stop restating openarm_rs adapter defaults in blueprint
paul-nechifor Jun 8, 2026
40dc78e
docs: explain lazy pinocchio imports in damiao base adapter
paul-nechifor Jun 8, 2026
1f9078d
refactor: share tick/cache defaults via named constants
paul-nechifor Jun 8, 2026
c26874e
refactor: single source of truth for default CAN address
paul-nechifor Jun 8, 2026
f98dbc3
perf: vectorize damiao state and command paths
paul-nechifor Jun 8, 2026
227e841
fix: use structured logging with tracebacks in damiao adapter
paul-nechifor Jun 8, 2026
a88758f
fix: log dropped gravity feed-forward in write_joint_positions
paul-nechifor Jun 8, 2026
36940ea
fix: narrow except in write_gravity_compensation
paul-nechifor Jun 8, 2026
e22e724
fix: reject unknown kwargs in OpenArmRSAdapter
paul-nechifor Jun 8, 2026
1b12e2d
docs: point to kp/kd source constants instead of restating them
paul-nechifor Jun 8, 2026
b558cfe
Merge pull request #2426 from dimensionalOS/cc/openarm-rust-adapter-a…
TomCC7 Jun 8, 2026
76158b2
chore: revert change to doc folder
TomCC7 Jun 8, 2026
15a6514
Merge branch 'main' into cc/openarm-rust-adapter
TomCC7 Jun 8, 2026
35c8b14
Merge branch 'main' into cc/feat/openspec
TomCC7 Jun 8, 2026
a9e731a
test: focus manipulator tests on behavior
TomCC7 Jun 8, 2026
7b29dcd
chore: remove openspec stuff
TomCC7 Jun 8, 2026
2125808
fix: openarm adapter lifecycle
TomCC7 Jun 9, 2026
12d4346
Merge branch 'main' into cc/feat/openspec
TomCC7 Jun 10, 2026
6cd2fd3
Merge remote-tracking branch 'origin/main' into cc/feat/openspec
TomCC7 Jun 12, 2026
d92a78b
spec: planning group
TomCC7 Jun 13, 2026
1730a5e
feat: add manipulation planning groups
TomCC7 Jun 17, 2026
2c80bf5
chore: merge main and adapt pink ik
TomCC7 Jun 17, 2026
3744ec7
fix: address planning group review feedback
TomCC7 Jun 18, 2026
0a403de
feat: multi-group rrt
TomCC7 Jun 18, 2026
6b36a70
fix: address remaining planning group review
TomCC7 Jun 18, 2026
31731b1
feat: dual xarm example
TomCC7 Jun 18, 2026
fe3957f
refactor: simplify manipulator joint naming
TomCC7 Jun 19, 2026
702ad74
refactor: tighten manipulation joint namespaces
TomCC7 Jun 19, 2026
d370174
refactor: align manipulation planning group APIs
TomCC7 Jun 19, 2026
664e6ea
Merge branch 'main' into cc/spec/movegroup
TomCC7 Jun 19, 2026
b3470bd
Apply suggestions from code review
TomCC7 Jun 19, 2026
a3b8459
docs: note pose group tf follow-up
TomCC7 Jun 19, 2026
1671ddb
refactor: split selected joint state collection
TomCC7 Jun 19, 2026
288fca5
refactor: begin planning by group selection
TomCC7 Jun 19, 2026
96f3fcc
refactor: type drake pose transform
TomCC7 Jun 19, 2026
d5788b2
refactor: name joint target conversion explicitly
TomCC7 Jun 19, 2026
4fcb7ef
refactor: execute generated plans directly
TomCC7 Jun 19, 2026
c07d8da
refactor: remove legacy preview path api
TomCC7 Jun 19, 2026
6429656
Merge remote-tracking branch 'origin/main' into cc/openarm-rust-adapter
TomCC7 Jun 19, 2026
95548e5
refactor: decouple planning group registry
TomCC7 Jun 19, 2026
2a7524a
feat: add openarm dual whole-body adapter
TomCC7 Jun 20, 2026
54f3bc2
Merge remote-tracking branch 'origin/main' into cc/spec/movegroup
TomCC7 Jun 20, 2026
c6e7782
feat: add viser planning target sets
TomCC7 Jun 20, 2026
a38a90c
fix: stabilize viser ik target solving
TomCC7 Jun 20, 2026
15ba00f
fix: polish viser planning group panel
TomCC7 Jun 20, 2026
04de196
fix: synchronize viser group previews
TomCC7 Jun 20, 2026
7e91f9b
fix: integrate dual xarm6 execution
TomCC7 Jun 20, 2026
4763fb9
fix: polish viser planning controls
TomCC7 Jun 20, 2026
fee4641
Merge origin/main into cc/spec/movegroup
TomCC7 Jun 21, 2026
10e4d31
fix: address quick movegroup review comments
TomCC7 Jun 21, 2026
4f771ce
feat: add composable movegroup planning primitives
TomCC7 Jun 21, 2026
ee904b2
refactor: compose viser planning primitives directly
TomCC7 Jun 21, 2026
0bcce30
refactor: remove viser module access adapter
TomCC7 Jun 22, 2026
8e3d051
refactor: simplify viser panel backend
TomCC7 Jun 22, 2026
6e55e8d
refactor: address movegroup review cleanup
TomCC7 Jun 22, 2026
5345204
refactor: use direct pink imports
TomCC7 Jun 22, 2026
fa35c31
fix: update viser collision target ghost
TomCC7 Jun 22, 2026
a27e822
chore: rpc for list planning group
TomCC7 Jun 22, 2026
a61b46b
openspec remove
TomCC7 Jun 22, 2026
12cf85d
Apply suggestions from code review
TomCC7 Jun 22, 2026
13f3bd0
refactor: remove robot catalog package
TomCC7 Jun 22, 2026
eb78230
fix: address movegroup ci failures
TomCC7 Jun 22, 2026
8a9e1df
test: skip dual blueprint checks without lfs data
TomCC7 Jun 22, 2026
39efbca
fix: align openarm planner coordinator joint state
TomCC7 Jun 22, 2026
84799d1
perf: improve pink ik
TomCC7 Jun 22, 2026
674a900
Merge remote-tracking branch 'origin/main' into cc/spec/movegroup
TomCC7 Jun 24, 2026
768e931
fix: address manipulation review feedback
TomCC7 Jun 24, 2026
ec936f1
feat: add composite roboplan multi-robot planning
TomCC7 Jun 25, 2026
e35744e
spec: behavior plan
TomCC7 Jun 25, 2026
ef22052
dep: grasp module
TomCC7 Jun 25, 2026
09a564e
Merge branch 'cc/openarm-rust-adapter' into cc/frontier
TomCC7 Jun 25, 2026
017bf36
spec: grasp gen
TomCC7 Jun 26, 2026
210648d
spec: robosuite integration
TomCC7 Jun 26, 2026
2554d79
feat: add target-conditioned VGN grasp demo
TomCC7 Jun 26, 2026
a0faf73
spec: add archive
TomCC7 Jun 26, 2026
16dc77b
chore: failed attempt on vgn tuning...
TomCC7 Jun 26, 2026
b18bb7d
feat: add robosuite runtime sidecar
TomCC7 Jun 26, 2026
171194a
Merge branch 'cc/frontier' into cc/frontier_/grasp-gen
TomCC7 Jun 26, 2026
3af4e7d
spec: venv modules
TomCC7 Jun 27, 2026
b7ed817
spec: agentic manipulation skills
TomCC7 Jun 27, 2026
91759ce
spec: roboplan ik
TomCC7 Jun 27, 2026
d49eb98
feat: add roboplan cartesian planning
TomCC7 Jun 27, 2026
b8c361e
feat: add roboplan oink kinematics
TomCC7 Jun 27, 2026
d65917d
spec: libero-pro
TomCC7 Jun 27, 2026
813386a
feat: add venv deployable modules
TomCC7 Jun 27, 2026
a67ec11
feat: add agentic manipulation primitives
TomCC7 Jun 27, 2026
e501222
Merge branch 'cc/frontier_/agentic-manip-skills' into cc/frontier
TomCC7 Jun 27, 2026
b931e2b
feat: add roboplan oink kinematics
TomCC7 Jun 27, 2026
d413f71
spec: trajectory-parametrization
TomCC7 Jun 27, 2026
4f72a1d
feat: add libero-pro runtime sidecar
TomCC7 Jun 27, 2026
d190ab3
Merge branch 'cc/frontier_/libero-pro' into cc/frontier
TomCC7 Jun 27, 2026
f63ddc3
feat: add manipulation trajectory parametrization
TomCC7 Jun 27, 2026
2004be6
spec: archive agentic primitive
TomCC7 Jun 27, 2026
3e78a8a
Merge branch 'cc/frontier_/traj-parametrization' into cc/frontier
TomCC7 Jun 29, 2026
1fa365e
feat: add linear tcp pose planning
TomCC7 Jun 29, 2026
c03f2a5
feat: add python project runtime environments
TomCC7 Jun 29, 2026
b473841
Merge branch 'cc/frontier_/roboplan-extension' into cc/frontier
TomCC7 Jun 29, 2026
984d3ee
spec: archive python project runtime environments
TomCC7 Jun 29, 2026
16d293f
feat: add roboplan trajectory postprocessing
TomCC7 Jun 29, 2026
a75da88
spec: refactor
TomCC7 Jun 29, 2026
67a0038
feat: add GPD MuJoCo grasp demo
TomCC7 Jun 30, 2026
dfc7d79
spec: dynamic module io
TomCC7 Jun 30, 2026
0daf7ed
Merge remote-tracking branch 'origin/main' into cc/frontier
TomCC7 Jun 30, 2026
618a2ae
Merge branch 'cc/frontier_/grasp-gen' into cc/frontier
TomCC7 Jun 30, 2026
a0d8733
feat: add configuration-resolved module io
TomCC7 Jun 30, 2026
8ec6e20
fix: keep coordinator config out of restart blueprint kwargs
TomCC7 Jun 30, 2026
973948c
Merge branch 'cc/frontier' into cc/frontier_/dynamic-module-io
TomCC7 Jun 30, 2026
d07fbac
Merge pull request #2659 from dimensionalOS/cc/frontier_/dynamic-modu…
TomCC7 Jun 30, 2026
27d54ac
spec: agentic grasp
TomCC7 Jun 30, 2026
5b0a0fe
feat: migrate sim sidecars to runtime modules
TomCC7 Jun 30, 2026
bafdac7
spec: openarm mini teleoperation
TomCC7 Jun 30, 2026
d942df8
Merge branch 'cc/frontier_/sidecar2module' into cc/frontier
TomCC7 Jul 1, 2026
8d2cdbe
feat: add manual agentic grasp demo
TomCC7 Jul 6, 2026
6039dac
fix: stabilize manual grasp sim execution
TomCC7 Jul 6, 2026
032ee82
spec: archive manual agentic grasp demo
TomCC7 Jul 6, 2026
ada31f5
Merge branch 'cc/frontier_/agentic-grasp' into cc/frontier
TomCC7 Jul 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
15 changes: 12 additions & 3 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,11 @@ __pycache__/
# Ignore virtual environment directories
*venv*/
.venv*/
# Keep OpenSpec artifacts trackable even when names include ignored words.
!/openspec/changes/
!/openspec/changes/**
!/openspec/specs/
!/openspec/specs/**
.ssh/
.direnv/

Expand Down Expand Up @@ -100,8 +105,12 @@ recording*.db

/misc/fresh-ubuntu-tests/cache

# openspec
/openspec/changes/archive/

# Deepwork local progress state
.slim/deepwork/

# Benchmark demo output artifacts
artifacts/

# LIBERO-PRO downloaded benchmark assets
/libero/
.codegraph/
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ dimos restart # stop + re-run with same original args
| `xarm-perception-sim-agent` | xArm | sim | GPT-4o | — | Manipulation + perception + agent, sim |
| `xarm7-planner-coordinator` | xArm7 | real | — | — | Trajectory planner coordinator |
| `teleop-quest-xarm7` | xArm7 | real | — | — | Quest VR teleop |
| `dual-xarm6-planner` | xArm6×2 | real | — | — | Dual-arm motion planner |
| `dual-xarm6-planner-coordinator` | xArm6×2 | real | — | — | Dual-arm motion planner + coordinator |

Run `dimos list` for the full list.

Expand Down
373 changes: 373 additions & 0 deletions CONTEXT.md

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions dimos/benchmark/runtime/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"""Benchmark runtime orchestration helpers."""
32 changes: 32 additions & 0 deletions dimos/benchmark/runtime/artifacts.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# 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.

"""Small artifact helpers for runtime demos."""

from __future__ import annotations

import json
from pathlib import Path


def write_json(path: Path, payload: object) -> None:
"""Write JSON artifact with parent directory creation."""

path.parent.mkdir(parents=True, exist_ok=True)
model_dump = getattr(payload, "model_dump", None)
if callable(model_dump):
value = model_dump(mode="json")
else:
value = payload
path.write_text(json.dumps(value, indent=2, sort_keys=True) + "\n")
145 changes: 145 additions & 0 deletions dimos/benchmark/runtime/config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
# 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.

"""Config and resolved plan models for benchmark runtime demos."""

from __future__ import annotations

from pathlib import Path
from typing import Literal

from dimos_runtime_protocol import CommandMode, RuntimeDescription, check_compatible
from dimos_runtime_protocol.types import JsonObject
from pydantic import BaseModel, ConfigDict, Field, NonNegativeInt, PositiveInt, model_validator


class StrictModel(BaseModel):
model_config = ConfigDict(extra="forbid")


class BenchmarkEpisodeConfig(StrictModel):
"""Backend-facing declaration of one benchmark episode intent."""

backend: str = "fake"
episode_id: str = "fake-smoke"
task_id: str = "fake-motor-smoke"
runtime_host: str = "127.0.0.1"
runtime_port: PositiveInt = 8765
robot_id: str = "fakebot"
dof: PositiveInt = 3
control_step_hz: PositiveInt = 100
ticks: PositiveInt = 30
target_position: float = 0.2
seed: int | None = None
artifact_dir: Path = Path("artifacts/benchmark/fake-runtime-smoke")
env_name: str = "Lift"
robot_model: str = "Panda"
controller: str = "JOINT_POSITION"
horizon: PositiveInt = 200
camera_name: str = "agentview"
visualize: bool = False
backend_options: JsonObject = Field(default_factory=dict)


class LiberoProBackendOptions(StrictModel):
"""Typed backend-specific options for registered LIBERO-PRO tasks."""

benchmark_name: str
task_order_index: NonNegativeInt = 0
task_index: NonNegativeInt = 0
init_state_index: NonNegativeInt = 0
controller: str = "JOINT_POSITION"
camera_names: list[str] = Field(default_factory=lambda: ["agentview"], min_length=1)
horizon: PositiveInt = 1000
bddl_root: Path
init_states_root: Path
allow_asset_bootstrap: bool = False
perturbation_mode: Literal["registered"] = "registered"

@model_validator(mode="after")
def _validate_non_empty_names(self) -> LiberoProBackendOptions:
if not self.benchmark_name.strip():
raise ValueError("benchmark_name must be non-empty")
if not self.controller.strip():
raise ValueError("controller must be non-empty")
empty_cameras = [
camera_name for camera_name in self.camera_names if not camera_name.strip()
]
if empty_cameras:
raise ValueError("camera_names must not contain empty names")
return self


def validate_libero_pro_backend_options(config: BenchmarkEpisodeConfig) -> LiberoProBackendOptions:
"""Validate and return typed LIBERO-PRO backend options for an episode config."""

if config.backend != "libero-pro":
raise ValueError(
"LIBERO-PRO backend options can only be validated for backend 'libero-pro'"
)
return LiberoProBackendOptions.model_validate(config.backend_options)


class ResolvedRuntimePlan(StrictModel):
"""Concrete launch material derived from a benchmark episode config."""

episode_id: str
task_id: str
backend: str
runtime_base_url: str
shm_key: str
robot_id: str
motor_names: list[str]
control_step_hz: PositiveInt
ticks: PositiveInt
target_position: float
artifact_dir: Path


def resolve_runtime_plan(
config: BenchmarkEpisodeConfig,
description: RuntimeDescription,
) -> ResolvedRuntimePlan:
"""Validate sidecar metadata and derive a concrete runtime plan."""

compatibility = check_compatible(description.protocol)
if not compatibility.compatible:
raise ValueError(f"incompatible sidecar protocol: {compatibility.reason}")
if description.backend != config.backend:
raise ValueError(f"backend mismatch: config={config.backend} sidecar={description.backend}")
matching_surfaces = [
surface for surface in description.robot_surfaces if surface.robot_id == config.robot_id
]
if not matching_surfaces:
raise ValueError(f"sidecar did not report robot surface {config.robot_id!r}")
surface = matching_surfaces[0]
motor_names = [motor.name for motor in sorted(surface.motors, key=lambda motor: motor.index)]
if len(motor_names) != config.dof:
raise ValueError(f"expected {config.dof} motors, sidecar reported {len(motor_names)}")
if CommandMode.POSITION not in surface.supported_command_modes:
supported = ", ".join(mode.value for mode in surface.supported_command_modes)
raise ValueError(f"sidecar robot surface does not support position commands: {supported}")
return ResolvedRuntimePlan(
episode_id=config.episode_id,
task_id=config.task_id,
backend=config.backend,
runtime_base_url=f"http://{config.runtime_host}:{config.runtime_port}",
shm_key=f"{config.episode_id}-{config.robot_id}",
robot_id=config.robot_id,
motor_names=motor_names,
control_step_hz=config.control_step_hz,
ticks=config.ticks,
target_position=config.target_position,
artifact_dir=config.artifact_dir,
)
14 changes: 14 additions & 0 deletions dimos/benchmark/runtime/configs/fake_runtime_smoke.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"backend": "fake",
"episode_id": "fake-runtime-smoke",
"task_id": "fake-motor-smoke",
"runtime_host": "127.0.0.1",
"runtime_port": 8765,
"robot_id": "fakebot",
"dof": 3,
"control_step_hz": 100,
"ticks": 30,
"target_position": 0.2,
"seed": 7,
"artifact_dir": "artifacts/benchmark/fake-runtime-smoke"
}
27 changes: 27 additions & 0 deletions dimos/benchmark/runtime/configs/libero_pro_goal_task0.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
{
"backend": "libero-pro",
"episode_id": "libero-pro-goal-task0",
"task_id": "libero_goal_task/0",
"runtime_host": "127.0.0.1",
"runtime_port": 8767,
"robot_id": "panda",
"dof": 8,
"control_step_hz": 20,
"ticks": 200,
"target_position": 0.03,
"seed": 7,
"artifact_dir": "artifacts/benchmark/libero-pro-goal-task0",
"backend_options": {
"benchmark_name": "libero_goal_task",
"task_order_index": 0,
"task_index": 0,
"init_state_index": 0,
"controller": "JOINT_POSITION",
"camera_names": [
"agentview"
],
"horizon": 1000,
"bddl_root": "libero/libero/bddl_files",
"init_states_root": "libero/libero/init_files"
}
}
19 changes: 19 additions & 0 deletions dimos/benchmark/runtime/configs/robosuite_panda_lift.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"backend": "robosuite",
"episode_id": "robosuite-panda-lift",
"task_id": "Lift",
"runtime_host": "127.0.0.1",
"runtime_port": 8766,
"robot_id": "panda",
"dof": 8,
"control_step_hz": 100,
"ticks": 30,
"target_position": 0.05,
"seed": 7,
"artifact_dir": "artifacts/benchmark/robosuite-panda-lift",
"env_name": "Lift",
"robot_model": "Panda",
"controller": "JOINT_POSITION",
"horizon": 200,
"camera_name": "agentview"
}
Loading
Loading