CoolFace
Datasetpublic

THULab/axiboai_piper_umi_tamping_after

Piper UMI Tamping TsFile This dataset is an Apache TsFile conversion of axiboai/piper_umi_tamping, a LeRobot v2.1 bimanual robot-manipulation dataset for tamping coffee beans. Modalities: Time-series. The converted repository contains numeric robot observations, actions, frame timing, episode/task tags, and mirrored source metadata. The two wrist-camera video streams remain in the original Hugging Face dataset. Source Dataset and Author Source dataset:… See the full description on the dataset page: https://huggingface.co/datasets/THULab/axiboai_piper_umi_tamping_after.

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

Piper UMI Tamping TsFile

This dataset is an Apache TsFile conversion of `axiboai/piper_umi_tamping`, a LeRobot v2.1 bimanual robot-manipulation dataset for tamping coffee beans.

Modalities: Time-series. The converted repository contains numeric robot observations, actions, frame timing, episode/task tags, and mirrored source metadata. The two wrist-camera video streams remain in the original Hugging Face dataset.

Source Dataset and Author

  • —Source dataset: `axiboai/piper_umi_tamping`
  • —Pinned source revision: `16d559b9281566b56ea0d3230a16553ee25c951f`
  • —Publishing organization: AXIBO (`axiboai`)
  • —Source uploader/contributor: Ishan Shah (`Ishan-Axibo`)
  • —Authorship evidence: the source repository's file history attributes the uploaded dataset tree to Ishan-Axibo; the source card provides no separate formal author list.
  • —License: Apache-2.0
  • —Robot type: piperx_bimanual_eef_6d
  • —LeRobot codebase version: v2.1
  • —Task: Tamp the coffee beans.
  • —Split: train
  • —Scale: 101 episodes, 73,575 frames, 1 task, 30 fps
  • —Episode lengths: 511 to 1,623 frames (mean 728.47)
  • —Source frame files: 101 Parquet files under data/chunk-000/
  • —Source frame layout: data/chunk-{episode_chunk:03d}/episode_{episode_index:06d}.parquet
  • —Source video layout: videos/chunk-{episode_chunk:03d}/{video_key}/episode_{episode_index:06d}.mp4
  • —Paper/citation: not supplied by the source dataset card

Converted Files

  • —TsFile: data/piper_umi_tamping_train.tsfile
  • —Table: piper_umi_tamping_train
  • —Rows: 73,575
  • —Episodes/devices: 101
  • —Tasks: 1
  • —Time precision: milliseconds
  • —Metadata: meta/ is mirrored from the source, with meta/info.json rewritten to describe the TsFile artifact and video policy.

TsFile Schema

Time is synthesized as round(timestamp * 1000) milliseconds and restarts from 0 for each episode.

TAG columns:

  • —episode_index
  • —task_index

Scalar FIELD columns:

  • —frame_index
  • —sample_index, renamed from source column index

Flattened FLOAT FIELD groups:

  • —observation.state[20] -> observation_state_0 ... observation_state_19
  • —action[20] -> action_0 ... action_19

The source uses the same 20-dimensional order for state and action:

IndexSource dimensionState FIELDAction FIELD
0left_xobservation_state_0action_0
1left_yobservation_state_1action_1
2left_zobservation_state_2action_2
3left_rot6d_0observation_state_3action_3
4left_rot6d_1observation_state_4action_4
5left_rot6d_2observation_state_5action_5
6left_rot6d_3observation_state_6action_6
7left_rot6d_4observation_state_7action_7
8left_rot6d_5observation_state_8action_8
9left_gripperobservation_state_9action_9
10right_xobservation_state_10action_10
11right_yobservation_state_11action_11
12right_zobservation_state_12action_12
13right_rot6d_0observation_state_13action_13
14right_rot6d_1observation_state_14action_14
15right_rot6d_2observation_state_15action_15
16right_rot6d_3observation_state_16action_16
17right_rot6d_4observation_state_17action_17
18right_rot6d_5observation_state_18action_18
19right_gripperobservation_state_19action_19

Conversion Notes

  • —The shared config-driven lerobot converter is used; the dataset-specific script at D:/code/scripts/convert_axiboai_piper_umi_tamping.py is a thin local orchestration and validation entry point and is not part of the dataset upload.
  • —The train split is merged into one table-model TsFile. Filter by episode_index and task_index to select an episode or task.
  • —Vector columns are flattened to scalar TsFile fields. Full source prefixes are preserved, with . replaced by _.
  • —The source timestamp column is dropped after Time synthesis because it is redundant with Time / 1000 seconds.
  • —Source index is renamed to sample_index; frame_index is retained.
  • —All 101 source Parquet schemas are identical, both vector widths are exactly 20, and no numeric row, episode, task, state dimension, or action dimension is dropped.

TsFile Encoding and Compression

The uploaded TsFile uses an explicit compact physical encoding profile:

  • —FLOAT/DOUBLE fields: GORILLA + LZ4
  • —INT32/INT64 fields: TS_2DIFF + LZ4
  • —Time: TS_2DIFF + LZ4
  • —BOOLEAN fields (if present): RLE + LZ4
  • —TAG values: TsFile table TAG/device mechanism, stored as STRING TAGs with PLAIN + LZ4

Videos

Videos are not duplicated in this converted repository. They remain under the original source revision's videos/chunk-000/ tree in two frame-aligned streams:

Together, the source contains 202 MP4 files totaling 1,990,320,838 bytes (about 1.85 GiB; Hugging Face displays 1.99 GB). Each stream contains one episode_XXXXXX.mp4 file per episode. Numeric rows remain aligned through episode_index, frame_index, and the source episode metadata. The source metadata describes 640x480 H.264 video at 30 fps without audio.

Validation

The generated TsFile was opened and fully queried with the Apache TsFile Java reader bundled with the conversion tools. Source, staged-Parquet, and TsFile readback row counts all equal 73,575. The file contains one table, 101 episode/task devices, 2 TAG columns, and 42 FIELD columns.

See VALIDATION.md and validation_report.json for hashes and exact checks.

Usage

python
from tsfile import TsFileReader

reader = TsFileReader("data/piper_umi_tamping_train.tsfile")
table_name = "piper_umi_tamping_train"
columns = [
    "episode_index",
    "task_index",
    "frame_index",
    "sample_index",
    "action_0",
    "observation_state_0",
]

with reader.query_table(table_name, columns, batch_size=65536) as result:
    batch = result.read_arrow_batch()
    print(batch.to_pandas().head())