CoolFace
Datasetpublic

THULab/tutorial-ball-2

tutorial-ball-2 (LeRobot) — TsFile This dataset is a lossless conversion to the Apache TsFile format of the HuggingFace LeRobot dataset notmahi/tutorial-ball-2: a low-dimensional robot tutorial trajectory dataset (no video). Original dataset Source dataset: notmahi/tutorial-ball-2 Format: early LeRobot format (meta_data/ + safetensors) Content: purely numeric low-dimensional state/action trajectories — 314,074 frames / 751 episodes / 30 fps. No images or video… See the full description on the dataset page: https://huggingface.co/datasets/THULab/tutorial-ball-2.

sourceHugging Faceotherupdated 1mo agoView on Hugging Face
0likes122downloads
Dataset Card

tutorial-ball-2 (LeRobot) — TsFile

This dataset is a lossless conversion to the [Apache TsFile](https://tsfile.apache.org/) format of the HuggingFace LeRobot dataset `notmahi/tutorial-ball-2`: a low-dimensional robot tutorial trajectory dataset (no video).

Original dataset

  • Source dataset: notmahi/tutorial-ball-2
  • Format: early LeRobot format (meta_data/ + safetensors)
  • Content: purely numeric low-dimensional state/action trajectories — 314,074 frames / 751 episodes / 30 fps. No images or video (meta_data/info.json: video=0).

What is in this repository

data/
└── tutorial_ball_2.tsfile     # numeric time-series (converted)
meta_data/
├── info.json                  # original fps/video flags + tsfile_conversion notes
├── stats.safetensors          # per-feature statistics (copied verbatim)
└── episode_data_index.safetensors  # episode boundaries (copied verbatim)

TsFile storage mapping (table model)

RoleColumn(s)TypeNotes
TAGepisode_idSTRINGepisode_{episode_index}, 751 devices (one per episode)
Timeround(frame_index * 1000 / 30) msINT64 (ms)30 fps; frame_index restarts at 0 each episode
FIELDstate_0state_3FLOATobservation.state[4] expanded
FIELDaction_0, action_1FLOATaction[2] expanded
FIELDepisode_index, frame_index, sample_indexINT64indices (indexsample_index)
FIELDepisode_timestamp_sFLOAT(timestamp)
FIELDnext_doneBOOLEAN(next.done)

Conversion notes

  • Purely numeric — the source has no images or video, so only data/ is converted; nothing else needed.
  • TAG = `episode_id` (751 devices). Time = `round(frame_index × 1000/30)` ms. Because frame_index restarts at 0 within each episode and is strictly increasing, and round(k × 1000/30) is also strictly increasing in k (step ≥ 33 ms), every device's time axis is strictly increasing — no de-duplication or offset needed. (30 fps gives a ~33.333 ms frame interval; with millisecond precision the per-frame times are 0, 33, 67, 100, … — consecutive and collision-free.)
  • Array columns expanded: observation.state[4]state_0..state_3, action[2]action_0..action_1 (FLOAT, matching the source float32).
  • Column names with dots made TsFile-safe (next.donenext_done, …).
  • No columns dropped, no rows dropped: all 314,074 frames preserved.
  • meta_data/ (info / stats / episode index) is copied over; info.json gains a tsfile_conversion block describing the table layout.

Usage

python
from tsfile import TsFileReader

reader = TsFileReader("data/tutorial_ball_2.tsfile")
schemas = reader.get_all_table_schemas()
tname = next(iter(schemas))

cols = ["episode_id", "state_0", "state_1", "action_0", "action_1"]
with reader.query_table(tname, cols, batch_size=65536) as rs:
    while (batch := rs.read_arrow_batch()) is not None:
        df = batch.to_pandas()
        # ... process ...
reader.close()

Citation

bibtex
@misc{tutorial_ball_2,
  title  = {tutorial-ball-2 (LeRobot)},
  author = {notmahi},
  url    = {https://huggingface.co/datasets/notmahi/tutorial-ball-2},
  publisher = {Hugging Face}
}

The source HuggingFace dataset does not declare an explicit license.