|
30 | 30 |
|
31 | 31 | import isaaclab.sim as sim_utils |
32 | 32 | from isaaclab.sensors.camera import TiledCamera, TiledCameraCfg |
| 33 | +from isaaclab.scene import cloner |
| 34 | + |
| 35 | + |
| 36 | +def _replicate_group_origins(group_index: int, num_cameras: int) -> None: |
| 37 | + """Replicate `/World/Origin_{i}_0` subtree to `/World/Origin_{i}_{1..N-1}` with preserved translations.""" |
| 38 | + stage = prim_utils.get_current_stage() |
| 39 | + fmt = f"/World/Origin_{group_index}_{{}}" |
| 40 | + get_translate = ( |
| 41 | + lambda prim_path: stage.GetPrimAtPath(prim_path).GetAttribute("xformOp:translate").Get() |
| 42 | + ) # noqa: E731 |
| 43 | + positions = torch.tensor([get_translate(fmt.format(j)) for j in range(num_cameras)]) |
| 44 | + cloner.usd_replicate( |
| 45 | + stage=stage, |
| 46 | + sources=[fmt.format(0)], |
| 47 | + destinations=[fmt], |
| 48 | + env_ids=torch.arange(num_cameras), |
| 49 | + positions=positions, |
| 50 | + ) |
33 | 51 |
|
34 | 52 |
|
35 | 53 | @pytest.fixture() |
@@ -82,8 +100,10 @@ def test_multi_tiled_camera_init(setup_camera): |
82 | 100 |
|
83 | 101 | # Create camera |
84 | 102 | camera_cfg = copy.deepcopy(camera_cfg) |
85 | | - camera_cfg.prim_path = f"/World/Origin_{i}.*/CameraSensor" |
| 103 | + camera_cfg.prim_path = f"/World/Origin_{i}_.*/CameraSensor" |
86 | 104 | camera = TiledCamera(camera_cfg) |
| 105 | + # Ensure each origin in this group gets a camera |
| 106 | + _replicate_group_origins(i, num_cameras_per_tiled_camera) |
87 | 107 | tiled_cameras.append(camera) |
88 | 108 |
|
89 | 109 | # Check simulation parameter is set correctly |
@@ -178,8 +198,10 @@ def test_all_annotators_multi_tiled_camera(setup_camera): |
178 | 198 | # Create camera |
179 | 199 | camera_cfg = copy.deepcopy(camera_cfg) |
180 | 200 | camera_cfg.data_types = all_annotator_types |
181 | | - camera_cfg.prim_path = f"/World/Origin_{i}.*/CameraSensor" |
| 201 | + camera_cfg.prim_path = f"/World/Origin_{i}_.*/CameraSensor" |
182 | 202 | camera = TiledCamera(camera_cfg) |
| 203 | + # Ensure each origin in this group gets a camera |
| 204 | + _replicate_group_origins(i, num_cameras_per_tiled_camera) |
183 | 205 | tiled_cameras.append(camera) |
184 | 206 |
|
185 | 207 | # Check simulation parameter is set correctly |
@@ -278,9 +300,11 @@ def test_different_resolution_multi_tiled_camera(setup_camera): |
278 | 300 |
|
279 | 301 | # Create camera |
280 | 302 | camera_cfg = copy.deepcopy(camera_cfg) |
281 | | - camera_cfg.prim_path = f"/World/Origin_{i}.*/CameraSensor" |
| 303 | + camera_cfg.prim_path = f"/World/Origin_{i}_.*/CameraSensor" |
282 | 304 | camera_cfg.height, camera_cfg.width = resolutions[i] |
283 | 305 | camera = TiledCamera(camera_cfg) |
| 306 | + # Ensure each origin in this group gets a camera |
| 307 | + _replicate_group_origins(i, num_cameras_per_tiled_camera) |
284 | 308 | tiled_cameras.append(camera) |
285 | 309 |
|
286 | 310 | # Check simulation parameter is set correctly |
@@ -349,8 +373,10 @@ def test_frame_offset_multi_tiled_camera(setup_camera): |
349 | 373 |
|
350 | 374 | # Create camera |
351 | 375 | camera_cfg = copy.deepcopy(camera_cfg) |
352 | | - camera_cfg.prim_path = f"/World/Origin_{i}.*/CameraSensor" |
| 376 | + camera_cfg.prim_path = f"/World/Origin_{i}_.*/CameraSensor" |
353 | 377 | camera = TiledCamera(camera_cfg) |
| 378 | + # Ensure each origin in this group gets a camera |
| 379 | + _replicate_group_origins(i, num_cameras_per_tiled_camera) |
354 | 380 | tiled_cameras.append(camera) |
355 | 381 |
|
356 | 382 | # modify scene to be less stochastic |
@@ -417,9 +443,10 @@ def test_frame_different_poses_multi_tiled_camera(setup_camera): |
417 | 443 |
|
418 | 444 | # Create camera |
419 | 445 | camera_cfg = copy.deepcopy(camera_cfg) |
420 | | - camera_cfg.prim_path = f"/World/Origin_{i}.*/CameraSensor" |
| 446 | + camera_cfg.prim_path = f"/World/Origin_{i}_.*/CameraSensor" |
421 | 447 | camera_cfg.offset = TiledCameraCfg.OffsetCfg(pos=positions[i], rot=rotations[i], convention="ros") |
422 | 448 | camera = TiledCamera(camera_cfg) |
| 449 | + _replicate_group_origins(i, num_cameras_per_tiled_camera) |
423 | 450 | tiled_cameras.append(camera) |
424 | 451 |
|
425 | 452 | # Play sim |
|
0 commit comments