Related: #2894, #2176, #3310, #3311, #3346
Decision requested
We need to choose the simulation path that the team will support going forward:
- Continue building on the current PimSim integration to preserve delivery speed and
working robot/evaluation verticals.
- 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:
- DimOS blueprints, skills and agents must not access simulator internals.
- Policies belong in
ControlCoordinator, not inside the simulation runtime.
- One process owns each authoritative MuJoCo model and physics state.
- The physics loop must not depend on per-tick Zenoh or RPC calls.
- High-rate control uses shared memory.
- Observable robot and sensor state uses typed DimOS streams.
- Scenario control and evaluator intervention use RPC.
- Camera rendering can use mesh or Gaussian-splat implementations independently of
MuJoCo while preserving calibration and scene alignment.
- Evaluator truth must remain separate from ordinary robot observations.
- Authored, procedural and captured environments compile into the same validated
scene.meta.json package contract.
- The existing DimSim-style E2E tests remain the provider-neutral evaluation
contract.
- 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.
Related: #2894, #2176, #3310, #3311, #3346
Decision requested
We need to choose the simulation path that the team will support going forward:
working robot/evaluation verticals.
feat/sim2-runtime, acceptingmore 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:
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:
PimSim registers
PimSimProviderthrough the
dimos.simulation.providerspackage entry point.PimSimProvider.build()returns a normalSimulationBinding. Itsbackendfield is aDimOS
Blueprint.The regular DimOS
ModuleCoordinatorthen:skills, and agents.
PimSim has no separate blueprint system, worker manager, transport system, agent
runtime, navigation stack, or application lifecycle.
Existing PimSim DimOS modules
PimSimG1Module; lidar, odometry and TF outputs; lifecycle, reset, respawn and sensor-health RPCsControlCoordinator.PimSimGo2Module;cmd_velinput; point-cloud, lidar, RGB, camera-info, odometry, joint-state and TF outputs; scene RPCsPimSimXArm7Module; TF and scene-entity outputs; lifecycle and reset RPCsPimSimXArmCameraModule; TF input; typed RGB, depth and camera-info outputsPimSimXArmSceneBridgeModule; scene-state input;DetObjectoutput; injected manipulation and episode-control specsPimSimClientSceneControlimplementationRuntime and transport boundary
The ownership split is:
ControlCoordinatorand policiesThe intended data paths are:
over Zenoh.
ControlTaskandControlCoordinator.The PimSim core is a passive library.
SimSessionprovidesload,reset,step,snapshot, andclose. 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:
ControlCoordinator, not inside the simulation runtime.MuJoCo while preserving calibration and scene alignment.
scene.meta.jsonpackage contract.contract.
dimos/simulationmust be audited and removed astheir replacements reach parity.
Option A: Continue with the current PimSim integration
Treat the current
pimsim-dimosprovider and its DimOS modules as the supportedsimulation path.
Continue extending the already working G1, Go2 and xArm verticals while correcting
specific architectural debt incrementally.
Work implied by this option
repositories.
ControlCoordinator.dimos/simulationonce PimSim covers their consumers.Advantages
Architectural limitations
buffers rather than one coherent versioned action/observation frame.
SimModuleor canonical robot-profile abstraction.WorldManifest/WorldStateFramesynchronization protocol.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-runtimeas the architectural reference, but do not merge the old WIP branch wholesale.
Create a clean
dimos/sim2migration namespace and port the working PimSimimplementation behind its contracts.
Sim2 contracts worth preserving
SimModuleowns the simulation runtime.SimBackendhides MuJoCo, kinematic or future backend details.SimRobotSpecdescribes robot identity, control family, assets, joints, sensors andcapabilities.
ControlCoordinatorowns policies and task arbitration.RobotChannelcarries coherent action andobservation frames over shared memory.
WorldManifestprovides stable entity discovery.WorldStateFrameprovides episode- and tick-stamped dynamic state.SensorReadyprovides an exact synchronization barrier for external cameras andsensors.
ScenePackagecontract.Intended structure
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
ControlCoordinatora coherent, versioned and deterministic control ABI.actors.
dimos/simulationpackage canbe retired.
Costs and risks
and landed.
ControlCoordinator, shared-memory adapters and robot blueprints must change.adoption.
parity tests.
Choosing this option means prioritizing the generic runtime architecture before
continuing broad feature development.
Direct comparison
SimModuleRobotChannelRequired validation under either option
The selected path must demonstrate:
ControlCoordinatorand shared memory.ControlCoordinator, with no policy inside thesimulator module.
Documentation required
Whichever option is selected, the main DimOS simulation documentation must immediately
explain:
ControlCoordinatorexchanges commands and state through shared memory;The current absence of this explanation is itself an integration problem.
Review requested
Please choose one:
If rejecting both paths, please provide an alternative with explicit answers for:
ControlCoordinatorintegration;