Skip to main content
Yanked

This release has been yanked by its maintainers, and will be ignored by installers, except when explicitly specified.
Consider using release 2026.10.12 instead.
Reason given by maintainers: Withdrawn; use 2026.8.31 instead.

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.21

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

Total release size: 105.1 MB

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

Download URL wuji_sdk-2026.9.21-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
132d2406b120cb708cf6f816375d2b528c715b6b8b634ed178fcee2d2fb18f53
BLAKE2b-256 checksum
How to use checksums
40a8186fd381f03f94ab62a42251516c53319edaca30d80d4ce5809ab8d80995
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 21, 2026.

Transparency log

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

Download URL wuji_sdk-2026.9.21-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
e6c92b517ea534e7a2dd4b8fc1e05c4b5e958adf8a2a729c0b43804355e1cb8f
BLAKE2b-256 checksum
How to use checksums
7f8f81be891d90d569a1c42c6b42d1dcaf1051e60d9535a6f4c988ad6253db40
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 21, 2026.

Transparency log

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

Download URL wuji_sdk-2026.9.21-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
3a25c63de4563137128da2ef0893a3916b27a8dd6b8e51d6b6f378433c56598c
BLAKE2b-256 checksum
How to use checksums
671f2a474f7d47356a72eb0272542c5b315229657c5621309048dae9e59edcb0
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 21, 2026.

Transparency log

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

Download URL wuji_sdk-2026.9.21-cp313-cp313-manylinux_2_34_aarch64.whl
Size 10.5 MB
Tags CPython 3.13 Linux glibc 2.34+ ARM64
SHA-256 checksum
How to use checksums
8f6ca788e079ddba92fb2f4fcc2968b8a6c403756fbbedd08f4c271fc8209230
BLAKE2b-256 checksum
How to use checksums
954c6bf798adb9175b6100caf6e7022db18a81761065475ce809f3378479dab2
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 21, 2026.

Transparency log

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

Download URL wuji_sdk-2026.9.21-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
5a1fb82d7f340496db592f4bca7367e6edec12af0e59eb05bb101bcc642cfbeb
BLAKE2b-256 checksum
How to use checksums
981db4ffa95861fcfa4722de877b02569e9a61b8342e2d1fd7146689eb360c12
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 21, 2026.

Transparency log

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

Download URL wuji_sdk-2026.9.21-cp312-cp312-manylinux_2_34_aarch64.whl
Size 10.5 MB
Tags CPython 3.12 Linux glibc 2.34+ ARM64
SHA-256 checksum
How to use checksums
4d75ae55c8638e437113494c532123c294a2f238f2533bb615c2a4adb9367d76
BLAKE2b-256 checksum
How to use checksums
c14778058658d1abc0a8f5b8f382cd6646b9d1f463db7130a672cc528c829118
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 21, 2026.

Transparency log

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

Download URL wuji_sdk-2026.9.21-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
42fe944a73b3cbcafae9d24bb83439fe4c9a581e21fc7c75d627463bfaa89860
BLAKE2b-256 checksum
How to use checksums
0b96532535c783eff6a5668e45cccdfae587c349bae55a08b472a3b8e3d3cd68
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 21, 2026.

Transparency log

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

Download URL wuji_sdk-2026.9.21-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
39ce3fc10cc9def7edca1749dc1a883b6a4e5d5b41d6f15d6a2417b7b41117e1
BLAKE2b-256 checksum
How to use checksums
dfbab4c73e5772f8459e68e74616ded36f7718d7781438a04063649e4b959933
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 21, 2026.

Transparency log

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

Download URL wuji_sdk-2026.9.21-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
a3e4e5a5e84289a54172862d22e93a1235406b7ef14b50273b71e4ff38216c42
BLAKE2b-256 checksum
How to use checksums
2d7e3616f1114228d62b79e34ed29b7e801cd0ae8951296f600a454abe2706c0
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 21, 2026.

Transparency log

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

Download URL wuji_sdk-2026.9.21-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
47d199dd1cc3f7f42829902962cfa911fd6c3f80257177102f0e3a31c8dbc1ea
BLAKE2b-256 checksum
How to use checksums
fc2a1acc7f3500ade66c1e262e141df779162ab45333212fe2b9e941018e3886
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 21, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

2026.9.21 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