# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). # All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause """ Script to print all the available environments in Isaac Lab. The script iterates over all registered environments and stores the details in a table. It prints the name of the environment, the entry point and the config file. All the environments are registered in the `go2Demo` extension. They start with `Isaac` in their name. """ """Launch Isaac Sim Simulator first.""" import argparse import contextlib from isaaclab.app import AppLauncher # add argparse arguments parser = argparse.ArgumentParser(description="List Isaac Lab environments.") parser.add_argument("--keyword", type=str, default=None, help="Keyword to filter environments.") parser.add_argument( "--show_presets", action="store_true", default=False, help=( "Show available preset selectors for each environment. " "Presets are grouped by selector type: physics (physics=NAME), " "renderer (renderer=NAME), and domain (presets=NAME)." ), ) # parse the arguments args_cli = parser.parse_args() # launch omniverse app app_launcher = AppLauncher(headless=True) simulation_app = app_launcher.app """Rest everything follows.""" import gymnasium as gym from prettytable import PrettyTable import go2Demo.tasks # noqa: F401 # PLACEHOLDER: Extension template (do not remove this comment) with contextlib.suppress(ImportError): import go2Demo.tasks_experimental # noqa: F401 def _format_presets(preset_map: dict | None) -> str: """Format a preset map returned by :func:`enumerate_task_presets` into a human-readable string. Args: preset_map: Mapping of :class:`~go2Demo.utils.preset_target.PresetTarget` to sorted preset name lists, or ``None`` when the env cfg could not be loaded. Returns: A multi-line string with one line per non-empty selector category, or a short placeholder when no presets are available or the cfg failed to load. """ if preset_map is None: return "(unavailable)" from go2Demo.utils.preset_target import PresetTarget lines = [] labels = { PresetTarget.PHYSICS: "physics", PresetTarget.RENDERER: "renderer", PresetTarget.DOMAIN: "domain", } for target, label in labels.items(): names = preset_map.get(target, []) if names: lines.append(f"{label}: {', '.join(names)}") return "\n".join(lines) if lines else "(none)" def main(): """Print all environments registered in `go2Demo` extension.""" # Collect matching task specs first so we can enumerate presets in one pass. task_specs = [ spec for spec in gym.registry.values() if "Template-" in spec.id and (args_cli.keyword is None or args_cli.keyword in spec.id) ] if args_cli.show_presets: from go2Demo.utils.preset_cli import enumerate_task_presets table = PrettyTable(["S. No.", "Task Name", "Entry Point", "Config", "Presets"]) table.title = "Available Environments in Isaac Lab" table.align["Task Name"] = "l" table.align["Entry Point"] = "l" table.align["Config"] = "l" table.align["Presets"] = "l" for index, spec in enumerate(task_specs): preset_map = enumerate_task_presets(spec.id) table.add_row( [ index + 1, spec.id, spec.entry_point, spec.kwargs["env_cfg_entry_point"], _format_presets(preset_map), ] ) else: table = PrettyTable(["S. No.", "Task Name", "Entry Point", "Config"]) table.title = "Available Environments in Isaac Lab" table.align["Task Name"] = "l" table.align["Entry Point"] = "l" table.align["Config"] = "l" for index, spec in enumerate(task_specs): table.add_row([index + 1, spec.id, spec.entry_point, spec.kwargs["env_cfg_entry_point"]]) print(table) if __name__ == "__main__": try: # run the main function main() except Exception as e: raise e finally: # close the app simulation_app.close()