Data Collection
Record contact pressure alongside robot joint state and camera video. The glove adds a tactile modality that captures how hard the robot gripper is pressing — information invisible to vision alone.
System Connections
Connect all devices before starting any software. The glove is strictly USB wired — there is no wireless mode.
Robot Arm + Hand
Orca Hand (recommended) or other end-effector. Connected via Feetech USB adapter or CAN, depending on arm.
/dev/ttyUSB0 or CAN0Juqiao Glove
USB-C to host PC. Appears as CDC-ACM serial. 1.5 m cable; use a USB extension if needed for freedom of movement.
/dev/ttyACM0Wrist Camera
USB or GigE camera mounted on the robot's wrist, providing an object-centric view for training.
/dev/video0 or GigE IPOverhead Camera
Fixed workspace camera for scene context. Pair with the wrist camera for multi-view datasets.
/dev/video2 or GigE IPTeleoperation Device
Leader arm (SO-101 / OpenArm leader), VR controller, or SpaceMouse driving the follower robot.
Leader port / HIDStep-by-Step Recording
Bring up the robot arm and hand
Start the arm driver (and Orca Hand driver if applicable) in separate terminals. Verify joint_states are publishing before proceeding.
Start the Juqiao Glove driver
Launch the glove ROS2 node. Verify 200 Hz data is flowing before starting any recording session.
Launch cameras
Start camera nodes for wrist and overhead views. Confirm image topics are publishing at target frame rate (typically 30 fps).
Verify all streams are synchronized
Use ros2 topic list to confirm all required topics are present. Check timestamps are within 20 ms across modalities before recording any episodes.
Record a dataset with LeRobot
Use LeRobot's record script. The --tactile-topic flag adds the glove pressure stream as a dataset column alongside joint states and images.
Review episodes before pushing
Replay each episode with the heatmap overlay to verify tactile data quality before committing to the HuggingFace Hub.
Push to HuggingFace Hub
Upload the validated dataset. The dataset card is auto-generated with modality descriptions including tactile.
Dataset Schema
Each frame in the dataset contains the following columns. All arrays are stored as float32 Parquet columns; images as MP4 video sequences.
| Column | Shape / Type | Description |
|---|---|---|
| observation.state | float32[6] | Robot arm joint positions (radians). Index 6 is gripper aperture if using a 6-DOF arm. |
| observation.hand_state | float32[17] | Orca Hand joint positions (radians), 17 DOF. Omit if no dexterous hand. Labeled per joint name in metadata. |
| observation.tactile_pressures | float32[64] | Juqiao Glove normalized pressure per node, 0.0 (no contact) to 1.0 (full scale). 200 Hz downsampled to match robot frame rate. |
| observation.tactile_pressures_raw | uint16[64] | Raw 16-bit ADC values. Preserve for re-normalization after recalibration. Optional; omit to reduce dataset size. |
| observation.grasp_region | str | Active contact region heuristic: "palm", "thumb", "index", "middle", "ring", "pinky", or "" (no contact). |
| observation.images.wrist | uint8[H, W, 3] | Wrist camera RGB frame at 30 fps, stored as MP4 video sequence. |
| observation.images.overhead | uint8[H, W, 3] | Overhead camera RGB frame at 30 fps. |
| action | float32[6 or 23] | Target joint positions for the arm (6) and optionally hand (17). Shape depends on whether dexterous hand is present. |
| language_instruction | str | Task description, e.g. "pick up the egg without breaking it". Enables language-conditioned policy training. |
| episode_index | int | Episode number within the dataset. |
| frame_index | int | Frame number within the episode (0-indexed). |
| timestamp | float64 | Seconds elapsed since episode start. |
Tactile Downsampling
The glove streams at 200 Hz; the robot and cameras typically run at 30–100 Hz. The recorder aligns frames using nearest-neighbor timestamp matching. To preserve the full 200 Hz tactile stream as a separate array:
Episode Quality Checklist
Review each episode against these criteria before including it in your dataset. One bad episode can introduce spurious tactile patterns that degrade policy training.
-
Tactile stream is continuous — no frame gaps Verify frame.sequence increments without skips. Frame drops appear as repeated values in the tactile column.
-
Baseline at rest is near zero (< 0.03) At episode start (before any contact), the max pressure node should read below 0.03. Drift above 0.05 at rest indicates the glove needs recalibration.
-
Contact events align with visible grasps in video Replay with --overlay-tactile. Pressure spikes (max node > 0.4) should coincide with visible gripper closure in the wrist camera.
-
Grasp region is consistent during contact phase grasp_region should stabilize on one or two regions during each grasp (e.g. "palm" + "index"). Rapidly changing regions indicate glove misalignment or noisy signal.
-
Glove latency < 20 ms relative to robot state Compare tactile event onset to gripper velocity spike. Latency > 20 ms suggests USB hub congestion — connect the glove directly to a host USB port.
-
Language instruction matches the task demonstrated For language-conditioned datasets, ensure the instruction entered at episode start accurately describes what the operator actually demonstrated.
-
No cable interference with robot motion The 1.5 m USB cable must not restrict the operator's hand movements or pull the glove off during the episode. Use a cable management clip on the forearm.
Training with Tactile Observations
Policies that consume tactile input typically see 15–30% improvement on contact-sensitive tasks (fragile object handling, peg insertion, cloth folding) compared to vision-only baselines.