Architecture¶
Dual-simulator design¶
SIMPLE strictly decouples physics from rendering. MuJoCo handles all rigid-body dynamics, contact resolution and robot control; the resulting states are synchronized to Isaac Sim, which performs photorealistic ray-traced rendering. The policy consumes Isaac Sim images and returns actions to MuJoCo.
This split buys MuJoCo’s contact fidelity and locomotion stability together with Isaac Sim’s visual diversity. The whole loop is wrapped in a standard Gym interface, and high-level policies emit upper-body kinematic targets plus base navigation commands that a higher-rate lower-body tracking controller executes.
Class diagram¶
BaseDualSim(envs/base_dual_env.py) — thegymnasium.Env; owns twoSimulatorinstances and the activeTask. Isaac Sim is created lazily, only when"isaac"is insim_mode.LocoManipulationEnv,SonicLocoManipEnvandTabletopGraspEnvsubclass it.Simulator(core/simulator.py) —update_layout(),set_states(),get_states(),step(),render(). Implemented byMujocoSimulator(physics) andIsaacSimSimulator(rendering).Task— composes aDRManagerand aRobot, and drives scene randomization at each reset. See Task.Robot— asset paths and kinematics config only. See Robot.DRManager— registry ofMaterialDR,SpatialDR,LightingDR,DistractorDRand friends. See Domain Randomization.Agents — teleoperation, motion planning and remote inference share one
get_action()interface over a buffered action queue.Whole-body controllers —
AmoWBC,SonicWBCandSonicDecoupledWBCsharesetup_controller()/apply_action()and turn high-level commands into low-level joint targets.Policy servers —
Psi0Server,Pi05Server,GR00TServerrun as separate processes behindhealth()/act(), reached over HTTP or WebSocket, so inference can sit on another GPU or machine.
One env.step()¶
Task.reset() applies domain randomization once per episode. Then each
env.step(action):
MuJoCo applies the action; the robot routes it through the whole-body controller and RL tracker, which return torque / qpos targets.
MuJoCo integrates physics at 500 Hz and reports
infoand termination.Isaac Sim reads the states (
get_states()→set_states()) and renders at the task’srender_hz(50 Hz for whole-body pipelines).The observation is returned to the agent.
MuJoCo sub-steps ahead of the slower rendering pass, so every inference step receives a physically consistent, photorealistic observation.