Skip to content

Manus plugin: HMD hand tracking, installer, docs, and visualizer#431

Open
jiwenc-nv wants to merge 2 commits intoNVIDIA:mainfrom
jiwenc-nv:manus/hmd-hand-tracking-rebased
Open

Manus plugin: HMD hand tracking, installer, docs, and visualizer#431
jiwenc-nv wants to merge 2 commits intoNVIDIA:mainfrom
jiwenc-nv:manus/hmd-hand-tracking-rebased

Conversation

@jiwenc-nv
Copy link
Copy Markdown
Collaborator

@jiwenc-nv jiwenc-nv commented Apr 29, 2026

Use HMD hand tracking when available to position the hands, with the existing tracker-based pose as a fallback. The hand-tracking plugin is substantially reworked: detection of an OpenXR hand-tracking extension at init time, conditional pose composition, and updated public types.

Tooling:

  • Add an install_manus.sh helper and a 70-manus-hid.rules udev rule. After review, the full installer was scaled back so the rule file is the abstracted, distributable artifact and the script focuses on bootstrapping the supported manual-setup path.
  • Expand the tracker printer into a visualizer (manus_hand_visualizer.hpp) for inspecting tracker output, and clarify the CLI usage. Remove the obsolete Isaac Lab start script.

Documentation:

  • Convert the Manus README to reStructuredText and add it to the device docs index (docs/source/device/manus.rst), with clarifications to the manual setup flow and updated log/installation guidance.

Core fix:

  • Declare xrEnumerateInstanceExtensionProperties alongside xrGetInstanceProcAddr under XR_NO_PROTOTYPES in oxr_funcs, so the Manus plugin can enumerate supported OpenXR extensions at init time without a compile error when prototypes are suppressed.

Quality:

  • clang-format and pre-commit linting passes across the touched files.
  • Address CodeRabbit and GitHub Copilot review feedback.

Summary by CodeRabbit

Release Notes

  • New Features

    • Added Manus gloves device integration with automated installation script
    • Added hand visualization tool featuring real-time skeleton rendering
    • Added optical hand tracking support for Quest 3
  • Documentation

    • Added comprehensive Manus setup guide covering prerequisites, installation workflows, runtime configuration, and troubleshooting

@jiwenc-nv jiwenc-nv requested a review from aristarkhovNV April 29, 2026 07:21
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 29, 2026

Important

Review skipped

Auto incremental reviews are disabled on this repository.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 310f4ff9-545b-4896-ad60-01b3a181bfa3

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

This pull request adds comprehensive Manus Gloves device integration to the Isaac Teleop framework. It introduces XDev optical hand tracking support with OpenXR extension integration and automatic fallback to controller pose when optical tracking is unavailable. The changes include a new Vulkan-based hand skeleton visualizer rendered in real-time via X11, an automated installer script that downloads the SDK, configures system permissions, and builds/installs components, updated documentation covering installation and troubleshooting, new public APIs to query hand skeleton topology, and CMake component tagging for organized installation. Supporting changes include udev rules for device access permissions, a diagnostic CLI tool that prints joint data and displays the visualizer, and OpenXR function declarations for extension enumeration.

Sequence Diagram

sequenceDiagram
    actor User
    participant ManusTrkr as ManusTracker<br/>(Main Plugin)
    participant OpenXR as OpenXR<br/>(Session)
    participant XDev as XDev API<br/>(Optical Tracking)
    participant CtrlFB as Controller<br/>(Fallback)
    
    User->>ManusTrkr: update() per frame
    ManusTrkr->>XDev: update_xdev_hand(Hand::LEFT)
    alt XDev has valid wrist pose
        XDev-->>ManusTrkr: return wrist_pose + TRACKED
    else XDev unavailable or stale
        XDev-->>ManusTrkr: return nullptr/stale
        ManusTrkr->>CtrlFB: fetch left controller pose
        CtrlFB-->>ManusTrkr: controller_pose
        ManusTrkr->>ManusTrkr: use controller as fallback
    end
    
    ManusTrkr->>OpenXR: inject selected wrist pose<br/>+ set TRACKED bit
    OpenXR-->>ManusTrkr: acknowledge
    ManusTrkr-->>User: hand pose ready for OpenXR
    
    User->>User: Visualizer thread polls update()
    User->>User: Builds vertex data from skeleton nodes
    User->>User: Renders via Vulkan on X11 surface
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~75 minutes

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 45.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title comprehensively summarizes the main changes: HMD hand tracking support, installer script, documentation, and visualizer tool for the Manus plugin.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Comment @coderabbitai help to get the list of available commands and usage tips.

@jiwenc-nv
Copy link
Copy Markdown
Collaborator Author

Squashed and rebased: #235

@jiwenc-nv jiwenc-nv requested a review from rwiltz April 29, 2026 07:23
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/plugins/manus/70-manus-hid.rules`:
- Around line 2-5: The udev rules currently grant world-writable device access
via MODE:="0666" on the rules matching SUBSYSTEMS=="usb",
ATTRS{idVendor}=="3325", the rule with
ATTRS{idVendor}=="1915",ATTRS{idProduct}=="83fd", and the KERNEL=="hidraw*",
ATTRS{idVendor}=="3325" rule; change these to least-privilege group-owned rules
by replacing MODE:="0666" with a group-based rule such as GROUP="plugdev"
MODE:="0660" (or GROUP="hidraw" MODE:="0660" if your distro provides a hidraw
group), apply the same change to all three matching rules, and ensure any users
who need access are added to that group on target systems.

In `@src/plugins/manus/install_manus.sh`:
- Line 145: The cmake build command uses an unquoted command substitution for
parallel jobs which Shellcheck flags (SC2046); update the cmake invocation (the
line invoking cmake --build build --target manus_hand_plugin
manus_hand_tracker_printer -j$(nproc)) to quote the substitution so the -j
argument uses "$(nproc)" instead of $(nproc), preserving the same targets
(manus_hand_plugin and manus_hand_tracker_printer) and behaviour while
preventing potential word-splitting.

In `@src/plugins/manus/tools/manus_hand_visualizer.hpp`:
- Around line 1262-1271: The swapchain recreation path leaks the old
VkCommandPool because createCommandBuffers() creates a new pool without
destroying the previous m_cmd_pool; fix by ensuring the existing command pool is
destroyed before creating a new one — either add cleanup of m_cmd_pool in
destroySwapchainResources() (destroy and set m_cmd_pool = VK_NULL_HANDLE) or
have createCommandBuffers() check m_cmd_pool and vkDestroyCommandPool(m_dev,
m_cmd_pool, nullptr) before allocating a new pool; update whichever function
(createCommandBuffers or destroySwapchainResources) to handle the destruction
and nulling of m_cmd_pool to prevent the leak.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 9f16a7bc-71a1-46a7-9dd7-68b348505122

📥 Commits

Reviewing files that changed from the base of the PR and between 48011b6 and 75429a0.

📒 Files selected for processing (20)
  • docs/source/device/index.rst
  • docs/source/device/manus.rst
  • examples/native_openxr/xdev_list/main.cpp
  • examples/oxr/cpp/oxr_session_sharing.cpp
  • src/core/deviceio_trackers/python/tracker_bindings.cpp
  • src/core/live_trackers/cpp/live_controller_tracker_impl.cpp
  • src/core/oxr_utils/cpp/inc/oxr_utils/oxr_funcs.hpp
  • src/core/schema/python/controller_bindings.h
  • src/core/schema/python/pedals_bindings.h
  • src/plugins/manus/70-manus-hid.rules
  • src/plugins/manus/CMakeLists.txt
  • src/plugins/manus/README.md
  • src/plugins/manus/app/CMakeLists.txt
  • src/plugins/manus/core/CMakeLists.txt
  • src/plugins/manus/core/manus_hand_tracking_plugin.cpp
  • src/plugins/manus/inc/core/manus_hand_tracking_plugin.hpp
  • src/plugins/manus/install_manus.sh
  • src/plugins/manus/tools/CMakeLists.txt
  • src/plugins/manus/tools/manus_hand_tracker_printer.cpp
  • src/plugins/manus/tools/manus_hand_visualizer.hpp

Comment thread src/plugins/manus/70-manus-hid.rules
Comment thread src/plugins/manus/install_manus.sh
Comment thread src/plugins/manus/tools/manus_hand_visualizer.hpp
Use HMD hand tracking when available to position the hands, with the
existing tracker-based pose as a fallback. The hand-tracking plugin is
substantially reworked: detection of an OpenXR hand-tracking extension at
init time, conditional pose composition, and updated public types.

Tooling:
- Add an install_manus.sh helper and a 70-manus-hid.rules udev rule.
  After review, the full installer was scaled back so the rule file is
  the abstracted, distributable artifact and the script focuses on
  bootstrapping the supported manual-setup path.
- Expand the tracker printer into a visualizer
  (manus_hand_visualizer.hpp) for inspecting tracker output, and clarify
  the CLI usage. Remove the obsolete Isaac Lab start script.

Documentation:
- Convert the Manus README to reStructuredText and add it to the device
  docs index (docs/source/device/manus.rst), with clarifications to the
  manual setup flow and updated log/installation guidance.

Core fix:
- Declare xrEnumerateInstanceExtensionProperties alongside
  xrGetInstanceProcAddr under XR_NO_PROTOTYPES in oxr_funcs, so the
  Manus plugin can enumerate supported OpenXR extensions at init time
  without a compile error when prototypes are suppressed.

Quality:
- clang-format and pre-commit linting passes across the touched files.
- Address CodeRabbit and GitHub Copilot review feedback.
@jiwenc-nv jiwenc-nv force-pushed the manus/hmd-hand-tracking-rebased branch from 75429a0 to 5f62bfa Compare April 29, 2026 16:27
@jiwenc-nv
Copy link
Copy Markdown
Collaborator Author

/preview-docs

@github-actions
Copy link
Copy Markdown
Contributor

✅ Preview deployed: https://NVIDIA.github.io/IsaacTeleop/preview/pr-431/

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant