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
| Stream | File | What it captures |
|---|---|---|
| ExperienceState | ExperienceState.csv | Authoritative per-frame timeline. Join key for every other file. |
| Participant | ParticipantTracking.csv | Camera pose, controller pose + velocity, grounded flag. |
| Body | BodyTracking.csv | Full-body skeleton joints. |
| Face | FaceTracking.csv | Face-mesh bones / blend-shape-driven skeleton. |
| Hand | LeftHandTracking.csv, RightHandTracking.csv | Left and right hand skeletons (two separate files). |
| Eye | EyeTracking.csv | Center / 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.
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 LaboExperienceState — ObservationTime, MonotonicExecutionTime, FrameNumber, etc. — followed by its domain columns. See Column conventions for the full prefix and what each column means.