Skip to main content

Regular streams

Regular streams emit a row on a fixed cadence — once per LateUpdate (render frame) or once per FixedUpdate (physics tick). The row rate is determined by the engine's loop, not by what's happening in the experiment. Even if nothing interesting occurred this frame, a row is still written.

Use regular streams for continuous signals that always have a value — position, rotation, gaze direction, skeletal pose. For discrete observations that only exist at specific moments (button presses, expression detections, agent steps), use irregular streams instead.

The streams

StreamFileWhat it captures
ExperienceStateExperienceState.csvAuthoritative per-frame timeline. Join key for every other file.
ParticipantParticipantTracking.csvCamera pose, controller pose + velocity, grounded flag.
BodyBodyTracking.csvFull-body skeleton joints.
FaceFaceTracking.csvFace-mesh bones / blend-shape-driven skeleton.
HandLeftHandTracking.csv, RightHandTracking.csvLeft and right hand skeletons (two separate files).
EyeEyeTracking.csvCenter / left / right eye positions, directions, gaze data.

All regular streams hook LateUpdate by default. They sample the simulation state at the end of the frame, before rendering. ExperienceState and Participant additionally support FixedUpdate and Both sampling — the others are LateUpdate only.

In action

At 90 Hz, each enabled regular stream produces ~90 rows per second — consistently, whether the participant is moving or sitting still. Ninety rows looks the same whether a stimulus just appeared or the screen is blank.

Where to start

  • Always start from ExperienceState. It's the authoritative timeline and the join key for every other regular and irregular file.
  • Read the Concepts pages first if you haven't — especially Regular vs Irregular and Timing. Every stream page links back to them rather than re-explaining.
  • Pick the stream that matches the signal you want to measure. Each page has the columns, sample rows, and gotchas specific to that stream.

Shared columns

Every regular stream's CSV begins with the same prefix from LaboExperienceStateObservationTime, MonotonicExecutionTime, FrameNumber, etc. — followed by its domain columns. See Column conventions for the full prefix and what each column means.