Changelog

Important Notice:

  • Please update firmware, Wuji SDK, and Wuji Studio to the latest versions for optimal performance and compatibility
  • For any questions, please contact support@wuji.tech

2026.08.03

Important: This release contains a C SDK breaking change (joint diagnostics struct ABI change). C applications using these structs must be recompiled against the new header.

Component Versions

ComponentVersionUpdate Method
Wuji SDKv2026.8.3pip install --upgrade wuji-sdk

Highlights

General

Changed:

  • C SDK: The Linux x86_64 and aarch64 (gnu) tarballs now ship one library file, libwuji_sdk_c.so. Wuji Hand support no longer needs the libwujihandcpp.so that earlier tarballs bundled beside it, and libstdc++.so.6 and libusb-1.0.so.0 are no longer runtime dependencies. The C API and link line are unchanged, so existing applications keep working without a rebuild. If you deployed libwujihandcpp.so from an earlier tarball, you can delete it — the SDK doesn't load it anymore.

Fixed:

  • Device scanning no longer hangs indefinitely in the rare case where a network peer disappears during discovery. The network discovery step is now time-bounded, so scanning always returns within a few seconds with the devices found so far. Covers both the Python SDK and the C SDK.
  • Network device discovery now works on Linux hosts with multiple network interfaces or IP addresses when the host's primary IP address is not on the device's subnet — previously scanning on such hosts could permanently find no devices. Covers both the Python SDK and the C SDK.

Device

Wuji Hand 2

New capabilities:

  • The joint_diagnostics stream now carries built-in communication health — each joint reports its bus response rate and timeout count, and every frame includes a summary with end-to-end (Ethernet) stream loss, request retry/timeout counters, and the fingertip tactile online bitmap. The SDK maintains all of it automatically in the background, so no polling is required.

Breaking changes (C SDK):

  • The joint diagnostics structs gained new fields, so their C ABI changed. Applications that use WujiJointDiagnosticsEntry or WujiJointDiagnosticsFrame must be recompiled against the new header before linking the new library — linking new against old will read and write past the end of the old structs. Existing fields keep their meaning and order, and no source changes are needed; the added fields carry the per-joint bus communication quality and the frame-level communication summary described above.

Fixed:

  • The SDK no longer binds a fixed local network port when connecting a hand. The local port is now assigned automatically by the operating system, so the SDK will not conflict with ports used by your own applications.
  • Setting effort_limit to a value the device rejects (e.g. above the current ceiling) now raises a ValueError instead of a generic error; the device keeps its previous limit.

Wuji Glove

New capabilities:

  • Added guided tactile calibration — record prompted hand motions to train a per-glove contact model for real-time contact detection (tactile_binary). Python: glove.calibrate_tactile() / glove.calibrate_tactile_blocking(). C: blocking guided flow with pose-prompt callbacks.

    Models load automatically. Training requires a model-export build — see the motion guide.

  • C SDK: Added wuji_glove_set_tactile_binary_sensitivity for standalone tactile_binary observation tools. It changes the SDK-local contact sensitivity for the connected glove and rejects non-finite or non-positive values.

  • C SDK: Added the runnable user-management example examples/c/wuji_glove/3_user_management.c for inspecting the current SDK user, creating or updating named users, and switching users before calibration.

  • Added tactile_residual observation examples — the continuous signed signal behind tactile_binary, where you set your own contact threshold instead of using a built-in one. Python: glove.tactile_residual(), C: wuji_glove_subscribe_tactile_residual typed callback. Calibrate the glove first.

Changed:

  • The C IK calibration example is now examples/c/wuji_glove/4_user_calibration.c (renamed from 3_user_calibration.c) and calibrates the SDK user you are already on instead of creating or switching one — use the new 3_user_management.c example first if you need to create or switch users. It also gained a --blocking mode, which runs calibration to completion without the cooperative Ctrl+C cancellation the default asynchronous path offers.

Fixed:

  • EMF finger poses now use the selected hand URDF to reject unreachable mirrored positions, reducing incorrect position reversals caused by transient interference.

Wuji Hand

Changed:

  • RealtimeController can now be shared across Python threads — for example a writer thread streaming targets while a reader thread polls actual positions — without any locking. Previously, touching the controller from a second thread raised an error.

Fixed:

  • Physically unplugging the tactile glove at runtime is now detected. is_tactile_attached() returns false, the tactile status stream reports NotPresent (state 0) typically within 200 ms, and other tactile reads return a clear "tactile not present" error — previously they all kept reporting a healthy, attached glove indefinitely and only the frame age hinted at the loss. The hand itself is unaffected and keeps working; re-attaching the glove still requires reconnecting the hand. Applies to both the Python SDK and the C SDK (wuji_hand_is_tactile_attached).
  • C SDK: Wuji Hand tactile-glove calls no longer crash the process when the glove is missing or faulty — they return an error status instead (details via wuji_last_error()).
  • Connecting to a hand that isn't ready no longer crashes your application — it now fails with a catchable error that names any joint that didn't respond. Covers both the Python SDK and the C SDK.

2026.07.21

Important: The retargeting interface moved to the package top level (breaking change, Python) — the wuji_sdk.retargeting submodule is removed. Update caller imports to the new form.

Component Versions

ComponentVersionUpdate Method
Wuji SDKv2026.7.21pip install --upgrade wuji-sdk

Highlights

Device

Wuji Hand 2

New capabilities:

  • First official release of fingertip tactile sensing: subscribe to self-describing per-finger sensor streams (FingertipSensorInfo metadata describes how to decode each FingertipSensorData frame — see the 3.fingertip_typed.py example), recalibrate all five fingertips to a fresh zero baseline with hand.tactile_calibrate() (Python) / wuji_hand_2_tactile_calibrate(dev) (C) while keeping the sensor surfaces unloaded, and query each sensor's model and calibration state with hand.tactile_status(finger) to confirm a recalibration has finished

Fixed:

  • Firmware upgrade failures now report the detailed error (specific reason, error code, and any failed nodes) instead of a generic "Unknown error"

Submodules

Retargeting

New capabilities:

  • Added the hand retargeting API (wuji_retarget_session_create / _step / _reset / _free) that maps 21 hand keypoints (MediaPipe order) to 20 joint angles in firmware order, matching the Python RetargetSession, with degenerate or invalid keypoint frames returning the new WUJI_STATUS_ERR_ALGORITHM status and details from wuji_last_error()

Breaking changes (Python):

  • RetargetSession and HandModel now live at the package top level and the wuji_sdk.retargeting submodule is removed (breaking change, Python) — update imports to from wuji_sdk import RetargetSession, HandModel

Changed:

  • RetargetSession now works out of the box without the [retarget] extra and with lower per-step latency — numpy is still used for keypoint/qpos arrays
  • Refined retargeting output with improved thumb articulation — joint angles for identical inputs may differ from previous releases

2026.07.14

Important: The Wuji Hand Python interface is aligned with the Wuji Hand 2 resource-style API (breaking change), and Wuji Glove hand calibration now belongs to the SDK user and hand side. Upgrade the SDK and update caller code to the new interface. Wuji Glove users should recalibrate.

Component Versions

ComponentVersionUpdate Method
Wuji SDKv2026.7.14pip install --upgrade wuji-sdk

Highlights

General

New capabilities:

  • Export, preview, and import your Wuji user data as a portable .zip bundle. SdkManager.export_user_data(user_id, out_path) writes everything a user owns — calibration hand models plus the tactile model and its latest complete calibration run — into one file. preview_user_data(zip_path) validates a bundle and reports its contents without importing it. import_user_data(zip_path) restores a bundle to the user who created it (creating that user if it doesn't exist) and overwrites that user's existing data, without changing the current user
  • scan() now reports each device's type: DiscoveredDevice.device_type is a DeviceType enum (WujiGlove / WujiHand2 / WujiHand), so you can tell what a device is before connecting. Unknown means the type was not available at scan time
  • C SDK: scan results now carry the device type. WujiDiscovered.device_id is a WujiDeviceType enum (WUJI_DEVICE_TYPE_WUJI_GLOVE / _WUJI_HAND_2 / _WUJI_HAND / _UNKNOWN) and model carries the readable type string, so you can tell what a device is before connecting
  • C SDK: added SDK user management and Wuji Glove IK calibration APIs matching the Python SDK. C applications can create and switch SDK users, run calibration with structured feedback, cancel asynchronous calibration sessions, and receive the per-user calibrated URDF path. The calibration example provides the same in-place terminal dashboard and throttled API log mode as the Python example
  • C SDK: added user data import/export and preview, mirroring the Python API. wuji_user_data_export / wuji_user_data_import move a user's data as a portable .zip bundle, and wuji_user_data_preview validates and lists a bundle's contents without writing to disk. All three return a WujiStatus — call wuji_last_error() for the message on failure. WUJI_STATUS_ERR_NOT_FOUND means the bundle file doesn't exist, and WUJI_STATUS_ERR_INVALID_DATA means the bundle is present but fails validation (corrupt zip, bad manifest, checksum mismatch, or unsafe path)

Breaking changes (C SDK):

  • WujiConnectOptions changed layout to match Python ConnectOptions for bridge and background time-sync settings. Rebuild C applications against the updated wuji_sdk.h. Use wuji_connect_options_default() before overriding fields when passing non-NULL options to wuji_connect, or pass opts_or_null = NULL to keep default connection behavior
  • Removed the unused wuji_glove_subscribe_tactile_zones_cache()

Fixed:

  • Fixed an issue where connecting multiple devices in the same process (for example a Wuji Glove and a Wuji Hand 2) could fail depending on the connection order
  • Fixed a crash on exit. If a device disconnected while a callback subscription was still running and the process then exited, the app could crash with a fatal Python error or segmentation fault. Background subscription threads now stop cleanly before the interpreter shuts down

Device

Wuji Hand

New capabilities:

  • The Wuji SDK real-time controller now exposes get_actual_effort() (per-joint effort in amps, read from the same non-blocking upstream cache as get_actual_position()) in the Python SDK, and the C SDK exposes the matching wuji_hand_realtime_controller_get_actual_effort. This API belongs to wuji-sdk, not wujihandcpp
  • Added Wuji Hand (first-generation dexterous hand) support to the C SDK. Connect by USB serial number (wuji_hand_connect_sn), then read joint positions, per-joint diagnostics (bus voltage / temperature / error code), firmware soft limits, handedness, and whether a tactile glove is attached. Control with enable / disable / clear_all_faults, set and read the effort limit, stream commands through a joint-command publisher (a list of 20 JointCommand structs — position / velocity / effort per joint, the same shape as Wuji Hand 2, so command code is portable between the two), and run a low-pass-filtered real-time position controller. Subscription streams for joint state and tactile pressure are also available. Supported on Linux x86_64 / aarch64 (gnu) only. On Android these functions are present but return WUJI_STATUS_ERR_UNSUPPORTED. Worked examples are under examples/c/wuji_hand/

Breaking changes (Python):

  • The joint-command publisher now takes an array of structs. JointCommandPublisher.send(...) changed from three parallel lists send(positions, velocities, efforts) to a single list of per-joint commands send(joints), where each entry is a JointCommand(position, velocity, effort) — pass exactly 20. The old publish(...) alias was removed. This matches Wuji Hand 2 exactly
  • The joint-command publisher is now opened via hand.joint_command().publish(). The resource accessor was renamed from .publisher() to .publish(), and the shortcut method hand.joint_command_publisher() was removed. The returned JointCommandPublisher (send(...) / close()) is unchanged
  • Tactile-glove classes now carry a TactileGlove prefix so they cannot be confused with the Wuji Glove's generic tactile streams: TactileStatusTactileGloveStatus, TactileDiagnosticsTactileGloveDiagnostics, TactileDeviceInfoTactileGloveDeviceInfo, and the sub-module handle WujiTactileWujiTactileGlove. Accessors and wire formats are unchanged — update type references and isinstance checks to the new class names
  • The joint-state stream is now hand.joint_states() (was hand.joint_state()), and the frame class is HandJointStates (was HandJointState), matching Wuji Hand 2 and the ROS /joint_states convention

Wuji Hand 2

  • disconnect() now fully releases the hand — after disconnecting, the hand is immediately available to any other application or machine, exactly as if your application had exited. Previously the hand could remain held by the application until it exited
  • Fixed a bug where applications that repeatedly connect and disconnect could see each new connection take longer than the last. Connections now stay consistently fast, no matter how long the application has been running

Wuji Glove

Breaking changes:

  • Hand calibration now belongs to the SDK user and hand side instead of an individual glove. Swapping to another glove of the same side no longer requires recalibration. Calibration recorded by older SDK versions is not loaded anymore — recalibrate under your user profile
  • The hand_profile calibration option is deprecated and ignored (passing it emits a DeprecationWarning). The calibration result was simplified to handedness plus a single calibrated_urdf path. The calibration.hand_profile and calibration.hand_model_paths.* parameters were removed: setting them now fails, and values left by older versions are ignored
  • The tactile contact model is now located automatically from the current SDK user and device serial number, the same convention as the calibrated hand model, and stored under the SDK's own tactile directory. The algorithms.tactile_binary.model_dir parameter was removed: setting it now fails, and values left by older versions are ignored. Integrations that set this parameter should stop setting it, as the model is resolved automatically once you select the SDK user
  • Calibration bundles use a new format with user-level hand models and per-glove tactile data. Importing bundles from older SDK versions keeps the tactile data but skips the old hand calibration (it is no longer loaded — recalibrate under your user profile). Bundles exported by this version require an up-to-date SDK to import

Fixed:

  • The Default profile uses Wuji's built-in URDF, and calibration recorded earlier does not apply. To calibrate, create and switch to your own user profile first

Submodules

Retargeting

  • Optimized wheel packaging — download and installed size are significantly smaller. No functional change

2026.07.02

Component Versions

ComponentVersionUpdate Method
Wuji SDKv2026.7.2pip install --upgrade wuji-sdk

Key Updates

Device

Wuji Hand

  • Fixed reconnecting within the same process: after disconnect(), calling connect() again for the same hand failed and previously required exiting the process to recover. The handle is no longer usable after disconnect(). Create a new connection to reconnect

Submodules

Retargeting

  • Fixed the live teleoperation example (examples/python/retargeting/1.teleop_real.py) that failed to run: manager.connect() defaults to enable_bridge=True (Zenoh Bridge enabled), so the glove → retarget → hand loop did not work when the example used the default connection options. The example now connects with ConnectOptions(enable_bridge=False), bypassing the Bridge for a direct connection

2026.07.01

Important: The Wuji Hand 2 interface is redesigned into a unified resource-style API (breaking change). Upgrade the device firmware and SDK together, and update caller code to the new interface.

Component Versions

ComponentVersionUpdate Method
Wuji SDKv2026.7.1pip install --upgrade wuji-sdk

Key Updates

C SDK

  • Added Wuji Hand 2 support, mirroring the Python resource-style API: joint_states / joint_diagnostics subscription streams, mit_params / effort_limit configuration, control actions (enable / disable / clear_fault / emergency_stop / user origin), and a joint-command publisher. Whole-hand reads cover 20 joints with a per-joint online bitmap so offline joints are distinguishable, and string getters use a two-call size query (pass a NULL buffer to get the required length, then call again to fill it)
  • New wuji_glove_get_emf_poses_rate_divider / wuji_glove_set_emf_poses_rate_divider lower the Wuji Glove EMF output rate (divider N ≥ 1, output rate = input rate / N, for example N=4 → 30 Hz). Every derived stream (hand_joint_angles / tip_poses / hand_skeleton / tactile_point_cloud) drops to the same rate, reducing IK CPU load. Applied at runtime and preserved across reconnects
  • New wuji_glove_sync_time triggers a single time-sync round-trip with a Wuji Glove, filling WujiTimeSyncResult with the clock offset, round-trip time, and measurement timestamp in microseconds, matching Python glove.sync_time()
  • New wuji_glove_get_hand_model_path / wuji_glove_set_hand_model_path (and Python glove.hand_model_path().get()/set(path)) select a custom hand URDF for Wuji Glove online IK. Python subscription examples now expose --hand-model-path

Device

Wuji Hand 2

Breaking changes:

  • Interface redesigned into a unified resource-style API. Every feature is accessed via .get() / .set() / .subscribe() / .publish(), with the same methods for whole-hand and per-joint use
  • Control actions enable() / disable() / clear_fault() / set_origin() / clear_origin() accept a length-20 mask for subset operations. emergency_stop() always acts on the whole hand
  • Feedback as subscription streams: hand.joint_states() and hand.joint_diagnostics(), with feedback frames carrying a FrameHeader (seq / timestamp_us / frame_id l_wrist / r_wrist), containing only online joints
  • Real-time control moved to a publish model: hand.joint_command().publish().send(joints) takes 20 JointCommand entries (each with position / velocity / effort). The previous send(positions, velocities, efforts) three-list form is retired
  • Configuration resources mit_params (kp/kd) and effort_limit (A) reject NaN / inf / negative writes
  • Control mode is no longer set from Python. The device runs MIT control by default

New capability:

describe_error(code) translates a status / error code into a human-readable description.

Wuji Glove

Breaking changes:

  • Updated tactile_point_cloud to the 526-taxel active point-cloud contract — use a matching firmware version to keep point-cloud frames consistently at 526 points
  • The default SDK user now always uses the built-in default hand URDF for IK-derived streams (hand_skeleton, hand_joint_angles, tip_poses) and ignores stored calibration URDF paths. Calling calibrate as the default user fails fast with error code 0x4108. Create or switch to a named SDK user before calibration so generated URDFs are scoped to that user

Default model refresh:

Finger-segment lengths and joint origins are updated to the latest calibration. Default hand-tracking output (hand_skeleton, hand_joint_angles, tip_poses) is more accurate when no user calibration profile is loaded. Joint and link layout unchanged.

Submodules

Retargeting

Ships with wuji-sdk, mapping hand keypoints to Wuji Hand / Wuji Hand 2 joint angles. Install with pip install wuji-sdk[retarget] (Linux x86_64 / aarch64 only). The standalone Wuji Retargeting repo is no longer updated.

  • Maps 21 MediaPipe-format hand keypoints to Wuji Hand joint angles. wuji_sdk.retargeting.RetargetSession.for_hand(HandModel.WujiHand2, side=Handedness.Right) builds a session in one line. session.step(keypoints) returns a 20-value joint command ready to send to the device with no extra reordering
  • Includes a Wuji Glove → retargeting → Wuji Hand / Wuji Hand 2 live teleoperation example at examples/python/retargeting/1.teleop_real.py

2026.06.18

Component Versions

ComponentVersionUpdate Method
Wuji SDKv2026.6.18pip install --upgrade wuji-sdk

Key Updates

Wuji Glove

  • Tactile data layout updates to 744 values in 24×31 (was 768, 24×32), shrinking tactile, tactile_residual, tactile_binary frames and the per-zone layout, with invalid taxels still reported as -1.0

2026.06.15

Component Versions

ComponentVersionUpdate Method
Wuji SDKv2026.6.16pip install --upgrade wuji-sdk

Key Updates

General

  • Added a prebuilt C SDK (libwuji_sdk_c.so + wuji_sdk.h), currently scoped to Wuji Glove only, covering device connection, cross-device coordinate transforms (tf / tf_static), and stream subscriptions (tactile, tactile zones, EMF poses, hand joint angles, hand skeleton, tactile point cloud), for x86_64-linux-gnu / aarch64-linux-gnu / aarch64-android.
  • Added local SDK user profiles via SdkManager.create_user(display_name) and switch_user() — each profile keeps its own calibration data per device, and switching profiles reloads calibration on connected devices immediately.

Wuji Glove

  • Added glove.tactile_residual() publishing 768 continuous contact-residual values at the same rate as tactile (positive = pressed, ~0 = no contact, -1.0 = invalid), mirroring TactileFrame shape so existing tactile-grid visualizers work unchanged. Apply your own thresholding instead of the built-in tactile_binary output.
  • Hand pose solving now runs in parallel, reducing compute time behind hand_joint_angles and derived hand-tracking data, output values and schemas unchanged.
  • Added Python-side IK calibration via glove.calibrate() with per-pose progress callbacks (on_feedback), select hand_profile for Wuji Hand or Wuji Hand 2, or leave it unset to generate URDFs for both profiles from a single capture, switchable later for live hand tracking.
  • Added glove.emf_poses_rate_divider() to lower EMF pose output rate (default 1, set N to publish at input_rate/N, e.g. N=4 → 120Hz down to ~30Hz). All EMF-derived streams (emf_poses / hand_joint_angles / tip_poses / hand_skeleton / tactile_point_cloud) drop to the same rate to reduce IK compute, while IMU (imu_*, tf) and raw tactile streams (tactile / tactile_zones / tactile_residual / tactile_binary) keep original rate. Runtime-effective, persists across reconnects.

Wuji Hand

  • Added the wuji_sdk.WujiHand class — Wuji Hand is now usable directly through wuji-sdk (alongside the existing wujihandpy), with USB auto-discovery and connection, motor enable/disable, per-joint effort limits, real-time 20-joint position subscription and command publishing with LowPass smoothing, and an optional plug-in tactile glove stream.
  • The WujiHand API surface mirrors Wuji Hand 2 (scan / connect / joint_state / joint_command), so code patterns largely interoperate between the two generations.

2026.06.02

Component Versions

ComponentVersionUpdate Method
Wuji SDKv2026.6.2pip install --upgrade wuji-sdk

Key Updates

  • Wuji Glove: Added the binary contact tactile stream glove.tactile_binary(), published at the same rate as tactile() with 768 contact states (1.0 in contact, 0.0 no contact, -1.0 invalid taxel). It mirrors the TactileFrame shape, so existing tactile-grid visualizers work without changes.
  • Added handedness-based connection SdkManager.connect(handedness=Handedness.Left | Handedness.Right, ...) to connect to the left or right side of a bimanual device directly.

2026.05.18

Component Versions

ComponentVersionUpdate Method
Wuji SDKv0.10.0pip install --upgrade wuji-sdk

Key Updates

  • Added device.export_flash_logs(out_dir) to dump historical device logs to JSONL files
  • Added per-channel recording health via QualityMetrics.channels — frame rate, drop rate, jitter, is_online, and last_downtime_ms for each recorded topic
  • Wuji Glove: hand_joint_angles and tip_poses now derive from the URDF kinematic chain. Output schemas are unchanged, but numerical values may differ from previous versions
  • Wuji Glove: Removed glove.tactile_raw() — subscribe to glove.tactile() (calibrated tactile frames) instead
  • Wuji Glove: Removed glove.factory_reset()
  • Fixed devices not reliably publishing offline status when disconnect_all() is called from non-async contexts

2026.04.07

Component Versions

ComponentVersionUpdate Method
Wuji SDKv0.9.0pip install --upgrade wuji-sdk

Key Updates

  • Fixed some known issues

2026.03.23

Component Versions

ComponentVersionUpdate Method
Wuji SDKv0.8.0pip install --upgrade wuji-sdk

Key Updates

  • Wuji SDK and Wuji Studio support sharing the same device
  • Improved log availability and reliability during startup and runtime
  • Improved upgrade stability and reduced false upgrade failure reports

2026.03.09

Component Versions

ComponentVersionUpdate Method
Wuji SDKv0.7.0pip install --upgrade wuji-sdk

Key Updates

  • Added cross-device merged subscription to receive aggregated data from all connected devices at once
  • Added data recording with multi-channel capture, pause/resume, episode switching, and real-time quality monitoring
  • Fixed an occasional crash in callback mode
  • Fixed an issue where subscribing to multiple data streams simultaneously could result in missing data
  • Fixed an issue where some Wuji Glove IMU data streams could not be subscribed

2026.02.14

Component Versions

ComponentVersionUpdate Method
Wuji SDKv0.6.0pip install --upgrade wuji-sdk

Key Updates

  • Added get() / set() APIs for reading and writing device configuration parameters
  • Added save_params() to persist parameter changes to device flash
  • Added SDK/Device logging support, use set_log_level() to control log level
  • Added 6-sensor IMU data: imu_palm(), imu_thumb(), imu_index(), imu_middle(), imu_ring(), imu_pinky()
  • Added coordinate transform APIs: tf_static().subscribe() and tf().subscribe()
  • Added hand tracking data: tip_poses() (fingertip poses), hand_joint_angles() (21 DoF joint angles), hand_skeleton() (21 hand keypoints)
  • Added tactile point cloud data: tactile_point_cloud() for 3D tactile visualization
  • Positioning quality metric EmfPose.confidence — indicates EMF pose estimation reliability (0.0 to 1.0)

2026.02.09

Component Versions

ComponentVersionUpdate Method
Wuji SDKv0.5.0pip install wuji-sdk

Key Updates

  • Wuji SDK launch: Python development kit for Wuji devices
  • Callback subscription support with subscribe_with_callback()
  • Async/await support with recv_async()
  • IDE auto-completion support
  • Data stream subscriptions: tactile matrix, tactile zones, EMF poses

Supported Devices

  • Wuji Glove — Smart glove with tactile sensing and motion capture

© 2026 WUJI TECH All Rights Reserved. https://wuji.tech/