Repository navigation
[Core] Inline launch-stack helpers that only restate or forward - #8111
Conversation
launch_simulation and scan turn launcher args into a dict once, so the Namespace/dict accessors and the separate logging-level resolver go away. The livestream mode and Kit-visualizer intent are resolved once, one-line predicates are inlined, and SettingsManager keeps one accessor and one setter. fuse_kit_args moves to a lightweight isaaclab.app.argv module, so dispatchers import it directly. KitLauncher inlines single-use helpers, merges the toolbar button helpers, and names its argument hook add_launcher_args.
|
run-ci |
|
| if self._deferred_cuda_device_id is not None: | ||
| set_cuda_device(self._deferred_cuda_device_id) |
There was a problem hiding this comment.
Deferred CUDA check removed The post-Kit call to
set_cuda_device is still needed, but the test that checked this step was deleted. The remaining CUDA tests cover only initialization before Kit starts. Please keep an assertion that the deferred device reaches set_cuda_device, so a startup regression does not go unnoticed.
There was a problem hiding this comment.
The deferred CUDA device step now runs inline in KitLauncher.__init__ right after Kit starts, so it can't be unit-tested without Kit. It's exercised by every Kit-backed test and training run on a CUDA device, e.g. the Isaac Sim PhysX Cartpole run in this PR's validation.
There was a problem hiding this comment.
That’s fair. Since the call is now deliberately part of the Kit-only startup sequence, a unit test would require mocking the boundary it is intended to exercise, while the Kit-backed CUDA runs cover the real ordering and device setup. I’ll withdraw the assertion request; deleting the helper-specific test is reasonable for this cleanup.
|
|
||
| def _hide_stop_button(self): | ||
| """Hide the stop button in the toolbar. | ||
| def _set_toolbar_button_visible(self, button_name: str, visible: bool): |
There was a problem hiding this comment.
Toolbar behavior lacks coverage This merged helper now hides and detaches the stop button and changes the play button when the timeline stops or plays, but no test exercises it. A test using a fake toolbar could protect those GUI behaviors without needing a GUI session.
Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!
There was a problem hiding this comment.
Added in 012d277: two unit tests with a fake omni.kit.widget.toolbar module check that the play button toggles, that the stop button is hidden and detached, and that a headless run without livestream never imports the toolbar.
There was a problem hiding this comment.
Isaac Lab Review Bot
The helper cleanup and relocation are coherent, but the PR removes or renames several public launch and settings APIs in a single release, contrary to the repository’s required deprecation policy.
- Design and architecture: The consolidation around a write-through launcher-argument dict and the relocation of
fuse_kit_argsto a lightweight module are internally consistent. The blocking concern is compatibility architecture: existing public entry points are removed rather than retained as temporary forwarding shims. - API:
SettingsManager.instance, the typedSettingsManager.set_*methods,isaaclab.app.make_physics_cfg,logging_utils.resolve_python_logging_level, the formersim_launcher.fuse_kit_argsimport path, andKitLauncher.add_app_launcher_argsare removed or renamed without prior deprecation. Changelog migration guidance does not satisfy the trusted requirement for a deprecation period; deprecated forwarding aliases should remain for one release. - Implementation: The new implementations and migrated in-repository callers use the replacement APIs consistently, but unchanged external consumers will receive import or attribute failures. Retaining thin warning-emitting forwarders for the removed functions and the renamed
KitLaunchermethod would preserve compatibility while allowing internal code to use the new interfaces.
Significant concerns. Posted 2 actionable findings inline.
Automated review; human maintainers own approval decisions.
| Removed | ||
| ^^^^^^^ | ||
|
|
||
| * **Breaking:** Removed ``SettingsManager.instance()``. Use :func:`~isaaclab.app.get_settings_manager`. |
There was a problem hiding this comment.
🟡 Warning · Api — Public symbols removed without deprecation window
SettingsManager.instance, the typed set_bool/set_int/set_float/set_string setters, isaaclab.app.make_physics_cfg, and logging_utils.resolve_python_logging_level are deleted outright, and sim_launcher.fuse_kit_args loses its old import path. Repository rules require a prior deprecation and migration path before removing a public API. Keep thin forwarders that emit DeprecationWarning for one release, then delete.
There was a problem hiding this comment.
Intentional, per the maintainer's policy for this refactor series: APIs outside public config and MDP terms are removed without a deprecation window, and each removal is listed as Breaking with its replacement in the changelog.
|
|
||
| @staticmethod | ||
| def add_app_launcher_args(parser: argparse.ArgumentParser) -> None: | ||
| def add_launcher_args(parser: argparse.ArgumentParser) -> None: |
There was a problem hiding this comment.
🟡 Warning · Api — KitLauncher method renamed without alias
Renaming the public KitLauncher.add_app_launcher_args to add_launcher_args makes existing callers that configure a parser through KitLauncher fail with AttributeError on upgrade. The changelog migration note does not substitute for the required deprecation period. Retain add_app_launcher_args as a deprecated forwarding static method for one release while internal callers use the new name.
There was a problem hiding this comment.
Same as above: KitLauncher is constructed only by launch_simulation, and the rename is listed as Breaking with its migration in the changelog.
Importing sim_launcher takes about a second (it loads the backend configs), so the benchmark dispatcher keeps its lazy-import wrapper and no new module is needed.
|
run-ci |
StafaH
left a comment
There was a problem hiding this comment.
Substantial amount of parser resolution happening, but I guess its outside of scope of this PR to figure out how we can simplify
| if renderer_cfg is None: | ||
| return True | ||
| if _is_auto_rtx_renderer(renderer_cfg): | ||
| if getattr(renderer_cfg, "renderer_type", None) == "auto_rtx": |
There was a problem hiding this comment.
let's avoid getattr if possible
There was a problem hiding this comment.
Done in 012d277. _is_kit_camera reads node.renderer_cfg directly (the node is already a CameraCfg) and checks isinstance(renderer_cfg, RendererCfg) before reading renderer_type, so no getattr.
|
|
||
| def _set_arg(launcher_args: argparse.Namespace | dict | None, key: str, value: Any) -> None: | ||
| """Write *key* on launcher args when it is a namespace or dict.""" | ||
| def _as_dict(launcher_args: argparse.Namespace | dict | None) -> dict: |
There was a problem hiding this comment.
shuold we just inline this wherever its used?
There was a problem hiding this comment.
Yes. It had two call sites (scan and launch_simulation), so it's inlined at both and the helper is gone (012d277).
| if args.get("visualizer_explicit", False): | ||
| has_kit_visualizer = "kit" in (args.get("visualizer") or ()) | ||
| else: | ||
| has_kit_visualizer = bool(kit_cfgs) or bool(caller_intent.get("has_kit_visualizer")) |
There was a problem hiding this comment.
Why is this written so weirdly, so many different branches here
There was a problem hiding this comment.
Agreed, rewritten in 012d277. The branching existed only to dig visualizer configs out of either cfg.sim.visualizer_cfgs or cfg.visualizer_cfgs. scan() already walks the whole config tree, so it now collects every VisualizerCfg it meets, and the intent is computed from that list: the explicit --viz selection decides if given, otherwise any Kit visualizer config or the caller's intent. As a side fix, a newton_rtx visualizer inside a visualizer_cfgs list is now detected too.
| def visit(node, parent, key): | ||
| nonlocal effective_cfg, has_ovrtx, has_auto_rtx, has_auto_physx, has_kit_camera | ||
| if _is_auto_rtx_renderer(node): | ||
| if getattr(node, "renderer_type", None) == "auto_rtx": |
There was a problem hiding this comment.
Not anymore (012d277). The auto_rtx/OVRTX checks are isinstance(node, RendererCfg) and node.renderer_type == ..., and launcher_type is now declared (default None) on the base PhysicsCfg and RendererCfg, so it's read as a plain attribute. The only getattr left is getattr(cfg, "sim", None), where the input really can be an env cfg, a SimulationCfg, a physics cfg, or None.
|
|
||
|
|
||
| class ExplicitAction(argparse.Action): | ||
| class _ExplicitAction(argparse.Action): |
There was a problem hiding this comment.
This function does not look good at all, it is just 2 setattr, what's going on inside?
There was a problem hiding this comment.
It recorded <dest>_explicit = True so launch code could tell a passed value from the default. For --viz that's gone in 012d277: --viz none now parses to [], so "passed" is visualizer is not None and "disable all" is visualizer == [], and the visualizer_explicit/visualizer_disable_all keys are removed. --device still needs it: its default must stay the string "cuda:0" (about 30 scripts pass args_cli.device into SimulationCfg before launch), and XR switches to CPU only when --device wasn't passed. It's renamed _StoreAndMarkExplicit with a docstring saying exactly that.
| "--viz", | ||
| type=_parse_visualizer_csv, | ||
| action=ExplicitAction, | ||
| action=_ExplicitAction, |
There was a problem hiding this comment.
inline the expected action as lambda
There was a problem hiding this comment.
argparse's action= has to be an Action subclass (or a builtin action name); a lambda isn't accepted there. So instead I removed the need for it on --viz (see the reply above), and --device keeps the small named action.
- _is_kit_camera and scan read typed attributes behind isinstance checks instead of probing with getattr; launcher_type is declared on the base physics and renderer configs. - scan collects visualizer configs during its tree walk, so the visualizer intent no longer digs through env and sim config shapes. - Inline the launcher-args conversion at its two call sites. - --viz none parses to an empty list, so "passed" is visualizer is not None and "disable all" is visualizer == []; the --viz explicit-flag action and the visualizer_explicit/visualizer_disable_all keys are gone. --device keeps a small action because its default must stay a string and XR needs to know whether it was passed. - Add unit tests for the toolbar button helper.
|
run-ci |
|
Backported to |
## Description A follow-up to #8068, #8090, and #8102: it inlines or removes launch-stack helpers whose names cost the reader more than their bodies do. This PR is pure cleanup with no behavior change; every public removal is listed below with its replacement. ### Launcher (`isaaclab.app.sim_launcher`) - **Arguments become a dict once.** `launch_simulation` and `scan` convert launcher args with `vars(args_cli)`, the namespace's live `__dict__`, so values resolved at launch (for example `args_cli.headless`) still reach the caller. That removes `_get_arg` / `_set_arg` and their three-way Namespace/dict/None branching on every read. - **Resolved once instead of twice:** - the livestream mode is resolved during argument normalization and read back afterwards; - the "explicit `--viz` overrides the config" rule for the Kit visualizer is part of the scan's visualizer intent. - **Inlined:** the logging-level resolver (now private here), the one-line `_is_*` config predicates, and the Kit-source list formatter. - **`make_physics_cfg` is private** (`_make_physics_cfg`); only `scan` used it. ### Settings (`isaaclab.app.settings_manager`) - **One accessor:** `SettingsManager.instance()` is removed. It was identical to `get_settings_manager()`. - **One setter:** `set_bool` / `set_int` / `set_float` / `set_string` are removed. They only called `set()`, which already dispatches on the value's type. Only calls on Isaac Lab's settings manager changed; calls on carb's settings interface are untouched. ### Kit launcher (`isaaclab_physx.app.KitLauncher`) - **Inlined:** three single-use helpers (spectator-view check, experience dependency check, deferred CUDA device). - **Merged:** the stop-button and play-button toolbar helpers become one `_set_toolbar_button_visible`, with each button's current behavior kept. - **Renamed:** `add_app_launcher_args` → `add_launcher_args`, and `ExplicitAction` → `_ExplicitAction` (internal). Net: +239 / −405 (about −165 lines). ## Type of change - Breaking change (removed `SettingsManager.instance`, the typed `SettingsManager.set_*` forwarders, and `isaaclab.app.make_physics_cfg`; renamed `KitLauncher.add_app_launcher_args`) ## Validation All runs on GPU 0. - **Launcher and runtime tests:** - Kit launcher (84), visualizer intent (8), distributed device resolution (11), runtime compatibility (27), `require_kit` (10); - preset Kit decision (6), preset CLI (11), RL entrypoints (44), CLI tests (234); - app tests, including the `AppLauncher` shim, exit status, and Kit startup; - simulation context (26), Isaac RTX renderer contract (26), and the changed contact-sensor and OvPhysX scene-data tests. - **`test_simulation_context_visualizers`:** 44 passed, 1 failed. The failing test needs `carb`, which only CI's image has, and it fails identically on develop. - **Training:** Cartpole runs 2 iterations with `isaacsim_physx` (Kit starts) and with `newton_mjwarp` (no Kit). - **Tutorial:** `create_empty.py` reaches setup and runs. - **Not run:** the toolbar-button and livestream `isaacsim.exp.full` paths need a GUI or a livestream. - **Removed test:** `test_deferred_cuda_device_synchronizes_torch_and_warp`. Its helper is now inlined into Kit-only startup code. ## Release backport - [x] <!-- backport-active-release --> Backport this pull request to the active release branch after it merges into `develop` ## Checklist - [x] I have read and understood the contribution guidelines - [x] I have run the pre-commit checks - [x] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [x] I have added changelog fragments for every touched package (cherry picked from commit 24e1b46)
## Description Follows #8111 (merged). This is the first step toward launch and preset consistency: one mechanism per decision. This PR removes parallel mechanisms that nothing needs. Follow-ups will make `launch_simulation` the single place visualizers and the device are decided, and replace `--physics` with `physics=` presets. ### Changes - **One preset-override parser.** `hydra_task_config` (no callers) is removed, and its callback indirection is folded into `resolve_task_config`. So is the second override parser (`parse_overrides` / `apply_overrides`). - `test_hydra.py` and the rendering test helper now go through `register_task` / `resolve_task_config`, the production parser, instead of a different one. - Five parser-only tests are dropped. One of them tested behavior production never had. - **`--viz` parsed once.** `_parse_visualizer_csv` accepts the argparse-parsed list, so `_normalize_launcher_args` no longer joins it back into a string and parses it again. Invalid values still fail at argparse time. - **One visualizer type table** (with the deprecated `newton` → `newton_gl` alias) lives in `isaaclab.visualizers.visualizer_cfg`. `SimulationContext` consumes canonical names instead of remapping aliases itself; the two tables disagreed about `none`. - **`SimulationContext` setup:** - `SettingsHelper` is removed, since `SettingsManager.set` already dispatches on the value type; - `get_physics_dt()` returns `cfg.dt`, and a `getattr(cfg.physics, "dt")` that never matched is dropped; - `initialize_visualizers(config_filter=None)` replaces a public/private forwarder pair; - the visualizer config list is normalized once instead of three times; - `build_simulation_context` reads `sim.has_gui`; - `use_stage` drops its Isaac Sim < 5 branch (the repo pins 6.1). Net: +209 / −500. ## Type of change - Breaking change (removed `hydra_task_config`, `parse_overrides`, `apply_overrides`, and `SettingsHelper`; `initialize_visualizers` gained `config_filter`) ## Validation All runs on GPU 0. - **Tests:** - `isaaclab/test/app` (27) and `isaaclab_physx/test/app` (90); - hydra (67), preset CLI (11), preset Kit decision (6), runtime compatibility (27), visualizer intent (8), distributed device (11), agent preset composition (13); - simulation context (26), stage utils (15), headless `build_simulation_context` (7), RL entrypoints (44 + 27). - **Training:** Cartpole with `physics=isaacsim_physx` and `physics=newton_mjwarp` runs 2 iterations, and the run summary names each backend correctly. - **Pre-existing failures on this machine, identical on the base branch:** one visualizer test that needs `carb`, and 8 golden-image diffs in `test_rendering_cartpole_kitless`. ## Release backport - [x] <!-- backport-active-release --> Backport this pull request to the active release branch after it merges into `develop` ## Checklist - [x] I have read and understood the contribution guidelines - [x] I have run the pre-commit checks - [x] My changes generate no new warnings - [x] I have added changelog fragments for every touched package
## Description Follows #8111 (merged). This is the first step toward launch and preset consistency: one mechanism per decision. This PR removes parallel mechanisms that nothing needs. Follow-ups will make `launch_simulation` the single place visualizers and the device are decided, and replace `--physics` with `physics=` presets. ### Changes - **One preset-override parser.** `hydra_task_config` (no callers) is removed, and its callback indirection is folded into `resolve_task_config`. So is the second override parser (`parse_overrides` / `apply_overrides`). - `test_hydra.py` and the rendering test helper now go through `register_task` / `resolve_task_config`, the production parser, instead of a different one. - Five parser-only tests are dropped. One of them tested behavior production never had. - **`--viz` parsed once.** `_parse_visualizer_csv` accepts the argparse-parsed list, so `_normalize_launcher_args` no longer joins it back into a string and parses it again. Invalid values still fail at argparse time. - **One visualizer type table** (with the deprecated `newton` → `newton_gl` alias) lives in `isaaclab.visualizers.visualizer_cfg`. `SimulationContext` consumes canonical names instead of remapping aliases itself; the two tables disagreed about `none`. - **`SimulationContext` setup:** - `SettingsHelper` is removed, since `SettingsManager.set` already dispatches on the value type; - `get_physics_dt()` returns `cfg.dt`, and a `getattr(cfg.physics, "dt")` that never matched is dropped; - `initialize_visualizers(config_filter=None)` replaces a public/private forwarder pair; - the visualizer config list is normalized once instead of three times; - `build_simulation_context` reads `sim.has_gui`; - `use_stage` drops its Isaac Sim < 5 branch (the repo pins 6.1). Net: +209 / −500. ## Type of change - Breaking change (removed `hydra_task_config`, `parse_overrides`, `apply_overrides`, and `SettingsHelper`; `initialize_visualizers` gained `config_filter`) ## Validation All runs on GPU 0. - **Tests:** - `isaaclab/test/app` (27) and `isaaclab_physx/test/app` (90); - hydra (67), preset CLI (11), preset Kit decision (6), runtime compatibility (27), visualizer intent (8), distributed device (11), agent preset composition (13); - simulation context (26), stage utils (15), headless `build_simulation_context` (7), RL entrypoints (44 + 27). - **Training:** Cartpole with `physics=isaacsim_physx` and `physics=newton_mjwarp` runs 2 iterations, and the run summary names each backend correctly. - **Pre-existing failures on this machine, identical on the base branch:** one visualizer test that needs `carb`, and 8 golden-image diffs in `test_rendering_cartpole_kitless`. ## Release backport - [x] <!-- backport-active-release --> Backport this pull request to the active release branch after it merges into `develop` ## Checklist - [x] I have read and understood the contribution guidelines - [x] I have run the pre-commit checks - [x] My changes generate no new warnings - [x] I have added changelog fragments for every touched package (cherry picked from commit b744dbe)
…8125) ## Description This is step 2 of the launch-consistency series, after #8111 and #8112: each run-time choice is decided once, in `launch_simulation`, and consumers read the resolved config instead of re-deciding it. ### Visualizers - **Resolved once.** `launch_simulation` resolves the final visualizer list: `--viz none` gives none; an explicit `--viz a,b` gives exactly those, reusing a configured visualizer of the same type (with its settings) or else a default; with no `--viz`, the config's own list; livestreaming adds Kit; and `--max_visible_envs` applies to the result. The list is written into the config's `sim.visualizer_cfgs` before any launcher starts, so a missing visualizer package fails before Kit starts. - **An explicit `--viz` governs everything derived from visualizers.** A configured `newton_rtx` or Kit visualizer that `--viz` drops no longer starts OVRTX, trips the Kit/OVRTX conflict check, or turns on the Kit streaming view. XR auto-starts only when the run has no Kit visualizer. - **`SimulationContext` reads `cfg.visualizer_cfgs`.** Its settings-based re-resolution and the `/isaaclab/visualizer/explicit` and `/disable_all` settings are gone. Code that builds a `SimulationContext` directly gets its config's visualizers. - **`build_simulation_context(visualizers=...)` is removed.** It had no callers and on develop only set a settings key without creating the visualizers. - **Public selection helpers.** `parse_visualizer_csv`, `resolve_visualizer_cfgs`, `get_visualizer_install_hint`, `VISUALIZER_TYPES` and `VISUALIZER_ALIASES` live in `isaaclab.visualizers.visualizer_cfg`. `VISUALIZER_TYPES` maps each type to its default config as a `"module:Class"` string, and `scan()` returns the typed `SimulationCfg` it found, so `launch_simulation` no longer probes with `getattr`/`hasattr`. - **Remaining fallback:** a launch with no `SimulationCfg` to write into (a physics config or `None`, as in several tutorials) still passes the selection through `/isaaclab/visualizer/types`, which `SimulationContext` applies once with the same function. It goes away when those entry points launch with their real config. The command-line convention changes (`--viz none` removal, no visualizer without `--viz`, `--video [SOURCE]`) are split out into the follow-up PR. ### Device - **Resolved once:** `--device`, or this rank's GPU in a distributed run, falling back to the config's device when `--device` is not given, then the launcher's refinement (for example XR picks the CPU), then `cuda` normalized to `cuda:N`. The result is written once to the config and to the launcher args. `validate_distributed_device` and its six callers are removed, since each rank now resolves its own `cuda:N`. - **Consequences:** `apply_env_overrides` no longer writes the device (its `apply_device` argument is removed), and `simple_agents` no longer overwrites `--device` with the task's device. ### One config scan per run - **RL run summary:** it no longer runs its own `scan()`. The RL backends print it inside `launch_simulation`, from the resolved config. - **Mimic:** `generate_dataset.py` launches with its real config instead of a throwaway one. - **Two locomanipulation scripts** still scan separately, because their task configs import USD and can only be parsed after Kit starts. ### Follow-up in this PR - **Top-level imports where cheap.** Function-local imports move to module top wherever measuring shows they load no `pxr`, `omni`, `carb`, `isaacsim`, or `usdrt` before Kit starts: 100 → 71 local imports across the launch stack, `SimulationContext`, the RL entrypoints, and mimic. The rest stay local for a stated reason: Kit-only, an optional dependency, or kept cheap on purpose (for example `isaaclab.test.utils`, which many Kit-free tests import, and the benchmark dispatcher). - **`SimulationContext` visualizer list.** `visualizer_cfgs` is turned into a list once (direct users now see `[]` instead of `None`), and default visualizer configs are built without a catch-all `try/except`. - **Video recording after launch.** `apply_video_recording` is wired after launch everywhere and reads the resolved visualizer list. `pre_launch_video_config` is the only place that adds a headless Kit visualizer, before launch, so a Kit visualizer is never injected too late to start Kit. A config with only streaming visualizers now errors on `--video` instead of picking a source that cannot capture. ### Bugs fixed - **`--viz none`:** the run summary listed the config's visualizers although none ran; it now shows `none (headless)`. - **Distributed runs:** the summary showed the default device instead of each rank's device. The summary now names the concrete backend (for example `ovphysx`) rather than `physx (ovphysx)`, because the resolved config no longer records which automatic selector chose it. Net: +667 / −853. ## Type of change - Bug fix - Breaking change: removed the `/isaaclab/visualizer/explicit` and `/disable_all` settings, the `has_kit_streaming_view` key of `visualizer_intent`, `build_simulation_context(visualizers=...)`, `apply_env_overrides(apply_device=...)` and `validate_distributed_device`; dropped the leading underscore from the visualizer selection helpers, and `show_run_summary` must be called inside the launch ## Validation All runs on GPU 0 except the multi-GPU check. - **New tests, each failing on the base:** - `--viz none` summary; - summary device taken from the resolved config; - device resolution for `--device cuda:1`, `cuda`, and `cpu`, and Kit starting on the config's device without `--device`; - visualizers resolved into the config for none and explicit selections, plus the fallback path; - an explicit `--viz` that drops a configured `newton_rtx` or Kit streaming view starts neither. - **Kit-free tests (266):** launcher and app, visualizer intent, runtime compatibility, distributed device, simulation-context visualizers, visualizers, RL entrypoints and video recording. - **Kit tests, each in its own process:** `test_kit_launcher` (86), `test_simulation_context` (26), `test_simulation_context_kit` (4). - **Training:** Cartpole with `physics=isaacsim_physx` and `physics=newton_mjwarp` each run 2 iterations; the summaries show the right backend and `cuda:0`. - **Video:** `train.py ... physics=isaacsim_physx --video --video_length 20 --video_interval 20` writes two mp4 clips headless. - **Multi-GPU:** `torch.distributed.run --nproc_per_node=2 train.py --task Isaac-Cartpole --distributed` on GPUs 0 and 1, with `physics=newton_mjwarp` and `physics=isaacsim_physx` (Kit in each rank): both exit 0, and rank 0 and rank 1 each report and run on their own `cuda:0` / `cuda:1`. - **Import purity:** importing the changed modules loads no `pxr`, `omni`, `carb`, `isaacsim`, or `usdrt`, and the env-config import-purity tests pass. - **Not run:** XR, livestream, and the imitation-learning scripts. ## Release backport - [ ] <!-- backport-active-release --> Backport this pull request to the active release branch after it merges into `develop` ## Checklist - [x] I have read and understood the contribution guidelines - [x] I have run the pre-commit checks - [x] My changes generate no new warnings - [x] I have added tests that prove my fix is effective - [x] I have added changelog fragments for every touched package
Description
A follow-up to #8068, #8090, and #8102: it inlines or removes launch-stack helpers whose names cost the reader more than their bodies do. This PR is pure cleanup with no behavior change; every public removal is listed below with its replacement.
Launcher (
isaaclab.app.sim_launcher)launch_simulationandscanconvert launcher args withvars(args_cli), the namespace's live__dict__, so values resolved at launch (for exampleargs_cli.headless) still reach the caller. That removes_get_arg/_set_argand their three-way Namespace/dict/None branching on every read.--vizoverrides the config" rule for the Kit visualizer is part of the scan's visualizer intent._is_*config predicates, and the Kit-source list formatter.make_physics_cfgis private (_make_physics_cfg); onlyscanused it.Settings (
isaaclab.app.settings_manager)SettingsManager.instance()is removed. It was identical toget_settings_manager().set_bool/set_int/set_float/set_stringare removed. They only calledset(), which already dispatches on the value's type. Only calls on Isaac Lab's settings manager changed; calls on carb's settings interface are untouched.Kit launcher (
isaaclab_physx.app.KitLauncher)_set_toolbar_button_visible, with each button's current behavior kept.add_app_launcher_args→add_launcher_args, andExplicitAction→_ExplicitAction(internal).Net: +239 / −405 (about −165 lines).
Type of change
SettingsManager.instance, the typedSettingsManager.set_*forwarders, andisaaclab.app.make_physics_cfg; renamedKitLauncher.add_app_launcher_args)Validation
All runs on GPU 0.
require_kit(10);AppLaunchershim, exit status, and Kit startup;test_simulation_context_visualizers: 44 passed, 1 failed. The failing test needscarb, which only CI's image has, and it fails identically on develop.isaacsim_physx(Kit starts) and withnewton_mjwarp(no Kit).create_empty.pyreaches setup and runs.isaacsim.exp.fullpaths need a GUI or a livestream.test_deferred_cuda_device_synchronizes_torch_and_warp. Its helper is now inlined into Kit-only startup code.Release backport
developChecklist