CoolFace
Datasetpublic

DaoyuanZhu/wb_push_cart_stop_go

wb_push_cart_stop_go Whole-body teleoperation data from a Unitree_G1_WholeBody_RGB, published in LeRobot v2.1 format. Published in the v2.1 layout (one parquet and one video clip per episode) so it loads directly on older lerobot releases. On lerobot v3.0+ run the official upgrade first: python -m lerobot.datasets.v30.convert_dataset_v21_to_v30 --repo-id=DaoyuanZhu/wb_push_cart_stop_go Task — push the cart, stop when the human raises a hand, and continue when the human waves… See the full description on the dataset page: https://huggingface.co/datasets/DaoyuanZhu/wb_push_cart_stop_go.

sourceHugging Faceapache-2.0updated 4d agoView on Hugging Face
0likes233downloads
Dataset Card

wbpushcartstopgo

Whole-body teleoperation data from a Unitree_G1_WholeBody_RGB, published in LeRobot v2.1 format.

Published in the v2.1 layout (one parquet and one video clip per episode) so it loads directly on older lerobot releases. On lerobot v3.0+ run the official upgrade first: `` python -m lerobot.datasets.v30.convert_dataset_v21_to_v30 --repo-id=DaoyuanZhu/wb_push_cart_stop_go ``
Taskpush the cart, stop when the human raises a hand, and continue when the human waves again

At a glance

Episodes61
Frames35959 (20 min @ 30 fps)
Episode length473–737 frames (median 586)
Cameras2 × 640×480 H264
State / action41-D / 43-D joint vectors
Splittrain 0:61

Hand state layout

This main revision stores a compact 41-D observation.state: the two unused padding slots from the legacy 43-D layout are removed. The 12 hand values come from the matching real_inspair state, six per hand. action remains the original 43-D command vector.

The matching real_inspair revision retains the original 43-D layout, with six Inspire state values plus one zero-padded slot per hand.

Schema

observation.state is 41-D and action remains 43-D:

 0–11  legs      left/right  hip_pitch, hip_roll, hip_yaw, knee, ankle_pitch, ankle_roll
12–14  waist     yaw, roll, pitch
15–21  left arm  shoulder_pitch/roll/yaw, elbow, wrist_roll/pitch/yaw
22–27  left hand pinky, ring, middle, index, thumb_pitch, thumb_yaw
28–34  right arm shoulder_pitch/roll/yaw, elbow, wrist_roll/pitch/yaw
35–40  right hand pinky, ring, middle, index, thumb_pitch, thumb_yaw

In real_inspair, the Inspire hand reports a 6-D estimate: slots 22–27 / 36–41 carry values and slot 28 / 42 stays zero-padded. On the action side the same slots carry the native command and the last slot is a binary trigger (0.0 / 1.0).

The hand state on real_inspair is estimated, transferred from captures that did record Inspire feedback — the legacy rig had no hand sensing. Describe it as estimated/transferred Inspire hand state, not as recorded ground truth.

Teleoperation stream

Beyond the 41-D state and 43-D action, every frame carries the raw teleoperation and controller signals the capture recorded:

ColumnShapeContent
action.motion_token(64,)SONIC motion token
observation.eef_state(14,)end-effector: left/right wrist position and quaternion
observation.projected_gravity(3,)gravity in the base frame
observation.root_position(3,)base position
observation.root_orientation(4,)base orientation quaternion
observation.init_base_quat(4,)base quaternion at episode start
observation.cpp_rotation_offset(4,)controller rotation offset
teleop.left_hand_joints(7,)raw left-hand teleop joints (Dex3 order)
teleop.right_hand_joints(7,)raw right-hand teleop joints
teleop.left_wrist_joints(3,)left wrist roll/pitch/yaw
teleop.right_wrist_joints(3,)right wrist roll/pitch/yaw
teleop.smpl_joints(72,)SMPL joint positions of the operator
teleop.smpl_pose(63,)SMPL pose parameters
teleop.body_quat_w(4,)operator body quaternion
teleop.target_body_orientation(6,)target body orientation (6-D)
teleop.vr_3pt_position(9,)VR three-point tracker positions
teleop.vr_3pt_orientation(18,)VR three-point tracker orientations
teleop.planner_mode(1,)locomotion mode
teleop.planner_movement(3,)commanded movement vector
teleop.planner_facing(3,)commanded facing vector
teleop.planner_speed(1,)commanded speed
teleop.planner_height(1,)commanded base height
teleop.delta_heading(1,)heading delta
teleop.stream_mode(1,)teleop stream mode
teleop.smpl_frame_index(1,)index into the SMPL stream
sync.t_host_ns(1,)host timestamp in nanoseconds

Video

KeyContentCodec
observation.images.cam_chestcam_chest — raw camerah264
observation.images.cam_chest_hand_overlaycam_chest — MediaPipe hand landmarksh264
observation.images.cam_chest_pose_overlaycam_chest — RTMO body skeletonh264
observation.images.cam_headcam_head — raw camerah264
observation.images.cam_head_hand_overlaycam_head — MediaPipe hand landmarksh264
observation.images.cam_head_pose_overlaycam_head — RTMO body skeletonh264

All video is H.264 and plays in any standard player.

Pose annotations

Keypoints ride along as parquet columns, one row per frame — no separate annotation files.

ColumnSourceContent
observation.human_hand.<cam>.landmarks_uvMediaPipe Hands21 points per hand, pixel u/v, left slot then right
observation.human_hand.<cam>.landmarks_2dMediaPipe Handsthe same points, normalised x/y/z
observation.human_hand.<cam>.world_landmarksMediaPipe Handsmetric-like world x/y/z
observation.human_hand.<cam>.valid / .scoreleft/right presence flag and handedness confidence
observation.human_body.<cam>.landmarks_uvRTMO rtmo-m_16xb16-600e_body7COCO-17 body, pixel u/v
observation.human_body.<cam>.landmarks_2dRTMOthe same points, normalised
observation.human_body.<cam>.scores / .validper-keypoint confidence and a per-frame flag

Zero-filled coordinates with valid = 0 mean nothing was detected; there are no NaNs.

How the annotations were filtered

Body detections are post-processed per episode: score threshold, duplicate suppression by bounding-box containment (plain IoU misses a sprawling false box that swallows the real one), fragment merging, then a single-identity lock built from motion tracklets merged on a saturation-masked torso-hue histogram. Tracklets that overlap in time are never merged, since co-visible detections cannot be the same person.

Hand candidates are additionally anchored to the central person's wrist — a detection further than half a shoulder-width from that wrist is rejected, which is what keeps hand-shaped props out of the annotations.

Layout

data/chunk-000/episode_000000.parquet             one parquet per episode
videos/chunk-000/<video_key>/episode_000000.mp4   one clip per episode
meta/info.json                                    feature schema
meta/episodes.jsonl                               episode index and lengths
meta/tasks.jsonl                                  task strings
meta/stats.json                                   per-feature statistics

Loading

python
from lerobot.common.datasets.lerobot_dataset import LeRobotDataset

ds = LeRobotDataset("DaoyuanZhu/wb_push_cart_stop_go", revision="real_inspair")
print(ds.meta.features.keys())
sample = ds[0]

License

Apache-2.0.