Rayform

Guides

Preparing recordings

What to record and how, so Rayform can align, reconstruct and label your data well.

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

Rayform works with what you already record. Better timing and calibration give better alignment and reconstruction, so a few checks before you record pay off.

Supported inputs

InputNotes
MCAP (.mcap)Preferred. ROS 2 and Foxglove message schemas are read directly.
ROS 2 bags (.db3, .mcap)Converted to MCAP on upload.
ROS 1 bags (.bag)Supported for common message types.
Raw filesImage sequences, .npy or .parquet tables, plus a rayform.yaml manifest describing them.

Sensors

Any mix of the following works. More viewpoints and depth give better reconstructions.

ChannelMessage typesUsed for
RGB camerasensor_msgs/Image, CompressedImage, foxglove.CompressedVideoReconstruction, segmentation, training observations
Depth camerasensor_msgs/Image (16UC1 mm or 32FC1 m)Reconstruction, scale
LiDARsensor_msgs/PointCloud2Geometry, metric scale, registration
IMUsensor_msgs/ImuPose estimation, time alignment
Joint statesensor_msgs/JointStateRobot state and actions
Grippercontrol_msgs/GripperCommand or a JointState jointRobot state
Posesgeometry_msgs/PoseStamped, tf2_msgs/TFMessageInitial trajectory, extrinsics

Timing

Alignment is only as good as your clocks.

  • Best: hardware synchronisation (PTP or a trigger line) with timestamps taken at capture, not at logging.
  • Good: one host clock with consistent driver latency. Rayform estimates fixed offsets per sensor from motion.
  • Avoid: timestamps assigned when messages are written to disk, which drift with load.

Rayform reports the offsets it estimated in the session's issues, so you can see how far each stream was moved.

Calibration

Include intrinsics and extrinsics for every sensor. Rayform reads sensor_msgs/CameraInfo and the /tf_static tree from the recording. If you calibrate separately, upload the result once per device:

calibration.yaml
device: arm-cell-1
cameras:
  cam0:
    model: pinhole-radtan
    intrinsics: [612.4, 611.9, 320.1, 241.7]       # fx, fy, cx, cy
    distortion: [0.091, -0.212, 0.0003, -0.0007]
    resolution: [640, 480]
    T_base_cam: [0.12, 0.0, 0.45, 0.5, -0.5, 0.5, -0.5]  # x y z qw qx qy qz
Shell
rayform calibration upload calibration.yaml

Raw files manifest

When your data is not in MCAP or a bag, describe it with a manifest next to the files.

rayform.yaml
site: lab-2
device: arm-cell-1
streams:
  - name: cam0/rgb
    type: image
    path: cam0/*.png
    timestamps: cam0/timestamps.csv     # one int64 nanosecond value per frame
  - name: joints
    type: joint_state
    path: joints.parquet                 # columns: t_ns, position, velocity, effort
    joint_names: [shoulder_pan, shoulder_lift, elbow, wrist_1, wrist_2, wrist_3, gripper]

Capture checklist

  • Walk or drive the space slowly at the start, so the static scene is well covered before anything moves.
  • Keep at least one camera on the workspace when a robot is acting.
  • Record the robot at its normal control rate; do not downsample before upload.
  • Note anything unusual (lighting changes, sensor faults) in the session notes when you upload.

Last updated October 18, 2026