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.
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.
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.
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.
