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
8 changes: 5 additions & 3 deletions docs/AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -92,9 +92,11 @@ third-party. `partner_grid.PROJECT_REPO` is the one place that boundary is writt
## Ecosystem section headings need an explicit target

The count pill is part of the heading text, so the auto-generated slug carries the number:
`#partners` becomes `#partners-15` and changes whenever a card is added or removed. Every
section on that page therefore gets a `.. _label:` target, which is what inbound links
and `#supported-input-devices` rely on. Add one with any new section.
`#partners` picks up whatever the count currently is and changes whenever a card is
added or removed — which is exactly why no number is quoted here. Every
section whose heading carries a count pill therefore gets a `.. _label:` target, which is
what inbound links and `#supported-input-devices` rely on. Add one with any new counted
section (`Become a Partner` has no pill and needs none).

## Never wrap styled layout in `.. container::`

Expand Down
7 changes: 4 additions & 3 deletions docs/source/device/manus.rst
Original file line number Diff line number Diff line change
Expand Up @@ -100,9 +100,10 @@ Expected directory layout after placing the SDK:
main.cpp
core/
manus_hand_tracking_plugin.cpp
inc/
core/
manus_hand_tracking_plugin.hpp
inc/
manus/
manus_glove_collection.hpp
manus_hand_tracking_plugin.hpp
tools/
manus_hand_tracker_printer.cpp
ManusSDK/ <-- placed here
Expand Down
10 changes: 5 additions & 5 deletions docs/source/device/trackers.rst
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,7 @@ HeadTracker
Tracks the HMD head pose via the OpenXR view space.

- Schema: :code-file:`src/core/schema/fbs/head.fbs`
- C++ header: ``#include <deviceio/head_tracker.hpp>``
- C++ header: ``#include <deviceio_trackers/head_tracker.hpp>``
- Python import: ``from isaacteleop.deviceio import HeadTracker``
- Record channels: ``head`` | MCAP schema: ``core.HeadPoseRecord``
- Tests:
Expand All @@ -199,7 +199,7 @@ Tracks articulated hand joints (26 joints per hand, following the OpenXR
``XrHandJointEXT`` ordering) using the ``XR_EXT_hand_tracking`` extension.

- Schema: :code-file:`src/core/schema/fbs/hand.fbs`
- C++ header: ``#include <deviceio/hand_tracker.hpp>``
- C++ header: ``#include <deviceio_trackers/hand_tracker.hpp>``
- Python import: ``from isaacteleop.deviceio import HandTracker``
- Record channels: ``left_hand``, ``right_hand`` | MCAP schema: ``core.HandPoseRecord``
- Tests:
Expand All @@ -221,7 +221,7 @@ Tracks both left and right controllers -- grip and aim poses, plus button and
axis inputs. Uses standard OpenXR action bindings.

- Schema: :code-file:`src/core/schema/fbs/controller.fbs`
- C++ header: ``#include <deviceio/controller_tracker.hpp>``
- C++ header: ``#include <deviceio_trackers/controller_tracker.hpp>``
- Python import: ``from isaacteleop.deviceio import ControllerTracker``
- Record channels: ``left_controller``, ``right_controller`` | MCAP schema: ``core.ControllerSnapshotRecord``
- Tests:
Expand Down Expand Up @@ -301,9 +301,9 @@ collections. Uses the :code-file:`SchemaTracker <src/core/live_trackers/cpp/inc/
utility internally.

- Schema: :code-file:`src/core/schema/fbs/pedals.fbs`
- C++ header: ``#include <deviceio/generic_3axis_pedal_tracker.hpp>``
- C++ header: ``#include <deviceio_trackers/generic_3axis_pedal_tracker.hpp>``
- Python import: ``from isaacteleop.deviceio import Generic3AxisPedalTracker``
- Record channels: ``pedals`` | MCAP schema: ``core.Generic3AxisPedalOutputRecord``
- Record channels: ``pedals``, ``pedals_tracked`` | MCAP schema: ``core.Generic3AxisPedalOutputRecord``
- Tests:

- :code-file:`tests/cpp/core/schema/test_pedals.cpp`
Expand Down
4 changes: 2 additions & 2 deletions 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/retargeting/python/gripper_retargeting_simple.py``
#. **Simplified Gripper Example**: ``examples/teleop/python/gripper_retargeting_example_simple.py``
-- Shows the minimal configuration approach and demonstrates auto-creation
of input sources.

Expand All @@ -462,7 +462,7 @@ Before vs After
required_extensions = deviceio.DeviceIOSession.get_required_extensions([controller_tracker])

# Create OpenXR session
oxr_session = oxr.OpenXRSession.create("MyApp", required_extensions)
oxr_session = oxr.OpenXRSession("MyApp", required_extensions)
oxr_session.__enter__()

# Create DeviceIO session
Expand Down
4 changes: 2 additions & 2 deletions docs/source/overview/ecosystem.rst
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,8 @@ acquisition channel.
Built and used inside NVIDIA

.. Explicit targets on every section below: the count pill is part of the heading text,
so without them the slug carries the count and #partners becomes #partners-15,
changing every time a card is added or removed.
so without them the slug carries the count and #partners picks up whatever that count
currently is, changing every time a card is added or removed.

.. _nvidia-platforms:

Expand Down
2 changes: 1 addition & 1 deletion docs/source/references/build.rst
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ The layout below reflects the actual ``CMakeLists.txt`` hierarchy (root ``CMakeL
CMake integration
-----------------

The project uses a modern CMake target-based approach. Libraries export targets (e.g. OXR, DEVICEIO, schema); include directories are propagated. Package config files are generated for use after install. See the respective ``CMakeLists.txt`` in ``src/core`` and under ``examples/`` for target names and usage.
The project uses a modern CMake target-based approach. Libraries export namespaced alias targets (e.g. ``oxr::oxr_core``, ``deviceio::deviceio_session``, ``isaacteleop_schema``); include directories are propagated. Package config files are generated for use after install. See the respective ``CMakeLists.txt`` in ``src/core`` and under ``examples/`` for target names and usage.

Using the Python wheel
----------------------
Expand Down
3 changes: 2 additions & 1 deletion docs/source/references/retargeting/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -356,7 +356,8 @@ If the built-in retargeters do not cover your use case, you can implement a cust
`Isaac Teleop repository <https://github.com/NVIDIA/IsaacTeleop>`_:

#. Inherit from ``BaseRetargeter`` and implement ``input_spec()``, ``output_spec()``, and
``compute()``.
``_compute_fn()``. (``compute()`` is concrete on the base class — it fills optional inputs
and syncs parameters, then calls your ``_compute_fn()``.)
#. Optionally add a ``ParameterState`` for parameters that should be live-tunable via the
retargeter tuning UI.
#. Connect to existing source nodes (``HandsSource``, ``ControllersSource``) or create a new
Expand Down
2 changes: 1 addition & 1 deletion src/core/AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ If work under **`src/core/`** went wrong—**user** correction, **pre-commit/CI*
- When changing `TeleopSession` retargeting execution defaults, update config, docs, and default-behavior tests together so opt-in vs. default semantics stay aligned.
- Preserve existing `TeleopSession` lifecycle flag semantics unless changing the public/context-manager contract intentionally; use tests to lock down cleanup details before altering them.
- After Python test or session-manager edits, let `ruff format`/pre-commit own wrapping and rerun the hook when it modifies files.
- **`IDeviceIOSource` leaves are only discovered when reachable from a declared `OutputCombiner` output.** `TeleopSession._discover_sources` calls `pipeline.get_leaf_nodes()`, which walks back from the combiner's outputs. An input *source* whose only purpose is a side effect (e.g. message-channel send) must therefore expose at least one output (a heartbeat boolean is the established pattern) **and** the user's combiner must include it; silent no-discovery is the recurring footgun. **Output `IDeviceIOSink` nodes are different:** they are registered via `TeleopSessionConfig(sinks=[...])` and the session runs and flushes them explicitly each frame, so a sink needs no heartbeat output and no `OutputCombiner` reachability.
- **`IDeviceIOSource` leaves are only discovered when reachable from a declared graph root** — the `pipeline` combiner's outputs, the `teleop_control_pipeline`, or a subgraph registered in `TeleopSessionConfig(sinks=[...])`. `TeleopSession._discover_sources` unions the leaves of all three. An input *source* whose only purpose is a side effect (e.g. message-channel send) must therefore expose at least one output (a heartbeat boolean is the established pattern) **and** be reachable from one of those roots; silent no-discovery is the recurring footgun. **Output `IDeviceIOSink` nodes are different:** they are registered via `TeleopSessionConfig(sinks=[...])` and the session runs and flushes them explicitly each frame, so a sink needs no heartbeat output and no `OutputCombiner` reachability.
- **Run `clang-format` on touched C++ before pushing** — CI rejects unformatted C++ and pre-commit does not catch it. See the formatting instructions in the repo root [`AGENTS.md`](../../AGENTS.md) ("Pre-commit — match CI before you stop") for the exact commands; the source of truth lives there, not here.
- **Authored `.py` under `src/python/isaacteleop/` carries no build-system registration.** The `CONFIGURE_DEPENDS` glob in ``src/python/CMakeLists.txt`` stages every `.py` there and `[tool.setuptools.packages.find]` discovers the packages, so a subpackage is a directory with an `__init__.py` and nothing else — no packages list, no `DEPENDS` entry. Targets that *produce* files in the staging tree (pybind ``.so``/``.pyd``, ``isaacteleop_python`` copies, ``stage_generated_tracker_exports``, ``viz_py``, vendored runtimes, …) must be **dependencies of** ``python_package`` (``DEPENDS`` / ``add_dependencies(python_package …)`` in ``src/core/python/CMakeLists.txt``), not the other way around — otherwise Windows ninja races the wheel build and setuptools fails with ``error: package directory 'isaacteleop\\<name>' does not exist``. **``python_package`` waits for ``viz_py`` when ``BUILD_VIZ=ON``** (``.pyd`` link race). **Central stubgen** in ``src/core/python/CMakeLists.txt`` (not a ``viz_py`` POST_BUILD) DEPENDS on ``python_package``, so ``stage_generated_tracker_exports`` must stay on ``python_package``'s DEPENDS — otherwise stubbing ``isaacteleop.viz._viz`` (or any module that loads ``isaacteleop/__init__.py``) fails on the missing export. **For ``pip install -e .`` (scikit-build-core), ``_generated_tracker_exports.py`` must also be ``install(FILES ...)`` under ``isaacteleop_wheel``** — the directory install excludes ``*.py`` so authored sources stay redirect-resolved, but that module is not under ``src/python/``.
- **Schema-based tracker sources exist only in a configured build tree.** They are generated at CMake *configure* time from `deviceio_trackers/trackers.toml` into `${CMAKE_BINARY_DIR}/generated/trackers/`, so grepping `src/` for a tracker such as `Se3Tracker` finds the manifest entry and the generator, not a `.cpp`. Searching, debugging, and clangd all need `cmake -B build` to have run first (already true for the `flatc` output). See [`deviceio_trackers/AGENTS.md`](deviceio_trackers/AGENTS.md) and [`codegen/AGENTS.md`](codegen/AGENTS.md) before adding or editing a tracker.
Expand Down
6 changes: 4 additions & 2 deletions src/core/deviceio_trackers/AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,9 @@ in **[`trackers.toml`](trackers.toml)** and generated at configure time by
under `${CMAKE_BINARY_DIR}/generated/trackers/`, **not** in `cpp/`.

- **Adding one is a manifest edit**, not a new source file: `name` and `table` are required, every
other key has a `%placeholder%` default in [`defaults.toml`](defaults.toml). Override a key only
other key has a default in [`defaults.toml`](defaults.toml) — most derive from `name` through
`%placeholder%` substitution, a few (`direction`, `record`, `max_flatbuffer_size`, …) are plain
constants. Override a key only
where the convention genuinely does not hold (`se3_tracker` sets `class`; `generic_3axis_pedal`
sets `schema` because its `.fbs` is `pedals.fbs`; `frame_metadata_oak` sets `header` so the
public `#include` stem stays `frame_metadata_tracker_oak`).
Expand All @@ -27,7 +29,7 @@ under `${CMAKE_BINARY_DIR}/generated/trackers/`, **not** in `cpp/`.
blocks, MCAP recording traits, and the Python `__all__` are emitted as `.inc` fragments that the
hand-written files `#include`; adding a row yourself produces a duplicate definition.
- **`__init__.py` needs no edit for new manifest trackers.**
[`../../../python/isaacteleop/deviceio_trackers/__init__.py`](../../../python/isaacteleop/deviceio_trackers/__init__.py)
[`../../python/isaacteleop/deviceio_trackers/__init__.py`](../../python/isaacteleop/deviceio_trackers/__init__.py)
star-imports `_generated_tracker_exports` (staged from configure-time codegen into the wheel
tree; for scikit-build-core / editable installs it is also installed via ``isaacteleop_wheel``
because it is not authored under ``src/python/``) and splices its ``__all__``. The legacy `isaacteleop.deviceio` shim is a **frozen** compat
Expand Down
4 changes: 2 additions & 2 deletions src/core/replay_trackers/AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ SPDX-License-Identifier: Apache-2.0
Replay impls for trackers declared in
[`../deviceio_trackers/trackers.toml`](../deviceio_trackers/trackers.toml) are emitted into
`${CMAKE_BINARY_DIR}/generated/trackers/replay_trackers/`. Only the hand-written trackers
(`head`, `hand`, `controller`, `full_body`, `message_channel`, `TensorPushTracker`) have `.cpp`
files in this directory.
(`head`, `hand`, `controller`, `full_body`, `message_channel`, `haptic_command_reader`,
`TensorPushTracker`) have `.cpp` files in this directory.

- `replay_deviceio_factory.{hpp,cpp}` stays hand-written but `#include`s generated `.inc` fragments
for the manifest trackers' forward decls, try-create thunks, dispatch rows, and factory methods.
Expand Down
Loading