Skip to content
Open
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
10 changes: 5 additions & 5 deletions docs/source/device/trackers.rst
Original file line number Diff line number Diff line change
Expand Up @@ -233,8 +233,8 @@ axis inputs. Uses standard OpenXR action bindings.
- Examples:

- :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`
- :code-file:`examples/teleop/python/isaacteleop_examples/teleop/locomotion_retargeting_example.py`
- :code-file:`examples/teleop/python/isaacteleop_examples/teleop/gripper_retargeting_example_simple.py`

FullBodyTracker
~~~~~~~~~~~~~~~
Expand Down Expand Up @@ -312,7 +312,7 @@ utility internally.
- Examples:

- :code-file:`examples/schemaio/pedal_printer.cpp`
- :code-file:`examples/teleop/python/foot_pedal_locomotion_example.py`
- :code-file:`examples/teleop/python/isaacteleop_examples/teleop/foot_pedal_locomotion_example.py`

.. note::

Expand Down Expand Up @@ -383,5 +383,5 @@ 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/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`
- :code-file:`examples/teleop/python/isaacteleop_examples/teleop/gripper_retargeting_example_simple.py`
- :code-file:`examples/teleop/python/isaacteleop_examples/teleop/locomotion_retargeting_example.py`
6 changes: 3 additions & 3 deletions docs/source/getting_started/quick_start.rst
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ env file and start the service with it:
python -m isaacteleop.cloudxr.service start --cloudxr-env-config ./custom.env

The same ``--cloudxr-env-config`` flag is available on the teleop examples under
``examples/teleop/python/``, which register CloudXR's launcher arguments through
``examples/teleop``, which register CloudXR's launcher arguments through
``CloudXRLauncher.add_launcher_arguments()`` — but it applies only when the
example is the one starting the runtime. With a service already running the
example attaches to it instead, and prints which settings it had to ignore (see
Expand Down Expand Up @@ -339,7 +339,7 @@ pipeline: reading XR controller input via CloudXR, retargeting it through the

.. code-block:: bash

python examples/teleop/python/gripper_retargeting_example_simple.py
python -m isaacteleop_examples.teleop.gripper_retargeting_example_simple

Once running, squeeze the controller triggers on your XR headset to control
the gripper. You should see periodic status output:
Expand All @@ -356,7 +356,7 @@ the gripper. You should see periodic status output:
...

The example runs for 20 seconds and then exits. To try other examples, see
``examples/teleop/python/`` — for instance:
``examples/teleop`` — for instance:

- ``se3_retargeting_example.py`` — maps hand or controller poses to
end-effector poses (absolute or relative)
Expand Down
2 changes: 1 addition & 1 deletion docs/source/getting_started/teleop_session.rst
Original file line number Diff line number Diff line change
Expand Up @@ -444,7 +444,7 @@ Examples
Complete Examples
^^^^^^^^^^^^^^^^^

#. **Simplified Gripper Example**: ``examples/teleop/python/gripper_retargeting_example_simple.py``
#. **Simplified Gripper Example**: ``examples/teleop/python/isaacteleop_examples/teleop/gripper_retargeting_example_simple.py``
-- Shows the minimal configuration approach and demonstrates auto-creation
of input sources.

Expand Down
4 changes: 2 additions & 2 deletions docs/source/references/cloudxr.rst
Original file line number Diff line number Diff line change
Expand Up @@ -181,13 +181,13 @@ launcher — do this for themselves and need no sourcing.
Run teleop examples against the service
---------------------------------------

Nothing to pass. The examples under ``examples/teleop/python/`` attach to
Nothing to pass. The examples under ``examples/teleop`` attach to
whatever runtime is serving, so with a service running they use it:

.. code-block:: bash

python -m isaacteleop.cloudxr.service start --accept-eula
python examples/teleop/python/gripper_retargeting_example_simple.py
python -m isaacteleop_examples.teleop.gripper_retargeting_example_simple

The example leaves the service running when it exits, so the headset stays
connected and the next run reattaches to the same session.
Expand Down
2 changes: 1 addition & 1 deletion docs/source/references/retargeting/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -243,7 +243,7 @@ Available Retargeters
For a complete hand retargeting example (e.g. ``HandsSource`` + ``DexHandRetargeter`` or
``TriHandMotionControllerRetargeter``, connect and compute), see
``g1_trihand_retargeting_example.py`` and ``dex_bimanual_example.py`` in the
:code-dir:`examples/teleop/python` directory.
:code-dir:`examples/teleop` directory.

.. dropdown:: LocomotionRootCmdRetargeter

Expand Down
8 changes: 5 additions & 3 deletions docs/source/references/retargeting/joint_space.rst
Original file line number Diff line number Diff line change
Expand Up @@ -102,13 +102,15 @@ and flatten ``ee_pose`` + ``gripper_command`` into the env's task-space action l
Run the example
---------------

The repo ships ``examples/teleop/python/joint_space_device_example.py``:
The repo ships ``examples/teleop``:

.. code-block:: console

$ uv pip install -e ./examples/teleop

# Consumes the so101_leader plugin over OpenXR (source cloudxr.env first):
$ python joint_space_device_example.py --launch-plugin --mode joint --frames 8
$ python joint_space_device_example.py --launch-plugin --mode ee --urdf so101_new_calib.urdf
$ python -m isaacteleop_examples.teleop.joint_space_device_example --launch-plugin --mode joint --frames 8
$ python -m isaacteleop_examples.teleop.joint_space_device_example --launch-plugin --mode ee --urdf so101_new_calib.urdf

Validate
--------
Expand Down
4 changes: 2 additions & 2 deletions examples/teleop/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# 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)
project(teleop_examples)

include(${CMAKE_SOURCE_DIR}/cmake/InstallPythonExample.cmake)
install_python_example(DESTINATION examples/teleop/python)
install_python_example(DESTINATION examples/teleop)
28 changes: 28 additions & 0 deletions examples/teleop/pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# 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-teleop"
version = "0.1.0"
description = "Isaac Teleop Retargeting Examples"
requires-python = ">=3.11,<3.14"
dependencies = [
"isaacteleop[retargeters]",
]

# `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 `teleop/`.
#
# config/ lives inside the package: dex_bimanual_example and
# full_bimanual_reordering_example resolve it from __file__.
[tool.hatch.build.targets.wheel]
only-include = ["python/isaacteleop_examples/teleop"]
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
Expand Up @@ -28,7 +28,9 @@
)


PLUGIN_ROOT_DIR = Path(__file__).resolve().parent.parent.parent.parent / "plugins"
# Six levels up is the tree root -- the checkout, or the install prefix
# when running from install/examples/teleop/.
PLUGIN_ROOT_DIR = Path(__file__).resolve().parents[5] / "plugins"
PLUGIN_NAME = "controller_synthetic_hands"
PLUGIN_ROOT_ID = "synthetic_hands"

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,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 Expand Up @@ -26,7 +26,9 @@
from isaacteleop.retargeting_engine.interface import OutputCombiner


PLUGIN_ROOT_DIR = Path(__file__).resolve().parent.parent.parent.parent / "plugins"
# Six levels up is the tree root -- the checkout, or the install prefix
# when running from install/examples/teleop/.
PLUGIN_ROOT_DIR = Path(__file__).resolve().parents[5] / "plugins"
PLUGIN_NAME = "controller_synthetic_hands"
PLUGIN_ROOT_ID = "synthetic_hands"

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 Expand Up @@ -36,7 +36,9 @@
)


PLUGIN_ROOT_DIR = Path(__file__).resolve().parent.parent.parent.parent / "plugins"
# Six levels up is the tree root -- the checkout, or the install prefix
# when running from install/examples/teleop/.
PLUGIN_ROOT_DIR = Path(__file__).resolve().parents[5] / "plugins"
PLUGIN_NAME = "controller_synthetic_hands"
PLUGIN_ROOT_ID = "synthetic_hands"

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 Expand Up @@ -27,7 +27,9 @@
)


PLUGIN_ROOT_DIR = Path(__file__).resolve().parent.parent.parent.parent / "plugins"
# Six levels up is the tree root -- the checkout, or the install prefix
# when running from install/examples/teleop/.
PLUGIN_ROOT_DIR = Path(__file__).resolve().parents[5] / "plugins"
PLUGIN_NAME = "controller_synthetic_hands"
PLUGIN_ROOT_ID = "synthetic_hands"

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
Expand Up @@ -60,7 +60,8 @@
_COLLECTION_ID = "so101_leader"
_POSE_LABELS = ["pos_x", "pos_y", "pos_z", "quat_x", "quat_y", "quat_z", "quat_w"]
_DEFAULT_PLUGIN_BIN = (
Path(__file__).resolve().parents[3]
# Six levels up is the repo root; see PLUGIN_ROOT_DIR in the sibling examples.
Path(__file__).resolve().parents[5]
/ "build/src/plugins/so101_leader/so101_leader_plugin"
)

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 Expand Up @@ -27,7 +27,9 @@
)


PLUGIN_ROOT_DIR = Path(__file__).resolve().parent.parent.parent.parent / "plugins"
# Six levels up is the tree root -- the checkout, or the install prefix
# when running from install/examples/teleop/.
PLUGIN_ROOT_DIR = Path(__file__).resolve().parents[5] / "plugins"
PLUGIN_NAME = "controller_synthetic_hands"
PLUGIN_ROOT_ID = "synthetic_hands"

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
11 changes: 0 additions & 11 deletions examples/teleop/python/pyproject.toml

This file was deleted.

2 changes: 1 addition & 1 deletion src/plugins/so101_leader/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ absorb calibration; for **EE (URDF FK)** mode the joint angles must already matc

The consumer side creates a `JointStateTracker("so101_leader")` (via
`JointStateSource(name=..., collection_id="so101_leader", joint_names=[...])`) on the same
`collection_id`. See `examples/teleop/python/joint_space_device_example.py` for the retargeting
`collection_id`. See `examples/teleop/python/isaacteleop_examples/teleop/joint_space_device_example.py` for the retargeting
pipeline (joint-mirror and task-space EE modes).

DOF order / names: `shoulder_pan, shoulder_lift, elbow_flex, wrist_flex, wrist_roll, gripper`.
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@

The output element names are chosen so a downstream
:class:`~isaacteleop.retargeters.TensorReorderer` can flatten them into the exact action layout
an Isaac Lab environment expects. See ``examples/teleop/python/joint_space_device_example.py``
an Isaac Lab environment expects. See ``examples/teleop/python/isaacteleop_examples/teleop/joint_space_device_example.py``
for an end-to-end reference.
"""

Expand Down
Loading