CoolFace
Datasetpublic

nepyope/can_to_martino

can_to_martino Whole-body teleoperation on a Unitree G1: pick a can off a low table and hand it to a person. Recorded 2026-08-23 with the SONIC teleop stack (PICO full-body tracking driving the balance controller, Damiao CAN grippers on both hands), then reshaped into the state/action layout π₀.₅ trains on. robot unitree_g1 episodes 44 frames 98,516 fps 50 task Move the can from the low table to Martino cameras ego_view, left_wrist, right_wrist — 480×640… See the full description on the dataset page: https://huggingface.co/datasets/nepyope/can_to_martino.

sourceHugging Faceapache-2.0updated 1mo agoView on Hugging Face
0likes109downloads
Dataset Card

cantomartino

Whole-body teleoperation on a Unitree G1: pick a can off a low table and hand it to a person. Recorded 2026-08-23 with the SONIC teleop stack (PICO full-body tracking driving the balance controller, Damiao CAN grippers on both hands), then reshaped into the state/action layout π₀.₅ trains on.

robotunitree_g1
episodes44
frames98,516
fps50
taskMove the can from the low table to Martino
camerasego_view, left_wrist, right_wrist — 480×640
observation.state31 = 29 body joints + left/right gripper
action66 = 64-D SONIC motion token + left/right gripper

action[t] is the command that produces observation.state[t+1], so the last frame of each episode is dropped for want of a target. The state joints carry Unitree SDK names (kLeftShoulderRoll.q), which is what the LeRobot visualizer maps onto the G1 URDF.

Provenance

Four recording sessions, merged and renumbered. 25 of the 69 recorded episodes were flagged as discarded by the operator during collection and dropped.

An earlier stretch of the evening produced nothing usable: four exporter runs exited before saving anything, and six more saved a single fragment each — seven episodes in total, none longer than 7 s — because the exporter was terminating after one episode. None of that is included here.

sessionkeptdiscarded
2026-08-23-20-15-0464
2026-08-23-20-59-5301
2026-08-23-21-05-482017
2026-08-23-21-38-32183

The kept episodes run 27–90 s, median 44 s.

Grippers

The jaws are driven open/closed rather than continuously, so both gripper channels are binary even though the schema is 0..1 closedness. The right hand does the work — closed in 27% of frames — while the left is closed in roughly 0.5%, since the task is one-handed.

That imbalance puts the left gripper's 1st and 99th percentiles both at 0. Left as computed, quantile normalization would divide by the 1e-8 epsilon and turn every frame where the left hand is closed into ~2×10⁸, as both a state input and an action target. Its q01/q99 are therefore set to the 0/1 the channel actually spans, matching the right hand. Every other quantile is as computed by augment_dataset_quantile_stats.py.

Stats

meta/stats.json carries q01, q10, q50, q90, q99 for observation.state and action. π₀.₅ normalizes both with quantiles rather than mean/std, and errors out without them. Image features keep mean/std only, which is correct: VISUAL maps to IDENTITY and image quantiles are never read.

The repo is tagged v3.0 to match meta/info.json; without the tag, dataset resolution fails with MISSING_VERSION_TAG_MESSAGE regardless of what the metadata says.