| name | isaac-sim-headless-deployment |
| description | Running Isaac Sim 6.0 headlessly with `--no-window` for batch simulation, automated data generation, and server-side workloads. Covers launch modes (native headless, physics-only, standalone Python), key CLI flags, app configurations, and the canonical `SimulationApp` bootstrap pattern. Use when: launching Isaac Sim without a display, running batch simulations on a server, generating synthetic data headlessly, or wrapping a standalone Python script in the headless `SimulationApp` lifecycle. Triggers on: headless Isaac Sim, --no-window, batch simulation, SimulationApp, physics-only, standalone Python script.
|
Isaac Sim Headless Usage (--no-window)
This skill covers headless usage of a built or installed Isaac Sim. It does
not cover Docker images, container orchestration, or CI/CD wiring โ those
live with the deployment infrastructure that wraps Isaac Sim, not in this
skill.
Launch modes
1. Headed (Default)
./isaac-sim.sh
2. Headless with Rendering
For headless GPU rendering (generates images without a window):
./isaac-sim.sh --no-window
DISPLAY=:0 ./isaac-sim.sh --no-window
3. Headless No Rendering
For physics-only simulation (no viewport, no rendering):
./isaac-sim.sh --no-window --/app/renderer/enabled=false
4. Python Standalone Scripts
Run simulation logic from a standalone Python script:
./python.sh my_simulation.py
The script controls headless behavior via the SimulationApp config (see
Batch simulation pattern below) โ python.sh
does not need a --no-window flag.
5. Kit CLI with Script Execution
[Code: scripts/kit_cli_with_script_execution.sh]
Key CLI Flags
| Flag | Description |
|---|
--no-window | Disable window creation (headless) |
--/app/renderer/enabled=false | Disable rendering entirely |
--/app/window/width=W | Set viewport width |
--/app/window/height=H | Set viewport height |
--/app/settings/fabricDefaultStageFrameHistoryCount=N | Frame history for Fabric |
--enable EXT_ID | Enable specific extension |
--ext-folder PATH | Add extension search path |
--exec SCRIPT | Execute script on startup |
--no-ros-env | Skip ROS 2 auto-sourcing |
--allow-root | Allow running as root |
App Configurations
| Config File | Use Case |
|---|
isaacsim.exp.full.kit | Full simulation (default) |
isaacsim.exp.full.newton.kit | Newton physics engine |
isaacsim.exp.full.fabric.kit | Fabric scene delegate |
isaacsim.exp.base.kit | Minimal base (faster startup) |
isaacsim.exp.base.python.kit | Python-only base |
isaacsim.exp.base.zero_delay.kit | Zero-delay base |
Batch Simulation Pattern
The canonical headless bootstrap pattern lives in:
source/standalone_examples/api/isaacsim.simulation_app/hello_world.py (minimal)
source/standalone_examples/api/isaacsim.simulation_app/load_stage.py (stage open + step loop with --test mode)
For an N-episode batch driver, wrap that bootstrap in a Python for episode in range(N) loop. Use the current APIs:
isaacsim.core.experimental.utils.stage for stage open / waiting on load
isaacsim.core.simulation_manager.SimulationManager.setup_simulation(dt=..., device=...) to configure physics
isaacsim.core.experimental.utils.app (enable_extension, play, stop, update_app) to drive the loop
Skeleton (paraphrased from load_stage.py, adapted for batch):
from isaacsim import SimulationApp
simulation_app = SimulationApp({"headless": True, "renderer": "RayTracedLighting"})
import isaacsim.core.experimental.utils.app as app_utils
import isaacsim.core.experimental.utils.stage as stage_utils
from isaacsim.core.simulation_manager import SimulationManager
NUM_EPISODES, STEPS_PER_EPISODE = 100, 1000
for episode in range(NUM_EPISODES):
stage_utils.open_stage("/path/to/scene.usd")
while stage_utils.is_stage_loading():
simulation_app.update()
SimulationManager.setup_simulation(dt=1.0 / 60.0, device="cpu")
app_utils.play()
for _ in range(STEPS_PER_EPISODE):
simulation_app.update()
app_utils.stop()
simulation_app.close()
Avoid the legacy isaacsim.core.api.World / isaacsim.core.utils.stage paths โ they are deprecated in Kit 110.
Migration: see Renaming Extensions for the omni.isaac.* โ isaacsim.* map covering omni.isaac.core, omni.isaac.utils, and friends.
Performance Tuning for Batch/Headless
Physics-Only (Fastest)
config = {"headless": True, "renderer": None}
world.step(render=False)
Throughput: 10-50x real-time depending on scene complexity.
Memory Management
- Clear stage between episodes:
world.clear() + garbage collect
- Use instanceable assets:
make_instanceable: true in config.yaml
- Monitor GPU memory:
nvidia-smi โ Kit leaks if stages aren't properly cleared
- GB10 (Jetson): Max ~35K prims, 16GB shared memory โ reduce scene complexity
Known Issues (Kit 110)
- DISPLAY=:0 required for headless viewport on Kit 110 with complex stages on some GPU configurations
- Viewport never initializes without DISPLAY on some configurations โ use
--no-window + offscreen rendering
- CUDA OOM: Monitor with
nvidia-smi, keep under 90% GPU VRAM utilization
- Startup time: ~30-60s cold start; use persistent processes for interactive batch
- Newton physics + torch conflict: Never import torch before physics settle