|
| 1 | +# Copyright (c) 2022-2024, The ORBIT Project Developers. |
| 2 | +# All rights reserved. |
| 3 | +# |
| 4 | +# SPDX-License-Identifier: BSD-3-Clause |
| 5 | + |
| 6 | +from __future__ import annotations |
| 7 | + |
| 8 | +"""Launch Isaac Sim Simulator first.""" |
| 9 | + |
| 10 | +from omni.isaac.orbit.app import AppLauncher |
| 11 | + |
| 12 | +# launch omniverse app |
| 13 | +app_launcher = AppLauncher(headless=True) |
| 14 | +simulation_app = app_launcher.app |
| 15 | + |
| 16 | +"""Rest everything follows.""" |
| 17 | + |
| 18 | +import torch |
| 19 | +import unittest |
| 20 | + |
| 21 | +import omni.isaac.core.utils.prims as prim_utils |
| 22 | +from omni.isaac.cloner import GridCloner |
| 23 | + |
| 24 | +import omni.isaac.orbit.sim as sim_utils |
| 25 | +from omni.isaac.orbit.terrains import TerrainImporter, TerrainImporterCfg |
| 26 | + |
| 27 | + |
| 28 | +class TestTerrainImporter(unittest.TestCase): |
| 29 | + """Test the terrain importer for different ground and procedural terrains.""" |
| 30 | + |
| 31 | + def test_grid_clone_env_origins(self): |
| 32 | + """Tests that env origins are consistent when computed using the TerrainImporter and IsaacSim GridCloner.""" |
| 33 | + # iterate over different number of environments and environment spacing |
| 34 | + for env_spacing in [1.0, 4.325, 8.0]: |
| 35 | + for num_envs in [1, 4, 125, 379, 1024]: |
| 36 | + with self.subTest(num_envs=num_envs, env_spacing=env_spacing): |
| 37 | + with sim_utils.build_simulation_context(auto_add_lighting=True) as sim: |
| 38 | + # create terrain importer |
| 39 | + terrain_importer_cfg = TerrainImporterCfg( |
| 40 | + num_envs=num_envs, |
| 41 | + env_spacing=env_spacing, |
| 42 | + prim_path="/World/ground", |
| 43 | + terrain_type="plane", # for flat ground, origins are in grid |
| 44 | + terrain_generator=None, |
| 45 | + ) |
| 46 | + terrain_importer = TerrainImporter(terrain_importer_cfg) |
| 47 | + # obtain env origins using terrain importer |
| 48 | + terrain_importer_origins = terrain_importer.env_origins |
| 49 | + |
| 50 | + # obtain env origins using grid cloner |
| 51 | + grid_cloner_origins = self.obtain_grid_cloner_env_origins( |
| 52 | + num_envs, env_spacing, device=sim.device |
| 53 | + ) |
| 54 | + |
| 55 | + # check if the env origins are the same |
| 56 | + torch.testing.assert_close(terrain_importer_origins, grid_cloner_origins, rtol=1e-5, atol=1e-5) |
| 57 | + |
| 58 | + """ |
| 59 | + Helper functions. |
| 60 | + """ |
| 61 | + |
| 62 | + @staticmethod |
| 63 | + def obtain_grid_cloner_env_origins(num_envs: int, env_spacing: float, device: str) -> torch.Tensor: |
| 64 | + """Obtain the env origins generated by IsaacSim GridCloner (grid_cloner.py).""" |
| 65 | + # create grid cloner |
| 66 | + cloner = GridCloner(spacing=env_spacing) |
| 67 | + cloner.define_base_env("/World/envs") |
| 68 | + envs_prim_paths = cloner.generate_paths("/World/envs/env", num_paths=num_envs) |
| 69 | + prim_utils.define_prim("/World/envs/env_0") |
| 70 | + # clone envs using grid cloner |
| 71 | + env_origins = cloner.clone( |
| 72 | + source_prim_path="/World/envs/env_0", prim_paths=envs_prim_paths, replicate_physics=True |
| 73 | + ) |
| 74 | + # return as tensor |
| 75 | + return torch.tensor(env_origins, dtype=torch.float32, device=device) |
| 76 | + |
| 77 | + |
| 78 | +if __name__ == "__main__": |
| 79 | + # run main |
| 80 | + runner = unittest.main(verbosity=2, exit=False) |
| 81 | + # close sim app |
| 82 | + simulation_app.close() |
| 83 | + # report success |
| 84 | + exit(not runner.result.wasSuccessful()) |
0 commit comments