Wuji Hand Community

Common questions and troubleshooting for the Wuji dexterous hand SDK, JSONL pipeline, and platform integration.

FAQ

What Python package do I need to read data from the Wuji hand?

Install wujihandpy, the official Wuji SDK Python package:

pip install wujihandpy numpy

The wuji_hand_sdk_stream.py bridge script imports it via import wujihandpy and calls hand.read_joint_actual_position(timeout=0.4) to get the 5×4 joint position array. Verify the install: python3 -c "import wujihandpy; print(wujihandpy.__version__)".

What does the 5×4 joint position array represent?

The Wuji hand has 5 fingers (thumb, index, middle, ring, little), each with 4 joints. The read_joint_actual_position() call returns a flat list of 20 floats representing joint angles in radians. The bridge script reshapes this into a 5×4 array, computes the mean across each finger's 4 joints, and normalizes from the [0, π/2] range to [0, 1] to produce the per-finger bends value used in teleop and recording.

The pressure map is always zeros. Is that normal?

It can be. If only the joint position hardware is connected without a tactile sensor module, the pressure_map_24x32 field is a zero-filled placeholder. Use mock_wuji_stream.py to verify the heatmap rendering pipeline works correctly. For production use, confirm your Wuji firmware version includes tactile sensor support and that the tactile module is powered and connected.

How do I run without physical hardware?

Use the included mock_wuji_stream.py script to generate synthetic JSONL frames with animated finger bends, a Gaussian pressure-blob tactile map, 6-axis IMU data, and EMF readings at configurable Hz:

python3 mock_wuji_stream.py --hz 30 --hand-side right --seed 42

To use the mock stream with the agent, override the default stream command with --wuji-cmd:

python3 wuji_glove_agent.py \
  --session YOUR_SESSION_ID \
  --node-id wuji-mock \
  --wuji-cmd "python3 mock_wuji_stream.py --hz 30 --hand-side right"

All platform features work identically in mock mode.

What is the difference between wuji_glove_agent.py and wuji_hand_sdk_stream.py?

wuji_hand_sdk_stream.py is a data source: it imports wujihandpy, reads raw joint positions from the hardware, and emits JSONL frames to stdout at configurable Hz. wuji_glove_agent.py is the platform bridge: it launches the stream script as a subprocess, parses the JSONL output, and forwards the decoded sensor data to the Fearless Platform via WebSocket. The agent also handles session registration, telemetry buffering, reconnection, and latency pings.

How do I select left vs right hand?

Pass --glove left, --glove right, or --glove auto (default) to wuji_glove_agent.py. In auto mode the agent reads the hand_side field from the first JSONL frame. The stream script accepts --hand-side left or --hand-side right, defaulting to right. For bilateral recording, run two agent processes with distinct --node-id values and different --glove settings, connected to the same session ID.

The agent fails to connect to the platform WebSocket. What should I check?

Confirm the Fearless backend is running: curl http://localhost:8000/health. If using a remote backend, pass the correct URL: --backend ws://HOST:PORT. The agent uses exponential backoff (1 s min, 10 s max) for reconnection — watch the terminal output for reconnect attempts and the specific error message.

Works best with OpenArm 1

The Wuji Hand is the recommended operator glove for OpenArm 1 teleoperation sessions. Mount the OpenArm on a stable surface, pair the Wuji agent to the same session as the arm agent, and you have a complete teleoperation and imitation learning data collection rig. See the OpenArm teleoperation setup step for integration instructions.

Ready to Start Collecting?

High-DOF teleoperation data at 30 Hz. Works best with OpenArm 1.