Skip to content

Commit 4374644

Browse files
committed
Move per-output loop from Camera into renderer and fix docs
1 parent 06a7fcc commit 4374644

7 files changed

Lines changed: 30 additions & 39 deletions

File tree

docs/source/how-to/save_camera_output.rst

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,18 +32,11 @@ images in a numpy format. For more information on the basic writer, please check
3232

3333
While stepping the simulator, the images can be saved to the defined folder. Since the BasicWriter only supports
3434
saving data using NumPy format, we first need to convert the PyTorch sensors to NumPy arrays before packing
35-
them in a dictionary.
35+
them in a dictionary and writing with the BasicWriter.
3636

3737
.. literalinclude:: ../../../scripts/tutorials/04_sensors/run_usd_camera.py
3838
:language: python
3939
:start-at: # Save images from camera at camera_index
40-
:end-at: single_cam_info = camera.data.info[camera_index]
41-
42-
After this step, we can save the images using the BasicWriter.
43-
44-
.. literalinclude:: ../../../scripts/tutorials/04_sensors/run_usd_camera.py
45-
:language: python
46-
:start-at: # Pack data back into replicator format to save them using its writer
4740
:end-at: rep_writer.write(rep_output)
4841

4942

source/isaaclab/isaaclab/renderers/base_renderer.py

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import torch
1515

1616
from isaaclab.sensors import SensorBase
17+
from isaaclab.sensors.camera.camera_data import CameraData
1718

1819

1920
class BaseRenderer(ABC):
@@ -93,16 +94,11 @@ def render(self, render_data: Any) -> None:
9394
pass
9495

9596
@abstractmethod
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.
98-
99-
Implementations should populate ``camera_data.output[output_name]`` with
100-
rendered data and, when available, ``camera_data.info[output_name]`` with
101-
annotator metadata (e.g. ``idToLabels`` for segmentation types).
97+
def read_output(self, render_data: Any, camera_data: CameraData) -> None:
98+
"""Read rendered outputs from the renderer into the camera data container.
10299
103100
Args:
104101
render_data: The render data object from :meth:`create_render_data`.
105-
output_name: Name of the output (e.g. ``"rgba"``, ``"depth"``).
106102
camera_data: The :class:`~isaaclab.sensors.camera.camera_data.CameraData`
107103
instance to populate.
108104
"""

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

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -462,10 +462,7 @@ def _update_buffers_impl(self, env_mask: wp.array):
462462
self._renderer.update_transforms()
463463
self._renderer.render(self._render_data)
464464

465-
for output_name in self._data.output:
466-
if output_name == "rgb":
467-
continue
468-
self._renderer.read_output(self._render_data, output_name, self._data)
465+
self._renderer.read_output(self._render_data, self._data)
469466

470467
"""
471468
Private Helpers

source/isaaclab/test/renderers/test_renderer_factory.py

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

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

5252
def cleanup(self, render_data):

source/isaaclab_newton/isaaclab_newton/renderers/newton_warp_renderer.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -224,14 +224,17 @@ def render(self, render_data: RenderData):
224224
shape_index_image=render_data.outputs.instance_segmentation_image,
225225
)
226226

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.
227+
def read_output(self, render_data: RenderData, camera_data: CameraData) -> None:
228+
"""Copy rendered outputs to the camera data buffers.
229229
See :meth:`~isaaclab.renderers.base_renderer.BaseRenderer.read_output`."""
230-
image_data = render_data.get_output(output_name)
231-
if image_data is not None:
232-
output_data = camera_data.output[output_name]
233-
if image_data.ptr != output_data.data_ptr():
234-
wp.copy(wp.from_torch(output_data), image_data)
230+
for output_name in camera_data.output:
231+
if output_name == "rgb":
232+
continue
233+
image_data = render_data.get_output(output_name)
234+
if image_data is not None:
235+
output_data = camera_data.output[output_name]
236+
if image_data.ptr != output_data.data_ptr():
237+
wp.copy(wp.from_torch(output_data), image_data)
235238

236239
def cleanup(self, render_data: RenderData | None):
237240
"""Release resources. No-op for Newton Warp.

source/isaaclab_ov/isaaclab_ov/renderers/ovrtx_renderer.py

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -391,16 +391,18 @@ def update_camera(
391391
def read_output(
392392
self,
393393
render_data: OVRTXRenderData,
394-
output_name: str,
395394
camera_data: CameraData,
396395
) -> None:
397-
"""Copy from render_data warp buffer to camera data output tensor."""
398-
if output_name not in render_data.warp_buffers:
399-
return
400-
src = render_data.warp_buffers[output_name]
401-
output_data = camera_data.output[output_name]
402-
if src.ptr != output_data.data_ptr():
403-
wp.copy(dest=wp.from_torch(output_data), src=src)
396+
"""Copy from render_data warp buffers to camera data output tensors."""
397+
for output_name in camera_data.output:
398+
if output_name == "rgb":
399+
continue
400+
src = render_data.warp_buffers.get(output_name)
401+
if src is None:
402+
continue
403+
output_data = camera_data.output[output_name]
404+
if src.ptr != output_data.data_ptr():
405+
wp.copy(dest=wp.from_torch(output_data), src=src)
404406

405407
def _generate_random_colors_from_ids(self, input_ids: wp.array) -> wp.array:
406408
"""Generate pseudo-random colors from semantic IDs."""

source/isaaclab_physx/isaaclab_physx/renderers/isaac_rtx_renderer.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -327,12 +327,12 @@ def tiling_grid_shape():
327327
0.0 if cfg.depth_clipping_behavior == "zero" else cfg.spawn.clipping_range[1]
328328
)
329329

330-
def read_output(self, render_data: IsaacRtxRenderData, output_name: str, camera_data: CameraData) -> None:
330+
def read_output(self, render_data: IsaacRtxRenderData, camera_data: CameraData) -> None:
331331
"""Populate per-output metadata collected during render(). Pixel data already written in render().
332332
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-
camera_data.info[output_name] = info
333+
for output_name, info in render_data.renderer_info.items():
334+
if info is not None:
335+
camera_data.info[output_name] = info
336336

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

0 commit comments

Comments
 (0)