Skip to content

MuJoCo Backend

OmniLoop’s Rust core handles pointer reflection (syncing data to and from memory) in an engine-agnostic way. A BackendAdapter maps a simulator’s live state to raw memory pointers, enabling zero-copy, zero-overhead readouts and mutations.

MuJoCo ships built-in via the MujocoAdapter. It reflects mjData control and velocity (ctrl/qvel) slots to named dashboard variables.

# Bind MuJoCo model & data directly to the OmniLoop tracker
tracker.register_simulation_backend(engine="mujoco", model=model, data=data)

If you’re using a custom C/C++ engine exposing its state to Python via ctypes or numpy arrays, you can write your own adapter:

from omniloop.backends import BackendAdapter, register_backend_adapter
class MySimAdapter(BackendAdapter):
engine = "my_sim"
def register(self, tracker, model, data):
# Register a pointer for a variable by its memory address
tracker.register_variable_pointer("velocity", addr, var_type="f64")
register_backend_adapter(MySimAdapter())

You can list all currently registered engines with available_backends().