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.3.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.3.0-py3-none-any.whl (37.3 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: openral_dataset-0.3.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.3.0.tar.gz
Algorithm Hash digest
SHA256 bd9704e968c64741b64945e82d86b66d277a90c4e01151257f108dbd98c9e5a6
MD5 c36668ca943384e8f7e626bd6fd6e07a
BLAKE2b-256 2218dd3706e490d75ea48441a251a890938169e99945c8cb39c176feb737d91a

See more details on using hashes here.

Provenance

The following attestation bundles were made for openral_dataset-0.3.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.3.0-py3-none-any.whl.

File metadata

File hashes

Hashes for openral_dataset-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 02a0f427e9fa483940b4200f6649b966563dc0aef4ec77ed97d9783a42f1572c
MD5 b3eeb4b6b7c776e802f52e351d3bd373
BLAKE2b-256 c03378165be9a7a37990483b0e8aa7799d811254ccdf3488775583b36ee66369

See more details on using hashes here.

Provenance

The following attestation bundles were made for openral_dataset-0.3.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

This release

0.3.0 This release

2 files

0.2.0

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