Edge engine
Output formats
The HDF5 and LeRobot layouts Rayform writes, and how to load them in PyTorch or JAX.
rayform export resamples a run to one rate, applies your action definition, and writes either HDF5 or LeRobot. Alignment and resampling happen once, at export, not in your dataloader on every epoch.
rayform export RUN [RUN…] --format hdf5|lerobot --fps 15 \
--action joints/position_delta --cameras wrist_left,front --only-usable --out PATHHDF5
The layout follows the robomimic convention also used by Isaac Lab, so existing loaders work unchanged.
drawer.h5
data/ attrs: rayform_version, layout, fps, rig, calibration
demo_0/ attrs: task, operator, run, quality
obs/
wrist_left_rgb (T, H, W, 3) uint8
front_depth (T, H, W) uint16, millimetres
joint_position (T, 14) float32, radians
gripper_position (T, 2) float32
actions (T, 14) float32
timestamps_ns (T,) int64, run clock
demo_1/ …
mask/
usable demo names that passed checksLeRobot
--format lerobot writes a LeRobot v3 dataset with even frame spacing, explicit joint names and camera videos. Before the command returns it loads the result with LeRobotDataset, so a dataset that LeRobot would reject is never written silently.
Loading
import rayform
ds = rayform.open("data/drawer.h5")
loader = ds.torch(cameras=["wrist_left_rgb"], horizon=16, batch_size=64, num_workers=8)import rayform
ds = rayform.open("data/drawer.h5")
for batch in ds.numpy(cameras=["wrist_left_rgb"], horizon=16, batch_size=64):
batch = jax.device_put(batch)rayform.open also accepts a LeRobot dataset folder. Plain h5py works too; the layout above is all there is.
Last updated October 19, 2026