diff --git a/docs/source/api/index.rst b/docs/source/api/index.rst index 452cadfebcc4..2ff0cf6174be 100644 --- a/docs/source/api/index.rst +++ b/docs/source/api/index.rst @@ -25,6 +25,7 @@ The following modules are available in the ``isaaclab`` extension: physics renderers scene + scene_data sensors sim terrains diff --git a/docs/source/api/lab/isaaclab.scene_data.rst b/docs/source/api/lab/isaaclab.scene_data.rst new file mode 100644 index 000000000000..c36b7666861a --- /dev/null +++ b/docs/source/api/lab/isaaclab.scene_data.rst @@ -0,0 +1,33 @@ +isaaclab.scene_data +=================== + +.. automodule:: isaaclab.scene_data + + .. rubric:: Classes + + .. autosummary:: + + SceneDataProvider + SceneDataBackend + SceneDataFormat + +Scene Data Provider +------------------- + +.. autoclass:: SceneDataProvider + :members: + :undoc-members: + :show-inheritance: + +Scene Data Backend +------------------ + +.. autoclass:: SceneDataBackend + :members: + :undoc-members: + :show-inheritance: + +.. autoclass:: SceneDataFormat + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/source/features/visualization.rst b/docs/source/features/visualization.rst index c23d9d4b5fd2..91a6027e72c5 100644 --- a/docs/source/features/visualization.rst +++ b/docs/source/features/visualization.rst @@ -547,7 +547,7 @@ Currently, live plots are only available in the Kit Visualizer. **Viser Visualizer Renderer Requirement** The Viser visualizer requires a Newton model, which is provided automatically by -:class:`~isaaclab.scene.scene_data_provider.SceneDataProvider` regardless of the active physics +:class:`~isaaclab.scene_data.SceneDataProvider` regardless of the active physics backend or renderer. It is compatible with all rendering backends (RTX, Newton Warp, OVRTX). diff --git a/docs/source/overview/core-concepts/multi_backend_architecture.rst b/docs/source/overview/core-concepts/multi_backend_architecture.rst index 8a946b50023c..55c524b22c33 100644 --- a/docs/source/overview/core-concepts/multi_backend_architecture.rst +++ b/docs/source/overview/core-concepts/multi_backend_architecture.rst @@ -56,7 +56,7 @@ This pattern applies to all simulation components: - :class:`~isaaclab_physx.renderers.IsaacRtxRenderer` - :class:`~isaaclab_newton.renderers.NewtonWarpRenderer` * - Scene Data Backend - - :class:`~isaaclab.physics.SceneDataBackend` + - :class:`~isaaclab.scene_data.SceneDataBackend` - ``PhysxSceneDataBackend`` (in :mod:`isaaclab_physx.physics`) - ``NewtonSceneDataBackend`` (in :mod:`isaaclab_newton.physics`) * - Cloner @@ -272,14 +272,15 @@ the established conventions: **2. Implement the physics manager:** -The manager must expose a :class:`~isaaclab.physics.SceneDataBackend` so that -:class:`~isaaclab.scene.scene_data_provider.SceneDataProvider` can read your backend's body +The manager must expose a :class:`~isaaclab.scene_data.SceneDataBackend` so that +:class:`~isaaclab.scene_data.SceneDataProvider` can read your backend's body transforms in a Warp-native format that renderers and visualizers consume directly. .. code-block:: python # isaaclab_mybackend/physics/mybackend_manager.py - from isaaclab.physics import PhysicsManager, SceneDataBackend, SceneDataFormat + from isaaclab.physics import PhysicsManager + from isaaclab.scene_data import SceneDataBackend, SceneDataFormat class MyBackendSceneDataBackend(SceneDataBackend): diff --git a/docs/source/overview/core-concepts/scene_data_providers.rst b/docs/source/overview/core-concepts/scene_data_providers.rst index a279735efb31..9562610e8b02 100644 --- a/docs/source/overview/core-concepts/scene_data_providers.rst +++ b/docs/source/overview/core-concepts/scene_data_providers.rst @@ -1,7 +1,7 @@ Scene Data Provider =================== -The :class:`~isaaclab.scene.scene_data_provider.SceneDataProvider` bridges physics simulation +The :class:`~isaaclab.scene_data.SceneDataProvider` bridges physics simulation backends and the visualizers/renderers that consume scene data. It exposes a single Warp-native read path for body transforms regardless of which physics backend (PhysX or Newton) is active, so renderers and visualizers can stay backend-agnostic. @@ -12,7 +12,7 @@ Overview Isaac Lab supports multiple physics backends (PhysX and Newton) and multiple visualizers (Omniverse Kit, Newton, Rerun, Viser). Each combination needs scene data to flow from the physics engine into the renderer or visualizer. The :class:`SceneDataProvider` owns this flow: -the physics manager provides a :class:`~isaaclab.physics.SceneDataBackend` that wraps its +the physics manager provides a :class:`~isaaclab.scene_data.SceneDataBackend` that wraps its native tensor views, and the provider handles format conversion and re-mapping on top of it. .. code-block:: python @@ -28,9 +28,9 @@ Architecture The system has three layers: -1. :class:`~isaaclab.physics.SceneDataBackend` — small interface implemented by each physics +1. :class:`~isaaclab.scene_data.SceneDataBackend` — small interface implemented by each physics manager. It exposes the backend's transform array directly as one of the - :class:`~isaaclab.physics.SceneDataFormat` Warp structs, plus the per-transform prim paths + :class:`~isaaclab.scene_data.SceneDataFormat` Warp structs, plus the per-transform prim paths and total count. There is no per-frame "update" call — the property accessors return live views into the underlying tensor each time they're read. @@ -40,7 +40,7 @@ The system has three layers: - :attr:`SceneDataBackend.transform_count` — number of transforms. - :attr:`SceneDataBackend.transform_paths` — list of USD prim paths, one per transform. -2. :class:`~isaaclab.scene.scene_data_provider.SceneDataProvider` — wraps a backend and offers +2. :class:`~isaaclab.scene_data.SceneDataProvider` — wraps a backend and offers format conversion plus index re-mapping: - :meth:`SceneDataProvider.get_transforms` — write the backend's transforms into a diff --git a/source/isaaclab/changelog.d/daniela-move-scene-data.major.rst b/source/isaaclab/changelog.d/daniela-move-scene-data.major.rst new file mode 100644 index 000000000000..39c979e086c4 --- /dev/null +++ b/source/isaaclab/changelog.d/daniela-move-scene-data.major.rst @@ -0,0 +1,23 @@ +Added +^^^^^ + +* Added :mod:`isaaclab.scene_data` sub-package consolidating + :class:`~isaaclab.scene_data.SceneDataProvider`, + :class:`~isaaclab.scene_data.SceneDataBackend`, and + :class:`~isaaclab.scene_data.SceneDataFormat` in a single import location. + +Changed +^^^^^^^ + +* **Breaking:** Moved :class:`~isaaclab.scene_data.SceneDataProvider` from + :mod:`isaaclab.scene.scene_data_provider` and + :class:`~isaaclab.scene_data.SceneDataBackend` / + :class:`~isaaclab.scene_data.SceneDataFormat` from :mod:`isaaclab.physics` + to the new :mod:`isaaclab.scene_data` sub-package. Update imports:: + + # before + from isaaclab.scene.scene_data_provider import SceneDataProvider + from isaaclab.physics import SceneDataBackend, SceneDataFormat + + # after + from isaaclab.scene_data import SceneDataProvider, SceneDataBackend, SceneDataFormat diff --git a/source/isaaclab/docs/CHANGELOG.rst b/source/isaaclab/docs/CHANGELOG.rst index 93d4c67b9497..68028a87110e 100644 --- a/source/isaaclab/docs/CHANGELOG.rst +++ b/source/isaaclab/docs/CHANGELOG.rst @@ -272,9 +272,9 @@ Added ``JointTypeFloatingBase``, OCS2's ``generalizedCoordinatesNum = 6 + actuatedJointsNum``, iDynTree's ``getFreeFloatingMassMatrix`` returning ``(6 + dofs, 6 + dofs)``). -* Added :attr:`~isaaclab.scene.scene_data_provider.SceneDataProvider.usd_stage`, - :attr:`~isaaclab.scene.scene_data_provider.SceneDataProvider.num_envs`, and - :meth:`~isaaclab.scene.scene_data_provider.SceneDataProvider.get_camera_transforms` +* Added :attr:`~isaaclab.scene_data.SceneDataProvider.usd_stage`, + :attr:`~isaaclab.scene_data.SceneDataProvider.num_envs`, and + :meth:`~isaaclab.scene_data.SceneDataProvider.get_camera_transforms` so visualizers and renderers can pull stage-derived data through the same Warp-native provider that already exposes transforms. @@ -309,12 +309,12 @@ Changed COM-referenced form can read :attr:`body_com_jacobian_w`. * **Breaking:** :class:`~isaaclab.visualizers.base_visualizer.BaseVisualizer` subclasses now receive a - :class:`~isaaclab.scene.scene_data_provider.SceneDataProvider` in + :class:`~isaaclab.scene_data.SceneDataProvider` in :meth:`~isaaclab.visualizers.base_visualizer.BaseVisualizer.initialize` instead of the removed ``BaseSceneDataProvider``. Read environment count - from :attr:`~isaaclab.scene.scene_data_provider.SceneDataProvider.num_envs` + from :attr:`~isaaclab.scene_data.SceneDataProvider.num_envs` and call - :meth:`~isaaclab.scene.scene_data_provider.SceneDataProvider.get_camera_transforms` + :meth:`~isaaclab.scene_data.SceneDataProvider.get_camera_transforms` on the new provider; both replace the previous ``get_metadata()`` / ``get_camera_transforms()`` calls on the legacy interface. diff --git a/source/isaaclab/isaaclab/physics/__init__.pyi b/source/isaaclab/isaaclab/physics/__init__.pyi index d2ceced82eb2..b4f910866210 100644 --- a/source/isaaclab/isaaclab/physics/__init__.pyi +++ b/source/isaaclab/isaaclab/physics/__init__.pyi @@ -8,10 +8,7 @@ __all__ = [ "PhysicsEvent", "PhysicsManager", "PhysicsCfg", - "SceneDataBackend", - "SceneDataFormat", ] from .physics_manager import CallbackHandle, PhysicsEvent, PhysicsManager from .physics_manager_cfg import PhysicsCfg -from .scene_data_backend import SceneDataBackend, SceneDataFormat diff --git a/source/isaaclab/isaaclab/physics/physics_manager.py b/source/isaaclab/isaaclab/physics/physics_manager.py index e6abd8287139..658679d5db01 100644 --- a/source/isaaclab/isaaclab/physics/physics_manager.py +++ b/source/isaaclab/isaaclab/physics/physics_manager.py @@ -15,7 +15,7 @@ from typing import TYPE_CHECKING, Any, ClassVar if TYPE_CHECKING: - from isaaclab.physics.scene_data_backend import SceneDataBackend + from isaaclab.scene_data import SceneDataBackend from isaaclab.sim.simulation_context import SimulationContext logger = logging.getLogger(__name__) diff --git a/source/isaaclab/isaaclab/physics/scene_data_backend.py b/source/isaaclab/isaaclab/physics/scene_data_backend.py deleted file mode 100644 index d94bea9e76c9..000000000000 --- a/source/isaaclab/isaaclab/physics/scene_data_backend.py +++ /dev/null @@ -1,61 +0,0 @@ -# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). -# All rights reserved. -# -# SPDX-License-Identifier: BSD-3-Clause - -"""Backend interface and data formats for the scene data provider. - -These types live in :mod:`isaaclab.physics` rather than -:mod:`isaaclab.scene.scene_data_provider` so that physics backends -(``isaaclab_physx``, ``isaaclab_newton``) can subclass -:class:`SceneDataBackend` without pulling :mod:`isaaclab.scene` into the -``AppLauncher`` pre-launch import chain. ``AppLauncher._create_app`` pops -``*lab*`` modules from ``sys.modules`` during Kit init and any submodule -imported during that window ends up orphaned from its parent's -``__dict__`` after restoration. -""" - -from __future__ import annotations - -import warp as wp - - -class SceneDataFormat: - @wp.struct - class Vec3_Quat: - positions: wp.array(dtype=wp.vec3f) = None - orientations: wp.array(dtype=wp.quatf) = None - - @wp.struct - class Vec3_Matrix33: - positions: wp.array(dtype=wp.vec3f) = None - orientations: wp.array(dtype=wp.mat33f) = None - - @wp.struct - class Transform: - transforms: wp.array(dtype=wp.transformf) = None - - @wp.struct - class Matrix44: - matrices: wp.array(dtype=wp.mat44f) = None - - -class SceneDataBackend: - @property - def transforms( - self, - ) -> ( - SceneDataFormat.Vec3_Quat | SceneDataFormat.Transform | SceneDataFormat.Matrix44 | SceneDataFormat.Vec3_Matrix33 - ): - """Return the sim backends transforms as one of the SceneDataFormat structs.""" - raise NotImplementedError - - @property - def transform_count(self) -> int: - """Return the number of transforms in the sim backend.""" - raise NotImplementedError - - @property - def transform_paths(self) -> list[str]: - """Return the paths for each transform.""" - raise NotImplementedError diff --git a/source/isaaclab/isaaclab/scene_data/__init__.py b/source/isaaclab/isaaclab/scene_data/__init__.py new file mode 100644 index 000000000000..9e3eaa88579f --- /dev/null +++ b/source/isaaclab/isaaclab/scene_data/__init__.py @@ -0,0 +1,22 @@ +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +"""Sub-package containing the scene data provider and backend interface. + +The :class:`SceneDataProvider` bridges physics simulation backends and the +consumers that read scene transforms (renderers and visualizers). Physics +backends implement :class:`SceneDataBackend` to expose their current +transforms in one of the :class:`SceneDataFormat` Warp struct variants; +the provider converts and remaps them on demand for each consumer. + +This package is deliberately separate from :mod:`isaaclab.scene` so that +physics backends (``isaaclab_physx``, ``isaaclab_newton``) can subclass +:class:`SceneDataBackend` without pulling :mod:`isaaclab.scene` into the +``AppLauncher`` pre-launch import chain. +""" + +from isaaclab.utils.module import lazy_export + +lazy_export() diff --git a/source/isaaclab/isaaclab/scene_data/__init__.pyi b/source/isaaclab/isaaclab/scene_data/__init__.pyi new file mode 100644 index 000000000000..2e17d33cf195 --- /dev/null +++ b/source/isaaclab/isaaclab/scene_data/__init__.pyi @@ -0,0 +1,13 @@ +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +__all__ = [ + "SceneDataBackend", + "SceneDataFormat", + "SceneDataProvider", +] + +from .scene_data_backend import SceneDataBackend, SceneDataFormat +from .scene_data_provider import SceneDataProvider diff --git a/source/isaaclab/isaaclab/scene_data/scene_data_backend.py b/source/isaaclab/isaaclab/scene_data/scene_data_backend.py new file mode 100644 index 000000000000..183b08246848 --- /dev/null +++ b/source/isaaclab/isaaclab/scene_data/scene_data_backend.py @@ -0,0 +1,91 @@ +# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +"""Backend interface and data formats for the scene data provider. + +These types live in :mod:`isaaclab.scene_data` rather than +:mod:`isaaclab.scene` so that physics backends (``isaaclab_physx``, +``isaaclab_newton``) can subclass :class:`SceneDataBackend` without pulling +:mod:`isaaclab.scene` into the ``AppLauncher`` pre-launch import chain. +``AppLauncher._create_app`` pops ``*lab*`` modules from ``sys.modules`` +during Kit init and any submodule imported during that window ends up +orphaned from its parent's ``__dict__`` after restoration. +""" + +from __future__ import annotations + +import warp as wp + +# Under Sphinx ``autodoc_mock_imports``, ``wp.struct`` is a ``_MockObject`` +# that replaces the decorated class with another mock, hiding its docstring +# and fields from autodoc. Fall back to an identity decorator when warp is +# mocked so the documentation builds from the source classes directly. +if getattr(wp, "__sphinx_mock__", False): + + def wp_struct(cls): + return cls +else: + wp_struct = wp.struct + + +class SceneDataFormat: + """Warp struct variants describing the transform layouts that a + :class:`SceneDataBackend` may publish to consumers. + """ + + @wp_struct + class Vec3_Quat: + """Separate position and quaternion arrays.""" + + positions: wp.array(dtype=wp.vec3f) = None + """Per-transform positions [m].""" + + orientations: wp.array(dtype=wp.quatf) = None + """Per-transform orientations as quaternions.""" + + @wp_struct + class Vec3_Matrix33: + """Separate position and rotation-matrix arrays.""" + + positions: wp.array(dtype=wp.vec3f) = None + """Per-transform positions [m].""" + + orientations: wp.array(dtype=wp.mat33f) = None + """Per-transform orientations as 3x3 rotation matrices.""" + + @wp_struct + class Transform: + """Packed warp transforms (position + quaternion).""" + + transforms: wp.array(dtype=wp.transformf) = None + """Per-transform packed position + orientation transforms [m, -].""" + + @wp_struct + class Matrix44: + """Packed 4x4 homogeneous transform matrices.""" + + matrices: wp.array(dtype=wp.mat44f) = None + """Per-transform 4x4 homogeneous transform matrices [m].""" + + +class SceneDataBackend: + @property + def transforms( + self, + ) -> ( + SceneDataFormat.Vec3_Quat | SceneDataFormat.Transform | SceneDataFormat.Matrix44 | SceneDataFormat.Vec3_Matrix33 + ): + """Return the sim backends transforms as one of the SceneDataFormat structs.""" + raise NotImplementedError + + @property + def transform_count(self) -> int: + """Return the number of transforms in the sim backend.""" + raise NotImplementedError + + @property + def transform_paths(self) -> list[str]: + """Return the paths for each transform.""" + raise NotImplementedError diff --git a/source/isaaclab/isaaclab/scene/scene_data_provider.py b/source/isaaclab/isaaclab/scene_data/scene_data_provider.py similarity index 99% rename from source/isaaclab/isaaclab/scene/scene_data_provider.py rename to source/isaaclab/isaaclab/scene_data/scene_data_provider.py index a44700dd575c..723652339b46 100644 --- a/source/isaaclab/isaaclab/scene/scene_data_provider.py +++ b/source/isaaclab/isaaclab/scene_data/scene_data_provider.py @@ -13,7 +13,7 @@ import numpy as np import warp as wp -from isaaclab.physics.scene_data_backend import SceneDataBackend, SceneDataFormat +from .scene_data_backend import SceneDataBackend, SceneDataFormat if TYPE_CHECKING: from pxr import Usd diff --git a/source/isaaclab/isaaclab/sim/simulation_context.py b/source/isaaclab/isaaclab/sim/simulation_context.py index 9975cf13100d..19712bde96b8 100644 --- a/source/isaaclab/isaaclab/sim/simulation_context.py +++ b/source/isaaclab/isaaclab/sim/simulation_context.py @@ -29,7 +29,7 @@ resolve_scene_data_requirements, ) from isaaclab.renderers.render_context import RenderContext -from isaaclab.scene.scene_data_provider import SceneDataProvider +from isaaclab.scene_data import SceneDataProvider from isaaclab.sim.utils import create_new_stage from isaaclab.utils.string import clear_resolve_matching_names_cache from isaaclab.utils.version import has_kit @@ -772,11 +772,6 @@ def update_visualizers(self, dt: float, skip_app_pumping: bool = False) -> None: if any(viz.supports_markers() for viz in self._visualizers): self.vis_marker_registry.dispatch_callbacks() - # Marker callbacks update VisualizationMarkers state; visualizer step() - # consumes that state later in this method. - if any(viz.supports_markers() for viz in self._visualizers): - self.vis_marker_registry.dispatch_callbacks() - visualizers_to_remove = [] for viz in self._visualizers: try: diff --git a/source/isaaclab/isaaclab/visualizers/base_visualizer.py b/source/isaaclab/isaaclab/visualizers/base_visualizer.py index 9e41ddce3402..4084aaef559b 100644 --- a/source/isaaclab/isaaclab/visualizers/base_visualizer.py +++ b/source/isaaclab/isaaclab/visualizers/base_visualizer.py @@ -16,7 +16,7 @@ from urllib.parse import urlparse if TYPE_CHECKING: - from isaaclab.scene.scene_data_provider import SceneDataProvider + from isaaclab.scene_data import SceneDataProvider from .visualizer_cfg import VisualizerCfg diff --git a/source/isaaclab/test/sim/test_newton_manager_visualization_state.py b/source/isaaclab/test/sim/test_newton_manager_visualization_state.py index 7c3abf9f300a..d444799620f5 100644 --- a/source/isaaclab/test/sim/test_newton_manager_visualization_state.py +++ b/source/isaaclab/test/sim/test_newton_manager_visualization_state.py @@ -11,7 +11,7 @@ :meth:`NewtonManager._build_visualization_model_from_stage`), and :meth:`NewtonManager.update_visualization_state` must copy fresh transforms into ``_state_0.body_q`` via the new -:class:`~isaaclab.scene.scene_data_provider.SceneDataProvider`. +:class:`~isaaclab.scene_data.SceneDataProvider`. """ from __future__ import annotations diff --git a/source/isaaclab_newton/changelog.d/daniela-move-scene-data.rst b/source/isaaclab_newton/changelog.d/daniela-move-scene-data.rst new file mode 100644 index 000000000000..1c077dc3f68a --- /dev/null +++ b/source/isaaclab_newton/changelog.d/daniela-move-scene-data.rst @@ -0,0 +1,14 @@ +Changed +^^^^^^^ + +* Updated imports of :class:`~isaaclab.scene_data.SceneDataBackend` and + :class:`~isaaclab.scene_data.SceneDataFormat` to their new location in + :mod:`isaaclab.scene_data` (previously :mod:`isaaclab.physics`). + +Fixed +^^^^^ + +* Fixed :meth:`~isaaclab_newton.physics.NewtonManager.update_visualization_state` + retrieving the wrong simulation context. It now uses + :meth:`~isaaclab.sim.SimulationContext.instance` instead of the stale + ``PhysicsManager._sim`` reference. diff --git a/source/isaaclab_newton/docs/CHANGELOG.rst b/source/isaaclab_newton/docs/CHANGELOG.rst index 836ba4a2c133..03ceddc82005 100644 --- a/source/isaaclab_newton/docs/CHANGELOG.rst +++ b/source/isaaclab_newton/docs/CHANGELOG.rst @@ -116,7 +116,7 @@ Added USD stage (via :meth:`~isaaclab_newton.physics.NewtonManager.instantiate_builder_from_stage`) and refreshes ``state_0.body_q`` from rigid-body transforms supplied by the - :class:`~isaaclab.scene.scene_data_provider.SceneDataProvider` each render + :class:`~isaaclab.scene_data.SceneDataProvider` each render frame. Changed @@ -149,7 +149,7 @@ Removed (``NewtonSceneDataProvider``). Replace direct uses with :meth:`~isaaclab_newton.physics.NewtonManager.get_model` / :meth:`~isaaclab_newton.physics.NewtonManager.get_state` and the - Warp-native :class:`~isaaclab.scene.scene_data_provider.SceneDataProvider`. + Warp-native :class:`~isaaclab.scene_data.SceneDataProvider`. Fixed ^^^^^ diff --git a/source/isaaclab_newton/isaaclab_newton/physics/newton_manager.py b/source/isaaclab_newton/isaaclab_newton/physics/newton_manager.py index 73f1ac535049..f41afa85678b 100644 --- a/source/isaaclab_newton/isaaclab_newton/physics/newton_manager.py +++ b/source/isaaclab_newton/isaaclab_newton/physics/newton_manager.py @@ -33,7 +33,9 @@ from newton.sensors import SensorIMU as NewtonSensorIMU from newton.solvers import SolverBase, SolverKamino, SolverNotifyFlags -from isaaclab.physics import CallbackHandle, PhysicsEvent, PhysicsManager, SceneDataBackend, SceneDataFormat +from isaaclab.physics import CallbackHandle, PhysicsEvent, PhysicsManager +from isaaclab.scene_data import SceneDataBackend, SceneDataFormat +from isaaclab.sim import SimulationContext from isaaclab.sim.utils.newton_model_utils import replace_newton_shape_colors from isaaclab.sim.utils.stage import get_current_stage from isaaclab.utils import checked_apply @@ -264,8 +266,8 @@ class NewtonManager(PhysicsManager): # Visualization-only state used when the sim backend is PhysX. Populated # lazily in :meth:`_ensure_visualization_model` and updated each render # frame in :meth:`update_visualization_state`. - _visualization_scene_data: SceneDataFormat.Transform | None = None - _visualization_mapping: wp.array | None = None + _scene_data: SceneDataFormat.Transform | None = None + _scene_data_mapping: wp.array | None = None # Views list for assets to register their views _views: list = [] @@ -609,7 +611,7 @@ def close(cls) -> None: super().close() @classmethod - def get_scene_data_backend(cls) -> SceneDataBackend: + def get_scene_data_backend(cls) -> SceneDataBackend | None: """Return the SceneDataBackend for the SceneDataProvider.""" return cls._scene_data_backend @@ -683,8 +685,8 @@ def clear(cls): NewtonManager._transforms_dirty = False NewtonManager._particles_dirty = False NewtonManager._up_axis = "Z" - NewtonManager._visualization_scene_data = None - NewtonManager._visualization_mapping = None + NewtonManager._scene_data = None + NewtonManager._scene_data_mapping = None NewtonManager._model_changes = set() NewtonManager._scene_data_backend = None NewtonManager._cl_pending_sites = {} @@ -1573,7 +1575,7 @@ def _ensure_visualization_model(cls) -> None: :meth:`_build_visualization_model_from_stage` and finalizing the resulting :class:`~newton.ModelBuilder`. Per-frame body transforms are pushed into ``_state_0.body_q`` by :meth:`update_visualization_state` using the new - :class:`~isaaclab.scene.scene_data_provider.SceneDataProvider`. + :class:`~isaaclab.scene_data.SceneDataProvider`. """ if cls._model is not None and cls._state_0 is not None: @@ -1767,7 +1769,7 @@ def update_visualization_state(cls, scene_data_provider=None) -> None: already advanced by :meth:`step` / forward kinematics. PhysX sim backend: pull rigid-body transforms from the - :class:`~isaaclab.scene.scene_data_provider.SceneDataProvider` and write + :class:`~isaaclab.scene_data.SceneDataProvider` and write them into the shadow ``_state_0.body_q`` so Newton-native consumers (Newton renderer, Newton/Rerun/Viser visualizers, OVRTX renderer, Newton GL video) see fresh poses. @@ -1782,24 +1784,20 @@ def update_visualization_state(cls, scene_data_provider=None) -> None: return sdp = scene_data_provider if sdp is None: - sim = PhysicsManager._sim + sim = SimulationContext.instance() if sim is not None: sdp = sim.get_scene_data_provider() if sdp is None: return - if cls._visualization_scene_data is None: - cls._visualization_scene_data = SceneDataFormat.Transform() - if cls._visualization_mapping is None: + if cls._scene_data is None: + cls._scene_data = SceneDataFormat.Transform() + if cls._scene_data_mapping is None: body_paths = list(getattr(cls._model, "body_label", None) or []) - cls._visualization_mapping = sdp.create_mapping(body_paths) + cls._scene_data_mapping = sdp.create_mapping(body_paths) - cls._visualization_scene_data.transforms = cls._state_0.body_q - sdp.get_transforms( - cls._visualization_scene_data, - mapping=cls._visualization_mapping, - allow_passthrough=False, - ) + cls._scene_data.transforms = cls._state_0.body_q + sdp.get_transforms(cls._scene_data, mapping=cls._scene_data_mapping) @classmethod def get_state_1(cls) -> State: diff --git a/source/isaaclab_ovphysx/changelog.d/daniela-move-scene-data.rst b/source/isaaclab_ovphysx/changelog.d/daniela-move-scene-data.rst new file mode 100644 index 000000000000..3a830a73152a --- /dev/null +++ b/source/isaaclab_ovphysx/changelog.d/daniela-move-scene-data.rst @@ -0,0 +1,7 @@ +Changed +^^^^^^^ + +* Updated imports of :class:`~isaaclab.scene_data.SceneDataBackend` and + :class:`~isaaclab.scene_data.SceneDataFormat` in + :mod:`~isaaclab_ovphysx.physics.ovphysx_manager` to their new location in + :mod:`isaaclab.scene_data` (previously :mod:`isaaclab.physics`). diff --git a/source/isaaclab_ovphysx/isaaclab_ovphysx/physics/ovphysx_manager.py b/source/isaaclab_ovphysx/isaaclab_ovphysx/physics/ovphysx_manager.py index 729b06befa95..14eb03ddc5fc 100644 --- a/source/isaaclab_ovphysx/isaaclab_ovphysx/physics/ovphysx_manager.py +++ b/source/isaaclab_ovphysx/isaaclab_ovphysx/physics/ovphysx_manager.py @@ -24,7 +24,8 @@ from pxr import UsdPhysics -from isaaclab.physics import PhysicsEvent, PhysicsManager, SceneDataBackend, SceneDataFormat +from isaaclab.physics import PhysicsEvent, PhysicsManager +from isaaclab.scene_data import SceneDataBackend, SceneDataFormat if TYPE_CHECKING: from isaaclab.sim.simulation_context import SimulationContext diff --git a/source/isaaclab_physx/changelog.d/daniela-move-scene-data.rst b/source/isaaclab_physx/changelog.d/daniela-move-scene-data.rst new file mode 100644 index 000000000000..d2e0b7df99ad --- /dev/null +++ b/source/isaaclab_physx/changelog.d/daniela-move-scene-data.rst @@ -0,0 +1,6 @@ +Changed +^^^^^^^ + +* Updated imports of :class:`~isaaclab.scene_data.SceneDataBackend` and + :class:`~isaaclab.scene_data.SceneDataFormat` to their new location in + :mod:`isaaclab.scene_data` (previously :mod:`isaaclab.physics`). diff --git a/source/isaaclab_physx/docs/CHANGELOG.rst b/source/isaaclab_physx/docs/CHANGELOG.rst index 8cee80884415..416ad468b059 100644 --- a/source/isaaclab_physx/docs/CHANGELOG.rst +++ b/source/isaaclab_physx/docs/CHANGELOG.rst @@ -100,7 +100,7 @@ Removed * **Breaking:** Removed the ``isaaclab_physx.scene_data_providers`` package (``PhysxSceneDataProvider``). The Warp-native - :class:`~isaaclab.scene.scene_data_provider.SceneDataProvider` now exposes + :class:`~isaaclab.scene_data.SceneDataProvider` now exposes PhysX rigid-body transforms via :class:`~isaaclab_physx.physics.PhysxSceneDataBackend`, and the PhysX→Newton state sync used by Newton visualizers/renderers moved to diff --git a/source/isaaclab_physx/isaaclab_physx/physics/physx_manager.py b/source/isaaclab_physx/isaaclab_physx/physics/physx_manager.py index 00e9ed3007d6..df30c9e268a7 100644 --- a/source/isaaclab_physx/isaaclab_physx/physics/physx_manager.py +++ b/source/isaaclab_physx/isaaclab_physx/physics/physx_manager.py @@ -32,7 +32,8 @@ from pxr import Sdf, Usd, UsdPhysics, UsdUtils import isaaclab.sim as sim_utils -from isaaclab.physics import CallbackHandle, PhysicsEvent, PhysicsManager, SceneDataBackend, SceneDataFormat +from isaaclab.physics import CallbackHandle, PhysicsEvent, PhysicsManager +from isaaclab.scene_data import SceneDataBackend, SceneDataFormat from isaaclab.utils.string import to_camel_case if TYPE_CHECKING: diff --git a/source/isaaclab_visualizers/changelog.d/daniela-move-scene-data.rst b/source/isaaclab_visualizers/changelog.d/daniela-move-scene-data.rst new file mode 100644 index 000000000000..ea709a9f96b3 --- /dev/null +++ b/source/isaaclab_visualizers/changelog.d/daniela-move-scene-data.rst @@ -0,0 +1,11 @@ +Fixed +^^^^^ + +* Updated ``configclass`` imports in :mod:`isaaclab_visualizers.kit`, + :mod:`isaaclab_visualizers.newton`, :mod:`isaaclab_visualizers.rerun`, and + :mod:`isaaclab_visualizers.viser` visualizer configs to import from + :mod:`isaaclab.utils.configclass` directly, matching the lazy-import layout + introduced in :mod:`isaaclab.utils`. +* Updated ``test_visualizer_cartpole_integration`` to read the tiled camera + RGB output via the ``.torch`` accessor, matching the Warp-backed camera + data API. diff --git a/source/isaaclab_visualizers/isaaclab_visualizers/kit/kit_visualizer.py b/source/isaaclab_visualizers/isaaclab_visualizers/kit/kit_visualizer.py index 133c565ccbad..ec51d8b183d4 100644 --- a/source/isaaclab_visualizers/isaaclab_visualizers/kit/kit_visualizer.py +++ b/source/isaaclab_visualizers/isaaclab_visualizers/kit/kit_visualizer.py @@ -23,7 +23,7 @@ logger = logging.getLogger(__name__) if TYPE_CHECKING: - from isaaclab.scene.scene_data_provider import SceneDataProvider + from isaaclab.scene_data import SceneDataProvider _DEFAULT_VIEWPORT_NAME = "Visualizer Viewport" diff --git a/source/isaaclab_visualizers/isaaclab_visualizers/newton/newton_visualizer.py b/source/isaaclab_visualizers/isaaclab_visualizers/newton/newton_visualizer.py index 565c16b0251b..43aa7d628e80 100644 --- a/source/isaaclab_visualizers/isaaclab_visualizers/newton/newton_visualizer.py +++ b/source/isaaclab_visualizers/isaaclab_visualizers/newton/newton_visualizer.py @@ -24,7 +24,7 @@ logger = logging.getLogger(__name__) if TYPE_CHECKING: - from isaaclab.scene.scene_data_provider import SceneDataProvider + from isaaclab.scene_data import SceneDataProvider class NewtonViewerGL(ViewerGL): diff --git a/source/isaaclab_visualizers/isaaclab_visualizers/rerun/rerun_visualizer.py b/source/isaaclab_visualizers/isaaclab_visualizers/rerun/rerun_visualizer.py index cc55dcef7fa5..c83439a5b9f3 100644 --- a/source/isaaclab_visualizers/isaaclab_visualizers/rerun/rerun_visualizer.py +++ b/source/isaaclab_visualizers/isaaclab_visualizers/rerun/rerun_visualizer.py @@ -28,7 +28,7 @@ from .rerun_visualizer_cfg import RerunVisualizerCfg if TYPE_CHECKING: - from isaaclab.scene.scene_data_provider import SceneDataProvider + from isaaclab.scene_data import SceneDataProvider logger = logging.getLogger(__name__) diff --git a/source/isaaclab_visualizers/isaaclab_visualizers/viser/viser_visualizer.py b/source/isaaclab_visualizers/isaaclab_visualizers/viser/viser_visualizer.py index 5848690263f1..10d117873c7d 100644 --- a/source/isaaclab_visualizers/isaaclab_visualizers/viser/viser_visualizer.py +++ b/source/isaaclab_visualizers/isaaclab_visualizers/viser/viser_visualizer.py @@ -28,7 +28,7 @@ logger = logging.getLogger(__name__) if TYPE_CHECKING: - from isaaclab.scene.scene_data_provider import SceneDataProvider + from isaaclab.scene_data import SceneDataProvider def _disable_viser_runtime_client_rebuild_if_bundled() -> None: