isaaclab_ov.physics#
OvPhysX physics manager implementation.
Classes
Manages an ovphysx-backed physics simulation lifecycle. |
|
Configuration for the ovphysx physics manager. |
|
Native runtime construction settings, separate from physics scene policy. |
Physics Manager#
- class isaaclab_ov.physics.OvPhysxManager[source]#
Bases:
PhysicsManagerManages an ovphysx-backed physics simulation lifecycle.
Unlike PhysxManager, this manager does not depend on a host Kit or Carbonite runtime, or on the Omniverse timeline. It drives the simulation through the OVPhysX Python wheel and its packaged runtime.
Lifecycle: initialize() -> reset() -> step() (repeated) -> close()
Methods:
__init__()get_dt()Get the physics timestep.
Load every authored environment during the next stage warmup.
fix_articulation_root(articulation_prim[, stage])Fix and normalize an articulation root for the OVPhysX parser.
setup_deformable_body(prim, deformable_type, ...)Apply the OmniPhysics deformable anchor APIs, rest state, and bind pose.
register_clone(source, targets[, ...])Queue clones at the given world positions with identity rotations.
initialize(sim_context)Initialize the physics manager with simulation context.
reset([soft])Reset physics simulation.
forward()Evaluate and publish state changes made without stepping physics.
Finish native kinematics before SDP publishes manually written joint poses.
Update dirty articulation kinematics without publishing or rendering.
step()Step the simulation by one physics timestep.
close()Release ovphysx resources and clean up.
Return the underlying ovphysx.PhysX instance (or None if not yet created).
Return the last successfully applied world-frame gravity vector [m/s^2].
set_gravity(gravity)Set the scene-wide gravity vector through OvStage [m/s^2].
Return the SDP backend created during initialization; native bindings are acquired lazily.
Hook after visualizers have stepped during
render().Remove all registered callbacks.
deregister_callback(callback_id)Remove a registered callback.
dispatch_event(event[, payload])Dispatch an event to all registered callbacks.
Get the tensor backend being used ("numpy" or "torch").
Get the physics simulation device.
Get the physics timestep in seconds.
Get the physics simulation view.
Get the current simulation time in seconds.
Truewhenstep()executes the full decimation loop internally.pause()Pause physics simulation.
play()Start or resume physics simulation.
register_callback(callback, event[, order, ...])Register a callback for a physics event.
safe_callback_invoke(fn, *args[, ...])Invoke a callback, catching exceptions that would be swallowed by external event buses.
set_decimation(decimation)Inform the physics backend how many substeps the environment runs per policy step.
stop()Stop physics simulation.
Return the video capture backend identifier for this physics manager.
Block until the timeline is playing.
Attributes:
Native resource borrowed from the context registry after warmup.
Backend implementation key used by asset and sensor factories.
Whether this backend can service
--anim_recording_enabled(OVD Recorder).Backend views by prim path expression, shared by the consumers of this manager.
Classes:
alias of
OvPhysxReplicateContext- backend_name: ClassVar[str] = 'ovphysx'#
Backend implementation key used by asset and sensor factories.
- classmethod fix_articulation_root(articulation_prim: Any, stage: Any = None) Any[source]#
Fix and normalize an articulation root for the OVPhysX parser.
- classmethod setup_deformable_body(prim: Any, deformable_type: str, sim_mesh_prim: Any, vis_mesh_prim: Any) None[source]#
Apply the OmniPhysics deformable anchor APIs, rest state, and bind pose.
OVPhysX reads the same OmniPhysics deformable schemas as the Kit PhysX backend, so both backends share one authoring path.
- register_clone(source: str, targets: list[str], parent_positions: list[tuple[float, float, float]] | None = None) None[source]#
Queue clones at the given world positions with identity rotations.
- initialize(sim_context: SimulationContext) None[source]#
Initialize the physics manager with simulation context.
This stores the config and device but does not load the USD stage yet – the stage may not be fully populated at this point. The actual load happens lazily in
reset().The simulation registry retains its native resource across reinitialization.
- reset(soft: bool = False) None[source]#
Reset physics simulation.
On the first (non-soft) reset the method: - Serializes the current USD stage in memory - Creates the ovphysx.PhysX instance - Populates and attaches an OVStage - Warms up GPU buffers (if on CUDA) - Dispatches PHYSICS_READY
A forced re-warm dispatches
STOPbefore replacing the attached stage so listeners discard stale bindings.
- pre_render() None[source]#
Finish native kinematics before SDP publishes manually written joint poses.
- update_kinematics() None[source]#
Update dirty articulation kinematics without publishing or rendering.
- get_physx_instance() Any[source]#
Return the underlying ovphysx.PhysX instance (or None if not yet created).
- get_gravity() tuple[float, float, float][source]#
Return the last successfully applied world-frame gravity vector [m/s^2].
Mirrors PhysX’s
SimulationView.get_gravity()so backend-agnostic sensor code can read gravity from their owning manager. The value tracksset_gravity(), falling back to the simulation cfg until the first live update.- Raises:
RuntimeError – If no simulation is active. Call
initialize()first.
- set_gravity(gravity: tuple[float, float, float]) None[source]#
Set the scene-wide gravity vector through OvStage [m/s^2].
The OvPhysX runtime accepts live scene changes only as sealed OvStage control updates. This method authors the scene’s gravity direction and magnitude at the next control ordinal, seals it, and applies that single ordinal to the running simulation.
- Parameters:
gravity¶ – World-frame gravity vector [m/s^2].
- Raises:
RuntimeError – If the OVPhysX simulation has not been initialized.
ValueError – If gravity does not contain three finite values.
- get_scene_data_backend() SceneDataBackend[source]#
Return the SDP backend created during initialization; native bindings are acquired lazily.
- after_visualizers_render() None[source]#
Hook after visualizers have stepped during
render().Use for physics-backend sync (e.g. fabric) if needed. Default is a no-op.
- clear_callbacks() None[source]#
Remove all registered callbacks.
IDs remain unique for this manager’s lifetime. Otherwise a retained handle could deregister a new callback after a close and reinitialization of the same manager.
- deregister_callback(callback_id: int | CallbackHandle) None[source]#
Remove a registered callback.
- Parameters:
callback_id¶ – The ID or CallbackHandle returned by register_callback().
- dispatch_event(event: PhysicsEvent, payload: Any = None) None[source]#
Dispatch an event to all registered callbacks.
This is the default implementation using simple callback lists. Subclasses may override or extend with platform-specific dispatch.
- handles_decimation() bool[source]#
Truewhenstep()executes the full decimation loop internally.When this returns
Truethe environment should callstep()once per policy step instead of loopingdecimationtimes.
- register_callback(callback: Callable[[Any], None], event: PhysicsEvent, order: int = 0, name: str | None = None, wrap_weak_ref: bool = True) CallbackHandle[source]#
Register a callback for a physics event.
- Parameters:
callback¶ – The callback function. Receives event payload as argument.
event¶ – The event to listen for.
order¶ – Priority order (lower = earlier). Default 0.
name¶ – Optional name for debugging.
wrap_weak_ref¶ – If True, wrap bound methods with weak references to prevent preventing garbage collection. Default True.
- Returns:
CallbackHandle that can be used to deregister the callback.
Example
>>> def on_physics_ready(payload): ... print("Physics is ready!") >>> handle = sim.backend_manager.register_callback(on_physics_ready, PhysicsEvent.PHYSICS_READY) >>> # Later, to remove: >>> handle.deregister()
- static safe_callback_invoke(fn: Callable, *args, backend_manager: PhysicsManager | None = None, physics_manager: PhysicsManager | None = None) None[source]#
Invoke a callback, catching exceptions that would be swallowed by external event buses.
Ignores
ReferenceError(from garbage-collected weakref proxies). All other exceptions are forwarded to backend_manager.``store_callback_exception`` when available (see note below), or re-raised immediately otherwise.- Parameters:
- Note (Octi):
The carb event bus used by PhysX/Omniverse silently swallows exceptions raised inside callbacks.
PhysxManagerworks around this by storing the exception and re-raising it after event dispatch completes (inreset()/step()). Backends that dispatch events directly (e.g. Newton) don’t need this — exceptions propagate normally — sostore_callback_exceptionis not called for them. This is a known wart; a cleaner solution is actively being explored.
- set_decimation(decimation: int) None[source]#
Inform the physics backend how many substeps the environment runs per policy step.
Backends that can fold the full decimation loop into a single
step()call (e.g. Newton with all-graphable actuators) use this to size their internal loop / CUDA graph. The default implementation is a no-op.- Parameters:
decimation¶ – Number of physics steps per environment step.
- supports_anim_recording: ClassVar[bool] = False#
Whether this backend can service
--anim_recording_enabled(OVD Recorder).Overridden by backends that implement the recorder (currently PhysX-only).
- video_capture_backend() str | None[source]#
Return the video capture backend identifier for this physics manager.
Used by
VideoRecorderto select how perspective video frames are captured when no visualizer is active.- Returns:
"kit"for backends that use Kit/Replicator (e.g.PhysxManager),"newton_gl"for backends that use a headless Newton GL viewer (e.g.NewtonManager), orNoneif the backend does not support perspective video capture.
Physics Configuration#
- class isaaclab_ov.physics.OvPhysxCfg[source]#
Bases:
PhysicsCfgConfiguration for the ovphysx physics manager.
PhysX scene-level parameters (solver iterations, GPU buffer sizes, etc.) are read from the USD PhysicsScene prim. Only ovphysx-specific settings that are not captured in USD live here.
Attributes:
The physics manager class to use.
Explicit OVPhysX 0.7 migration values for legacy USD joint friction.
Directory for the OVPhysX cooked-collider cache, defaulting to a per-user directory under the system temporary directory.
Enable/disable improved determinism at the expense of performance.
Whether to request reproducible physics from the backend.
Enable/disable external forces every position iteration in the TGS solver.
Size of the GPU rigid-body contact buffer.
Size of the GPU rigid-body patch buffer.
Capacity for GPU found/lost broadphase pairs.
Capacity for GPU found/lost aggregate broadphase pairs.
Capacity for total GPU aggregate broadphase pairs.
GPU collision stack size in bytes.
- class_type: type[PhysicsManager] | Any#
The physics manager class to use. Must be set by subclasses.
- legacy_joint_friction_replacements: dict[str, tuple[float, float, float]]#
Explicit OVPhysX 0.7 migration values for legacy USD joint friction.
Keys are regular expressions matched against the complete joint name. Values are
(static effort, dynamic effort, viscous coefficient)in SI units: N or N*m, and N*s/m or N*m*s/rad. These are calibrated replacement efforts, not converted legacy coefficients. Static effort must be at least dynamic effort.Only the private OVPhysX 0.7 export is changed. Older runtimes ignore this mapping. Authored modern friction takes precedence. Unmatched nonzero legacy friction still raises an error; this mapping does not provide a global fallback for unknown assets.
- cooked_collider_cache_dir: str | None#
Directory for the OVPhysX cooked-collider cache, defaulting to a per-user directory under the system temporary directory. Set to
Noneto use the runtime default.The datastore is created once per process, so the first OVPhysX construction fixes the location and a later config does not relocate it. The runtime garbage collects the cache against a disk budget; deleting the directory reclaims the space immediately, and a system temporary directory may also be purged between boots.
- enable_enhanced_determinism: bool#
Enable/disable improved determinism at the expense of performance. Defaults to False.
For more information on PhysX determinism, please check here.
- deterministic: bool#
Whether to request reproducible physics from the backend. Defaults to False.
This is the backend-agnostic form of the request, set by the
--deterministiccommand-line flag. Each physics manager translates it into its own settings when the simulation starts, and raises when its configuration cannot provide the guarantee. A backend-specific determinism attribute set explicitly, such asdeterministic_mode, is the more specific instruction and takes precedence.Deterministic execution can increase memory use and reduce simulation performance.
- enable_external_forces_every_iteration: bool#
Enable/disable external forces every position iteration in the TGS solver. Default is True.
This matches the PhysX backend default and can improve the accuracy of velocity updates. Set to
Falseexplicitly to preserve the previous OvPhysX default behavior. Changing this setting can affect simulated velocities and contact forces.
- class isaaclab_ov.physics.OvPhysxBackendCfg[source]#
Bases:
BackendCfgNative runtime construction settings, separate from physics scene policy.
Attributes:
Constructor called through
instantiate(cfg); the returned resource must implementclose().cpuorcuda:<index>.Cooked-collider cache location, fixed by the first runtime created in the process.