Data Streams Overview

Wuji Glove outputs many data streams through the Wuji SDK: raw data captured directly by the glove hardware, and post-processed products solved by SDK algorithms. For subscription modes, see SDK Data subscription. For a hands-on introduction, see Quick start.

All data frames share the same FrameHeader, which contains a sequence number and device timestamp. For common type definitions (FrameHeader, Vector3, Quaternion, Pose, etc.), see SDK Data structure reference. For timestamp_us semantics, the sync mechanism, and accuracy, see SDK Time Synchronization.

Available data streams

The data streams fall into three categories by how they are produced:

  • Raw data: captured directly by the glove hardware and the input for every product. It can be saved alone and recomputed into all products afterward with the offline pipeline, with the same result as real-time computation and significantly lower CPU usage during capture.
  • Post-processed products: solved by SDK algorithms on top of the raw data.
  • Global resources: device-level coordinate transforms published independently of the data streams.

Raw data

Data streamSDK methodTypeDefault output rateDescription
Tactileglove.tactile()TactileFrame120 FPS24×31 calibrated pressure matrix from the piezoresistive array
EMF posesglove.emf_poses()EmfPoseArray120 Hz5-finger positioning poses from the EMF modules
IMUglove.imu_palm()ImuData800 HzDorsum IMU angular velocity and linear acceleration (raw, no orientation)

Post-processed products

Data streamSDK methodTypeDefault output rateDescription
Tactile zonesglove.tactile_zones()TactileZones120 FPSPressure data aggregated from tactile by hand region
Tactile point cloudglove.tactile_point_cloud()PointCloud120 HzTactile 3D point cloud generated from tactile
Contact detectionglove.tactile_binary()TactileBinary120 FPS24×31 binary contact map inferred from tactile (1.0 contact / 0.0 no contact / -1.0 invalid taxel)
Contact residualglove.tactile_residual()TactileResidual120 FPS24×31 signed contact residual inferred from tactile (per-taxel measured − predicted baseline, threshold it yourself)
Fingertip posesglove.tip_poses()FingertipPoses120 Hz5-finger fingertip poses solved from emf_poses
Joint anglesglove.hand_joint_angles()HandJointAngles120 Hz21 DoF hand joint angles solved from emf_poses (thumb 5 + other four fingers 4 each)
Hand skeletonglove.hand_skeleton()HandSkeleton120 Hz21 MediaPipe keypoint skeleton solved from emf_poses
IMU fusionglove.imu_data_palm()ImuData800 HzComplementary-filter fusion of imu_palm raw data, adding orientation

The tactile frame (tactile), tactile zones (tactile_zones), EMF poses (emf_poses), and the raw IMU streams support runtime output rate tuning: call sub.set_rate(hz) on a subscription handle to request a lower output rate — the device quantizes it, returns the rate in effect, and 0 restores the default. Although the table above lists tactile_zones as aggregated by zone, the device produces it directly, so it can be tuned independently. Derived streams (tip_poses, hand_joint_angles, hand_skeleton, tactile_point_cloud, imu_data_palm, and so on) follow their source rate and can't be tuned on their own. See Output Rate Tuning.

Global resources

Data streamSDK methodTypeOutput rateDescription
Static TFmanager.tf_static()FrameTransforms1 HzFixed frame relationships
Dynamic TFmanager.tf()FrameTransforms800 HzIMU-driven dynamic transforms

C SDK equivalents: wuji_subscribe_tf(...) / wuji_subscribe_tf_static(...), callback signature WujiFrameTransforms, device-independent. For the full C API reference, see Wuji SDK · C API Reference.

Subscribe to Updates