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)Custom Adapters
Section titled “Custom Adapters”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().