From 3e5b00401d7e9559ba866984bca5028a258dc094 Mon Sep 17 00:00:00 2001 From: Jiwen Cai Date: Fri, 28 Aug 2026 04:55:49 +0000 Subject: [PATCH] examples(teleop): package under isaaccapture_examples Package the teleoperation examples with their configuration assets and update plugin discovery for the nested layout. Part of NVIDIA/IsaacCapture#985. Signed-off-by: Jiwen Cai --- docs/source/device/trackers.rst | 10 +++---- docs/source/getting_started/quick_start.rst | 6 ++-- .../source/getting_started/teleop_session.rst | 2 +- docs/source/references/cloudxr.rst | 4 +-- docs/source/references/retargeting/index.rst | 2 +- .../references/retargeting/joint_space.rst | 8 ++++-- examples/teleop/CMakeLists.txt | 4 +-- examples/teleop/pyproject.toml | 28 +++++++++++++++++++ .../isaaccapture_examples/teleop/__init__.py | 2 ++ .../teleop}/config/dex_retargeting/README.md | 0 .../dex_retargeting/hand_left_config.yml | 0 .../dex_retargeting/hand_right_config.yml | 0 .../dex_retargeting/left_robot_hand.urdf | 0 .../dex_retargeting/right_robot_hand.urdf | 0 .../teleop}/dex_bimanual_example.py | 2 +- .../teleop}/foot_pedal_locomotion_example.py | 4 ++- .../full_bimanual_reordering_example.py | 2 +- .../teleop}/g1_trihand_retargeting_example.py | 6 ++-- .../teleop}/gripper_retargeting_example.py | 6 ++-- .../gripper_retargeting_example_simple.py | 6 ++-- .../teleop}/isaac_lab_gripper_example.py | 2 +- .../teleop}/joint_space_device_example.py | 3 +- .../teleop}/locomotion_retargeting_example.py | 6 ++-- .../teleop}/se3_retargeting_example.py | 2 +- examples/teleop/python/pyproject.toml | 11 -------- src/plugins/so101_leader/README.md | 2 +- .../joint_space/joint_state_retargeter.py | 2 +- 27 files changed, 76 insertions(+), 44 deletions(-) create mode 100644 examples/teleop/pyproject.toml create mode 100644 examples/teleop/python/isaaccapture_examples/teleop/__init__.py rename examples/teleop/python/{ => isaaccapture_examples/teleop}/config/dex_retargeting/README.md (100%) rename examples/teleop/python/{ => isaaccapture_examples/teleop}/config/dex_retargeting/hand_left_config.yml (100%) rename examples/teleop/python/{ => isaaccapture_examples/teleop}/config/dex_retargeting/hand_right_config.yml (100%) rename examples/teleop/python/{ => isaaccapture_examples/teleop}/config/dex_retargeting/left_robot_hand.urdf (100%) rename examples/teleop/python/{ => isaaccapture_examples/teleop}/config/dex_retargeting/right_robot_hand.urdf (100%) rename examples/teleop/python/{ => isaaccapture_examples/teleop}/dex_bimanual_example.py (98%) rename examples/teleop/python/{ => isaaccapture_examples/teleop}/foot_pedal_locomotion_example.py (95%) rename examples/teleop/python/{ => isaaccapture_examples/teleop}/full_bimanual_reordering_example.py (98%) rename examples/teleop/python/{ => isaaccapture_examples/teleop}/g1_trihand_retargeting_example.py (94%) rename examples/teleop/python/{ => isaaccapture_examples/teleop}/gripper_retargeting_example.py (94%) rename examples/teleop/python/{ => isaaccapture_examples/teleop}/gripper_retargeting_example_simple.py (92%) rename examples/teleop/python/{ => isaaccapture_examples/teleop}/isaac_lab_gripper_example.py (96%) rename examples/teleop/python/{ => isaaccapture_examples/teleop}/joint_space_device_example.py (98%) rename examples/teleop/python/{ => isaaccapture_examples/teleop}/locomotion_retargeting_example.py (93%) rename examples/teleop/python/{ => isaaccapture_examples/teleop}/se3_retargeting_example.py (98%) delete mode 100644 examples/teleop/python/pyproject.toml diff --git a/docs/source/device/trackers.rst b/docs/source/device/trackers.rst index 98a54027fb..1e0280129c 100644 --- a/docs/source/device/trackers.rst +++ b/docs/source/device/trackers.rst @@ -233,8 +233,8 @@ axis inputs. Uses standard OpenXR action bindings. - Examples: - :code-file:`examples/retargeting/python/isaaccapture_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/isaaccapture_examples/teleop/locomotion_retargeting_example.py` + - :code-file:`examples/teleop/python/isaaccapture_examples/teleop/gripper_retargeting_example_simple.py` FullBodyTracker ~~~~~~~~~~~~~~~ @@ -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/isaaccapture_examples/teleop/foot_pedal_locomotion_example.py` .. note:: @@ -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/isaaccapture_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/isaaccapture_examples/teleop/gripper_retargeting_example_simple.py` +- :code-file:`examples/teleop/python/isaaccapture_examples/teleop/locomotion_retargeting_example.py` diff --git a/docs/source/getting_started/quick_start.rst b/docs/source/getting_started/quick_start.rst index 348fa07147..455550082d 100644 --- a/docs/source/getting_started/quick_start.rst +++ b/docs/source/getting_started/quick_start.rst @@ -100,7 +100,7 @@ env file and start the service with it: python -m isaaccapture.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 @@ -309,7 +309,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 isaaccapture_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: @@ -326,7 +326,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) diff --git a/docs/source/getting_started/teleop_session.rst b/docs/source/getting_started/teleop_session.rst index 6f098f070f..29d3885f07 100644 --- a/docs/source/getting_started/teleop_session.rst +++ b/docs/source/getting_started/teleop_session.rst @@ -456,7 +456,7 @@ Examples Complete Examples ^^^^^^^^^^^^^^^^^ -#. **Simplified Gripper Example**: ``examples/teleop/python/gripper_retargeting_example_simple.py`` +#. **Simplified Gripper Example**: ``examples/teleop/python/isaaccapture_examples/teleop/gripper_retargeting_example_simple.py`` -- Shows the minimal configuration approach and demonstrates auto-creation of input sources. diff --git a/docs/source/references/cloudxr.rst b/docs/source/references/cloudxr.rst index 9dd831a71c..d2d69b9d36 100644 --- a/docs/source/references/cloudxr.rst +++ b/docs/source/references/cloudxr.rst @@ -183,13 +183,13 @@ 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 isaaccapture.cloudxr.service start --accept-eula - python examples/teleop/python/gripper_retargeting_example_simple.py + python -m isaaccapture_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. diff --git a/docs/source/references/retargeting/index.rst b/docs/source/references/retargeting/index.rst index 31a9daa0a2..1a40174d98 100644 --- a/docs/source/references/retargeting/index.rst +++ b/docs/source/references/retargeting/index.rst @@ -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 diff --git a/docs/source/references/retargeting/joint_space.rst b/docs/source/references/retargeting/joint_space.rst index b329f9a217..d22dee2037 100644 --- a/docs/source/references/retargeting/joint_space.rst +++ b/docs/source/references/retargeting/joint_space.rst @@ -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 isaaccapture_examples.teleop.joint_space_device_example --launch-plugin --mode joint --frames 8 + $ python -m isaaccapture_examples.teleop.joint_space_device_example --launch-plugin --mode ee --urdf so101_new_calib.urdf Validate -------- diff --git a/examples/teleop/CMakeLists.txt b/examples/teleop/CMakeLists.txt index 94a93beb11..e681c36cde 100644 --- a/examples/teleop/CMakeLists.txt +++ b/examples/teleop/CMakeLists.txt @@ -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) diff --git a/examples/teleop/pyproject.toml b/examples/teleop/pyproject.toml new file mode 100644 index 0000000000..042331d4ad --- /dev/null +++ b/examples/teleop/pyproject.toml @@ -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 = "isaaccapture-examples-teleop" +version = "0.1.0" +description = "Isaac Teleop Retargeting Examples" +requires-python = ">=3.11,<3.14" +dependencies = [ + "isaaccapture[retargeters]", +] + +# `isaaccapture_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/isaaccapture_examples/teleop"] +sources = ["python"] diff --git a/examples/teleop/python/isaaccapture_examples/teleop/__init__.py b/examples/teleop/python/isaaccapture_examples/teleop/__init__.py new file mode 100644 index 0000000000..52a7a9daf0 --- /dev/null +++ b/examples/teleop/python/isaaccapture_examples/teleop/__init__.py @@ -0,0 +1,2 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 diff --git a/examples/teleop/python/config/dex_retargeting/README.md b/examples/teleop/python/isaaccapture_examples/teleop/config/dex_retargeting/README.md similarity index 100% rename from examples/teleop/python/config/dex_retargeting/README.md rename to examples/teleop/python/isaaccapture_examples/teleop/config/dex_retargeting/README.md diff --git a/examples/teleop/python/config/dex_retargeting/hand_left_config.yml b/examples/teleop/python/isaaccapture_examples/teleop/config/dex_retargeting/hand_left_config.yml similarity index 100% rename from examples/teleop/python/config/dex_retargeting/hand_left_config.yml rename to examples/teleop/python/isaaccapture_examples/teleop/config/dex_retargeting/hand_left_config.yml diff --git a/examples/teleop/python/config/dex_retargeting/hand_right_config.yml b/examples/teleop/python/isaaccapture_examples/teleop/config/dex_retargeting/hand_right_config.yml similarity index 100% rename from examples/teleop/python/config/dex_retargeting/hand_right_config.yml rename to examples/teleop/python/isaaccapture_examples/teleop/config/dex_retargeting/hand_right_config.yml diff --git a/examples/teleop/python/config/dex_retargeting/left_robot_hand.urdf b/examples/teleop/python/isaaccapture_examples/teleop/config/dex_retargeting/left_robot_hand.urdf similarity index 100% rename from examples/teleop/python/config/dex_retargeting/left_robot_hand.urdf rename to examples/teleop/python/isaaccapture_examples/teleop/config/dex_retargeting/left_robot_hand.urdf diff --git a/examples/teleop/python/config/dex_retargeting/right_robot_hand.urdf b/examples/teleop/python/isaaccapture_examples/teleop/config/dex_retargeting/right_robot_hand.urdf similarity index 100% rename from examples/teleop/python/config/dex_retargeting/right_robot_hand.urdf rename to examples/teleop/python/isaaccapture_examples/teleop/config/dex_retargeting/right_robot_hand.urdf diff --git a/examples/teleop/python/dex_bimanual_example.py b/examples/teleop/python/isaaccapture_examples/teleop/dex_bimanual_example.py similarity index 98% rename from examples/teleop/python/dex_bimanual_example.py rename to examples/teleop/python/isaaccapture_examples/teleop/dex_bimanual_example.py index 0612b8481a..d2b4b7bc10 100644 --- a/examples/teleop/python/dex_bimanual_example.py +++ b/examples/teleop/python/isaaccapture_examples/teleop/dex_bimanual_example.py @@ -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 """ diff --git a/examples/teleop/python/foot_pedal_locomotion_example.py b/examples/teleop/python/isaaccapture_examples/teleop/foot_pedal_locomotion_example.py similarity index 95% rename from examples/teleop/python/foot_pedal_locomotion_example.py rename to examples/teleop/python/isaaccapture_examples/teleop/foot_pedal_locomotion_example.py index 08c533e514..a31bfc0b32 100644 --- a/examples/teleop/python/foot_pedal_locomotion_example.py +++ b/examples/teleop/python/isaaccapture_examples/teleop/foot_pedal_locomotion_example.py @@ -30,7 +30,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" diff --git a/examples/teleop/python/full_bimanual_reordering_example.py b/examples/teleop/python/isaaccapture_examples/teleop/full_bimanual_reordering_example.py similarity index 98% rename from examples/teleop/python/full_bimanual_reordering_example.py rename to examples/teleop/python/isaaccapture_examples/teleop/full_bimanual_reordering_example.py index 2c7020225d..89aa901725 100644 --- a/examples/teleop/python/full_bimanual_reordering_example.py +++ b/examples/teleop/python/isaaccapture_examples/teleop/full_bimanual_reordering_example.py @@ -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 """ diff --git a/examples/teleop/python/g1_trihand_retargeting_example.py b/examples/teleop/python/isaaccapture_examples/teleop/g1_trihand_retargeting_example.py similarity index 94% rename from examples/teleop/python/g1_trihand_retargeting_example.py rename to examples/teleop/python/isaaccapture_examples/teleop/g1_trihand_retargeting_example.py index d20c043691..4a9174a644 100644 --- a/examples/teleop/python/g1_trihand_retargeting_example.py +++ b/examples/teleop/python/isaaccapture_examples/teleop/g1_trihand_retargeting_example.py @@ -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 """ @@ -26,7 +26,9 @@ from isaaccapture.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" diff --git a/examples/teleop/python/gripper_retargeting_example.py b/examples/teleop/python/isaaccapture_examples/teleop/gripper_retargeting_example.py similarity index 94% rename from examples/teleop/python/gripper_retargeting_example.py rename to examples/teleop/python/isaaccapture_examples/teleop/gripper_retargeting_example.py index c52a8ba83c..67ed3f396b 100644 --- a/examples/teleop/python/gripper_retargeting_example.py +++ b/examples/teleop/python/isaaccapture_examples/teleop/gripper_retargeting_example.py @@ -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 """ @@ -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" diff --git a/examples/teleop/python/gripper_retargeting_example_simple.py b/examples/teleop/python/isaaccapture_examples/teleop/gripper_retargeting_example_simple.py similarity index 92% rename from examples/teleop/python/gripper_retargeting_example_simple.py rename to examples/teleop/python/isaaccapture_examples/teleop/gripper_retargeting_example_simple.py index ebd6e029fa..82601331ba 100644 --- a/examples/teleop/python/gripper_retargeting_example_simple.py +++ b/examples/teleop/python/isaaccapture_examples/teleop/gripper_retargeting_example_simple.py @@ -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 """ @@ -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" diff --git a/examples/teleop/python/isaac_lab_gripper_example.py b/examples/teleop/python/isaaccapture_examples/teleop/isaac_lab_gripper_example.py similarity index 96% rename from examples/teleop/python/isaac_lab_gripper_example.py rename to examples/teleop/python/isaaccapture_examples/teleop/isaac_lab_gripper_example.py index c6a3a3ee71..1589358129 100644 --- a/examples/teleop/python/isaac_lab_gripper_example.py +++ b/examples/teleop/python/isaaccapture_examples/teleop/isaac_lab_gripper_example.py @@ -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 """ diff --git a/examples/teleop/python/joint_space_device_example.py b/examples/teleop/python/isaaccapture_examples/teleop/joint_space_device_example.py similarity index 98% rename from examples/teleop/python/joint_space_device_example.py rename to examples/teleop/python/isaaccapture_examples/teleop/joint_space_device_example.py index 70fbd4dd58..73de69a199 100644 --- a/examples/teleop/python/joint_space_device_example.py +++ b/examples/teleop/python/isaaccapture_examples/teleop/joint_space_device_example.py @@ -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" ) diff --git a/examples/teleop/python/locomotion_retargeting_example.py b/examples/teleop/python/isaaccapture_examples/teleop/locomotion_retargeting_example.py similarity index 93% rename from examples/teleop/python/locomotion_retargeting_example.py rename to examples/teleop/python/isaaccapture_examples/teleop/locomotion_retargeting_example.py index 14efd9dba2..7040452dba 100644 --- a/examples/teleop/python/locomotion_retargeting_example.py +++ b/examples/teleop/python/isaaccapture_examples/teleop/locomotion_retargeting_example.py @@ -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 """ @@ -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" diff --git a/examples/teleop/python/se3_retargeting_example.py b/examples/teleop/python/isaaccapture_examples/teleop/se3_retargeting_example.py similarity index 98% rename from examples/teleop/python/se3_retargeting_example.py rename to examples/teleop/python/isaaccapture_examples/teleop/se3_retargeting_example.py index 47b7c9b02b..d68e4606e4 100644 --- a/examples/teleop/python/se3_retargeting_example.py +++ b/examples/teleop/python/isaaccapture_examples/teleop/se3_retargeting_example.py @@ -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 """ diff --git a/examples/teleop/python/pyproject.toml b/examples/teleop/python/pyproject.toml deleted file mode 100644 index e2e359259e..0000000000 --- a/examples/teleop/python/pyproject.toml +++ /dev/null @@ -1,11 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -[project] -name = "teleop-examples" -version = "0.1.0" -description = "Isaac Teleop Retargeting Examples" -requires-python = ">=3.11,<3.14" -dependencies = [ - "isaaccapture[retargeters]", -] diff --git a/src/plugins/so101_leader/README.md b/src/plugins/so101_leader/README.md index 20c9e4c09c..e89d05e9a5 100644 --- a/src/plugins/so101_leader/README.md +++ b/src/plugins/so101_leader/README.md @@ -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/isaaccapture_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`. diff --git a/src/python/isaaccapture/retargeters/joint_space/joint_state_retargeter.py b/src/python/isaaccapture/retargeters/joint_space/joint_state_retargeter.py index 0654f67248..5c5429e455 100644 --- a/src/python/isaaccapture/retargeters/joint_space/joint_state_retargeter.py +++ b/src/python/isaaccapture/retargeters/joint_space/joint_state_retargeter.py @@ -18,7 +18,7 @@ The output element names are chosen so a downstream :class:`~isaaccapture.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/isaaccapture_examples/teleop/joint_space_device_example.py`` for an end-to-end reference. """