Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions docs/source/device/trackers.rst
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,7 @@ Tracks articulated hand joints (26 joints per hand, following the OpenXR

- :code-file:`examples/oxr/cpp/oxr_simple_api_demo.cpp`
- :code-file:`examples/oxr/python/modular_example.py`
- :code-file:`examples/retargeting/python/sources_example.py`
- :code-file:`examples/retargeting/python/isaacteleop_examples/retargeting/sources_example.py`

ControllerTracker
~~~~~~~~~~~~~~~~~
Expand All @@ -232,7 +232,7 @@ axis inputs. Uses standard OpenXR action bindings.

- Examples:

- :code-file:`examples/retargeting/python/sources_example.py`
- :code-file:`examples/retargeting/python/isaacteleop_examples/retargeting/sources_example.py`
- :code-file:`examples/teleop/python/locomotion_retargeting_example.py`
- :code-file:`examples/teleop/python/gripper_retargeting_example_simple.py`

Expand Down Expand Up @@ -382,6 +382,6 @@ For end-to-end usage patterns combining trackers with a ``DeviceIOSession``, see

For higher-level usage with the teleop session manager and retargeting, see:

- :code-file:`examples/retargeting/python/sources_example.py`
- :code-file:`examples/retargeting/python/isaacteleop_examples/retargeting/sources_example.py`
- :code-file:`examples/teleop/python/gripper_retargeting_example_simple.py`
- :code-file:`examples/teleop/python/locomotion_retargeting_example.py`
11 changes: 6 additions & 5 deletions docs/source/references/retargeting/sharpa.rst
Original file line number Diff line number Diff line change
Expand Up @@ -125,19 +125,20 @@ produced in your target joint order.
Run the example
---------------

The repo ships a bimanual demo at
``examples/retargeting/python/sharpa_hand_retargeter_demo.py``:
The repo ships a bimanual demo in ``examples/retargeting``:

.. code-block:: console

$ uv pip install -e ./examples/retargeting

# Synthetic curl animation (no headset, no GUI required):
$ python examples/retargeting/python/sharpa_hand_retargeter_demo.py --synthetic
$ python -m isaacteleop_examples.retargeting.sharpa_hand_retargeter_demo --synthetic

# Live bimanual from a connected Quest headset:
$ python examples/retargeting/python/sharpa_hand_retargeter_demo.py
$ python -m isaacteleop_examples.retargeting.sharpa_hand_retargeter_demo

# Custom MJCFs (e.g. the mesh-bearing variants):
$ python examples/retargeting/python/sharpa_hand_retargeter_demo.py \
$ python -m isaacteleop_examples.retargeting.sharpa_hand_retargeter_demo \
--left-mjcf /path/to/left_sharpawave.xml \
--right-mjcf /path/to/right_sharpawave.xml

Expand Down
8 changes: 5 additions & 3 deletions docs/source/references/retargeting/wuji.rst
Original file line number Diff line number Diff line change
Expand Up @@ -69,16 +69,18 @@ real Wuji hand:

.. code-block:: console

$ uv pip install -e ./examples/retargeting

# Device-free smoke test
$ python examples/retargeting/python/wuji_hand_retargeter_demo.py \
$ python -m isaacteleop_examples.retargeting.wuji_hand_retargeter_demo \
--mode synthetic --model wuji_hand_2 --hand right

# Replay MediaPipe-format keypoints
$ python examples/retargeting/python/wuji_hand_retargeter_demo.py \
$ python -m isaacteleop_examples.retargeting.wuji_hand_retargeter_demo \
--mode replay --replay my_take.pkl --model wuji_hand_2 --hand right

# Drive real hardware and let TeleopSession launch the Wuji glove plugin
$ python examples/retargeting/python/wuji_hand_retargeter_demo.py \
$ python -m isaacteleop_examples.retargeting.wuji_hand_retargeter_demo \
--mode drive --hand right --plugin-path build/src/plugins

Drive mode needs a running CloudXR runtime, an OpenXR hand-tracking source, and
Expand Down
4 changes: 2 additions & 2 deletions examples/retargeting/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0

cmake_minimum_required(VERSION 3.20)

include(${CMAKE_SOURCE_DIR}/cmake/InstallPythonExample.cmake)
install_python_example(DESTINATION examples/retargeting/python)
install_python_example(DESTINATION examples/retargeting)
25 changes: 25 additions & 0 deletions examples/retargeting/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<!--
SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
SPDX-License-Identifier: Apache-2.0
-->

# Retargeting engine examples

Standalone demos of the retargeting engine. Install once, then run whichever
one you want:

```bash
uv pip install -e ./examples/retargeting
python -m isaacteleop_examples.retargeting.sources_example
```

| Module | What it shows |
| --- | --- |
| `sources_example` | Wiring DeviceIO sources into a retargeting graph |
| `dual_source_teleop_example` | Two input sources driving one session |
| `example_retargeters` | `GainOffsetRetargeter`, a minimal custom retargeter |
| `multi_retargeter_tuning_demo_imgui` | Tuning several retargeters live, with an ImGui panel |
| `sharpa_hand_retargeter_demo` | Bimanual Sharpa hands; `--synthetic` needs no headset |
| `wuji_hand_retargeter_demo` | Wuji hand, in `synthetic` / `replay` / `drive` modes |

Docs: `docs/source/references/retargeting/`.
26 changes: 26 additions & 0 deletions examples/retargeting/pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

[project]
# The dist name mirrors the import path, so an installed example claims no bare
# top-level name in site-packages.
name = "isaacteleop-examples-retargeting"
version = "0.0.0" # Internal examples - not versioned
description = "Retargeting Engine Python Examples"
requires-python = ">=3.11,<3.14"
dependencies = [
"isaacteleop[ui,retargeters-lite]",
"numpy>=1.23.0",
]

# `isaacteleop_examples` is a PEP 420 namespace shared by every example dist and
# must stay without an __init__.py. `only-include` + `sources`, not `packages`:
# the latter keeps only the last path component and would root the wheel at a
# bare top-level `retargeting/`.
[tool.hatch.build.targets.wheel]
only-include = ["python/isaacteleop_examples/retargeting"]
sources = ["python"]
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0

"""
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0

"""
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0

"""
Expand All @@ -25,7 +25,7 @@

import numpy as np

from example_retargeters import GainOffsetRetargeter
from .example_retargeters import GainOffsetRetargeter
from isaacteleop.retargeting_engine.interface import TensorGroup
from isaacteleop.retargeting_engine_ui import (
MultiRetargeterTuningUIImGui,
Expand Down
12 changes: 0 additions & 12 deletions examples/retargeting/python/pyproject.toml

This file was deleted.

Loading