Rayform

Reference

Frames, units and time

The conventions every processed recording follows, so your pipeline never has to guess.

Rayform is in private preview. APIs, formats and the SDK described here may change before general availability.

Mismatched conventions are the most common reason robot data quietly fails: a quaternion read in the wrong order or a flipped camera frame trains a model on wrong data without any error. Rayform converts every recording to one convention on the way in, records it in the metadata, and converts again on the way out only when you ask.

Space

ItemConvention
World frameOne per site. Right-handed, Z up, metres (ROS REP-103)
Camera frameOpenCV: X right, Y down, Z forward
RotationsUnit quaternions, w, x, y, z order
Poses[x, y, z, qw, qx, qy, qz], child in parent
Camera modelPinhole with radial-tangential distortion, from a versioned calibration

Time

ItemConvention
Timestampsint64 nanoseconds (t_ns), monotonic within a session
ClockThe session clock; offsets estimated during alignment are already applied
ResamplingOnly on request, with the method recorded (nearest or linear)

Values

QuantityUnit and type
RGB imagesuint8, channels-last on disk, channels-first in EpisodeDataset
Depthmetres, float32; missing depth is 0
Point cloudsmetres, float32, in the sensor frame
Joint positionsradians (revolute) or metres (prismatic), float32
Joint velocitiesper second, float32
Gripperas reported by your robot; units stored in channel metadata

Converting on the way out

Exports, streams and the PyTorch dataset accept frame and quat_order:

frameWorldCamera
rayform (default)Z upOpenCV
rosZ up, REP-103ROS optical (same axes as OpenCV)
opencvY downOpenCV
openglY upOpenGL: X right, Y up, Z backward
isaacZ upUSD camera (OpenGL axes)
mujocoZ upMuJoCo camera (OpenGL axes)
Python
seg.channel("poses/base", frame="opengl")
client.exports.create(slice_, format="rlds", options={"frame": "ros", "quat_order": "xyzw"})

Provenance

Every exported sample carries slice, segment, segment_version and site. Keep them in your training logs; any result can then be traced to the exact data it came from.

Last updated October 18, 2026