Skip to main content
Download hands back the raw .capture package: a folder of CSVs, JSON and video. Export as HDF5 writes the same data as one .h5 file with typed datasets, a shared time axis and the media embedded, for notebooks, robotics pipelines and anyone who would rather not parse CSVs.

Exporting

Right-click a completed capture in the Captures table or tile grid and choose Export as HDF5. A worker writes the file, so the toast follows the job (waiting for a worker, writing, uploading) and the download starts when it is done. A capture whose export is still current hands back the same file without a new job; editing the transcript makes the last export stale, and the next ask writes a fresh one. Picture captures have no package and do not offer the export.

The conventions

The group tree is built from three published conventions, each one checkable with a tool you already have, rather than a layout of our own.
  • Dimension Scales. Every axis of every gridded dataset carries a scale: time for the sample axis, pose_component (x y z qx qy qz qw), joint, tracked_object, state_component. This is the mechanism netCDF-4 is built on, so xarray, netCDF4 and MATLAB read the axes without custom code.
  • Image and Palette Specification 1.2 on image datasets (CLASS="IMAGE", IMAGE_VERSION="1.2", IMAGE_SUBCLASS="IMAGE_TRUECOLOR", INTERLACE_MODE="INTERLACE_PIXEL"), so HDFView renders them.
  • Opaque datatypes with a MIME tag for embedded container bytes: the camera .mov files are H5T_OPAQUE tagged video/quicktime, the microphone .wav is tagged audio/wav. Readers know what they are holding without a sidecar.
  • Chunked storage with gzip, shuffle and Fletcher-32 checksums on anything that is not tiny; one self-contained file with no external links; strings as variable-length UTF-8.
  • Root: Conventions="CF-1.11, HolosCapture-1.0", title, institution, source (device and app), history (exporter version and time), references (this page), capture_id, organization_id, modality, capture_start.
  • Every numeric dataset: units (m, s, ns, 1), long_name, and _FillValue (NaN) where a stream can be absent.
  • time: float64 with units="seconds since <capture start, ISO-8601 UTC>" and calendar="proleptic_gregorian", so xarray decodes it to datetimes. timestamp_ns beside it is int64 nanoseconds since the Unix epoch, the ROS 2 convention.
  • The coordinate frame is stated once on the demo group and never left implicit: frame="arkit_world", handedness="right", up_axis="Y", quaternion_order="xyzw", length_unit="m".
robomimic’s HDF5 format is the de facto shape for learning-from-demonstration data (robosuite, MimicGen, LIBERO and ManiSkill exporters all read or write it). One capture is one demo:
  • /data with attrs total (sample count) and env_args (JSON: env_name="holos_capture", type=99 meaning no simulator behind this, and the capture’s metadata under env_kwargs).
  • /data/demo_0 with attrs num_samples and the frame conventions above, holding obs/*, actions, states, time and timestamp_ns.
  • /mask/all listing demo_0, so filter_by_attribute="all" works.
Everything Holos-specific lives outside /data, under /holos and /media, so a stock robomimic loader never sees it.

What is inside

Only what the package holds is written. Sources the capture lacks are listed in the job’s notes as skipped. A file the exporter has no typed home for is embedded verbatim under /holos/files/<path> with its MIME type and listed in the notes as an extra, so a new track is never dropped silently.

Vision Pro and iPhone packages

A Vision Pro capture carries ARKit’s 26-joint hand skeleton (hand_*_joints_*) and stereo video. An iPhone capture carries Vision’s 21 hand landmarks instead (hand_*_landmarks_3d in metres and _2d in image space, each landmark with a confidence, 0 where Vision did not see it), a Core Motion IMU track, one back-camera video, and a tracking_state column on the device pose. Both export into the same tree; the demo group’s master_clock says which hand track set the clock, and source on the root names the device.

One clock for the demo, every clock under raw

The device records streams at different rates: the head pose at about 60 Hz, each hand at about 90 Hz on Vision Pro and about 15 Hz on iPhone, the IMU at 100 Hz, object anchors when they move. robomimic assumes one T, so /data/demo_0 samples everything on the dominant hand’s clock (the right hand when it was tracked, else the left, ARKit’s skeleton before Vision’s landmarks, else the device) by zero-order hold: each sample carries the latest value of every other stream, and NaN where a stream has nothing yet or its newest value is older than 0.25 s. The demo group’s master_clock and resampling attrs say exactly this. Nothing is thrown away: /holos/raw keeps every stream at its own rate with its own time scale.

What actions means for a human demonstration

robomimic loaders require the key, and a person has no commanded action. actions[t] is the dominant hand’s wrist pose delta: the position difference to the next sample and the relative rotation q[t+1] * conj(q[t]) (xyzw), with an identity delta on the last row. On an iPhone capture, where Vision’s wrist landmark carries no rotation, it is the [T, 3] position delta alone. The dataset’s derivation and source_hand attrs state it, so nobody has to guess.

Procedure steps as sample ranges

When the capture was recorded against a procedure, /holos/events/procedure_steps carries each step visit with t_start and t_end in capture seconds and start_sample and end_sample as indices into /data/demo_0 (end exclusive), so a step is a slice: obs[start:end].

Reading it

Decoded frames

The export embeds the camera files as bytes rather than decoding them: a ten-minute stereo capture decoded to uint8 arrays is tens of gigabytes. Asking the API with decodeFrames: true adds /holos/raw/video/<camera>/frames (uint8 [F, H, W, 3], Image Spec 1.2, one frame per chunk, with its own time scale) and /data/demo_0/obs/<camera>_frame_index (int64 [T], the frame nearest each demo sample), so a loader can gather frames per sample without the file repeating them.

The convention version

The root attrs carry holos_convention_version="HolosCapture-1.0". On top of robomimic’s layout, 1.0 adds:
  • the shared coordinate scales at the root (pose_component, joint, tracked_object, axis_xyz, landmark, image_uv) and the per-demo state_component and action_component scales
  • timestamp_ns, time as a CF dimension scale, and the frame attrs on the demo group
  • /holos (metadata, raw streams, transcript, events, VLM) and /media
  • actions as the wrist delta, declared in derivation
A change to any of this is a new version here, not a surprise in a file.

API

The file lives under the capture’s exports/ prefix and is removed with the capture.