Repository navigation
Add tactile schemas, trackers, bindings and sources #1242
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
45 commits
Select commit
Hold shift + click to select a range
3e57a95
Add tactile schemas, trackers, bindings and sources
lotusl-code 7ff1680
Add tactile pusher and feeder example
lotusl-code 24b547d
Copy the tactile shape out of TactileSource
lotusl-code dfa2891
Describe TactileDataRecord without a nonexistent serialize_all()
lotusl-code e9d43b1
Describe the TactileShape test fixture as it is built
lotusl-code aee5aa8
Improve schema to be extensible
lotusl-code 5348889
Variable naming
lotusl-code 306ee09
Make fields required
lotusl-code c38ddd9
Validate tactile metadata before adoption and recording
lotusl-code e95d1d9
Fix tactile layout NumPy type inference
lotusl-code 52efcbe
Reject out-of-range tactile segment indices
lotusl-code 695a7e9
Preserve HandJoint types in tactile metadata bindings
lotusl-code 898b765
Clarify tactile example OpenXR system requirement
lotusl-code 5181e65
Remove unrelated maintenance from tactile schema PR
lotusl-code 3570b33
Dispatch metadata semantic validation through the schema layer
lotusl-code 899238b
Remove one-off review notes from agent guidance
lotusl-code 7ffcd3a
Document tactile coordinate conventions and data flow
lotusl-code 3791111
Apply suggestion from @aristarkhovNV
lotusl-code c7dca68
Preserve metadata validation across tensor collection recreation
lotusl-code fb817ca
Expose default tracker buffer sizes to Python
lotusl-code 1434c2a
Separate tactile segment indices from hand joint ordinals
lotusl-code ee5ed74
Simplify tactile feeder context management
lotusl-code 8214cab
Apply reviews on docs and example
lotusl-code 9a418fb
Only verify metadata once at first reception
lotusl-code f7e2333
Validate replay tracker metadata semantics
lotusl-code 71b8d1d
Report specific tactile metadata validation errors
lotusl-code c6ad2c7
Validate tactile bind pose finiteness and quaternion norms
lotusl-code f63878a
Extract UInt4 and Float4 into standalone schemas
lotusl-code da9b523
Share tactile metadata validation with Python constructors
lotusl-code 9a96775
Require tactile forces and record payloads
lotusl-code a498d6e
Cache tactile layouts by metadata buffer
lotusl-code 6246731
Apply reviews to tests
lotusl-code a25e228
Move tactile group types into tensor_types
lotusl-code 38e89db
Move tactile layout indices into tensor_types.indices
lotusl-code 27f2d04
Name tactile data and metadata input slots
lotusl-code 1535320
Key cached tactile layout arrays by named output slots
lotusl-code 1b2b4a5
Centralize metadata validation error context
lotusl-code 999dcff
Store tensor collection index and identity together
lotusl-code dcb563a
Allow tactile records without a data payload
lotusl-code 8f372cc
Keep tactile layout cache state in one optional tuple
lotusl-code 181a4b2
Remove redundant definition of TactileLBSLayoutIndex
lotusl-code 163ea48
Derive DeviceIO tactile indices from their tensor group
lotusl-code 8fb5a11
Refine tactile schema test coverage and fixtures
lotusl-code e94042e
Remove unreachable tactile feeder fallback paths
lotusl-code 453e4ec
Clarify tactile consumer buffer sizing
lotusl-code File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,7 @@ | ||
| # SPDX-FileCopyrightText: Copyright (c) 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/tactile) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,56 @@ | ||
| <!-- | ||
| SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | ||
| SPDX-License-Identifier: Apache-2.0 | ||
| --> | ||
|
|
||
| # Tactile | ||
|
|
||
| A mock tactile device and a consumer for exercising the tactile tracker without tactile hardware. | ||
|
|
||
| - `feeder` publishes a 26-joint hand with 200 taxels by default. Each frame carries one | ||
| `TactileDataArray`; it publishes `TactileMetadata` when it starts and every second after that. | ||
| It publishes through `TensorPushTracker` on a `DeviceIOSession`, as a tactile plugin would | ||
| through `SchemaPusher`. | ||
| - `printer` reads one `TactileTracker` directly. It discovers the joint and taxel counts from | ||
| `TactileMetadata`, prints the first and last taxel forces, and records the session to MCAP. | ||
|
|
||
| ```text | ||
| feeder -> "tactile" (TactileDataArray, every frame) | ||
| -> "tactile/metadata" (TactileMetadata, at start and every --metadata-interval s) | ||
| -> TactileTracker -> printer, and tactile/* MCAP channels | ||
| ``` | ||
|
|
||
| Install the example: | ||
|
|
||
| ```bash | ||
| uv pip install -e ./examples/tactile | ||
| ``` | ||
|
|
||
| Start the printer first; it starts the CloudXR runtime. Live initialization requires an | ||
| OpenXR HMD system; if none is available, it waits for a headset client to connect: | ||
|
|
||
| ```bash | ||
| python -m isaaccapture_examples.tactile.printer --accept-eula --duration 0 | ||
| ``` | ||
|
|
||
| Then, in another terminal, start the feeder. It attaches to the same runtime: | ||
|
|
||
| ```bash | ||
| python -m isaaccapture_examples.tactile.feeder | ||
| ``` | ||
|
|
||
| Stop the printer with `Ctrl+C`; it writes `./recordings/tactile_<timestamp>.mcap`. Print a | ||
| recording with no runtime at all: | ||
|
|
||
| ```bash | ||
| python -m isaaccapture_examples.tactile.printer --replay recordings/tactile_<timestamp>.mcap | ||
| ``` | ||
|
|
||
| Use feeder options `--joints` and `--taxels` to change the shape; the printer discovers both | ||
| counts from metadata. The `TactileMetadata` must fit `TRACKER_METADATA_MAX_SIZE`. | ||
| The two processes need only agree on `--collection-id`. | ||
|
|
||
| Metadata contains an ordered `HandSkeletonRef` and an `LBS` binding. Segment indices address | ||
| that joint list, not OpenXR ordinals. Python pose arrays have seven columns: position XYZ in | ||
| meters followed by unit quaternion XYZW; per-frame force components are in taxel-local axes | ||
| and measured in newtons. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,23 @@ | ||
| # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | ||
| # SPDX-License-Identifier: Apache-2.0 | ||
|
|
||
| [build-system] | ||
| requires = ["hatchling"] | ||
| build-backend = "hatchling.build" | ||
|
|
||
| [project] | ||
| name = "isaaccapture-examples-tactile" | ||
| version = "0.0.0" | ||
| description = "Isaac Teleop tactile feeder and printer" | ||
| requires-python = ">=3.11,<3.14" | ||
| dependencies = [ | ||
| "isaaccapture[cloudxr]", | ||
| "numpy>=1.23.0", | ||
| ] | ||
|
|
||
| [tool.hatch.build.targets.wheel] | ||
| only-include = ["python/isaaccapture_examples/tactile"] | ||
| sources = ["python"] | ||
|
|
||
| [tool.uv.sources] | ||
| isaaccapture = { path = "../..", editable = true } |
2 changes: 2 additions & 0 deletions
2
examples/tactile/python/isaaccapture_examples/tactile/__init__.py
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 |
6 changes: 6 additions & 0 deletions
6
examples/tactile/python/isaaccapture_examples/tactile/common.py
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,6 @@ | ||
| # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | ||
| # SPDX-License-Identifier: Apache-2.0 | ||
|
|
||
| """Values the feeder and the printer must agree on.""" | ||
|
|
||
| DEFAULT_COLLECTION_ID = "tactile" |
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.