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 | Output rate | Description |
|---|---|---|---|---|
| Tactile | glove.tactile() | TactileFrame | 120 FPS | 24×32 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 orientation, angular velocity and acceleration |
Post-processed products
| Data stream | SDK method | Type | 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×32 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×32 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 |
The EMF chain (emf_poses and its derived streams tip_poses, hand_joint_angles, hand_skeleton, and tactile_point_cloud) supports runtime rate reduction. Call glove.emf_poses_rate_divider().set(N) to drop all five streams to input rate / N (default 1, N=4 → 30 Hz) and cut CPU load. IMU streams (imu_*, tf) and tactile streams (tactile, tactile_zones, tactile_binary, tactile_residual) keep their original rate.
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.