Contact labels

Egocentric Hand-Object Contact Data

A grasp is defined by the moment fingers meet an object and the moment they let go. We label those moments on first-person video as contact events, annotated against the same hardware clock and depth stream as the footage, so a manipulation policy gets contact timing as data rather than something inferred from a single frame.
Label
contact_events
Basis
Same clock as video and depth
First batch
Median 48 h
License
Buyer-owned
A human hand grasps a household object mid-demonstration, with a depth sensor and annotated contact point visible.
Contact events mark when fingers make and break contact with an object, on the same clock as the video and depth.

Requirements

What does hand-object contact data need?

01

Contact timing on the same clock as the video

When fingers make and break contact is annotated against the same hardware clock as the video and depth, so the onset and offset of a grasp line up with every other stream in the episode rather than being aligned after the fact.

02

Hand pose around the contact, not just the contact

Contact events sit alongside per-frame 3D hand pose with a visibility flag per joint, so a policy sees how the hand moved before it touched the object, and which joints were occluded when it did.

03

Action segments to say what the contact was part of

A contact event says that contact happened. A start and end-timestamped action segment with a verb and noun says which action it belonged to, which is what turns a contact into a labeled step of a task.

04

Failure cases kept in the episode

A dropped object or a re-grasp is recorded continuously, not cut or re-shot, so the loss of contact and the recovery that follows both stay in the data.

05

Rights you can ship on

A perpetual, buyer-owned commercial license backed by a documented consent chain, so a policy trained on contact-labeled data can go into a product.

Definition

What is egocentric hand-object contact data?

It is first-person video in which the moments of hand-object contact are labeled as data. The label is called contact_events. It marks when fingers make and break contact with an object, as a timestamped onset and offset against the same clock as the rest of the episode. The video is recorded from the performer’s own viewpoint, so the contact is seen from roughly where a robot’s head camera would be.

This page is about contact events as a label product: a delivery in which the contact timing is the thing a buyer is specifying. It is narrower than hand-object interaction data in general, which covers hand pose, contact and depth together, and narrower than hand tracking data, which centres on 21-joint hand pose per hand. Those pages are linked below, and the comparison table shows how they differ.

Contact events are timing labels. The fields documented on this site do not include force, pressure or tactile channels, and this page does not claim any.

Why it matters

Why do manipulation policies need contact labels?

Manipulation is organized around contact. A policy that is learning to pick something up needs to know when the hand arrives at the object, when the grasp is established, and when it is released. Video alone shows a hand near an object, and a single frame cannot say whether the fingers are touching it. The site’s own definition of hand-object interaction data makes the same point: the goal is that a manipulation policy can learn the approach, grasp and release rather than just seeing a hand near an object in a single frame.

Contact timing is also a natural boundary for segmenting behavior. The onset of contact is when a reach turns into a grasp, and the offset is when a placement is complete. Having those boundaries as labels, rather than leaving them for a downstream team to estimate, gives a training pipeline a consistent, spec-defined notion of when a grasp begins and ends across every episode in a dataset.

Because the labels are annotated against captured depth geometry and not guessed from a single frame, the contact moment reflects what the sensors recorded. That is the claim this site makes for its contact events, and it is the reason to buy contact labels as part of a custom collection rather than add them later from video alone.

The label

Which contact events does the site label, and how are they defined?

The field is contact_events. In the episode schema it sits in the annotations group alongside hand_joints, hand_visible, body_joints, instance_masks, objects, action_segments and gaze_target. In the WebDataset format, each sample’s ann.json carries hand_joints, action and contact_events.

Contact events are described in two ways across the site: as contact onsets and grasp events on the hand-object interaction page, and as a timestamped onset and offset against the same clock that marks when fingers make and break contact with an object on the hand tracking page. Granularity is therefore event-level, with an onset and an offset for each contact, rather than a continuous per-frame signal.

The site does not break contact events down into contact types, and it does not state a per-finger or per-hand attribution scheme beyond describing fingers making and breaking contact with an object. On the hand tracking page the field is listed as optional, so contact events are something you include in the written spec rather than assume. If your policy needs contact tied to a particular hand or object, say so when you write the spec and the annotation depth is set against it.

Capture setup

How are contact events captured: head and wrist views, depth, IMU and sync?

A head-mounted camera keeps the hands and object in frame from the operating viewpoint. A wrist-mounted camera can run alongside it for a close-range view of the grasp, which is useful when fine manipulation matters more than the full-arm reach, and which keeps the contact point in view when the hand and arm would block the head camera.

Depth gives the contact events a measured basis. Where manipulation precision requirements are high, a stereo pair adds binocular depth for finer contact-level geometry. Head and wrist IMU streams are synchronized to the same clock, and the site lists motion data among the signals used for motion and contact event detection.

All streams are hardware-triggered from a single PTP grandmaster clock and aligned under 2 ms, with per-stream nanosecond timestamps in the PTP domain so the synchronization can be verified independently. Distance-invalid pixels beyond the depth sensor’s reliable range are flagged rather than interpolated.

Label relationships

How do contact events relate to action segments, hand pose and episodes?

Each label answers a different question. hand_joints gives where the hand is: two hands, 21 joints each, per frame, in metres in the head-camera frame. hand_visible says which joints were actually observed, so occluded joints are flagged instead of guessed. contact_events says when the hand touched the object. action_segments says what the performer was doing, as a start and end timestamp with a verb and noun.

They are annotated against the same clock, so they can be joined without alignment work. A contact onset falls inside an action segment such as a grasp, the hand pose around it shows how the fingers closed, and the visibility flags show where that pose is reliable. A policy that conditions on all four sees the motion, the contact and the intent together.

Everything is organized by episode. The episode schema is the canonical layout every delivery format is a projection of, with meta, streams, annotations and calibration groups. The meta group carries fields such as episode_id and skill_id, so contact-labeled episodes tie back to the named skill in the spec.

Failure cases

How are missed or slipped grasps handled?

Failure cases are recorded as part of the episode instead of being cut out. For a dropped object, the drop and what follows are recorded continuously, contact_events flags the loss of contact, and a new action segment marks the recovery attempt as its own labeled sub-action. For a re-grasp or restart, the attempt stays in the same continuous episode as the failure that preceded it.

Occlusion is handled by hand_visible, which flags occluded joints per frame while the surrounding reach stays inside one action segment. Missed grasps and dropped items are captured and action-segmented alongside clean takes, and they count toward validated hours like any other accepted footage. The full treatment is in the failure-case guide linked below.

QA

How is contact data QA’d and accepted?

Acceptance is measured against signed accept criteria written into the spec before capture begins. Each batch goes through per-batch QA, and a reject log ships with every batch. You are billed per validated hour, so only footage that clears the criteria is billed.

Rejected items are recaptured at our cost. A Spec Pilot, a small and fast first batch, lets you check how contact events are defined and how they line up with hand pose and action segments before you scale volume. The pilot is where you confirm that the labeled onsets and offsets match what your policy needs.

Consent and rights

How are consent, anonymization and licensing handled?

Every contributor signs a documented consent release, and each episode links to that signed release through a documented consent chain. Faces, license plates and screens are detected and irreversibly blurred at ingest, and a reviewer confirms the result before anything ships. The anonymization record is included with delivery.

Every custom collection ships under a perpetual, buyer-owned commercial license. Exclusivity is available so the data is never resold. The site does not make certification claims for this data, and this page makes none.

Delivery

How is contact data delivered, and in which formats?

Delivery formats are RLDS, LeRobot and WebDataset, plus HDF5, zarr and Rerun .rrd for full-fidelity review of the aligned streams. Because the episode schema is the canonical layout and each format is a projection of it, the contact_events annotation is part of the layout your loader reads. In WebDataset it is carried in each sample’s ann.json. Converter source is readable, so you can retarget the schema to your own loader.

Delivery uses the same units as the rest of the schema: metric, with depth in millimetres and hand joints in metres.

Fast · on demand

How do you start a custom contact data collection?

Describe the objects, tasks and settings your policy needs contact labels for, and whether contact events should be in scope. We turn that into a written spec covering tasks, environments, capture tier, annotation depth and accept criteria, then quote reach, timeline and price against that document before any capture begins. Pricing details are on the pricing page rather than here.

Where coverage is already deep, the first validated batch lands in a median of 48 hours from signed spec. Thin environments typically take three to four weeks, because vetting operators there is the bottleneck, and we quote that timeline up front. On-demand top-ups run against the same spec and accept criteria, so new contact-labeled data stays consistent with what you already hold.

At a glance

What you get.

Contact label
contact_events: onset and offset
Hand labels
3D joint pose (21 per hand) · per-joint visibility
Sync
Hardware-triggered PTP clock, under 2 ms
Optional
Wrist camera · stereo depth · instance masks
Delivery
RLDS · LeRobot · WebDataset · HDF5 · zarr · Rerun
License
Perpetual, buyer-owned, documented consent chain

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.

Contact-related fields

Which labels and streams carry contact data?

Contact-related labels and streams, what each marks, and where each sits in the episode schema and WebDataset delivery.
Label or streamWhat it marksFormat field
contact_eventsWhen fingers make and break contact with an object, as a timestamped onset and offset on the shared clockannotations/ group in the episode schema; ann.json in WebDataset
hand_jointsTwo hands, 21 joints each, per frame, in metres in the head-camera frameannotations/ group; ann.json in WebDataset
hand_visiblePer-joint flag marking occluded joints instead of guessing a positionannotations/ group
action_segmentsStart and end timestamps with a verb and noun for each sub-actionannotations/ group
depth_mm, depth_confPer-pixel metric depth the contact events are annotated against, with a confidence streamstreams/ group
instance_masks, objectsObject separation and object records where the program spec calls for themannotations/ group
*_timestamp_nsPer-stream nanosecond timestamps in the PTP domain, so sync can be verifiedstreams/ group

Related pages

Contact data vs. hand-object interaction, hand tracking, action-labeled video and pick-and-place pages

Five related pages on this site and how their focus and contact labelling differ.
PageFocusContact labelling as stated
Egocentric hand-object contact data (this page)Contact events as the label product, tied to action segments, hand pose and episodescontact_events: onset and offset on the shared clock
Hand-object interaction video dataHand approaching, contacting and manipulating an object, with hand pose and depthContact onsets and grasp events in the spec
Egocentric hand tracking data21-joint 3D hand pose per hand with per-joint visibilitycontact_events listed as optional
Action-labeled egocentric videoAction segments with hand pose for robot pretrainingContact events named among the annotated labels
Egocentric pick and place dataReach, grasp, transport and place as a manipulation primitiveContact events at pick-up and release

Failure cases

How do contact labels behave in failure and recovery?

Failure types, how each is captured, and how it is labeled, as stated in the failure-case guide.
CaseHow it is capturedHow it is labeled
Dropped objectThe drop and what follows are recorded continuously, not cut or re-shotcontact_events flags the loss of contact; a new action segment marks the recovery attempt
Recovery attemptRecorded in the same continuous episode as the failure that preceded itIts own verb-noun action segment on the same clock
OcclusionRecorded uncut through the occluded momenthand_visible flags occluded joints per frame; the reach stays inside one action segment

FAQ

Hand-object contact data, answered.

What is egocentric hand-object contact data?
It is first-person video annotated with contact events: timestamped labels for when fingers make and break contact with an object. The events are annotated on the same clock as the video and depth, alongside 3D hand pose and action segments.
What do the contact events mark?
Contact onsets and grasp events: the timestamped moment fingers make contact with an object and the moment they break it. They are event-level labels, not a continuous per-frame signal.
Is force, pressure or tactile data included?
No. Contact events are timing labels. The fields documented on this site do not include force, pressure or tactile channels, and this page does not claim any.
How is this different from hand-object interaction data or hand tracking data?
Hand-object interaction data covers hand pose, contact and depth together for the approach, grasp and release. Hand tracking data centres on 21-joint 3D hand pose per hand, with contact events optional. This page is the contact events as the label product being specified.
Are contact events always included?
They are listed as optional on the hand tracking page, so name them in the written spec. Accept criteria and annotation depth are set in that spec before capture begins.
What happens when an object is dropped or a grasp slips?
The drop is recorded continuously, contact_events flags the loss of contact, and a new action segment marks the recovery attempt as its own labeled sub-action. Failure cases count toward validated hours.
Which delivery formats carry contact events?
Delivery is RLDS, LeRobot and WebDataset, plus HDF5, zarr and Rerun .rrd, as projections of the episode schema. In WebDataset, contact_events is carried in each sample’s ann.json.
How fast can a first batch ship?
A median of 48 hours from signed spec where coverage is deep, and three to four weeks where it is thin. A Spec Pilot can prove the contact definitions before you scale. For cost, see the pricing page.

Sources

Where are the delivery formats documented?

Request a custom dataset.

Tell us the objects, tasks and settings your policy needs contact labels for. We will quote reach, timeline and price against a written spec, with a first validated batch in a median of 48 hours where coverage is deep.