[omni.kit.loop-isaac] Isaac Loop Runner#

Version: 1.6.0

Overview#

The omni.kit.loop-isaac extension provides a custom loop runner for Isaac Sim that controls run-loop pacing and the dt value the loop dispatches to its preUpdate / update / postUpdate event streams. It replaces the default Kit loop runner with one that supports manual stepping mode and a fixed dt for deterministic frame timing. Timeline tick advance (omni.timeline) and physics stepping (omni.physx.*) are separate systems that consume the loop’s events; this extension does not own them directly.

This extension must be enabled during app startup by adding it as a dependency in your application’s .kit file.

Functionality#

  • Manual stepping mode: Enables explicit control over when simulation frames advance, allowing external code to step the simulation at a controlled rate

  • Fixed timestep control: Configurable step sizes for deterministic simulation behavior independent of wall-clock time

  • Rate limiting: Configurable rate limits for main, present, and rendering run loops (defaults: main and rendering at 120Hz, present at 60Hz)

  • External simulation time: Supports setting simulation time from external sources for synchronized multi-system simulations

Enable Extension#

The extension can be enabled (if not already) in one of the following ways:

Define the next entry as an application argument from a terminal.

APP_SCRIPT.(sh|bat) --enable omni.kit.loop-isaac

Define the next entry under [dependencies] in an experience (.kit) file or an extension configuration (extension.toml) file.

[dependencies]
"omni.kit.loop-isaac" = {}

Open the Window > Extensions menu in a running application instance and search for omni.kit.loop-isaac. Then, toggle the enable control button if it is not already active.

Python API#


Isaac loop bindings

class RunLoopRunner#

Bases: pybind11_object

get_manual_mode(
self: omni.kit.loop.bindings._loop.RunLoopRunner,
name: str = '',
) bool#

Gets the manual mode state for the run loop.

Parameters:

name (str) – The name of the run loop. If name is an empty string, returns the state of the first active run loop.

Returns:

True if manual mode is enabled, false otherwise.

Return type:

bool

get_manual_step_size(
self: omni.kit.loop.bindings._loop.RunLoopRunner,
name: str = '',
) float#

Gets the time step size (dt) for manual stepping mode.

Parameters:

name (str) – The name of the run loop. If name is an empty string, returns the step size of the first active run loop.

Returns:

The time step size in seconds.

Return type:

double

set_manual_mode(
self: omni.kit.loop.bindings._loop.RunLoopRunner,
enabled: bool = True,
name: str = '',
) None#

Enables or disables manual stepping mode for the run loop.

Parameters:
  • enabled (bool) – Set to true to enable manual mode, false to disable.

  • name (str) – The name of the run loop. If name is an empty string, all active run loops are set.

set_manual_step_size(
self: omni.kit.loop.bindings._loop.RunLoopRunner,
dt: float = 0.01667,
name: str = '',
) None#

Sets the time step size (dt) for manual stepping mode.

Parameters:
  • dt (double) – The time step size in seconds.

  • name (str) – The name of the run loop. If name is an empty string, all active run loops are set.

acquire_loop_interface(
plugin_name: str = None,
library_path: str = None,
) omni.kit.loop.bindings._loop.RunLoopRunner#
release_loop_interface(
arg0: omni.kit.loop.bindings._loop.RunLoopRunner,
) None#

Settings#

Other Settings#

The extension changes some settings of the application or other extensions, which are listed in the table below.

Application/extension setting

Description

Value

app.runLoopsGlobal.syncToPresent

Do not sync threads to the present thread.

False

app.runLoops.main.rateLimitEnabled

Set to true to enable rate limiting for the main run loop.

True

app.runLoops.main.rateLimitFrequency

Rate-limit frequency in Hz for the main run loop.

120

app.runLoops.main.rateLimitUseBusyLoop

Set to true to use a busy loop for the main run loop.

False

app.runLoops.present.rateLimitEnabled

Set to true to enable rate limiting for the present run loop.

True

app.runLoops.present.rateLimitFrequency

Rate-limit frequency in Hz for the present run loop.

60

app.runLoops.present.rateLimitUseBusyLoop

Set to true to use a busy loop for the present run loop.

False

app.runLoops.rendering_0.rateLimitEnabled

Set to true to enable rate limiting for the rendering run loop.

True

app.runLoops.rendering_0.rateLimitFrequency

Rate-limit frequency in Hz for the rendering run loop.

120

app.runLoops.rendering_0.rateLimitUseBusyLoop

Set to true to use a busy loop for the rendering run loop.

False