Skip to content

Commit 34307a8

Browse files
committed
Address review comments
1 parent c0b9ecd commit 34307a8

6 files changed

Lines changed: 51 additions & 15 deletions

File tree

source/isaaclab/isaaclab/renderers/base_renderer.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,26 @@ def write_output(self, render_data: Any, output_name: str, output_data: torch.Te
103103
"""
104104
pass
105105

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``.
116+
117+
Args:
118+
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.
123+
"""
124+
pass
125+
106126
@abstractmethod
107127
def cleanup(self, render_data: Any) -> None:
108128
"""Release renderer resources associated with the given render data.

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

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
import isaaclab.sim as sim_utils
2020
import isaaclab.utils.sensors as sensor_utils
2121
from isaaclab.app.settings_manager import get_settings_manager
22-
from isaaclab.renderers import Renderer
22+
from isaaclab.renderers import BaseRenderer, Renderer
2323
from isaaclab.sim.views import XformPrimView
2424
from isaaclab.utils import has_kit, to_camel_case
2525
from isaaclab.utils.math import (
@@ -157,7 +157,7 @@ def __init__(self, cfg: CameraCfg):
157157
# Create empty variables for storing output data
158158
self._data = CameraData()
159159
# Renderer and render data — initialized in _initialize_impl
160-
self.renderer: Renderer | None = None
160+
self.renderer: BaseRenderer | None = None
161161
self.render_data = None
162162

163163
if not has_kit():
@@ -417,8 +417,7 @@ def _initialize_impl(self):
417417
self.renderer.prepare_stage(self.stage, self._num_envs)
418418

419419
# Create a view for the sensor with Fabric enabled for fast pose queries.
420-
# TODO: remove sync_usd_on_fabric_write=True once the GPU (cuda:0) Fabric sync bug in
421-
# renderer.update_transforms() is fixed. Without it, poses are stale on the GPU path.
420+
# TODO: remove sync_usd_on_fabric_write=True once the GPU Fabric sync bug is fixed.
422421
self._view = XformPrimView(
423422
self.cfg.prim_path, device=self._device, stage=self.stage, sync_usd_on_fabric_write=True
424423
)
@@ -446,6 +445,7 @@ def _initialize_impl(self):
446445

447446
# View needs to exist before creating render data
448447
self.render_data = self.renderer.create_render_data(self)
448+
self._renderer_info_populated = False
449449

450450
# Create internal buffers (includes intrinsic matrix and pose init)
451451
self._create_buffers()
@@ -468,12 +468,13 @@ def _update_buffers_impl(self, env_mask: wp.array):
468468
continue
469469
self.renderer.write_output(self.render_data, output_name, output_data)
470470

471-
# Broadcast renderer info (e.g. segmentation label mappings) to all per-camera entries
472-
renderer_info = getattr(self.render_data, "renderer_info", None)
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
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
477478

478479
"""
479480
Private Helpers

source/isaaclab/test/renderers/test_renderer_factory.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,9 @@ def render(self, render_data):
4949
def write_output(self, render_data, output_name, output_data):
5050
pass
5151

52+
def get_output_info(self, render_data):
53+
return None
54+
5255
def cleanup(self, render_data):
5356
pass
5457

source/isaaclab_newton/isaaclab_newton/renderers/newton_warp_renderer.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,11 @@ def render(self, render_data: RenderData):
223223
shape_index_image=render_data.outputs.instance_segmentation_image,
224224
)
225225

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+
226231
def write_output(self, render_data: RenderData, output_name: str, output_data: torch.Tensor):
227232
"""Copy a specific output to the given buffer.
228233
See :meth:`~isaaclab.renderers.base_renderer.BaseRenderer.write_output`."""

source/isaaclab_ov/isaaclab_ov/renderers/ovrtx_renderer.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -387,6 +387,11 @@ def update_camera(
387387
wp_transforms_view = wp.from_dlpack(attr_mapping.tensor, dtype=wp.mat44d)
388388
wp.copy(wp_transforms_view, camera_transforms)
389389

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+
390395
def write_output(
391396
self,
392397
render_data: OVRTXRenderData,

source/isaaclab_physx/isaaclab_physx/renderers/isaac_rtx_renderer.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import logging
1212
import math
1313
import weakref
14-
from dataclasses import dataclass
14+
from dataclasses import dataclass, field
1515
from typing import TYPE_CHECKING, Any
1616

1717
import numpy as np
@@ -60,7 +60,7 @@ class IsaacRtxRenderData:
6060
render_product_paths: list[str]
6161
output_data: dict[str, torch.Tensor] | None = None
6262
sensor: SensorBase | None = None
63-
renderer_info: dict[str, Any] | None = None
63+
renderer_info: dict[str, Any] = field(default_factory=dict)
6464

6565

6666
class IsaacRtxRenderer(BaseRenderer):
@@ -252,9 +252,6 @@ def tiling_grid_shape():
252252

253253
num_tiles_x = tiling_grid_shape()[0]
254254

255-
if render_data.renderer_info is None:
256-
render_data.renderer_info = {}
257-
258255
# Extract the flattened image buffer
259256
for data_type, annotator in render_data.annotators.items():
260257
# check whether returned data is a dict (used for segmentation)
@@ -329,6 +326,11 @@ def tiling_grid_shape():
329326
0.0 if cfg.depth_clipping_behavior == "zero" else cfg.spawn.clipping_range[1]
330327
)
331328

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+
332334
def write_output(self, render_data: IsaacRtxRenderData, output_name: str, output_data: torch.Tensor):
333335
"""No-op for Isaac RTX - all outputs written in render().
334336
See :meth:`~isaaclab.renderers.base_renderer.BaseRenderer.write_output`."""

0 commit comments

Comments
 (0)