CaryxAI/everyday-manipulation-3d
everyday-manipulation-3d Browse the episodes in your browser → · caryx.ai · founders@caryx.ai Every frame carries metric depth, 6-DoF camera pose, MANO hand pose, per-hand object contact, hand and object segmentation, and time-aligned language, so a model can be tested against any one of those channels or all of them at once without collecting or labelling anything first. Recorded on iPhone Pro (ARKit LiDAR) as part of Everyday Manipulation 1 (EM1), annotated by CaryX AI… See the full description on the dataset page: https://huggingface.co/datasets/CaryxAI/everyday-manipulation-3d.
everyday-manipulation-3d
[Browse the episodes in your browser →](https://caryx.ai/data) · caryx.ai · founders@caryx.ai
Every frame carries metric depth, 6-DoF camera pose, MANO hand pose, per-hand object contact, hand and object segmentation, and time-aligned language, so a model can be tested against any one of those channels or all of them at once without collecting or labelling anything first.
Recorded on iPhone Pro (ARKit LiDAR) as part of Everyday Manipulation 1 (EM1), annotated by CaryX AI, packaged as a single multi-episode LeRobot v3.0 dataset. This is a research corpus (116 episodes, 10 tasks, 5 participants): built for method development and per-channel evaluation, not for broad generalization claims.
116 episodes · 28019 frames @ 15 fps · release v0.7
Quick start
Requires Python 3.12+ and lerobot==0.6.0 (the version this dataset was written and verified with).
# pip install "lerobot==0.6.0"
from lerobot.datasets.lerobot_dataset import LeRobotDataset
# depth_output_unit: the loader default is MILLIMETRES; pass "m" for metres.
ds = LeRobotDataset("CaryxAI/everyday-manipulation-3d", depth_output_unit="m")
frame = ds[0] # RGB, metric depth, MANO hands, contact, camera pose in one dictStorage shapes below are HWC (height, width, channel). The official loader returns image tensors as CHW floats in [0, 1], which is normal LeRobot behaviour.
License
Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (CC-BY-NC-SA-4.0), non-commercial. https://creativecommons.org/licenses/by-nc-sa/4.0/.
MANO-derived data (observation.mano_joints, observation.mano_params, and the HaMeR hand fields in the episode sidecars) is subject to the MANO license. Full terms: LICENSE.txt.
Episode orientation
Most episodes were recorded portrait; a few were recorded landscape and are shipped ROTATED 90° CCW onto the same portrait canvas so the dataset merges under one schema. Those episodes are flagged in meta/foundry.json episodes.<id>.raster_rotation = "ccw90": rotate their image channels 90° CW to display upright. All spatial channels (RGB, depth, masks, camera pose, MANO orientation) are expressed consistently in the shipped, rotated frame, so training and 3D geometry need no special-casing.
Features
Shapes are numpy shapes, so (7,) is a flat 7-element vector.
Timing
The timestamp column is true source time: every 1/15 s tick of the source clip ships as one frame (nearest source frame; nothing is dropped), so timestamp in this dataset and the times in language_spans.json are the same clock. Frames with no derivable hand pose ship with a zero state and state_valid = 0.0 instead of being removed. Per episode, meta/foundry.json episodes.<id>.source_frame_indices gives the source video frame behind each tick and source_fps the source frame rate, so exact source-frame timing is recoverable.
Per-episode sidecars
Full-resolution annotation that does not fit the fixed frame schema rides alongside each episode in episodes/<capture_id>/.
Both contact files are keyed by the same object_ids as object_mask.npz. To resolve which object is slot k, read episodes.<capture_id>.contact_slot_object_ids and contact_slot_object_labels in meta/foundry.json. The same k indexes the object_mask video channel (R = slot 0, B = slot 1) and object_mask.npz object_ids[k].
Episodes and tasks
Tasks are native LeRobot tasks (meta/tasks.parquet); filter episodes by task_index. The episode index (id, task, length) is in meta/episodes/. The per-episode CaryX AI metadata lives in `meta/foundry.json` (orientation flags, state source, source frame indices, contact slot ids). The official LeRobot loader does not surface custom metadata; fetch that file directly.
What is exact and what is not
meta/checksums.json is the sha256 manifest of this release (it does not list itself).
Canonical split
meta/splits.json freezes an episode-level train/val/test split. The rule is deterministic: within each task, episodes are ordered by capture time (capture_id is time-sortable); the last episode of each task is test, the second-to-last is val, and the rest are train. This is a chronological partition by episode, not a held-out participant, scene or session: the same participant can appear in every split.
Report results on test; tune on val.
Provenance
Self-collected capture by CaryX AI, recorded by 5 consenting adults in private homes. Annotations are produced by CaryX AI's pipeline using third-party models and reviewed by humans.
Citation
@misc{caryx2026egocentric,
title = {everyday-manipulation-3d: Egocentric Human Manipulation with Metric Depth, Contact, and MANO Hands},
author = {CaryX AI},
year = {2026},
publisher = {CaryX AI},
howpublished = {\url{https://caryx.ai}},
url = {https://huggingface.co/datasets/CaryxAI/everyday-manipulation-3d},
note = {Dataset. Available at \url{https://caryx.ai/data}}
}The raw full-resolution RGB-D clips these episodes were built from are published separately: CaryxAI/everyday-manipulation-3d-raw (CC BY 4.0, no annotations).
Produced by CaryX AI. Reach out: founders@caryx.ai · caryx.ai
