Body pose collection

Egocentric Video with Body Pose Data

Hands show what a policy did; the body shows the stance, reach and balance it did it from. We collect custom first-person video on demand against your written skill spec and deliver it with a 24-joint 3D body skeleton beside 3D hand pose, depth and IMU, all on one PTP clock. This is collection, not annotation of footage you already have.
Body pose
24 joints, 3D, per frame
Hand pose
21 per hand, metres
Sync
Median 1.12 ms, 2.0 ms ceiling
First batch
Median 48 h in deep-coverage settings
A contributor wearing a head-mounted camera performs a bimanual task, beside a graphic of the whole-body pose and action layers delivered with each episode.
Body joints are delivered beside the video, hand joints, depth and IMU, on the same timeline.

What a body pose delivery includes

The whole body, not just the hands.

01

A 24-joint 3D skeleton

Body pose ships as body_joints in the annotations group, with 24 joints of 3D coordinates per frame, on the same timeline as the video.

02

Beside hand pose and wrist motion

Hand joints (21 per hand, with a visibility flag) and 200 Hz wrist IMUs ship on the same clock, so body, hands and wrists can be read together.

03

On the same clock as the pixels

Streams are hardware-triggered onto one PTP domain with int64 nanosecond timestamps, so pose and video can be aligned from the data itself.

04

Packed for the format you load

In the LeRobot v2.1 export, body joints follow the hand joints in observation.state, in a fixed order documented on the format page.

Definition

What is egocentric video with body pose data?

Egocentric video with body pose data is first-person task footage delivered together with the 3D positions of the wearer’s body joints over time. On Firsthand’s rig that is a 24-joint skeleton per frame, delivered as body_joints in the annotations group of the episode schema, on the same timeline as the video, the hand joints, depth and IMU.

This page sells the collection: fast, on-demand, custom collection scoped to your skill spec, with body pose delivered beside the video. It is not the definition and it is not annotation of footage you already own. The body pose estimation glossary entry defines the term, and the keypoint and pose annotation page covers labeling. Here the focus is what you receive and how to order it.

Why it matters

Why do humanoid and robot learning teams need body pose?

The site’s glossary states the case: humanoid and other embodied-AI policies need more than hand geometry, because a task like carrying, reaching or stepping around an obstacle depends on torso orientation, stance and arm extension together. It adds that body pose matters most for humanoid and whole-body manipulation training rather than fixed-base arm tasks.

The humanoid pages say the same thing from the data side: whole-body pose alongside the hands carries the balance and locomotion context a humanoid action depends on, and body pose with IMU adds stance, reach and the transfer between locomotion and manipulation. The site states this dependency but does not quantify how much body pose changes model performance, and this page does not either.

Pose fields

Which pose fields does Firsthand deliver?

Body pose is delivered as body_joints in the annotations group, listed beside hand_joints, hand_visible, contact_events, instance_masks, objects, action_segments and gaze_target. The site’s format FAQ gives its shape as bodyJoints[24][3]: 24 joints with three coordinates each. The stream list describes it as 3D, root-relative and world-frame, with torso and forearm chains resolved, and the glossary describes the coordinates as metric and captured in the head-camera frame.

The two frame descriptions are both on the site, so which frame a given delivery uses is confirmed in the spec rather than assumed. The body pose field sits next to the hand fields, which are better specified: float32 [T, 2, 21, 3] in metres in the head-camera frame, with hand_visible flagging occluded joints. The first table lists each field and what the site states about it.

Body, hand and wrist

How does body pose differ from hand pose and wrist trajectories?

They are three different signals. Body pose is the larger skeleton, covering torso, arms and legs, and is used for whole-body motion such as stance, reach and stepping. Hand pose is the 21 joints per hand used for fine manipulation, meaning grasp shape and contact at the object. A wrist trajectory is the motion of each wrist recorded by a 6-DoF IMU at 200 Hz.

The site delivers all three together and keeps them distinct. This page claims for body pose only what the site states for body pose: 24 joints, 3D, in the annotations group. The per-joint visibility flag and the 21-joint count belong to hand pose, and the IMU rate belongs to the wrist streams. The second table sets the three side by side.

Capture

How is body pose captured on the rig?

The site states that 3D hand and body pose are captured live on the rig rather than reconstructed after the fact, and lists body pose in the enrichment stage of its pipeline, with depth, hand pose, action segments and instance masks. The rig itself is a global-shutter head camera at 4K and 60 fps with a 120° horizontal field of view, two wrist cameras at 1920×1080 and 60 fps, a depth stream at 848×480 and 30 fps in metric millimetres, and 6-DoF IMUs on the head and both wrists at 200 Hz.

What the site does not state is how the 24 joints are derived: which sensors or estimation method produce them is not described on any page. That is set per program in the skill spec, and you should ask for it if your model depends on it. The third table lists the rig streams that travel with body pose.

Sync

How are body pose, video and IMU kept in sync?

The glossary states that body pose is captured synchronized with hand pose, depth and RGB under two milliseconds. The capture page describes the mechanism: the head-mounted stereo pair, both wrist cameras, the depth sensor and the IMUs run on one PTP clock domain, and every delivered stream carries int64 nanosecond timestamps in that domain.

The stated figures are a 1.12 ms median and 1.94 ms p99 against a 2.0 ms ceiling, and a stream that exceeds the ceiling for more than three consecutive frames is a reject reason. The frame rate of the body_joints stream itself is not stated and is set per program.

Formats

Which formats carry the pose data?

The episode schema is the canonical layout, and its annotations group lists body_joints; HDF5 and zarr mirror that layout. In the LeRobot v2.1 export, hand and body pose are flattened into a single observation.state vector, with 2×21×3 hand joints first and then 24×3 body joints, in that order. The guide on converting between RLDS and LeRobot says to keep that ordering and to check the vector against it.

RLDS names hand_joints as a step key, but body pose is not a named RLDS step key on its own. The WebDataset page lists hand_joints, action and contact_events for its annotation file and does not mention body joints. How body pose is laid out in those two formats, and in Rerun .rrd, is not stated, so name your loader in the spec. The fourth table summarizes this.

Quality and consent

How is a body pose delivery checked, and who owns it?

Body pose is part of the validated hour only through the checks the site defines for every episode: sync within the ceiling, calibration solved and within drift tolerance, coverage cells filled and consent documented. A separate accuracy gate for body joints is not stated, and no body pose accuracy figure is published.

On consent, the contributor agreement the site describes covers derivative representations, including hand and body pose estimates, and those layers sit under the same consent as the video. Delivered data ships under a perpetual, buyer-owned license. Rejected episodes are recaptured at the provider’s cost.

Agreed per spec

What is set per program rather than stated up front?

Several body pose details are not fixed on this site and are agreed in the skill spec. The last table separates what the site states from what is set per program, so you know what to put in writing before the quote.

Getting started

How do you order a custom body pose collection?

Send the tasks, the environments and regions, and the delivery format you need, and name body pose in the streams and labels list. The site lists RGB as the baseline and the other streams as added where the spec calls for them, and says that hand pose, body pose, segmentation and action labels each add equipment, QA passes and cost, so order what the model consumes. If you have no written spec yet, the first draft is written with you on a call.

The order flow is spec, quote, Spec Pilot, then production. Where coverage for your tasks and regions is deep, the median time from signed spec to first validated batch is 48 hours; where it is thin, turnaround runs three to four weeks. There is no list price, and billing is per validated hour.

At a glance

What you get.

Body pose
24 joints, 3D, bodyJoints[24][3]
Delivered field
annotations/body_joints (episode schema)
Units and frame
Metric; head-camera frame per the body pose glossary entry
Hand pose beside it
21 joints per hand, metres, head-camera frame, per-joint visibility flag
Wrist motion beside it
6-DoF IMU on each wrist, 200 Hz
Sync
One PTP domain; median 1.12 ms, p99 1.94 ms, 2.0 ms ceiling
LeRobot v2.1 state vector
2×21×3 hand joints first, then 24×3 body joints
Delivery
RLDS · LeRobot · WebDataset · HDF5 / zarr
Skeleton model, joint names, body accuracy, body visibility flag
Set per program in the skill spec
Spec to first batch
a median of 48 hours (deep coverage)
License
Perpetual, buyer-owned

Every collection runs through the same seven-stage end-to-end custom collection pipeline. End-to-end custom data collection is a managed service that takes an AI data need from problem to owned dataset in a single accountable pipeline.

Pose fields

Pose fields the site states, and what each is used for

Field names and shapes as stated on the site’s format, glossary and capture pages.
FieldWhat the site statesWhat it is used for
body_jointsIn the annotations group; bodyJoints[24][3], 24 joints with 3D coordinatesWhole-body stance, reach and locomotion context
Body frame and unitsMetric; head-camera frame (glossary); root-relative and world-frame (stream list)Confirmed in the spec for each delivery
Body chainsTorso and forearm chains resolvedArm and trunk motion during manipulation
hand_jointsfloat32 [T, 2, 21, 3], metres, head-camera frameFine manipulation: grasp shape and contact
hand_visiblePer-joint visibility flag for handsMasking or down-weighting occluded hand joints
imu_wrist_l / imu_wrist_r6-DoF, 200 Hz, one per wristWrist motion measured live
*_timestamp_nsint64 nanoseconds per stream, shared PTP domainAligning pose to video from the data

Body, hand and wrist

Body pose, hand pose and wrist trajectory compared

Each signal as the site describes it. Blank-looking cells say “not stated” on purpose.
SignalWhat the site statesTypical useNot stated
Body pose24 joints, 3D, per frame; annotations/body_jointsStance, reach, carrying, steppingSkeleton model, accuracy, body visibility flag
Hand pose21 joints per hand, metres, with per-joint visibility flagGrasp shape and contact at the objectAccuracy figure
Wrist trajectory6-DoF IMU on each wrist, 200 HzWhere the hand went, measured livePose derivation, frame, smoothing

Rig streams

Rig streams that travel with body pose

Stream specifications as stated on the site; body pose shares the clock with each of them.
StreamWhat the site statesRelation to body pose
Head cameraGlobal-shutter, 4K at 60 fps, 120° HFOVReference frame for pose coordinates
Wrist camerasTwo, 1920×1080 at 60 fpsHand-level view beside whole-body context
Depth848×480 at 30 fps, metric millimetres plus confidencePose is aligned to depth and RGB
IMUs6-DoF, 200 Hz, head and both wristsMotion context beside body joints
ClockOne PTP domain, hardware-triggeredBody pose aligned under 2.0 ms ceiling

Formats

What each format states about body pose

Claims as stated on the site’s format and conversion pages; unstated layout is set per program.
FormatWhat the site statesSet per program
Episode schemaannotations/ group lists body_joints beside hand_jointsBody joint frame and frame rate
HDF5 / zarrMirrors the episode schema layoutAnything beyond the format page
LeRobot v2.1observation.state: 2×21×3 hand joints first, then 24×3 body jointsNothing beyond the stated ordering
RLDShand_joints is a step key; body pose is not a named step key on its ownWhere body pose is stored
WebDatasetAnnotation file lists hand_joints, action, contact_eventsWhere body pose is stored
Rerun .rrdListed as a delivery formatBody pose layout

Agreed per spec

What the site states vs what is set per program

Details the site does not fix are agreed in the skill spec.
DetailWhat the site statesWhere it is set
Joint count24 jointsStated; confirmed in the spec
Skeleton model and joint namesNot statedSet per program in the skill spec
Body pose accuracyNot stated; no figure publishedSet per program in the skill spec
Body joint visibility flagStated for hands onlySet per program in the skill spec
Sensors or method behind the jointsCaptured live on the rig; method not statedSet per program in the skill spec
Hours, price and turnaroundNo list price; median 48 h where deep, three to four weeks where thinThe quote and the Spec Pilot

FAQ

Egocentric video with body pose data, answered.

What is egocentric video with body pose data?
First-person task footage delivered with the 3D positions of the wearer’s body joints over time: a 24-joint skeleton per frame in the body_joints field, on the same timeline as the video, hand joints, depth and IMU.
Does Firsthand deliver body pose, not just hand pose?
Yes. The episode schema lists body_joints in the annotations group beside hand_joints, and the format FAQ gives its shape as bodyJoints[24][3]. Hand pose remains a separate field with 21 joints per hand and a visibility flag.
How many body joints, and which skeleton model?
The site states 24 joints. The skeleton model and joint names are not stated, so they are set per program in the skill spec. Ask for them in writing if your model depends on a specific joint layout.
In what order does the LeRobot export pack hand and body pose?
Hands first, as 2×21×3 flattened values, then body, as 24×3 flattened values, in observation.state. Keep that ordering when you slice the vector or convert from another format.
How accurate is the body pose?
No body pose accuracy figure is published on the site, so none is claimed here. Episodes are gated on sync, calibration, coverage and consent; any further body-joint check is set per program in the skill spec.
Which formats carry body pose?
The episode schema and HDF5 / zarr list body_joints, and LeRobot v2.1 packs it into observation.state after the hand joints. RLDS has no named body pose step key, and the layout for RLDS, WebDataset and Rerun is set per program in the skill spec.
How fast and how priced is a body pose collection?
Where coverage is deep, the median from signed spec to first validated batch is 48 hours; where thin, three to four weeks. There is no list price: you are quoted against your spec and billed per validated hour, and body pose adds equipment and QA like any added stream.

Sources

Where are the delivery formats documented?

Request a custom body pose dataset.

Tell us the tasks, environments, the body and hand fields your model needs, and the format you load from. A first validated batch arrives in a median of 48 hours where coverage is deep.