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, and 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 Publishes at 50 Hz, then disables and disconnects
6_opposition/opposition.py Streams the connected side's recorded thumb opposition Publishes 30,000 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. It doesn't add interpolation, resampling, smoothing, or recovery motion. 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.8.31

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.8.31
File
wuji_sdk-2026.8.31-cp314-cp314-manylinux_2_34_x86_64.whl CPython 3.14 CPython 3.14 Linux glibc 2.34+ x86-64 Details
wuji_sdk-2026.8.31-cp314-cp314-manylinux_2_34_aarch64.whl CPython 3.14 CPython 3.14 Linux glibc 2.34+ ARM64 Details
wuji_sdk-2026.8.31-cp313-cp313-manylinux_2_34_x86_64.whl CPython 3.13 CPython 3.13 Linux glibc 2.34+ x86-64 Details
wuji_sdk-2026.8.31-cp313-cp313-manylinux_2_34_aarch64.whl CPython 3.13 CPython 3.13 Linux glibc 2.34+ ARM64 Details
wuji_sdk-2026.8.31-cp312-cp312-manylinux_2_34_x86_64.whl CPython 3.12 CPython 3.12 Linux glibc 2.34+ x86-64 Details
wuji_sdk-2026.8.31-cp312-cp312-manylinux_2_34_aarch64.whl CPython 3.12 CPython 3.12 Linux glibc 2.34+ ARM64 Details
wuji_sdk-2026.8.31-cp311-cp311-manylinux_2_34_x86_64.whl CPython 3.11 CPython 3.11 Linux glibc 2.34+ x86-64 Details
wuji_sdk-2026.8.31-cp311-cp311-manylinux_2_34_aarch64.whl CPython 3.11 CPython 3.11 Linux glibc 2.34+ ARM64 Details
wuji_sdk-2026.8.31-cp310-cp310-manylinux_2_34_x86_64.whl CPython 3.10 CPython 3.10 Linux glibc 2.34+ x86-64 Details
wuji_sdk-2026.8.31-cp310-cp310-manylinux_2_34_aarch64.whl CPython 3.10 CPython 3.10 Linux glibc 2.34+ ARM64 Details

Total release size: 101.5 MB

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

Download URL wuji_sdk-2026.8.31-cp314-cp314-manylinux_2_34_x86_64.whl
Size 10.1 MB
Tags CPython 3.14 Linux glibc 2.34+ x86-64
SHA-256 checksum
How to use checksums
f05e6df5efa601480c4d2f712a03a6ba64ba5135d84d2f841a69a7324de2bb5a
BLAKE2b-256 checksum
How to use checksums
284e5b5e5623476e8368a6e6682cc194af93514d52f28bd990fc54b8d0396bc1
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 Aug 31, 2026.

Transparency log

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

Download URL wuji_sdk-2026.8.31-cp314-cp314-manylinux_2_34_aarch64.whl
Size 10.2 MB
Tags CPython 3.14 Linux glibc 2.34+ ARM64
SHA-256 checksum
How to use checksums
aed85ed6cf91d7453756f40f5218ee0b9a6fd7404fce366f586a63825f83e2cb
BLAKE2b-256 checksum
How to use checksums
bd634ac2b0312a3e632fbfeae88a919b55575429b2b0913754eb2f45fc4704c2
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 Aug 31, 2026.

Transparency log

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

Download URL wuji_sdk-2026.8.31-cp313-cp313-manylinux_2_34_x86_64.whl
Size 10.1 MB
Tags CPython 3.13 Linux glibc 2.34+ x86-64
SHA-256 checksum
How to use checksums
069978d3a7c58b8ac6e1ce81552f3b9b684068755c71a191f932648dc7b93bd6
BLAKE2b-256 checksum
How to use checksums
ea6103bfbd0e858db06567310ff193fea5488ad0be65f2bb2ebd712097389e2c
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 Aug 31, 2026.

Transparency log

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

Download URL wuji_sdk-2026.8.31-cp313-cp313-manylinux_2_34_aarch64.whl
Size 10.2 MB
Tags CPython 3.13 Linux glibc 2.34+ ARM64
SHA-256 checksum
How to use checksums
4fa7944349209c27162fc5419ff123fdccf3d050567a65582a2deb8d241771ed
BLAKE2b-256 checksum
How to use checksums
607c02b00879421821dbb46599be9771047181e6b03e520fea5c2ec5d84eddb2
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 Aug 31, 2026.

Transparency log

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

Download URL wuji_sdk-2026.8.31-cp312-cp312-manylinux_2_34_x86_64.whl
Size 10.1 MB
Tags CPython 3.12 Linux glibc 2.34+ x86-64
SHA-256 checksum
How to use checksums
dcbabf1ed6e87d50e581dd466fed2564b71abb61afb99b4a20eb2de9c3c6ac7d
BLAKE2b-256 checksum
How to use checksums
d6f168561c69ef3d49ca3e1ddbbbcec3ada220f92cc0021f96ed4f4dde2460c8
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 Aug 31, 2026.

Transparency log

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

Download URL wuji_sdk-2026.8.31-cp312-cp312-manylinux_2_34_aarch64.whl
Size 10.2 MB
Tags CPython 3.12 Linux glibc 2.34+ ARM64
SHA-256 checksum
How to use checksums
117718e3f6f798359bf378fc5bfebd8c8367f75f40df7231e5c29a0286751bf8
BLAKE2b-256 checksum
How to use checksums
df51f6a1c352ddd8308b0ab82f15f31b64c9dd736b4f742993198043e814086a
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 Aug 31, 2026.

Transparency log

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

Download URL wuji_sdk-2026.8.31-cp311-cp311-manylinux_2_34_x86_64.whl
Size 10.1 MB
Tags CPython 3.11 Linux glibc 2.34+ x86-64
SHA-256 checksum
How to use checksums
442d620520b2f04a0821fda7abc6be3f164ae62eab55bbc25ebc2ff0465e08db
BLAKE2b-256 checksum
How to use checksums
54c2fc0e2255b9fc210cd019d2eb96d01622fdb9dbd2236730778d27edbe5c76
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 Aug 31, 2026.

Transparency log

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

Download URL wuji_sdk-2026.8.31-cp311-cp311-manylinux_2_34_aarch64.whl
Size 10.2 MB
Tags CPython 3.11 Linux glibc 2.34+ ARM64
SHA-256 checksum
How to use checksums
a05e687a7d383576e6387e8a546d6a75c202b33b6f3a87022792c12ca9f20796
BLAKE2b-256 checksum
How to use checksums
0fb66b32e4d9aae259f438151cf08cc453e835d66fdd79682b061e0107cba925
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 Aug 31, 2026.

Transparency log

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

Download URL wuji_sdk-2026.8.31-cp310-cp310-manylinux_2_34_x86_64.whl
Size 10.1 MB
Tags CPython 3.10 Linux glibc 2.34+ x86-64
SHA-256 checksum
How to use checksums
2a7ea2f9e8dd237dcfca9222beb3466a5c98ade41f81b2eb3c43c7ff9fdd72e7
BLAKE2b-256 checksum
How to use checksums
b1a0da1ecd535123ea8744c8f4bb109b4b7fb75660babbabc74253db14321f1b
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 Aug 31, 2026.

Transparency log

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

Download URL wuji_sdk-2026.8.31-cp310-cp310-manylinux_2_34_aarch64.whl
Size 10.2 MB
Tags CPython 3.10 Linux glibc 2.34+ ARM64
SHA-256 checksum
How to use checksums
5a9b28fd9a2b71865990544fc8c0646c845779a2f4e585e541f29a0b5c287b96
BLAKE2b-256 checksum
How to use checksums
778c754abb9b1f44d1b92d0cac6bcfca434f5687f620928a979c5e99adf42e8b
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 Aug 31, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

2026.8.31 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