.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.HDF Group specifications (file level)
HDF Group specifications (file level)
- Dimension Scales. Every axis of every gridded dataset carries a scale:
timefor 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
.movfiles areH5T_OPAQUEtaggedvideo/quicktime, the microphone.wavis taggedaudio/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.
CF-1.11 attributes (metadata level)
CF-1.11 attributes (metadata level)
- 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 withunits="seconds since <capture start, ISO-8601 UTC>"andcalendar="proleptic_gregorian", so xarray decodes it to datetimes.timestamp_nsbeside 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 dataset layout (domain level)
robomimic dataset layout (domain level)
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:
/datawith attrstotal(sample count) andenv_args(JSON:env_name="holos_capture",type=99meaning no simulator behind this, and the capture’s metadata underenv_kwargs)./data/demo_0with attrsnum_samplesand the frame conventions above, holdingobs/*,actions,states,timeandtimestamp_ns./mask/alllistingdemo_0, sofilter_by_attribute="all"works.
/data, under /holos and /media, so a stock robomimic loader never sees it.What is inside
/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 oneT, 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 withdecodeFrames: 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 carryholos_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-demostate_componentandaction_componentscales timestamp_ns,timeas a CF dimension scale, and the frame attrs on the demo group/holos(metadata, raw streams, transcript, events, VLM) and/mediaactionsas the wrist delta, declared inderivation
API
The file lives under the capture’s
exports/ prefix and is removed with the capture.