Skip to content

Commit 6a2e63f

Browse files
committed
Pass CameraData to read_output
1 parent a179fc3 commit 6a2e63f

6 files changed

Lines changed: 28 additions & 63 deletions

File tree

source/isaaclab/isaaclab/renderers/base_renderer.py

Lines changed: 7 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -93,33 +93,17 @@ def render(self, render_data: Any) -> None:
9393
pass
9494

9595
@abstractmethod
96-
def write_output(self, render_data: Any, output_name: str, output_data: torch.Tensor) -> None:
97-
"""Write a specific output type to the given buffer.
96+
def read_output(self, render_data: Any, output_name: str, camera_data: Any) -> None:
97+
"""Read a named output from the renderer into the camera data container.
9898
99-
Args:
100-
render_data: The render data object from :meth:`create_render_data`.
101-
output_name: Name of the output (e.g. ``"rgba"``, ``"depth"``).
102-
output_data: Pre-allocated tensor to write the output into.
103-
"""
104-
pass
105-
106-
@abstractmethod
107-
def get_output_info(self, render_data: Any) -> dict[str, Any] | None:
108-
"""Return static metadata collected during rendering.
109-
110-
Renderers that produce metadata (e.g. semantic segmentation label
111-
mappings) return a dictionary mapping output names to their metadata.
112-
The returned dictionary is written once into :attr:`CameraData.info`
113-
after the first render and is not queried again.
114-
115-
Renderers that do not produce metadata should return ``None``.
99+
Implementations should populate ``camera_data.output[output_name]`` with
100+
rendered data and, when available, other metadata (ex. ``camera_data.info``).
116101
117102
Args:
118103
render_data: The render data object from :meth:`create_render_data`.
119-
120-
Returns:
121-
A dictionary mapping output names to their metadata, or ``None``
122-
if the renderer does not produce metadata.
104+
output_name: Name of the output (e.g. ``"rgba"``, ``"depth"``).
105+
camera_data: The :class:`~isaaclab.sensors.camera.camera_data.CameraData`
106+
instance to populate.
123107
"""
124108
pass
125109

source/isaaclab/isaaclab/sensors/camera/camera.py

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -445,7 +445,6 @@ def _initialize_impl(self):
445445

446446
# View needs to exist before creating render data
447447
self.render_data = self.renderer.create_render_data(self)
448-
self._renderer_info_populated = False
449448

450449
# Create internal buffers (includes intrinsic matrix and pose init)
451450
self._create_buffers()
@@ -463,18 +462,10 @@ def _update_buffers_impl(self, env_mask: wp.array):
463462
self.renderer.update_transforms()
464463
self.renderer.render(self.render_data)
465464

466-
for output_name, output_data in self._data.output.items():
465+
for output_name in self._data.output:
467466
if output_name == "rgb":
468467
continue
469-
self.renderer.write_output(self.render_data, output_name, output_data)
470-
471-
if not self._renderer_info_populated:
472-
renderer_info = self.renderer.get_output_info(self.render_data)
473-
if renderer_info:
474-
for data_type, metadata in renderer_info.items():
475-
for cam_idx in range(self._view.count):
476-
self._data.info[cam_idx][data_type] = metadata
477-
self._renderer_info_populated = True
468+
self.renderer.read_output(self.render_data, output_name, self._data)
478469

479470
"""
480471
Private Helpers

source/isaaclab/test/renderers/test_renderer_factory.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,9 @@ def update_camera(self, render_data, positions, orientations, intrinsics):
4646
def render(self, render_data):
4747
pass
4848

49-
def write_output(self, render_data, output_name, output_data):
49+
def read_output(self, render_data, output_name, camera_data):
5050
pass
5151

52-
def get_output_info(self, render_data):
53-
return None
54-
5552
def cleanup(self, render_data):
5653
pass
5754

source/isaaclab_newton/isaaclab_newton/renderers/newton_warp_renderer.py

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
if TYPE_CHECKING:
2626
from isaaclab.physics import BaseSceneDataProvider
2727
from isaaclab.sensors import SensorBase
28+
from isaaclab.sensors.camera.camera_data import CameraData
2829

2930
logger = logging.getLogger(__name__)
3031

@@ -223,16 +224,12 @@ def render(self, render_data: RenderData):
223224
shape_index_image=render_data.outputs.instance_segmentation_image,
224225
)
225226

226-
def get_output_info(self, render_data: RenderData) -> dict[str, Any] | None:
227-
"""No metadata for Newton Warp.
228-
See :meth:`~isaaclab.renderers.base_renderer.BaseRenderer.get_output_info`."""
229-
return None
230-
231-
def write_output(self, render_data: RenderData, output_name: str, output_data: torch.Tensor):
232-
"""Copy a specific output to the given buffer.
233-
See :meth:`~isaaclab.renderers.base_renderer.BaseRenderer.write_output`."""
227+
def read_output(self, render_data: RenderData, output_name: str, camera_data: CameraData) -> None:
228+
"""Copy a specific output to the camera data buffer.
229+
See :meth:`~isaaclab.renderers.base_renderer.BaseRenderer.read_output`."""
234230
image_data = render_data.get_output(output_name)
235231
if image_data is not None:
232+
output_data = camera_data.output[output_name]
236233
if image_data.ptr != output_data.data_ptr():
237234
wp.copy(wp.from_torch(output_data), image_data)
238235

source/isaaclab_ov/isaaclab_ov/renderers/ovrtx_renderer.py

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959

6060
if TYPE_CHECKING:
6161
from isaaclab.sensors import SensorBase
62+
from isaaclab.sensors.camera.camera_data import CameraData
6263

6364

6465
class OVRTXRenderData:
@@ -387,21 +388,17 @@ def update_camera(
387388
wp_transforms_view = wp.from_dlpack(attr_mapping.tensor, dtype=wp.mat44d)
388389
wp.copy(wp_transforms_view, camera_transforms)
389390

390-
def get_output_info(self, render_data: OVRTXRenderData) -> dict[str, Any] | None:
391-
"""No metadata for OVRTX.
392-
See :meth:`~isaaclab.renderers.base_renderer.BaseRenderer.get_output_info`."""
393-
return None
394-
395-
def write_output(
391+
def read_output(
396392
self,
397393
render_data: OVRTXRenderData,
398394
output_name: str,
399-
output_data: torch.Tensor,
395+
camera_data: CameraData,
400396
) -> None:
401-
"""Copy from render_data warp buffer to output tensor."""
397+
"""Copy from render_data warp buffer to camera data output tensor."""
402398
if output_name not in render_data.warp_buffers:
403399
return
404400
src = render_data.warp_buffers[output_name]
401+
output_data = camera_data.output[output_name]
405402
if src.ptr != output_data.data_ptr():
406403
wp.copy(dest=wp.from_torch(output_data), src=src)
407404

source/isaaclab_physx/isaaclab_physx/renderers/isaac_rtx_renderer.py

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929

3030
if TYPE_CHECKING:
3131
from isaaclab.sensors import SensorBase
32+
from isaaclab.sensors.camera.camera_data import CameraData
3233

3334
from .isaac_rtx_renderer_cfg import IsaacRtxRendererCfg
3435

@@ -326,15 +327,13 @@ def tiling_grid_shape():
326327
0.0 if cfg.depth_clipping_behavior == "zero" else cfg.spawn.clipping_range[1]
327328
)
328329

329-
def get_output_info(self, render_data: IsaacRtxRenderData) -> dict[str, Any] | None:
330-
"""Return segmentation label mappings collected during render().
331-
See :meth:`~isaaclab.renderers.base_renderer.BaseRenderer.get_output_info`."""
332-
return render_data.renderer_info
333-
334-
def write_output(self, render_data: IsaacRtxRenderData, output_name: str, output_data: torch.Tensor):
335-
"""No-op for Isaac RTX - all outputs written in render().
336-
See :meth:`~isaaclab.renderers.base_renderer.BaseRenderer.write_output`."""
337-
pass
330+
def read_output(self, render_data: IsaacRtxRenderData, output_name: str, camera_data: CameraData) -> None:
331+
"""Populate per-output metadata collected during render(). Pixel data already written in render().
332+
See :meth:`~isaaclab.renderers.base_renderer.BaseRenderer.read_output`."""
333+
info = render_data.renderer_info.get(output_name)
334+
if info is not None:
335+
for cam_info in camera_data.info:
336+
cam_info[output_name] = info
338337

339338
def cleanup(self, render_data: IsaacRtxRenderData | None):
340339
"""Detach annotators from render product.

0 commit comments

Comments
 (0)