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 stream | SDK method | Type | Default output rate | Description |
|---|---|---|---|---|
| Tactile | glove.tactile() | TactileFrame | 120 FPS | 24×31 calibrated pressure matrix from the piezoresistive array |
| EMF poses | glove.emf_poses() | EmfPoseArray | 120 Hz | 5-finger positioning poses from the EMF modules |
| IMU | glove.imu_palm() | ImuData | 800 Hz | Dorsum IMU angular velocity and linear acceleration (raw, no orientation) |
Post-processed products
| Data stream | SDK method | Type | Default output rate | Description |
|---|---|---|---|---|
| Tactile zones | glove.tactile_zones() | TactileZones | 120 FPS | Pressure data aggregated from tactile by hand region |
| Tactile point cloud | glove.tactile_point_cloud() | PointCloud | 120 Hz | Tactile 3D point cloud generated from tactile |
| Contact detection | glove.tactile_binary() | TactileBinary | 120 FPS | 24×31 binary contact map inferred from tactile (1.0 contact / 0.0 no contact / -1.0 invalid taxel) |
| Contact residual | glove.tactile_residual() | TactileResidual | 120 FPS | 24×31 signed contact residual inferred from tactile (per-taxel measured − predicted baseline, threshold it yourself) |
| Fingertip poses | glove.tip_poses() | FingertipPoses | 120 Hz | 5-finger fingertip poses solved from emf_poses |
| Joint angles | glove.hand_joint_angles() | HandJointAngles | 120 Hz | 21 DoF hand joint angles solved from emf_poses (thumb 5 + other four fingers 4 each) |
| Hand skeleton | glove.hand_skeleton() | HandSkeleton | 120 Hz | 21 MediaPipe keypoint skeleton solved from emf_poses |
| IMU fusion | glove.imu_data_palm() | ImuData | 800 Hz | Complementary-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 stream | SDK method | Type | Output rate | Description |
|---|---|---|---|---|
| Static TF | manager.tf_static() | FrameTransforms | 1 Hz | Fixed frame relationships |
| Dynamic TF | manager.tf() | FrameTransforms | 800 Hz | IMU-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.