unisim.backend.mjwarp.backend¶
Host-compatibility implementation of the independent mjwarp backend.
mjwarp is not a MuJoCo backend mode. It uploads a CPU MuJoCo model to
mujoco_warp and owns its own device data and host cache. The cache is
refreshed exactly at explicit step/reset barriers; legacy getters only return
views into that cache and therefore never trigger an implicit Warp .numpy
transfer.
Classes
Independent CUDA backend exposed through the host NumPy profile. |
- class unisim.backend.mjwarp.backend.MjwarpBackend[source]¶
Bases:
SimBackendIndependent CUDA backend exposed through the host NumPy profile.
State and control cross the host/device boundary only at explicit step/reset barriers with bounded, statically declared transfers. Reset DR writes per-world rows of cold-path-expanded model arrays in place and recomputes derived constants with the graded
set_const*family; interval DR stagesxfrc_appliedpushes/body forces for the next step barrier or kicks root velocity through the reset upload+forward path. A registered pre-step control converter runs on the host before every physics substep (seeset_pre_step_control); per-world gravity DR and native rendering remain fail-closed. Detached host snapshots support finite MuJoCo-based offline recording.- Parameters:
- __init__(scene, num_envs, sim_dt, *, base_name=None, push_body_name=None, nconmax=None, njmax=None, add_body_sensors=False, **unexpected_kwargs)[source]¶
- get_actuator_ctrl_range()[source]¶
Return actuator control ranges.
- Return type:
- Returns:
Array with shape
(num_actuators, 2)and columns[low, high].
- get_actuator_joint_names()[source]¶
Return each actuator’s target single-DoF joint in control-vector order.
Backends must fail closed when an actuator does not target exactly one hinge/slide joint. Manager action terms use this cold-path metadata to map community joint selectors onto the backend control vector without inspecting backend-private model objects.
- get_keyframe_qpos(name)[source]¶
Return the full qpos for a named keyframe, including the floating base.
- get_default_qpos()[source]¶
Return the backend/model default qpos through a stable contract.
- Return type:
- get_default_dof_pos()[source]¶
Return default joint positions in the same column order as
get_dof_pos.The returned array is detached, one-dimensional, and excludes floating root coordinates. Backends whose DoF view is actuator-indexed must use that same actuator-target order here.
- Return type:
- get_init_qvel()[source]¶
Return a zero-initialized qvel vector compatible with
set_state.- Return type:
- Returns:
Zero-filled qvel array.
- get_root_state_layout(root_body_name)[source]¶
Resolve one body’s floating-root columns on the cold path.
Backends must verify that
root_body_nameowns a free/floating joint; fixed bodies and runtimes without body-to-root metadata fail closed. Name/model lookup is forbidden on reset and step hot paths, so callers cache either the returned layout or the unsupported result during scene materialization.- Parameters:
root_body_name (
str)- Return type:
BackendRootStateLayout
- get_body_ids(names)[source]¶
Resolve body/link names to backend integer IDs.
- Parameters:
- Return type:
- Returns:
int32array with shape(len(names),).- Raises:
ValueError – If any name is not found.
- get_geom_solref()[source]¶
Return default contact reference parameters, shape (ngeom, 2).
- Return type:
- get_geom_solimp()[source]¶
Return default contact impedance parameters, shape (ngeom, 5).
- Return type:
- bind_mocap_pose(body_name)[source]¶
Resolve a mocap body once; unavailable capabilities fail at binding.
- Parameters:
body_name (
str)- Return type:
BackendMocapPoseBinding
- get_joint_dof_indices(names)[source]¶
Resolve named joint qvel coordinates on the cold metadata path.
- get_joint_dof_pos_indices(names)[source]¶
Resolve named single-DoF qpos coordinates excluding the free root.
- get_joint_dof_vel_indices(names)[source]¶
Resolve named joint qvel coordinates excluding the free root.
- get_actuator_gains()[source]¶
Expose immutable model defaults; this does not advertise gain DR support.
- set_pre_step_control(fn)[source]¶
Register or clear the env-owned per-substep control converter.
Semantics match the MuJoCo backend: the callback runs once before every physics substep with the host qpos/qvel cache refreshed to the substep-start state, and its return value becomes that substep’s device ctrl. Each invocation costs one explicit device round trip, so the callback path intentionally uses eager kernel launches instead of replaying the captured step graph. Passing
Nonerestores the direct control path.
- set_state(env_indices, qpos, qvel, randomization=None)[source]¶
Set physics state for selected environments.
- Parameters:
env_indices (
ndarray) – Environment indices.qpos (
ndarray) – Position state. Free-root columns exposed byget_root_state_layout()use world xyz and wxyz quaternion.qvel (
ndarray) – Velocity state. Free-root columns exposed byget_root_state_layout()use world linear velocity and body-frame angular velocity.randomization (
ResetRandomizationPayload|None) – Optional backend randomization payload.
- Return type:
- Returns:
Optional dictionary. Backends MAY include a
"timing"key with per-substep timings in milliseconds (e.g.set_state_mask_ms,set_state_data_slice_ms, …). Callers MUST treatNoneor missing keys as “not reported” — the outer wall-clock measurement inDomainRandomizationManager.reset(dr_reset_set_state_ms) remains authoritative for total set_state time.
- get_dr_capabilities()[source]¶
Advertise the per-world model mutation set validated by effect tests.
- Return type:
- push_robots(force_range)[source]¶
Sample one world-frame push force per env and stage it for the next step.
- apply_body_force(body_ids, force, torque=None)[source]¶
Accumulate world-frame forces on the staged
xfrc_appliedrows.
- materialize()[source]¶
Resources are fully materialized during the constructor cold path.
- Return type:
- get_play_capabilities()[source]¶
Return backend-native play/render capabilities.
- Return type:
BackendPlayCapabilities
- resolve_play_render_plan(*, play_render_mode, play_steps, output_video)[source]¶
Resolve high-level playback mode into backend-owned render parameters.
- run_playback(*, env, initialize, step, num_steps, output_video=None, render_spacing=None, render_offset_mode=None, headless=None, record_video=None, frame_state_getter=None, camera_kwargs=None, debug_overlay_getter=None, on_frame=None)[source]¶
Execute backend-owned playback for an env wrapper.
camera_kwargsis normalized intoCameraCfgat this boundary; unknown mapping keys fail closed with an error naming them.debug_overlay_getteris an optional per-frame callback returning a sequence with one entry per environment (len == num_envs); each entry is that env’s sequence ofDebugPrimitive(Noneor empty marks an env without overlay) and returningNonedisables overlays for the frame. Primitive poses are env-local; the renderer applies grid offsets when composing multiple envs. Backends whoseget_play_capabilities().supports_debug_overlayis False fail closed withNotImplementedErrorwhen this is notNone. On the interactive rendering path only backends whosesupports_interactive_debug_overlayis True consume it; the others fail closed withNotImplementedError.on_frameis an optional per-frame video hook called by offline render pipelines before encoding: it receives(frame_index, frame)with the frame an(H, W, 3)uint8 array, and returns a replacement frame of the same shape/dtype orNoneto keep the original. Backends rendering through a native (non-offline) renderer fail closed withNotImplementedErrorwhen this is notNone.Known boundary:
envis the owning env wrapper, not a physics-layer concept. Current playback implementations read env-level configuration (e.g.cfg.scene,cfg.ctrl_dt,cfg.render_spacing) and env-owned playback helpers (get_playback_model,get_physics_state_snapshot) that have no backend-native equivalent yet. The parameter stays on this contract until playback asset/config resolution moves onto backend-owned metadata; backends must only use it on the cold playback path.- Parameters:
env (Any)
initialize (Any)
step (Any)
num_steps (int | None)
output_video (str | PathLike[str] | None)
render_spacing (float | None)
render_offset_mode (str | None)
headless (bool | None)
record_video (bool | None)
frame_state_getter (Any)
camera_kwargs (CameraCfg | Mapping[str, Any] | None)
debug_overlay_getter (DebugOverlayGetter | None)
on_frame (Any)
- Return type:
str | None
- get_physics_state()[source]¶
Return a physics snapshot suitable for offline playback/video export.
Rows use the
[time, qpos, qvel]layout; backends whose model has mocap bodies append[mocap_pos(nmocap*3), mocap_quat(nmocap*4)]so offline rendering can replay mocap-driven geometry at its recorded pose.- Return type:
- get_playback_mocap_state(env_index=0)[source]¶
Return copied mocap pose arrays for detached visual playback.
- get_playback_model(env_index=None)[source]¶
Return the playback model for a specific env when variants exist.
- get_base_pos()[source]¶
Return base position in the world frame.
- Return type:
- Returns:
(num_envs, 3)
- get_base_quat()[source]¶
Return base quaternion in the world frame as
wxyz.- Return type:
- Returns:
(num_envs, 4)
- get_base_lin_vel()[source]¶
Return base linear velocity in the world frame.
This is the first three dimensions of generalized velocity
qvel, expressed in world coordinates.- Return type:
- Returns:
(num_envs, 3)
- get_base_ang_vel()[source]¶
Return base angular velocity in the world frame.
This is dimensions 3-5 of generalized velocity
qvel, expressed in world coordinates. It differs from gyro readings: gyro sensors report angular velocity components in the body/sensor local frame, while this contract returns world-frame values. Use the matching sensor contract when body-frame angular velocity is required.- Return type:
- Returns:
(num_envs, 3)
- get_dof_pos()[source]¶
Return joint positions, excluding the base.
- Return type:
- Returns:
(num_envs, num_dof)
- get_dof_vel()[source]¶
Return joint velocities, excluding the base.
- Return type:
- Returns:
(num_envs, num_dof)
- get_body_pose_w_rows(env_ids, body_ids)[source]¶
Gather world-frame body pose for selected environments only.
- get_body_lin_vel_w_rows(env_ids, body_ids)[source]¶
Gather world-frame body linear velocity for selected rows.
- get_body_ang_vel_w_rows(env_ids, body_ids)[source]¶
Gather world-frame body angular velocity for selected rows.
- copy_body_state_w(body_ids, out_pos, out_quat, out_lin_vel, out_ang_vel)[source]¶
Copy selected world-frame body state into caller-owned buffers.
- get_body_lin_vel_b(body_ids)[source]¶
Return selected body linear velocities expressed in each body’s own frame.
The value is the body’s world-frame velocity rotated by the inverse of the body’s world-frame orientation, i.e.
quat_apply_inverse(quat_w, lin_vel_w)(mjlab/Isaac-style analytical definition). It is well-defined for every body — including the root body — and must NOT be implemented as the motion relative to the baselink frame (which degenerates to zero for the root body).
- get_body_ang_vel_b(body_ids)[source]¶
Return selected body angular velocities expressed in each body’s own frame.
The value is the body’s world-frame angular velocity rotated by the inverse of the body’s world-frame orientation, i.e.
quat_apply_inverse(quat_w, ang_vel_w)(mjlab/Isaac-style analytical definition). It is well-defined for every body — including the root body — and must NOT be implemented as the motion relative to the baselink frame (which degenerates to zero for the root body).