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.

from omniloop.backends import get_backend_adapter
adapter = get_backend_adapter("mujoco")
adapter.register(tracker, model, 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().