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-pathto set a custom online-IK URDF first.wuji_glove/1.subscribe_async.py: subscribe to glove streams with async/await. Pass--hand-model-pathto 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 withsubscription.set_rate()onemf_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 livetactile_binarycontact grid after calibration. It is not a calibration workflow.wuji_glove/9.tactile_residual_view.py: observe the continuous signedtactile_residualgrid 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 withRetargetSession— no hardware needed.retargeting/1.teleop_real.py: live teleoperation — drive a Wuji Hand / Wuji Hand 2 from a Wuji Glove. This example usesRetargetSession, 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
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)
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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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