Skip to main content

openral-dataset

openral-dataset — rosbag2 ↔ LeRobotDataset v3 bridge. Every skill execution (sim or hardware) becomes a row in a LeRobotDataset v3.0 (codebase_version="3.0", lerobot>=0.5.1). Successful and failed episodes are both persisted; the per-row next.success flag and the per-dataset meta/info.json["metadata"] ["dataset_success_rate"] let downstream consumers filter.

Public API

from openral_core import RobotDescription
from openral_dataset import LeRobotDatasetSink, RolloutRecorder

robot = RobotDescription.from_yaml("robots/so100_follower/robot.yaml")
sink = LeRobotDatasetSink(
    root="/tmp/ds",
    robot=robot,
    fps=30.0,
    repo_id="openral/dataset-pick-cube",
    license="CC-BY-4.0",
)
with RolloutRecorder(
    robot=robot,
    task_string="pick the cube",
    fps=30.0,
    sinks=[sink],
    repo_id="openral/dataset-pick-cube",
) as rec:
    rec.episode_start()
    # for each tick:
    rec.record_frame(
        observation_state=state_vec,    # (state_dim,) float32
        images={"camera1": rgb_frame},  # camera_key → (H, W, 3) uint8
        action=action_vec,              # (action_dim,) float32
        reward=0.0,
        terminated=False,
        truncated=False,
    )
    rec.episode_end(success=True)

Components

  • RolloutRecorder — in-memory per-rollout accumulator with multi-sink fan-out. Writes the openral.dataset.repo_id / episode_idx / frame_idx OTel attributes on the active rskill.tick span so the Jaeger trace can be joined to the on-disk frame.
  • DatasetSink Protocol — every sink (online / offline) implements open_episode / write_frame / close_episode / finalize.
  • LeRobotDatasetSink — wraps the real lerobot.datasets.LeRobotDataset.create / add_frame / save_episode / finalize. Lazy-imports lerobot; raises ROSConfigError with an install hint when lerobot is absent.
  • features_from_robot — pure RobotDescription → LeRobot v3 features dict mapping. No I/O, no lerobot import.

The rest of the dataset-bridge PR series has since landed:

  • PR2 (partial)SensorRosPublisher in python/sensors/ (ros_publisher.py) ships and is tested. The wrapping packages/openral_sensors_ros/ lifecycle node specified by the dataset-bridge design is not yet built, so feeding live camera topics into a recorder on the hardware path is the one remaining gap.
  • PR3 ✅ — Rosbag2Sink (mcap, daemon writer thread) + openral_msgs/Tick / openral_msgs/Episode IDLs + explicit episode_start / episode_end API on DeployRunner (bag.py).
  • PR4 ✅ — Rosbag2ToLeRobotConverter.from_bag + openral dataset from-bag CLI subcommand (converter.py).
  • PR5 ✅ — openral dataset push with consent prompt + _hf_publish shared helper de-duped from tools/rskill_publisher.py.

CLI surface

Sim pathopenral sim run accepts three flags (PR1):

  • --dataset-out PATH — write a LeRobotDataset v3 to PATH as the sim runs. Path must not pre-exist; lerobot v3 refuses to write into a populated root.
  • --dataset-repo-id STR — repo id stored in meta/info.json. Defaults to openral/dataset-<robot_id>. Not pushed by openral sim run; openral dataset push owns publishing.
  • --dataset-license SPDX — defaults to CC-BY-4.0 (the LeRobot convention). PII-bearing datasets must set a more restrictive license; the openral dataset push consent prompt enforces this.

Hardware / rosbag path — record on a live ROS 2 graph, then convert offline:

  • openral record --profile slim|full --out DIR — wrap ros2 bag record with curated topic profiles (mcap storage). --dry-run prints the composed argv without a sourced ROS 2 install.
  • openral dataset from-bag BAG --robot robot.yaml --output DS — replay a Rosbag2Sink mcap into a LeRobotDataset v3 (--repo-id / --license / --fps optional). PR4.
  • openral dataset push DS [--repo-id ID] [--yes] [--dry-run] — consent-gated upload of a local dataset root to the HF Hub. PR5.

Verification

uv run pytest python/dataset/tests/ -v
uv run mypy --strict -p openral_dataset
uv run ruff check python/dataset/

End-to-end against a real lerobot.datasets.LeRobotDataset v3.0 round-trip:

uv run pytest python/dataset/tests/test_sink_lerobot.py -v

Per CLAUDE.md §1.11 (no mocks): every test loads the real SO-100 RobotDescription from robots/so100_follower/robot.yaml and exercises the real lerobot.datasets.LeRobotDataset writer. Tests pytest.skip with a typed reason on hosts without lerobot>=0.5.1 installed (it lives behind the libero / metaworld dependency groups today).

Coverage scope

  • Sim path is covered end-to-end: tests/sim/test_dataset_emission.py drives openral sim run --dataset-out against aloha_transfer_cube.yaml with real ACT weights + gym-aloha physics + SVT-AV1 video encoding, then re-opens the produced v3 dataset (CUDA + lerobot + gym_aloha gated; skips on CPU/CI).
  • Hardware / rosbag path is covered only in unit isolation: tests/unit/test_deploy_runner_dataset_recording.py drives DeployRunner + Rosbag2Sink directly, plus the converter / CLI unit tests. It has not been exercised through openral deploy sim or a live ROS 2 graph — the deploy-sim node (rskill_runner_node.py) does not yet construct or attach a RolloutRecorder.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

openral_dataset-0.2.0.tar.gz (50.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

openral_dataset-0.2.0-py3-none-any.whl (37.3 kB view details)

Uploaded Python 3

File details

Details for the file openral_dataset-0.2.0.tar.gz.

File metadata

  • Download URL: openral_dataset-0.2.0.tar.gz
  • Upload date:
  • Size: 50.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for openral_dataset-0.2.0.tar.gz
Algorithm Hash digest
SHA256 854e0482ccdc61258d08473083db1011bf2da5422993717e1269a414fd077b02
MD5 0f9dab9900711586f98c708cbe406b7c
BLAKE2b-256 6eb8fc2da0557ab3ef3922ad85e5432769ed0d2baf95ebe6e535b4e589897585

See more details on using hashes here.

Provenance

The following attestation bundles were made for openral_dataset-0.2.0.tar.gz:

Publisher: release-pypi.yml on OpenRAL/openral

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file openral_dataset-0.2.0-py3-none-any.whl.

File metadata

File hashes

Hashes for openral_dataset-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 16403a6ff29aa1b325c851dd5bcb950f22e09e52b06f822870909d861517befa
MD5 b5aac22cd33eedb93b82de4162c5b3f8
BLAKE2b-256 c7cb7499761d0dc7a99d00ae664c1d99e9a0d6d368cf63c288d29cf340ebb772

See more details on using hashes here.

Provenance

The following attestation bundles were made for openral_dataset-0.2.0-py3-none-any.whl:

Publisher: release-pypi.yml on OpenRAL/openral

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

0.3.1

2 files

0.3.0

2 files

This release

0.2.0 This release

2 files

0.1.0

1 file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page