Skip to main content

wuji-sdk (Python)

Python SDK for Wuji series devices. Provides automatic device discovery, connection management, and real-time data streaming for Wuji Glove, Wuji Hand 2, and other Wuji peripherals. Features a type-safe semantic API with native async/await and callback-based subscription support, multi-channel MCAP recording, and rich hand tracking data including joint angles, skeleton, and fingertip poses.

For detailed documentation, see the Wuji Docs Center.

Looking for the C SDK? See the C SDK README.

Installation

pip install wuji-sdk

Quick Start

import time
from wuji_sdk import SdkManager, DeviceType

manager = SdkManager.instance()
# scan() reports each device's type, so connect only the glove.
gloves = [d for d in manager.scan() if d.device_type == DeviceType.WujiGlove]
if not gloves:
    print("No Wuji Glove found")
    exit()
glove = manager.connect(sn=gloves[0].sn, device_name="glove")

sub = glove.tactile().subscribe_with_callback(
    callback=lambda frame: print(f"Max pressure: {max(frame.data):.2f}")
)

time.sleep(10)
sub.close()

More examples: examples/python/.

Examples

  • wuji_glove/0.subscribe_callback.py: subscribe to glove streams with callbacks. Pass --hand-model-path to set a custom online-IK URDF first.
  • wuji_glove/1.subscribe_async.py: subscribe to glove streams with async/await. Pass --hand-model-path to set a custom online-IK URDF first.
  • wuji_glove/2.recording.py: record glove data to MCAP.
  • wuji_glove/3.offline_pipeline.py: run hand tracking from offline frames.
  • wuji_glove/4.user.py: inspect, create, and switch local SDK users.
  • wuji_glove/5.calibration.py: run hand model calibration with terminal guidance or API-style callbacks.
  • wuji_glove/6.set_stream_rate.py: lower the glove's raw pose output rate at runtime with subscription.set_rate() on emf_poses; derived streams follow automatically.
  • wuji_glove/7.tactile_calibration.py: run the recommended guided tactile-calibration flow.
  • wuji_glove/8.tactile_contact_view.py: independently observe the live tactile_binary contact grid after calibration. It is not a calibration workflow.
  • wuji_glove/9.tactile_residual_view.py: observe the continuous signed tactile_residual grid after calibration and apply an adjustable contact threshold.
  • wuji_hand_2/5.export_flash_logs.py: export the device's on-flash log history to a JSONL file.
  • wuji_hand_2/6_opposition/opposition.py: stream either side's recorded four-finger motion at 1 kHz.
  • wuji_hand_2/7.mit_sweep.py: run the fixed joint-0 cosine sweep, or render the command sequence offline.
  • retargeting/0.retarget_session.py: map hand keypoints (21×3) to a joint command with RetargetSession — no hardware needed.
  • retargeting/1.teleop_real.py: live teleoperation — drive a Wuji Hand / Wuji Hand 2 from a Wuji Glove. This example uses RetargetSession, and you can replace the glove read with any (21,3) keypoint source. It lists the SDK users and asks which one to teleoperate under. Press Enter to keep the current user, pick the default user for the built-in hand URDF, or pick a named user to use that user's calibrated hand model. An uncalibrated named user falls back to the built-in URDF.

Wuji Hand 2 Motion Examples

Example 7 is a standalone source file. Example 6 is a standalone bundle that contains opposition.py and Right and Left replay data. Copy the complete 6_opposition/ directory to use that example.

Both entries accept no command-line options. They auto-connect one device, require all 20 joints online, enable the hand, ramp from the current pose to the trajectory start, and then send a fixed command sequence. Example 6 selects and streams one replay file from device handedness.

Choose Example 6 or 7

Example Motion Output
7.mit_sweep.py Moves joint 0 through a fixed 0.02 rad, 101-command cosine sweep while the other joints stay at zero Ramps to the start pose at 1 kHz, publishes the sweep at 50 Hz, then disables and disconnects
6_opposition/opposition.py Streams the connected side's recorded thumb opposition Ramps to the start pose at 1 kHz, publishes 30,000 recorded commands at 1 kHz, then disables and disconnects

Example 7 is the smaller motion check. Example 6 replays a complete recorded four-finger motion.

Run Example 7

Run the fixed supervised motion:

python examples/python/wuji_hand_2/7.mit_sweep.py

Example 7 sends a fixed 101-command cosine sweep. Joint 0 moves from zero to 0.02 rad and back to zero. The other 19 joints remain at zero.

Run Example 6

Auto-connect one Hand 2 and replay the recording selected by its handedness:

python examples/python/wuji_hand_2/6_opposition/opposition.py

Example 6 selects data/right.replay or data/left.replay from device handedness. It validates the file header and length before enable, then streams every recorded qpos once at a fixed 1 kHz command rate. The recorded sequence itself adds no interpolation, resampling, smoothing, or recovery motion; before it starts, the example ramps from the captured current pose to the first recorded frame over about one second. The final recorded frame is the return to Open.

Cleanup Behavior

Normal completion disables the hand after the final command. An error or interrupt stops further commands and adds no recovery motion. Both examples disable the connected hand, close their publishers, and disconnect the device. Runtime and cleanup errors return 1. Ctrl-C returns 130.

Retargeting

Map human hand keypoints to Wuji Hand joint commands. Retargeting works out of the box — numpy is the only extra dependency (keypoint/qpos arrays):

pip install wuji-sdk numpy

The SDK exposes the pure retarget interface — one frame at a time, supply keypoints from any source:

import numpy as np
from wuji_sdk import Handedness, HandModel, RetargetSession

# The hand model selects the builtin tuning config internally — no config path to manage.
session = RetargetSession.for_hand(HandModel.WujiHand2, side=Handedness.Right)

# A synthetic open right hand, (21, 3) in meters, MediaPipe landmark order —
# replace with your real keypoint source (camera / glove / replay).
# (All-zero / degenerate frames are rejected with an exception.)
keypoints = np.zeros((21, 3), dtype=np.float32)
for finger, x in enumerate([-0.04, -0.03, -0.01, 0.01, 0.03]):  # thumb..pinky
    for k in range(4):
        keypoints[1 + finger * 4 + k] = [x, 0.03 * (k + 1), 0.0]
keypoints[1] = [-0.03, 0.02, 0.01]  # thumb CMC nearer the palm

qpos = session.step(keypoints)  # -> (20,) joint command (firmware order)

Driving a hand live (read → retarget → send) is plain application code built on this interface — see retargeting/1.teleop_real.py for a complete glove → hand loop.

Retargeting is available on Linux x86_64 / aarch64.

License

MIT

Metadata

Release files for wuji-sdk 2026.9.22

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distributions (wheels)

Table of built distributions (wheels) for wuji-sdk 2026.9.22
File
wuji_sdk-2026.9.22-cp314-cp314-manylinux_2_34_x86_64.whl CPython 3.14 CPython 3.14 Linux glibc 2.34+ x86-64 Details
wuji_sdk-2026.9.22-cp314-cp314-manylinux_2_34_aarch64.whl CPython 3.14 CPython 3.14 Linux glibc 2.34+ ARM64 Details
wuji_sdk-2026.9.22-cp313-cp313-manylinux_2_34_x86_64.whl CPython 3.13 CPython 3.13 Linux glibc 2.34+ x86-64 Details
wuji_sdk-2026.9.22-cp313-cp313-manylinux_2_34_aarch64.whl CPython 3.13 CPython 3.13 Linux glibc 2.34+ ARM64 Details
wuji_sdk-2026.9.22-cp312-cp312-manylinux_2_34_x86_64.whl CPython 3.12 CPython 3.12 Linux glibc 2.34+ x86-64 Details
wuji_sdk-2026.9.22-cp312-cp312-manylinux_2_34_aarch64.whl CPython 3.12 CPython 3.12 Linux glibc 2.34+ ARM64 Details
wuji_sdk-2026.9.22-cp311-cp311-manylinux_2_34_x86_64.whl CPython 3.11 CPython 3.11 Linux glibc 2.34+ x86-64 Details
wuji_sdk-2026.9.22-cp311-cp311-manylinux_2_34_aarch64.whl CPython 3.11 CPython 3.11 Linux glibc 2.34+ ARM64 Details
wuji_sdk-2026.9.22-cp310-cp310-manylinux_2_34_x86_64.whl CPython 3.10 CPython 3.10 Linux glibc 2.34+ x86-64 Details
wuji_sdk-2026.9.22-cp310-cp310-manylinux_2_34_aarch64.whl CPython 3.10 CPython 3.10 Linux glibc 2.34+ ARM64 Details

Total release size: 105.2 MB

Release files / wuji_sdk-2026.9.22-cp314-cp314-manylinux_2_34_x86_64.whl

Download URL wuji_sdk-2026.9.22-cp314-cp314-manylinux_2_34_x86_64.whl
Size 10.5 MB
Tags CPython 3.14 Linux glibc 2.34+ x86-64
SHA-256 checksum
How to use checksums
b697ee8f799dea384bddb2df98cfcd8d425d2c4b768ad0f9bd228ed17a3ce834
BLAKE2b-256 checksum
How to use checksums
cf6a43a9e293d408da123dd5c6aba3684e4f9230c5fda380b536ee8bee6f87fb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 22, 2026.

Transparency log

Release files / wuji_sdk-2026.9.22-cp314-cp314-manylinux_2_34_aarch64.whl

Download URL wuji_sdk-2026.9.22-cp314-cp314-manylinux_2_34_aarch64.whl
Size 10.6 MB
Tags CPython 3.14 Linux glibc 2.34+ ARM64
SHA-256 checksum
How to use checksums
3e61108b882315e8876cef000723919f3fefaf3171d3e3ec769dc6eb9d9918c0
BLAKE2b-256 checksum
How to use checksums
014b97de67bc69d086a2ed81a31effc038e64359f2eec7ecbd070b6a3f15b5e0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 22, 2026.

Transparency log

Release files / wuji_sdk-2026.9.22-cp313-cp313-manylinux_2_34_x86_64.whl

Download URL wuji_sdk-2026.9.22-cp313-cp313-manylinux_2_34_x86_64.whl
Size 10.5 MB
Tags CPython 3.13 Linux glibc 2.34+ x86-64
SHA-256 checksum
How to use checksums
31b9314cb899f65bae69d20cbb51c19a71f399cd21daa3edb03ed259e684ac43
BLAKE2b-256 checksum
How to use checksums
45bebca2868830f42049ebe5afb141ccde72ee7bc29933590e32673d21681023
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 22, 2026.

Transparency log

Release files / wuji_sdk-2026.9.22-cp313-cp313-manylinux_2_34_aarch64.whl

Download URL wuji_sdk-2026.9.22-cp313-cp313-manylinux_2_34_aarch64.whl
Size 10.6 MB
Tags CPython 3.13 Linux glibc 2.34+ ARM64
SHA-256 checksum
How to use checksums
cf7ccf5964a6f34dd5fb0bfb5611191205ded07865b2d17969401a54e1fc7480
BLAKE2b-256 checksum
How to use checksums
d77212210497b5152883787b66e1f59791d1f7f3b2cbe8df1e647adf9d30024e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 22, 2026.

Transparency log

Release files / wuji_sdk-2026.9.22-cp312-cp312-manylinux_2_34_x86_64.whl

Download URL wuji_sdk-2026.9.22-cp312-cp312-manylinux_2_34_x86_64.whl
Size 10.5 MB
Tags CPython 3.12 Linux glibc 2.34+ x86-64
SHA-256 checksum
How to use checksums
1f86b22691d89510bbadbf48170ce6bedbbb32a9899f8a9b5ca6dfee49d0ec5d
BLAKE2b-256 checksum
How to use checksums
eca12ffada3ae0055b0d8864b68c24a333784b4ff2cfea299cdd28829b07a645
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 22, 2026.

Transparency log

Release files / wuji_sdk-2026.9.22-cp312-cp312-manylinux_2_34_aarch64.whl

Download URL wuji_sdk-2026.9.22-cp312-cp312-manylinux_2_34_aarch64.whl
Size 10.6 MB
Tags CPython 3.12 Linux glibc 2.34+ ARM64
SHA-256 checksum
How to use checksums
e550939c5a4efb68581b16a7122905bb394ee8abf016f84ba1a89619567cd67f
BLAKE2b-256 checksum
How to use checksums
85b2676ff6b9bd983f67b49e4d50c78539d7efe98975834bc489c9b651c0d63e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 22, 2026.

Transparency log

Release files / wuji_sdk-2026.9.22-cp311-cp311-manylinux_2_34_x86_64.whl

Download URL wuji_sdk-2026.9.22-cp311-cp311-manylinux_2_34_x86_64.whl
Size 10.5 MB
Tags CPython 3.11 Linux glibc 2.34+ x86-64
SHA-256 checksum
How to use checksums
5dba8167c999e00a0480e7468a6993a49d3f66d751c54f8a6b990f24c80e0723
BLAKE2b-256 checksum
How to use checksums
21e1b1d4188e374ca282ce757641a6215ca2fa9f39dd688dc63d51e8b6d3455b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 22, 2026.

Transparency log

Release files / wuji_sdk-2026.9.22-cp311-cp311-manylinux_2_34_aarch64.whl

Download URL wuji_sdk-2026.9.22-cp311-cp311-manylinux_2_34_aarch64.whl
Size 10.6 MB
Tags CPython 3.11 Linux glibc 2.34+ ARM64
SHA-256 checksum
How to use checksums
8fd29e45018ebf2f631e5da814263df325d5dc0d1f7aff5a2e94086fdc8cfc12
BLAKE2b-256 checksum
How to use checksums
9ee87fb2a7b3bd6ff5b471c5319c322d8c39dd87e2d5624cbecea2ac2c053b85
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 22, 2026.

Transparency log

Release files / wuji_sdk-2026.9.22-cp310-cp310-manylinux_2_34_x86_64.whl

Download URL wuji_sdk-2026.9.22-cp310-cp310-manylinux_2_34_x86_64.whl
Size 10.5 MB
Tags CPython 3.10 Linux glibc 2.34+ x86-64
SHA-256 checksum
How to use checksums
4ca6fcf69818480e4b1aaafe892aeb37f70b94ba5f0077f293e22fe2f4263cf3
BLAKE2b-256 checksum
How to use checksums
dc892dcd1a55ff969edc9fdfba3f1931e5a16e9b10957002fbb28945b17b1ef7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 22, 2026.

Transparency log

Release files / wuji_sdk-2026.9.22-cp310-cp310-manylinux_2_34_aarch64.whl

Download URL wuji_sdk-2026.9.22-cp310-cp310-manylinux_2_34_aarch64.whl
Size 10.6 MB
Tags CPython 3.10 Linux glibc 2.34+ ARM64
SHA-256 checksum
How to use checksums
6db93dac7b458fdee1e0c540aa428b98e6c544bd7d339dd87314f0f66472287f
BLAKE2b-256 checksum
How to use checksums
b238a49ff4a9890434aac9a58f60d684d6a3d759674da043983d30aa20c7176b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 22, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

2026.9.22 This release

10 release files

0.8.0

10 release files

0.6.0

10 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page