Skip to content

Commit 06a7fcc

Browse files
committed
Change CameraData.info from list[dict] to flat dict[str, Any] to match Replicator annotator output
1 parent 724f5d4 commit 06a7fcc

12 files changed

Lines changed: 27 additions & 29 deletions

File tree

scripts/tutorials/04_sensors/run_ray_caster_camera.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -132,12 +132,10 @@ def run_simulator(sim: sim_utils.SimulationContext, scene_entities: dict):
132132
single_cam_data = convert_dict_to_backend(
133133
{k: v[camera_index] for k, v in camera.data.output.items()}, backend="numpy"
134134
)
135-
# Extract the other information
136-
single_cam_info = camera.data.info[camera_index]
137-
138135
# Pack data back into replicator format to save them using its writer
139136
rep_output = {"annotators": {}}
140-
for key, data, info in zip(single_cam_data.keys(), single_cam_data.values(), single_cam_info.values()):
137+
for key, data in single_cam_data.items():
138+
info = camera.data.info.get(key)
141139
if info is not None:
142140
rep_output["annotators"][key] = {"render_product": {"data": data, **info}}
143141
else:

scripts/tutorials/04_sensors/run_usd_camera.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -232,12 +232,10 @@ def run_simulator(sim: sim_utils.SimulationContext, scene_entities: dict):
232232
{k: v[camera_index] for k, v in camera.data.output.items()}, backend="numpy"
233233
)
234234

235-
# Extract the other information
236-
single_cam_info = camera.data.info[camera_index]
237-
238235
# Pack data back into replicator format to save them using its writer
239236
rep_output = {"annotators": {}}
240-
for key, data, info in zip(single_cam_data.keys(), single_cam_data.values(), single_cam_info.values()):
237+
for key, data in single_cam_data.items():
238+
info = camera.data.info.get(key)
241239
if info is not None:
242240
rep_output["annotators"][key] = {"render_product": {"data": data, **info}}
243241
else:

source/isaaclab/docs/CHANGELOG.rst

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,13 @@ Changed
1111
into a single implementation. :class:`Camera` now delegates all rendering to the
1212
:class:`~isaaclab.renderers.Renderer` abstraction (same approach :class:`TiledCamera` used).
1313
The public API is unchanged for :class:`Camera` users.
14-
* **Breaking (TiledCamera users):** :attr:`~isaaclab.sensors.camera.CameraData.info` now correctly
15-
returns ``list[dict[str, Any]]`` (per-camera, then per-data-type) as documented in
16-
:class:`~isaaclab.sensors.camera.CameraData`. :class:`TiledCamera` previously returned a flat
17-
``dict``, which violated the documented contract. Migration: replace
18-
``camera.data.info[data_type]`` with ``camera.data.info[cam_idx][data_type]``.
14+
* **Breaking:** :attr:`~isaaclab.sensors.camera.CameraData.info` is now a flat
15+
``dict[str, Any]`` keyed by data type (e.g. ``camera.data.info["semantic_segmentation"]``).
16+
The metadata is shared across all cameras and identical to what the underlying renderer returns.
17+
18+
- **Camera users (old):** replace ``camera.data.info[cam_idx][data_type]`` with
19+
``camera.data.info[data_type]``.
20+
- **TiledCamera users (old):** access pattern ``camera.data.info[data_type]`` is unchanged.
1921

2022
Deprecated
2123
^^^^^^^^^^

source/isaaclab/isaaclab/renderers/base_renderer.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,8 @@ def read_output(self, render_data: Any, output_name: str, camera_data: Any) -> N
9797
"""Read a named output from the renderer into the camera data container.
9898
9999
Implementations should populate ``camera_data.output[output_name]`` with
100-
rendered data and, when available, other metadata (ex. ``camera_data.info``).
100+
rendered data and, when available, ``camera_data.info[output_name]`` with
101+
annotator metadata (e.g. ``idToLabels`` for segmentation types).
101102
102103
Args:
103104
render_data: The render data object from :meth:`create_render_data`.

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -567,7 +567,7 @@ def _create_buffers(self):
567567
).contiguous()
568568

569569
self._data.output = data_dict
570-
self._data.info = [{name: None for name in self.cfg.data_types} for _ in range(self._view.count)]
570+
self._data.info = {name: None for name in self.cfg.data_types}
571571
self._renderer.set_outputs(self._render_data, self._data.output)
572572

573573
def _update_intrinsic_matrices(self, env_ids: Sequence[int]):

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ class CameraData:
5959
.. _Replicator Documentation: https://docs.omniverse.nvidia.com/prod_extensions/prod_extensions/ext_replicator/annotators_details.html#annotator-output
6060
"""
6161

62-
info: list[dict[str, Any]] = None
62+
info: dict[str, Any] = None
6363
"""The retrieved sensor info with sensor types as key.
6464
6565
This contains extra information provided by the sensor such as semantic segmentation label mapping, prim paths.

source/isaaclab/isaaclab/sensors/ray_caster/ray_caster_camera.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -376,7 +376,7 @@ def _create_buffers(self):
376376
# -- output data
377377
# create the buffers to store the annotator data.
378378
self._data.output = {}
379-
self._data.info = [{name: None for name in self.cfg.data_types}] * self._view.count
379+
self._data.info = {name: None for name in self.cfg.data_types}
380380
for name in self.cfg.data_types:
381381
if name in ["distance_to_image_plane", "distance_to_camera"]:
382382
shape = (self.cfg.pattern_cfg.height, self.cfg.pattern_cfg.width, 1)

source/isaaclab/test/sensors/test_camera.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ def test_camera_init(setup_sim_camera):
109109
assert camera.data.quat_w_opengl.shape == (1, 4)
110110
assert camera.data.intrinsic_matrices.shape == (1, 3, 3)
111111
assert camera.data.image_shape == (camera_cfg.height, camera_cfg.width)
112-
assert camera.data.info == [{camera_cfg.data_types[0]: None}]
112+
assert camera.data.info == {camera_cfg.data_types[0]: None}
113113

114114
# Simulate physics
115115
for _ in range(10):
@@ -939,9 +939,9 @@ def test_camera_all_annotators(setup_camera_device, device):
939939
assert output["semantic_segmentation"].dtype == torch.uint8
940940
assert output["instance_segmentation_fast"].dtype == torch.uint8
941941
assert output["instance_id_segmentation_fast"].dtype == torch.uint8
942-
assert isinstance(info[0]["semantic_segmentation"], dict)
943-
assert isinstance(info[0]["instance_segmentation_fast"], dict)
944-
assert isinstance(info[0]["instance_id_segmentation_fast"], dict)
942+
assert isinstance(info["semantic_segmentation"], dict)
943+
assert isinstance(info["instance_segmentation_fast"], dict)
944+
assert isinstance(info["instance_id_segmentation_fast"], dict)
945945

946946
del camera
947947

@@ -972,7 +972,7 @@ def test_camera_segmentation_non_colorize(setup_camera_device, device):
972972
for seg_type in camera_cfg.data_types:
973973
assert camera.data.output[seg_type].shape == (num_cameras, camera_cfg.height, camera_cfg.width, 1)
974974
assert camera.data.output[seg_type].dtype == torch.int32
975-
assert isinstance(camera.data.info[0][seg_type], dict)
975+
assert isinstance(camera.data.info[seg_type], dict)
976976

977977
del camera
978978

source/isaaclab/test/sensors/test_multi_mesh_ray_caster_camera.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ def test_camera_init(setup_simulation):
138138
assert camera.data.quat_w_opengl.shape == (1, 4)
139139
assert camera.data.intrinsic_matrices.shape == (1, 3, 3)
140140
assert camera.data.image_shape == (camera_cfg.pattern_cfg.height, camera_cfg.pattern_cfg.width)
141-
assert camera.data.info == [{camera_cfg.data_types[0]: None}]
141+
assert camera.data.info == {camera_cfg.data_types[0]: None}
142142
# Simulate physics
143143
for _ in range(10):
144144
# perform rendering

source/isaaclab/test/sensors/test_multi_tiled_camera.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -245,9 +245,9 @@ def test_all_annotators_multi_tiled_camera(setup_camera):
245245
assert output["semantic_segmentation"].dtype == torch.uint8
246246
assert output["instance_segmentation_fast"].dtype == torch.uint8
247247
assert output["instance_id_segmentation_fast"].dtype == torch.uint8
248-
assert isinstance(info[0]["semantic_segmentation"], dict)
249-
assert isinstance(info[0]["instance_segmentation_fast"], dict)
250-
assert isinstance(info[0]["instance_id_segmentation_fast"], dict)
248+
assert isinstance(info["semantic_segmentation"], dict)
249+
assert isinstance(info["instance_segmentation_fast"], dict)
250+
assert isinstance(info["instance_id_segmentation_fast"], dict)
251251

252252
for camera in tiled_cameras:
253253
del camera

0 commit comments

Comments
 (0)