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.
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)
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_indexrestarts at 0 within each episode and is strictly increasing, andround(k × 1000/30)is also strictly increasing ink(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.done→next_done, …). - No columns dropped, no rows dropped: all 314,074 frames preserved.
meta_data/(info / stats / episode index) is copied over;info.jsongains atsfile_conversionblock describing the table layout.
Usage
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
@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.
