[isaacsim.kit.xr.teleop.bridge] Isaac Kit XR Teleop Bridge#

Version: 1.1.2

Overview#

This extension provides OpenXR handle access for teleoperation integrations and fills API gaps across Kit versions.

It exposes a C++/Python bridge that:

  • gives access to OpenXR handles needed by external libraries (for example IsaacTeleop DeviceIO),

  • polyfills missing handle helpers into omni.kit.xr.system.openxr,

  • and lets you configure or extend required OpenXR extension names.

What It Provides#

The bridge exposes these functions from isaacsim.kit.xr.teleop.bridge:

  • get_instance_handle() -> XrInstance as int (0 when unavailable)

  • get_session_handle() -> XrSession as int (0 when unavailable)

  • get_stage_space_handle() -> XrSpace as int (0 when unavailable)

  • get_instance_proc_addr() -> xrGetInstanceProcAddr as int (0 when unavailable)

  • subscribe_required_extensions(callback) -> RAII subscription handle

On import, the extension also patches missing functions into omni.kit.xr.system.openxr (only the missing ones, never overriding existing functions).

Quick Start#

import isaacsim.kit.xr.teleop.bridge  # Triggers polyfill for missing openxr helpers
import omni.kit.xr.system.openxr as openxr

from teleopcore.oxr import OpenXRSessionHandles
from teleopcore.deviceio import DeviceIOSession, HandTracker

handles = OpenXRSessionHandles(
    openxr.get_instance_handle(),
    openxr.get_session_handle(),
    openxr.get_stage_space_handle(),
    openxr.get_instance_proc_addr(),
)

with DeviceIOSession.run([HandTracker()], handles) as session:
    while running:
        session.update()

Required OpenXR Extensions#

The bridge component resolves its required OpenXR extension names using settings and optional runtime callbacks.

Settings keys#

  • exts."isaacsim.kit.xr.teleop.bridge".openxr.requiredExtensions.set

  • exts."isaacsim.kit.xr.teleop.bridge".openxr.requiredExtensions.add

  • exts."isaacsim.kit.xr.teleop.bridge".openxr.requiredExtensions.remove

Resolution order#

  1. Start from set

  2. Apply add (deduplicated)

  3. Apply remove

  4. Append all callback-provided extensions (deduplicated)

If settings are unavailable, the bridge falls back to:

  • XR_KHR_convert_timespec_time

  • XR_NVX1_tensor_data

Example: replace/add/remove via settings#

[settings]
exts."isaacsim.kit.xr.teleop.bridge".openxr.requiredExtensions.set = [
    "XR_KHR_convert_timespec_time",
]
exts."isaacsim.kit.xr.teleop.bridge".openxr.requiredExtensions.add = [
    "XR_FB_passthrough",
]
exts."isaacsim.kit.xr.teleop.bridge".openxr.requiredExtensions.remove = [
    "XR_KHR_convert_timespec_time",
]

Example: explicitly clear the settings list#

[settings]
exts."isaacsim.kit.xr.teleop.bridge".openxr.requiredExtensions.set = []
exts."isaacsim.kit.xr.teleop.bridge".openxr.requiredExtensions.add = []
exts."isaacsim.kit.xr.teleop.bridge".openxr.requiredExtensions.remove = []

Runtime Callback Subscription (RAII)#

You can append required extensions at runtime by subscribing a callback.

import isaacsim.kit.xr.teleop.bridge as bridge

required_ext_subscription = bridge.subscribe_required_extensions(
    lambda: ["XR_FB_passthrough", "XR_EXT_hand_tracking"]
)

# Keep `required_ext_subscription` alive while you want callback active.
# Unsubscribe explicitly:
required_ext_subscription.reset()

# Or drop all references (for example: required_ext_subscription = None).

Behavior notes:

  • Callback signature is () -> list[str] (or any iterable of strings).

  • Callback results are deduplicated against the final extension list.

  • Exceptions thrown by callbacks are caught and logged; resolution continues.

  • Subscription lifetime is tied to the returned subscription handle object.

Direct Function Usage#

You can call bridge helpers directly without going through openxr polyfills:

import isaacsim.kit.xr.teleop.bridge as bridge

proc_addr = bridge.get_instance_proc_addr()

Compatibility Notes#

  • On newer Kit versions where some helpers already exist in omni.kit.xr.system.openxr, this extension only adds missing helpers.

  • If/when get_instance_proc_addr() is provided natively, the bridge will not override it.

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 isaacsim.kit.xr.teleop.bridge

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

[dependencies]
"isaacsim.kit.xr.teleop.bridge" = {}

Open the Window > Extensions menu in a running application instance and search for isaacsim.kit.xr.teleop.bridge. Then, toggle the enable control button if it is not already active.

Settings#

Extension Settings#

The table list the extension-specific settings.

Setting name

Description

Type

Default value

openxr.requiredExtensions.set

Base required OpenXR extension list for this bridge component. If non-empty, this list becomes the starting value before add/remove are applied.

list

['XR_KHR_convert_timespec_time', 'XR_NVX1_tensor_data']

openxr.requiredExtensions.add

Additional OpenXR extensions to append to the resolved required extension list. Duplicate values are ignored.

list

[]

openxr.requiredExtensions.remove

OpenXR extensions to remove from the resolved required extension list.

list

[]

The extension-specific settings can be either specified (set) or retrieved (get) in one of the following ways:

Define the key and value of the setting as an application argument from a terminal.

APP_SCRIPT.(sh|bat) --/exts/isaacsim.kit.xr.teleop.bridge/SETTING_NAME=SETTING_VALUE

Define the key and value of the setting under [settings] in an experience (.kit) file or an extension configuration (extension.toml) file.

[settings]
exts."isaacsim.kit.xr.teleop.bridge".SETTING_NAME = SETTING_VALUE

Define the key and value of the setting using the carb framework (in Python).

import carb

settings = carb.settings.get_settings()
settings.set("/exts/isaacsim.kit.xr.teleop.bridge/SETTING_NAME", SETTING_VALUE)

Define the key to query the value of the setting using the carb framework (in Python).

import carb

settings = carb.settings.get_settings()
value = settings.get("/exts/isaacsim.kit.xr.teleop.bridge/SETTING_NAME")