Rendering out AOV image sequences via command line in headless mode

Hello!!

I’ve been rendering AOV image sequences with the Movie Capture extension in Omniverse which has been working great.

I was wondering if there is a command line interface which provides an equivalent functionality to Movie Capture in terms of rendering out image sequences given an input USD scene, with the ability to select the render product, set start/end frame, etc. If not - how feasible is it to build one using the available python API? Are there some examples of rendering and saving out images ideally in headless mode (no GUI)?

Thanks!

Yes you can do all of that through scripting. Let me get you a list of commands.

1 Like

The best way is not to use Movie Capture which is really a GUI extension, but to use Replicator, which is specifically designed for command line rendering.

Hi Richard! Thanks for providing the list of commands.

Unfortunately I am stuck right at the starting line – wondering if you had any suggestions.

So far I’ve set up a new kit-app-template with the Kit Base Editor template.

Next I’ve taken a little python example from Core Functions - “Hello World” of Replicator — Omniverse Extensions and created a python script with the following code:

import omni.replicator.core as rep with rep.new_layer(): camera = rep.create.camera(position=(0, 0, 1000)) render_product = rep.create.render_product(camera, (1024, 1024)) 

When I try to execute the script via CLI:

rlei /home/rlei/dev/kit-app-template/_build/linux-x86_64/release $ ./kit.sh --exec omni_render_usd.py [Info] [carb] Logging to file: /home/rlei/.nvidia-omniverse/logs/Kit/kit/108.0/kit_20250819_180158.log 2025-08-20T01:01:58Z [64ms] [Error] [carb.scripting-python.plugin] ModuleNotFoundError: No module named 'omni.replicator' At: /home/rlei/dev/kit-app-template/_build/linux-x86_64/release/omni_render_usd.py(1): <module> ModuleNotFoundError: No module named 'omni.replicator' At: /home/rlei/dev/kit-app-template/_build/linux-x86_64/release/omni_render_usd.py(1): <module> 2025-08-20T01:01:58Z [64ms] [Error] [omni.kit.app.plugin] [py stderr]: ModuleNotFoundError: No module named 'omni.replicator' At: /home/rlei/dev/kit-app-template/_build/linux-x86_64/release/omni_render_usd.py(1): <module> 

So I tried to add some additional code at the top of the script to enable the omni.replicator.core extension:

# Enable required extensions import omni.kit.app app = omni.kit.app.get_app() ext_mgr = app.get_extension_manager() ext_mgr.set_extension_enabled_immediate("omni.replicator.core", True) 

but it complained that the extension was not found.

I feel like I’m missing something very basic - would appreciate any pointers in the right direction

Cheers

Ah, I see. Can you use Replicator with Isaac Sim 5.0, and not the kit app template. Or at least try USD Composer first. Make sure you have actually installed Replicator.

Hi @Richard3D ,

Thanks for the suggestions. The issue was that I was using kit-app-template 108 and it wasn’t able to find the omni.replicator.core extension in that major version. Perhaps it’s not built yet?

I’m now using kit-app-template 107.3 and am able to load the omni.replicatore.core extension. This is my script based on Running Replicator Headlessly — Omniverse Extensions that I am able to execute within the Kit Base Editor application in the python editor which successfully outputs some frames:

# Enable required extensions import omni.kit.app app = omni.kit.app.get_app() ext_mgr = app.get_extension_manager() ext_mgr.set_extension_enabled_immediate("omni.replicator.core", True) import omni.replicator.core as rep import omni.usd # Create a new stage in kit.sh execution mode if omni.usd.get_context().get_stage() is None: omni.usd.get_context().new_stage() with rep.new_layer(): camera = rep.create.camera(position=(0, 0, 1000)) sphere_light = rep.create.light( light_type="Sphere", temperature=rep.distribution.normal(6500, 500), intensity=rep.distribution.normal(35000, 5000), position=rep.distribution.uniform((-300, -300, -300), (300, 300, 300)), scale=rep.distribution.uniform(50, 100), count=2 ) render_product = rep.create.render_product(camera, (1024, 1024)) torus = rep.create.torus(semantics=[('class', 'torus')] , position=(0, -200 , 100)) sphere = rep.create.sphere(semantics=[('class', 'sphere')], position=(0, 100, 100)) cube = rep.create.cube(semantics=[('class', 'cube')], position=(100, -200 , 100) ) with rep.trigger.on_frame(num_frames=10): with rep.create.group([torus, sphere, cube]): rep.modify.pose( position=rep.distribution.uniform((-100, -100, -100), (200, 200, 200)), scale=rep.distribution.uniform(0.1, 2)) # Initialize and attach writer writer = rep.WriterRegistry.get("BasicWriter") writer.initialize( output_dir="_output", rgb=True, bounding_box_2d_tight=True) writer.attach([render_product]) rep.orchestrator.run() 

However, if I save that same script as a file and try running it via kit.sh like so:

rlei /home/rlei/dev/kit-107/_build/linux-x86_64/release $ ./kit.sh --no-window --exec my_script.py 

The program exits without any frames being generated. I assume this is because rep.orchestrator.run is non-blocking – so after changing:

rep.orchestrator.run() 

to

asyncio.run(rep.orchestrator.run_until_complete_async()) 

it seems to hang indefinitely and no frames are generated.

Any ideas?

Cheers,
Richard

Can you please try with kit 107.3 USD COMPOSER, not kit base editor, and then also try with Isaac Sim 5.0.

Hi @Richard3D I see the same behavior executing that script with kit from 107.3 Usd Composer and Isaac Sim 5.0

Can you help @pcallender