You need to agree to share your contact information to access this dataset

This repository is publicly accessible, but you have to accept the conditions to access its files and content.

Log in or Sign Up to review the conditions and access this dataset content.

OmniContact Dataset: Contact-Rich Humanoid Object Interaction

Project Page

OmniContact contains human-object interaction motion capture, processed Unitree G1 trajectories, and motion clips for contact-rich box manipulation and soccer interactions. This release contains 690 processed source trajectories and 2,231 clips. Every source NPZ has exactly one retained raw mocap capture and one portable BVH cache entry.

Matched Task Previews

Carry box

BVH source
G1 retarget

Push box

BVH source
G1 retarget

Slide box

BVH source
G1 retarget

Kick ball

BVH source
G1 retarget

Relocate ball

BVH source
G1 retarget

Dataset Summary

Subset Source NPZ Motion Clips Raw MoCap
box/case1_carry 210 623 210
box/case2_push 162 453 162
box/case3_slide 118 190 118
soccer/case1_kick_forward 30 177 30
soccer/case2_kick_left 30 170 30
soccer/case3_kick_right 30 210 30
soccer/case4_carry 51 199 51
soccer/case5_pickball_kick 59 209 59
Total 690 2,231 690

Box Size Augmentation

The carry clips include box-size augmentation. Each panel below shows a different box dimension while preserving the corresponding object pose and G1 motion.

Exact source NPZ files, frame ranges, panel positions, and dimensions are listed in demo/box_size_augmentation/manifest.json.

Directory Layout

OmniContact-Dataset/
|-- assets/                         # G1 URDF/meshes and object meshes
|-- bvh_cache/                      # Portable BVH world-position caches
|   `-- manifest.json               # Raw BVH path -> cache mapping
|-- demo/
|   |-- box_size_augmentation/     # Carry augmentation videos and checksums
|   |-- g1_videos/                 # Matched G1 retarget previews
|   `-- mocap_task_videos/         # Matched BVH source previews
|-- metadata/
|   |-- raw_mocap_manifest.csv      # NPZ/raw mocap path mapping
|   `-- splits.csv                  # Train/val/test assignment
|-- npz/                            # 690 complete processed trajectories
|-- npz_clips/                      # 2,231 task clips
|-- raw_mocap/                      # 690 matched source captures
|-- build_bvh_cache.py
`-- visualize_npz_bvh_minimal.py

Each retained raw_mocap/<domain>/<case>/<capture_id>/ directory contains:

  • motion_actor.bvh: actor skeleton motion.
  • motion_actor.csv: actor timestamps.
  • prop_*.csv or object_pose_*.csv: object pose samples.
  • capture_meta.json: capture metadata with paths normalized to this release.

Processed Data Format

Each source .npz contains one complete G1 trajectory. Common arrays include:

  • fps: frames per second.
  • base_pos_w: floating-base position, shape [T, 3].
  • base_quat_w: floating-base orientation in wxyz order, shape [T, 4].
  • joint_pos: G1 joint positions, shape [T, 29].
  • body_pos_w: body positions, shape [T, 39, 3].
  • body_quat_w: body orientations in wxyz order, shape [T, 39, 4].
  • object_pos_w: object position, shape [T, 3].
  • object_quat_w: object orientation in wxyz order, shape [T, 4].
  • contact_info: binary contact labels, shape [T, 4, 1].

The contact order is left_ankle, right_ankle, left_wrist, right_wrist. Carry augmentation clips additionally store carry_box_source_size_cm and carry_box_selected_size_cm.

Example:

import numpy as np

path = "npz/box/case1_carry/20260330000166_1_1775007076_with_contact.npz"
with np.load(path, allow_pickle=False) as data:
    joint_pos = data["joint_pos"]
    base_pos = data["base_pos_w"]
    object_pos = data["object_pos_w"]
    contact = data["contact_info"]
    fps = float(data["fps"][0])

Visualization

Install the local viewer dependencies:

pip install numpy viser yourdfpy

Visualize one matched NPZ/BVH pair:

python visualize_npz_bvh_minimal.py \
  --data npz/box/case1_carry/20260330000336_1_1775817056_with_contact.npz \
  --align-roots \
  --port 8092

Open http://localhost:8092. To browse all 690 pairs:

python visualize_npz_bvh_minimal.py --dataset-root . --align-roots --port 8092

The viewer automatically loads the prebuilt portable caches from bvh_cache/; no extra flag is required. If a cache entry is missing or invalid, it parses the raw BVH once and writes a new cache entry. A custom cache directory can be selected with --bvh-cache-dir PATH, and --no-bvh-cache forces raw BVH parsing.

Useful options:

  • --max-frames 600: limit the loaded trajectory length.
  • --playback-speed 0.5: slow down playback.
  • --sync-mode frame: synchronize NPZ and BVH by frame index.
  • --bvh-cache-dir PATH: load and write BVH caches in another directory.
  • --no-bvh-cache: disable cache use and parse raw BVH files.
  • --bvh-line-width 1: render thinner BVH bones.

Metadata

metadata/raw_mocap_manifest.csv contains these columns:

domain, case, capture_id, raw_dir, bvh, timestamps, object_files, npz

metadata/splits.csv maps every retained capture_id to train, val, or test.

Verify the augmentation demos with:

cd demo/box_size_augmentation
sha256sum -c SHA256SUMS

Citation

@misc{yu2026omnicontactchainingmetaskillscontact,
      title={OmniContact: Chaining Meta-Skills via Contact Flow for Generalizable Humanoid Loco-Manipulation},
      author={Runyi Yu and Xiaoyi Lin and Ji Ma and Yinhuai Wang and Koukou Luo and Jiahao Ji and Huayi Wang and Wenjia Wang and Runhan Zhang and Ping Tan and Ting Wu and Ruoli Dai and Qifeng Chen and Lei Han},
      year={2026},
      eprint={2606.26201},
      archivePrefix={arXiv},
      primaryClass={cs.RO},
      url={https://arxiv.org/abs/2606.26201}
}
Downloads last month
722

Paper for lightcone02/OmniContact-Dataset