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
12 changes: 5 additions & 7 deletions docs/source/device/sharpa_avatar.rst
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ Sharpa AvatarExo Glove
======================

A Linux-only plugin for integrating Sharpa AvatarExo (AE) Gloves into the
Isaac Teleop framework. The gloves stream IMU and encoder data through the
official Avatar SDK over USB. The plugin maps that stream into Isaac Teleop's
usual surfaces: OpenXR hand tracking for the HUMAN skeleton,
Isaac Teleop framework. The gloves stream IMU and encoder data wirelessly
through a USB dongle and the official Avatar SDK. The plugin maps that stream
into Isaac Teleop's usual surfaces: OpenXR hand tracking for the HUMAN skeleton,
``JointStateOutput`` tensors for the RAW and ROBOT 22-DoF joint sets, and
inbound per-finger vibration on a haptic collection.

Expand All @@ -33,7 +33,7 @@ named joint-state collections:

.. code-block:: text

Sharpa AvatarExo Gloves (USB)
Sharpa AvatarExo Gloves (wireless via USB dongle)
│
▼
avatar_hand_plugin (Avatar SDK, production package)
Expand All @@ -56,9 +56,7 @@ Prerequisites
- **Pinned production Avatar SDK** (``avatar-sdk`` 1.7.3-17) from Sharpa's
signed APT repository. ``install_avatar_sdk.sh`` retrieves it; do not substitute
``avatar-sdk-dev`` or ``avatar-sdk-beta``.
- **Sharpa AvatarExo Gloves** powered and connected over USB. Transport settings
are selected in ``<sdk-root>/share/sdk_config.json`` (default root
``/opt/avatar-sdk``).
- **Sharpa AvatarExo Gloves** powered and paired with the USB wireless dongle.
- **CloudXR runtime** on the plugin host, unless a ``TeleopSession`` example
launches it for you.
- A built Isaac Teleop checkout. CMake 3.24 or newer is required.
Expand Down
6 changes: 6 additions & 0 deletions examples/sharpa_avatar/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,14 @@ above first. `uv pip install -e` pulls `viser`; CloudXR comes from the
--no-launch-cloudxr-runtime connect to an already running CloudXR runtime
--world-frame display the unmodified OpenXR poses
--plugin-search-path DIR directory that contains sharpa_avatar/
--sdk-config FILE Avatar SDK configuration file
--datasets LIST comma-separated human,raw,robot,haptic selection
```

All four datasets and haptics are enabled by default, so they do not need to be
listed for a normal run. The supported workflow uses the USB dongle for a
wireless glove connection. This plugin does not accept a `--transport` option.

## Behavior

`live_view.py` launches the plugin through `TeleopSession`, reads `/hand/left`
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -157,8 +157,8 @@ def _finger_chain(root: int, *joints: int) -> list[tuple[int, int]]:
HandJointIndex.WRIST,
HandJointIndex.LITTLE_METACARPAL,
HandJointIndex.LITTLE_PROXIMAL,
HandJointIndex.LITTLE_INTERMEDIATE,
HandJointIndex.LITTLE_DISTAL,
# Avatar HUMAN has no little intermediate/distal landmarks; connect
# the real proximal and tip poses directly for display.
HandJointIndex.LITTLE_TIP,
)
)
Expand Down
16 changes: 13 additions & 3 deletions src/plugins/sharpa_avatar/AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ SPDX-FileCopyrightText: Copyright (c) 2025-2026 Avatar SDK contributors. All rig
SPDX-License-Identifier: Apache-2.0
-->

# Sharpa Avatar plugin — agent notes
# Sharpa AvatarExo plugin — agent notes

**CRITICAL:** Before editing this tree, read this file and the repo root
[`AGENTS.md`](../../../AGENTS.md).
Expand Down Expand Up @@ -34,6 +34,9 @@ SPDX-License-Identifier: Apache-2.0
- Installers must not delete files derived from a configured install prefix.
- Do not mutate loader environment variables or SDK configuration at runtime.
Runtime paths come from the selected SDK root and its `sdk_config.json`.
- Document the supported user workflow as wireless through the USB dongle. Do
not advertise wired, Ethernet, USB Type-C, or SDK link names outside focused
diagnostics.
- Carry Avatar SDK enums such as `DeviceSide` and `DeviceDataCategory` through
plugin internals; convert only at an existing external API boundary.
- Adapt this plugin to shared APIs; do not refactor other plugins or shared
Expand All @@ -48,11 +51,18 @@ SPDX-License-Identifier: Apache-2.0
- OpenXR setup is required for publication; initialization errors must abort
construction instead of leaving an Avatar-only idle plugin.
- Keep initialization non-blocking; `update()` owns retries for absent gloves.
- Reconcile glove handles from the SDK manager's discovery inventory, not the
handle's cached `online` snapshot. Gate publication and haptics on a fresh
ingress callback; do not add transport-specific parameter probes for liveness.
- Keep each side's HUMAN injector and RAW/ROBOT collections alive only while
that glove is streaming; destroy them on disconnect and recreate them after
fresh ingress so consumers cannot retain stale online data.
- Keep the static HUMAN-to-OpenXR index table synchronized with the pinned
production SDK's landmark order. Do not read joint names from
`sdk_config.json` at runtime or fill unsupported OpenXR slots with neighbouring
poses. Refresh that table and the example's RAW/ROBOT name snapshots together
with the package pin.
poses. Publish RAW/ROBOT with their pinned semantic name tables, never the
SDK frame's positional `joint_<index>` names. Refresh those tables and the
example's RAW/ROBOT name snapshots together with the package pin.
- When reconciling the maintained feature branch, use it as the baseline and
retain local divergence only for an explicit API or correctness requirement.
- Keep this plugin tree C++-only (`core/` + `app/`). The TeleopSession sample
Expand Down
8 changes: 5 additions & 3 deletions src/plugins/sharpa_avatar/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ The visualization example is separate:

- Linux x86_64 (Ubuntu 22.04)
- A built Isaac Teleop checkout
- Sharpa AvatarExo Gloves connected through a USB dongle or USB cable
- Sharpa AvatarExo Gloves connected wirelessly through the USB dongle

`install_avatar_sdk.sh` retrieves a pinned production `avatar-sdk` version from Sharpa's
signed production APT repository, without selecting the `avatar-sdk-dev` or
Expand Down Expand Up @@ -72,8 +72,10 @@ or dongle:
udev does not run inside containers, so this command must run on the host.
The plugin follows the Sharpa host application layout and uses the SDK,
configuration, and runtime assets directly from the selected SDK root
(`AVATAR_SDK_ROOT`, default `/opt/avatar-sdk`). Transport selection, including
wired Ethernet, is controlled by `<sdk-root>/share/sdk_config.json`.
(`AVATAR_SDK_ROOT`, default `/opt/avatar-sdk`). The supported workflow uses the
USB dongle for a wireless glove connection. This plugin does not accept a
`--transport` option and must not run concurrently with `avatar-backend` or
Avatar Desktop.

## Run

Expand Down
Loading