Skip to content

RFC: Choose the canonical DimOS simulation path: PimSim or Sim2 #3353

Description

@Nabla7

Related: #2894, #2176, #3310, #3311, #3346

Decision requested

We need to choose the simulation path that the team will support going forward:

  1. Continue building on the current PimSim integration to preserve delivery speed and
    working robot/evaluation verticals.
  2. Reintroduce the stronger generic runtime contracts from feat/sim2-runtime, accepting
    more architectural work before returning to product features.

This is not a choice between PimSim and DimOS.

PimSim already runs as ordinary DimOS modules, inside DimOS workers, using DimOS
blueprints, typed streams, transports, RPC, hardware adapters, and
ControlCoordinator.

The choice is between:

  • the current working, robot-oriented PimSim implementation; and
  • a more generic Sim2 runtime that absorbs the working PimSim implementation.

What PimSim actually is

The current documentation does not explain the integration boundary adequately. This
has created the incorrect impression that PimSim bypasses the DimOS module system or
introduces a parallel application runtime.

It does neither.

Discovery and blueprint integration

DimOS defines the provider-neutral interface:

class SimulationProvider(Protocol):
    def build(self, request: SimulationRequest) -> SimulationBinding: ...

PimSim registers PimSimProvider
through the dimos.simulation.providers package entry point.

PimSimProvider.build() returns a normal SimulationBinding. Its backend field is a
DimOS Blueprint.

The regular DimOS ModuleCoordinator then:

  • deploys the modules into DimOS worker processes;
  • connects typed ports;
  • selects LCM or Zenoh transports;
  • injects module RPC references;
  • starts and stops module lifecycles;
  • composes the simulation with mapping, navigation, manipulation, perception, memory,
    skills, and agents.

PimSim has no separate blueprint system, worker manager, transport system, agent
runtime, navigation stack, or application lifecycle.

Existing PimSim DimOS modules

Component DimOS interface Responsibility
PimSimG1 Module; lidar, odometry and TF outputs; lifecycle, reset, respawn and sensor-health RPCs Owns G1 physics. Joint commands and state cross shared memory between the simulation and the DimOS ControlCoordinator.
PimSimGo2 Module; cmd_vel input; point-cloud, lidar, RGB, camera-info, odometry, joint-state and TF outputs; scene RPCs Owns Go2 physics and sensors. It currently also owns the Go2 locomotion policy, which is a known exception that should be moved into the normal DimOS control path.
PimSimXArm7 Module; TF and scene-entity outputs; lifecycle and reset RPCs Owns xArm mechanics. Joint and gripper commands/state use the existing DimOS shared-memory manipulator adapter.
PimSimXArmCamera Module; TF input; typed RGB, depth and camera-info outputs Renders from scene assets and synchronized physics transforms without coupling rendering to the physics loop.
PimSimXArmSceneBridge Module; scene-state input; DetObject output; injected manipulation and episode-control specs Converts simulation state into ordinary DimOS perception and manipulation interfaces.
PimSimClient Provider-neutral SceneControl implementation Lets the existing DimSim-style E2E tests reset, respawn, add obstacles, publish goals and query evaluator truth.

Runtime and transport boundary

DimOS Blueprint / ModuleCoordinator
                   |
                   v
         PimSim DimOS Module(s)
          |         |          |
          |         |          +-- RPC: reset and evaluator intervention
          |         +------------- typed streams: camera, lidar, odom, TF
          +----------------------- SHM: joint commands and robot state
                   |
                   | direct in-process calls
                   v
              SimSession
                   |
                   v
             MuJoCo backend

The ownership split is:

DimOS owns PimSim owns
Blueprints and module lifecycle Physics state and contact
Worker deployment Deterministic session stepping
Typed messages and transports MuJoCo model binding and composition
ControlCoordinator and policies Simulated sensor generation
Mapping and navigation Scene-package execution
Manipulation and perception Renderer implementations
Memory, skills and agents Evaluator-only physical truth
E2E test runner Reset and scenario mechanics

The intended data paths are:

  • High-rate joint commands and state: shared memory.
  • Camera, lidar, odometry, TF, detections and commands: typed DimOS streams, normally
    over Zenoh.
  • Reset, respawn and evaluator intervention: low-frequency RPC.
  • Policies: DimOS ControlTask and ControlCoordinator.
  • Cameras: independent DimOS modules consuming synchronized simulation state.

The PimSim core is a passive library. SimSession provides load, reset, step,
snapshot, and close. It contains no DimOS dependency.

A DimOS module owning a synchronous internal library is normal DimOS architecture.
Planning modules own planning libraries and perception modules own inference
runtimes. Turning every MuJoCo operation into another module or RPC call would put
distributed communication inside the physics loop.

Therefore, the current PimSim integration is already deeply integrated with DimOS and
uses the module system at the correct subsystem boundary.

The main known boundary violation is the Go2 locomotion policy living inside
PimSimGo2. That should be corrected under either option.

Shared requirements

The following requirements apply regardless of which implementation is selected:

  1. DimOS blueprints, skills and agents must not access simulator internals.
  2. Policies belong in ControlCoordinator, not inside the simulation runtime.
  3. One process owns each authoritative MuJoCo model and physics state.
  4. The physics loop must not depend on per-tick Zenoh or RPC calls.
  5. High-rate control uses shared memory.
  6. Observable robot and sensor state uses typed DimOS streams.
  7. Scenario control and evaluator intervention use RPC.
  8. Camera rendering can use mesh or Gaussian-splat implementations independently of
    MuJoCo while preserving calibration and scene alignment.
  9. Evaluator truth must remain separate from ordinary robot observations.
  10. Authored, procedural and captured environments compile into the same validated
    scene.meta.json package contract.
  11. The existing DimSim-style E2E tests remain the provider-neutral evaluation
    contract.
  12. The overlapping contents of dimos/simulation must be audited and removed as
    their replacements reach parity.

Option A: Continue with the current PimSim integration

Treat the current pimsim-dimos provider and its DimOS modules as the supported
simulation path.

Continue extending the already working G1, Go2 and xArm verticals while correcting
specific architectural debt incrementally.

Work implied by this option

  • Document the module, shared-memory, typed-stream and RPC boundaries in both
    repositories.
  • Move the Go2 policy into ControlCoordinator.
  • Keep G1 and xArm on the existing DimOS hardware-adapter path.
  • Continue the scene compiler, procedural generation, camera and evaluation roadmap.
  • Replace robot-specific duplication when it causes concrete maintenance problems.
  • Retire old MuJoCo paths in dimos/simulation once PimSim covers their consumers.
  • Continue validating through the existing DimSim-compatible E2E test bodies.

Advantages

  • Preserves the currently working robot, scene, sensor and manipulation workflows.
  • Keeps implementation work close to user-visible evaluations.
  • Avoids stopping feature work for another foundational rewrite.
  • Allows developers to use the system now through ordinary DimOS blueprints.
  • Keeps the simulation core independently testable and free of DimOS imports.

Architectural limitations

  • G1, Go2 and xArm currently have separate physics-owning module implementations.
  • The current shared-memory implementation has fixed-size, independently sequenced
    buffers rather than one coherent versioned action/observation frame.
  • There is no generic SimModule or canonical robot-profile abstraction.
  • Live execution exists, but the full Sim2 lockstep clock contract does not.
  • External renderers and sensors do not yet share a canonical
    WorldManifest / WorldStateFrame synchronization protocol.
  • Repository separation continues to create some review and installation friction.

Choosing this option means accepting these limitations temporarily in exchange for
continuing product and evaluation work immediately.

Option B: Reintroduce Sim2 as the canonical runtime

Use feat/sim2-runtime
as the architectural reference, but do not merge the old WIP branch wholesale.

Create a clean dimos/sim2 migration namespace and port the working PimSim
implementation behind its contracts.

Sim2 contracts worth preserving

  • One generic SimModule owns the simulation runtime.
  • SimBackend hides MuJoCo, kinematic or future backend details.
  • SimRobotSpec describes robot identity, control family, assets, joints, sensors and
    capabilities.
  • Robot-specific simulation knowledge lives beside each robot as a profile.
  • ControlCoordinator owns policies and task arbitration.
  • A versioned, dynamically sized RobotChannel carries coherent action and
    observation frames over shared memory.
  • Live and lockstep modes use the same policy and hardware-adapter path.
  • WorldManifest provides stable entity discovery.
  • WorldStateFrame provides episode- and tick-stamped dynamic state.
  • SensorReady provides an exact synchronization barrier for external cameras and
    sensors.
  • Scenes use the existing ScenePackage contract.
  • Unsupported backend capabilities fail explicitly.

Intended structure

dimos/sim2/
├── spec.py
├── module.py
├── session.py
├── backend/
│   ├── base.py
│   ├── mujoco/
│   └── kinematic.py
├── control/
│   ├── channel.py
│   ├── adapters/
│   └── tick_source.py
├── sensors/
├── scene/
└── testing/

The working PimSim implementation would supply the MuJoCo backend, scene composition,
robot bindings, sensors, renderers and validated robot behavior. This is a port and
consolidation, not a clean-room rewrite.

Advantages

  • Produces one generic simulation module rather than one physics module per robot.
  • Makes robot addition profile-driven.
  • Gives ControlCoordinator a coherent, versioned and deterministic control ABI.
  • Supports exact lockstep evaluation and sensor synchronization.
  • Establishes a canonical world-state contract for cameras, splats, lidar and dynamic
    actors.
  • Creates a clean destination from which the current dimos/simulation package can
    be retired.

Costs and risks

  • Feature work slows while runtime, control and world-state contracts are reviewed
    and landed.
  • ControlCoordinator, shared-memory adapters and robot blueprints must change.
  • The previous Sim2 attempt touched too many systems at once and did not reach user
    adoption.
  • A poorly scoped revival could repeat that failure despite the stronger design.
  • Existing PimSim behavior must be preserved through incremental ports and explicit
    parity tests.

Choosing this option means prioritizing the generic runtime architecture before
continuing broad feature development.

Direct comparison

Question Continue PimSim Reintroduce Sim2
Is it already usable through DimOS modules? Yes Prototype only
Immediate robot coverage G1, Go2 and xArm Must be ported
Near-term evaluation work Continues immediately Slows during foundation work
Physics ownership Robot-oriented DimOS modules One generic SimModule
Robot integration Current runtime classes Profiles by control family
Control ABI Existing SHM adapters Versioned coherent RobotChannel
Policy ownership Correct for G1/xArm; Go2 must move Enforced through generic adapters
Execution modes Live Live and lockstep
External sensor contract Typed sensor streams Manifest, world state and sensor barriers
Scene packages Working Contract exists; implementation must be ported
Review surface Incremental fixes and features Cross-cutting runtime and control work
Long-term cleanup Incremental retirement Explicit replacement of old simulation tree

Required validation under either option

The selected path must demonstrate:

  • G1 policy execution through ControlCoordinator and shared memory.
  • Go2 policy execution through ControlCoordinator, with no policy inside the
    simulator module.
  • xArm plan, execute, grasp, retained lift, place and deterministic reset.
  • Camera, depth, lidar, odometry, TF and joint-state cadence and timestamp checks.
  • The same DimSim-style test bodies against supported providers:
    • walk forward;
    • dynamic path replanning;
    • semantic navigation to bed;
    • semantic navigation to couch;
    • semantic navigation to kitchen;
    • semantic navigation to television.
  • Source-checkout and installed-package scene resolution.
  • Deterministic reset, seed, episode and tick identity.
  • Separation of ordinary observations from evaluator-only truth.
  • An explicit list of old simulator paths deleted after parity.

Documentation required

Whichever option is selected, the main DimOS simulation documentation must immediately
explain:

  • which DimOS modules own simulation;
  • where the physics loop runs;
  • how ControlCoordinator exchanges commands and state through shared memory;
  • which data uses typed streams over Zenoh;
  • which operations use RPC;
  • how cameras and external sensors consume simulation state;
  • how scenes are compiled and loaded;
  • how developers add robots, policies, sensors, environments and evaluations;
  • which existing G1, Go2 and xArm workflows currently work.

The current absence of this explanation is itself an integration problem.

Review requested

Please choose one:

Decision: Continue PimSim / Reintroduce Sim2

Reason:
Blocking concern:
Minimum architectural correction required:
Required validation before adoption:
Old path(s) that should be retired:

If rejecting both paths, please provide an alternative with explicit answers for:

  • DimOS module ownership;
  • physics process ownership;
  • ControlCoordinator integration;
  • shared-memory layout;
  • typed-stream boundaries;
  • scene and world-state contracts;
  • deterministic reset and lockstep execution;
  • external camera and sensor synchronization.

Metadata

Metadata

Assignees

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions