136 lines
4.3 KiB
Python
136 lines
4.3 KiB
Python
# 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()
|