unisim.backend.isaacsim.backend.IsaacSimBackend¶
- class unisim.backend.isaacsim.backend.IsaacSimBackend[source]¶
Bases:
MjcfSubprocessBackendThin host client for the IsaacLab/PhysX worker.
The shared client owns pipe framing, shared-memory slot allocation, timeout/crash diagnostics, XML cold-path metadata, and all NumPy state views. Physics remains the default (
render_mode=None). Eval/play profiles pass a concrete render intent through the coldINITpayload so Kit selects the correct experience before simulation materialization. The worker owns all camera/viewport operations; this class validates the NumPy-facing frame contract.- Parameters:
Methods
__init__(scene, num_envs, sim_dt, *[, ...])apply_body_force(body_ids, force[, torque])Apply a world-frame force (and optional torque) to bodies for the upcoming step.
apply_init_randomization(plan)Apply cold-path model/materialization randomization.
Apply a scheduled interval randomization plan.
bind_mocap_pose(body_name)Resolve a mocap body once; unavailable capabilities fail at binding.
bind_sensor_data(names)Materialize a validated view over named sensors on the cold path.
Capture one RGB frame from the worker's camera sensor.
Release all backend-owned resources, including the worker process.
close()Shut down the worker and release shared memory.
copy_body_state_w(body_ids, out_pos, ...)Copy selected world-frame body state into caller-owned buffers.
create_hfield_scanner(*, hfield_geom_id, ...)Create a reusable height-field scanner on the init/cold path.
Position-target clamp per dof, from the MJCF
ctrlrangeattributes.Per-dof (kp, kd) from the MJCF
<position>actuators (pure XML).The shared position-control profile drives one actuator per DoF.
Return actuator names in control-vector order on the cold path.
Return base angular velocity in the world frame.
Return base linear velocity in the world frame.
Return base position in the world frame.
Return base quaternion in the world frame as
wxyz.get_body_ang_vel_b(body_ids)Return selected body angular velocities expressed in each body's own frame.
get_body_ang_vel_w(body_ids)Return selected body angular velocities in the world frame.
get_body_ang_vel_w_rows(env_ids, body_ids)Get selected env rows of world-frame body angular velocity.
get_body_id(name)Resolve one body/link name through the backend contract.
get_body_ids(names)Resolve body/link names to backend integer IDs.
Return the backend body inertial-position table.
get_body_lin_vel_b(body_ids)Return selected body linear velocities expressed in each body's own frame.
get_body_lin_vel_w(body_ids)Return selected body linear velocities in the world frame.
get_body_lin_vel_w_rows(env_ids, body_ids)Get selected env rows of world-frame body linear velocity.
Return the backend body-mass table.
get_body_pos_b(body_ids)Return selected body positions in the baselink frame.
get_body_pos_w(body_ids)Return selected body positions in the world frame.
get_body_pose_w(body_ids)Return selected body positions and quaternions in the world frame.
get_body_pose_w_rows(env_ids, body_ids)Get selected env rows of world-frame body position and quaternion.
get_body_quat_b(body_ids)Return selected body quaternions in the baselink frame as
wxyz.get_body_quat_w(body_ids)Return selected body quaternions in the world frame as
wxyz.get_body_state_w(body_ids)Get selected body position, quaternion, linear velocity, and angular velocity.
get_body_subtree_ids(root_body_id)Return body ids in the subtree rooted at
root_body_id.get_body_vel_w(body_ids)Return selected body linear and angular velocities in the world frame.
Return default joint positions in the same column order as
get_dof_pos.Return the backend/model default qpos through a stable contract.
Return the backend dof-armature table.
Return default joint damping, shape (nv,).
Return default joint friction loss, shape (nv,).
Return joint positions, excluding the base.
Return joint velocities, excluding the base.
Advertise no DR until per-env model mutation is effect-tested.
Return the owning body id for each geom.
Return per-geom contact type and affinity masks.
Return the backend geom-friction table.
get_geom_id(name)Resolve one geom name through the backend contract.
Return backend geom names in backend id order.
get_geom_size(name)Return one geom size vector through the backend contract.
Return default geometry sizes, shape (ngeom, 3).
Return default contact impedance parameters, shape (ngeom, 5).
Return default contact reference parameters, shape (ngeom, 2).
Return the backend gravity vector.
Return a zero-initialized qvel vector compatible with
set_state.get_joint_dof_indices(names)Resolve named joints to absolute qvel indices (root 6 columns first).
get_joint_dof_pos_indices(names)Resolve joint names to DoF indices in position space (qpos).
get_joint_dof_vel_indices(names)Resolve joint names to DoF indices in velocity space (qvel).
Per-joint
rangefrom the MJCF (pure XML, available pre-materialize).get_joint_state_qpos_indices(names)Resolve single-DoF joints to full
set_stateqpos columns.get_joint_state_qvel_indices(names)Resolve single-DoF joints to full
set_stateqvel columns.get_keyframe_qpos(name)Return the full qpos for a named keyframe, including the floating base.
get_motion_body_ids(names)Resolve backend-native body IDs used by motion datasets.
Return a physics snapshot suitable for offline playback/video export.
Return the native Kit viewer and RGB camera capabilities.
get_playback_model([env_index])Return the playback model for a specific env when variants exist.
get_root_state_layout(root_body_name)Resolve one body's floating-root columns on the cold path.
Return the materialized scene path for diagnostics, when available.
Return the scene visual model file on the cold path, when available.
get_sensor_data(name)Compute one mapped scene sensor from the shm state caches.
get_sensor_data_batch(names)Fetch multiple sensors and concatenate their flattened values.
get_sensor_data_rows(name, env_ids)Get selected env rows of a sensor array.
get_site_ids(names)Resolve site names to integer ID arrays.
get_site_jacobian_w(site_id, dof_indices)Compute world-frame Jacobians for one site and selected DoF columns.
get_state([fields])Return a detached, backend-neutral state snapshot.
Return backend-materialized terrain metadata on the cold path.
init_renderer([spacing, offset_mode, ...])Initialize the worker-side viewer and/or capture camera.
Spawn the worker, run the handshake, and bind shared-memory slots.
render()Draw one interactive viewer frame through the worker.
reset([env_ids])Reset selected environments to the backend's default state.
resolve_play_render_plan(*, ...)Resolve high-level playback mode into backend-owned render parameters.
run_playback(*, env, initialize, step, num_steps)Execute backend-owned playback for an env wrapper.
set_physics_state(state)Restore a snapshot produced by
get_physics_state.Register an env-owned policy-control to physics-control converter.
set_state(env_indices, qpos, qvel[, ...])Set physics state for selected environments.
step(ctrl[, nsteps])Advance physics.
Attributes
Coarse capability labels for clients that need a cheap feature check.
Return backend-owned model metadata; never a live physics object.
Number of actuators.
Number of joint velocity DoFs, excluding the floating base.
Number of vectorized environments.
- __init__(scene, num_envs, sim_dt, *, render_mode=None, render_width=1280, render_height=720, **kwargs)[source]¶
- get_play_capabilities()[source]¶
Return the native Kit viewer and RGB camera 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.
- init_renderer(spacing=1.0, *, offset_mode='grid', headless=False, capture=False, width=1280, height=720, camera_kwargs=None)[source]¶
Initialize the worker-side viewer and/or capture camera.
spacing/offset_modeare accepted for contract parity and ignored: envs are already laid out on the worker sim’s grid.
- apply_body_force(body_ids, force, torque=None)¶
Apply a world-frame force (and optional torque) to bodies for the upcoming step.
- Parameters:
body_ids (
ndarray) – Body ids whose external forces should be perturbed.force (
ndarray) – Force values with shape(num_envs, len(body_ids), 3).torque (
ndarray|None) – Optional world-frame torque values with the same shape. Backends without a torque channel must fail closed when this is notNone.
- Return type:
- Returns:
None. Backends that support this mutate their pending simulation state.
- apply_init_randomization(plan)¶
Apply cold-path model/materialization randomization.
- Parameters:
plan (
InitRandomizationPlan)- Return type:
- apply_interval_randomization(plan)¶
Apply a scheduled interval randomization plan.
Generic dispatch: each op yielded by
plan.iter_ops()is validated against the builtin term specs (custom terms pass through) and routed to the backend-owned handler table returned by_interval_term_handlers(). A term without a handler fails closed withNotImplementedErrornaming the backend class and the term. Backends that need per-plan prologue/epilogue semantics (for example clearing staged external forces before the ops accumulate) keep a thin override that calls this base implementation.- Parameters:
plan (
IntervalRandomizationPlan)- Return type:
- bind_mocap_pose(body_name)¶
Resolve a mocap body once; unavailable capabilities fail at binding.
- Parameters:
body_name (
str)- Return type:
BackendMocapPoseBinding
- bind_sensor_data(names)¶
Materialize a validated view over named sensors on the cold path.
The existing sensor getters remain the sole backend adapter surface. This method validates each requested sensor once, records its flattened width, and returns a stable view for manager terms. Backends override the protected reader hook when numeric slots or stable cache slices are available; callers do not depend on that implementation detail.
- property capabilities¶
Coarse capability labels for clients that need a cheap feature check.
The detailed contract is expressed by the methods on this class. The labels remain useful for benchmark/conformance metadata and are derived from the mandatory lifecycle methods rather than maintained separately by every adapter.
- cleanup_scene_assets()¶
Release all backend-owned resources, including the worker process.
NpEnv.close()deliberately depends on the basecleanup_scene_assetshook rather than a backend-specificclosemethod. A subprocess backend must therefore bridge that lifecycle hook explicitly; otherwise closing a manager environment would leave the Python 3.8/3.11 worker and its shared-memory segments alive until interpreter teardown.- Return type:
- copy_body_state_w(body_ids, out_pos, out_quat, out_lin_vel, out_ang_vel)¶
Copy selected world-frame body state into caller-owned buffers.
- create_hfield_scanner(*, hfield_geom_id, offsets, frame_body_id, alignment='yaw', output='height')¶
Create a reusable height-field scanner on the init/cold path.
Backends that support height-field terrain scan must override this method.
- get_actuator_ctrl_range()¶
Position-target clamp per dof, from the MJCF
ctrlrangeattributes.Pure XML metadata (available pre-materialize). Undeclared ctrlranges report
(0, 0), matching the MuJoCo backend which returns the rawactuator_ctrlrange(ctrllimited=false→0 0).- Return type:
- get_actuator_gains()¶
Per-dof (kp, kd) from the MJCF
<position>actuators (pure XML).Passive joints (no actuator) report zero gains. Returned in MJCF joint document order, which the INIT handshake pins to the worker’s dof order.
- get_actuator_joint_names()¶
The shared position-control profile drives one actuator per DoF.
- get_actuator_names()¶
Return actuator names in control-vector order on the cold path.
- get_base_ang_vel()¶
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_base_lin_vel()¶
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_pos()¶
Return base position in the world frame.
- Return type:
- Returns:
(num_envs, 3)
- get_base_quat()¶
Return base quaternion in the world frame as
wxyz.- Return type:
- Returns:
(num_envs, 4)
- get_body_ang_vel_b(body_ids)¶
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).
- get_body_ang_vel_w(body_ids)¶
Return selected body angular velocities in the world frame.
- get_body_ang_vel_w_rows(env_ids, body_ids)¶
Get selected env rows of world-frame body angular velocity.
- get_body_id(name)¶
Resolve one body/link name through the backend contract.
- get_body_ids(names)¶
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_body_lin_vel_b(body_ids)¶
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_lin_vel_w(body_ids)¶
Return selected body linear velocities in the world frame.
- get_body_lin_vel_w_rows(env_ids, body_ids)¶
Get selected env rows of world-frame body linear velocity.
- get_body_pos_b(body_ids)¶
Return selected body positions in the baselink frame.
- get_body_pos_w(body_ids)¶
Return selected body positions in the world frame.
- get_body_pose_w(body_ids)¶
Return selected body positions and quaternions in the world frame.
- get_body_pose_w_rows(env_ids, body_ids)¶
Get selected env rows of world-frame body position and quaternion.
- get_body_quat_b(body_ids)¶
Return selected body quaternions in the baselink frame as
wxyz.
- get_body_quat_w(body_ids)¶
Return selected body quaternions in the world frame as
wxyz.
- get_body_state_w(body_ids)¶
Get selected body position, quaternion, linear velocity, and angular velocity.
- get_body_subtree_ids(root_body_id)¶
Return body ids in the subtree rooted at
root_body_id.
- get_body_vel_w(body_ids)¶
Return selected body linear and angular velocities in the world frame.
- get_default_dof_pos()¶
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_default_qpos()¶
Return the backend/model default qpos through a stable contract.
- Return type:
- get_dof_pos()¶
Return joint positions, excluding the base.
- Return type:
- Returns:
(num_envs, num_dof)
- get_dof_vel()¶
Return joint velocities, excluding the base.
- Return type:
- Returns:
(num_envs, num_dof)
- get_dr_capabilities()¶
Advertise no DR until per-env model mutation is effect-tested.
- Return type:
- get_geom_contact_masks()¶
Return per-geom contact type and affinity masks.
- get_geom_id(name)¶
Resolve one geom name through the backend contract.
- get_geom_size(name)¶
Return one geom size vector through the backend contract.
- get_geom_solimp()¶
Return default contact impedance parameters, shape (ngeom, 5).
- Return type:
- get_geom_solref()¶
Return default contact reference parameters, shape (ngeom, 2).
- Return type:
- get_init_qvel()¶
Return a zero-initialized qvel vector compatible with
set_state.- Return type:
- Returns:
Zero-filled qvel array.
- get_joint_dof_indices(names)¶
Resolve named joints to absolute qvel indices (root 6 columns first).
- get_joint_dof_pos_indices(names)¶
Resolve joint names to DoF indices in position space (qpos).
Only single-DoF joints are supported; free joints are excluded.
- get_joint_dof_vel_indices(names)¶
Resolve joint names to DoF indices in velocity space (qvel).
- get_joint_range()¶
Per-joint
rangefrom the MJCF (pure XML, available pre-materialize).The XML is the cross-runtime source of truth for this contract. Joints without a
rangeattribute report(-inf, inf).
- get_joint_state_qpos_indices(names)¶
Resolve single-DoF joints to full
set_stateqpos columns.Unlike
get_joint_dof_pos_indices(), these indices address the complete qpos vector accepted byset_state(), including any root coordinates. Manager reset transactions resolve them on the cold path.
- get_joint_state_qvel_indices(names)¶
Resolve single-DoF joints to full
set_stateqvel columns.
- get_keyframe_qpos(name)¶
Return the full qpos for a named keyframe, including the floating base.
- get_motion_body_ids(names)¶
Resolve backend-native body IDs used by motion datasets.
- get_physics_state()¶
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_model(env_index=None)¶
Return the playback model for a specific env when variants exist.
- get_root_state_layout(root_body_name)¶
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_scene_model_file()¶
Return the materialized scene path for diagnostics, when available.
- get_scene_visual_model_file()¶
Return the scene visual model file on the cold path, when available.
Backends without a separate visual scene model return
None.
- get_sensor_data(name)¶
Compute one mapped scene sensor from the shm state caches.
See
sensors.pyfor the MJCF-sensor → tensor-quantity mapping table. Names that are not declared in the scene raiseValueError; declared but unmappable sensors fail closed withNotImplementedError.
- get_sensor_data_batch(names)¶
Fetch multiple sensors and concatenate their flattened values.
- get_sensor_data_rows(name, env_ids)¶
Get selected env rows of a sensor array.
- get_site_ids(names)¶
Resolve site names to integer ID arrays.
- get_site_jacobian_w(site_id, dof_indices)¶
Compute world-frame Jacobians for one site and selected DoF columns.
- get_state(fields=None)¶
Return a detached, backend-neutral state snapshot.
qposandqvelare assembled from the public kinematic getters; adapters may override this to expose native fields such asctrl. This convenience API keeps benchmark clients independent from private model/data objects while the full reset contract remainsset_state.
- get_terrain_spawn_data()¶
Return backend-materialized terrain metadata on the cold path.
Backends without generated terrain support return
None. Callers should resolve this once during env initialization and cache the returned height-sampling callable for reset/reward hot paths.- Return type:
BackendTerrainSpawnData|None
- materialize()¶
Spawn the worker, run the handshake, and bind shared-memory slots.
Idempotent. Called lazily by the first state/metadata access, so env constructors that read shapes before the explicit lifecycle point work like they do on the MuJoCo backend. A closed backend cannot be materialized again.
- Return type:
- property model: SubprocessModelInfo¶
Return backend-owned model metadata; never a live physics object.
- reset(env_ids=None)¶
Reset selected environments to the backend’s default state.
- 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)¶
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.
- set_physics_state(state)¶
Restore a snapshot produced by
get_physics_state.Backends implementing this must refresh their host caches so state and sensor getters stay consistent with the restored physics state.
- set_pre_step_control(fn)¶
Register an env-owned policy-control to physics-control converter.
The callback receives
(backend, ctrl)so owner code can read the backend’s freshly-updated sensor contract before every physics substep. It must return backend-native actuator control with the same shape. Position-actuator envs leave this unset and keep the direct control path.
- set_state(env_indices, qpos, qvel, randomization=None)¶
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.
- step(ctrl, nsteps=1)¶
Advance physics.
- backend_type: str¶