CoolFace
Datasetpublic

angledusgar/forge-v1

Forge v1 — contact-rich manipulation with force/torque, 3 tasks Expert demonstrations for the three Isaac Lab FORGE tasks, collected from trained rl_games PPO policies. Successful episodes only; the failures from the same collection are published separately as angledusgar/forge-failure-v1. Beyond the usual LIBERO-shaped fields this dataset carries the wrist force/torque signal, which is what makes contact-rich insertion legible: the peg/hole clearance is 0.114 mm, far below what… See the full description on the dataset page: https://huggingface.co/datasets/angledusgar/forge-v1.

sourceHugging Faceapache-2.0updated 2mo agoView on Hugging Face
0likes228downloads
Dataset Card

Forge v1 — contact-rich manipulation with force/torque, 3 tasks

Expert demonstrations for the three Isaac Lab FORGE tasks, collected from trained rl_games PPO policies. Successful episodes only; the failures from the same collection are published separately as `angledusgar/forge-failure-v1`.

Beyond the usual LIBERO-shaped fields this dataset carries the wrist force/torque signal, which is what makes contact-rich insertion legible: the peg/hole clearance is 0.114 mm, far below what a 224×224 camera can resolve, so the moment of contact and the onset of a jam are visible in the wrench long before they are visible in pixels.

Contents

taskepisodessteps/episodeprompt
Isaac-Forge-PegInsert-Direct-v0~984149"insert the peg into the socket"
Isaac-Forge-GearMesh-Direct-v0~996299"mesh the gear onto the shaft"
Isaac-Forge-NutThread-Direct-v0~988449"thread the nut onto the bolt"
total2,968888,032 frames

All three tasks live in one repository, distinguished by the per-frame task string (meta/tasks.jsonl), the same packing physical-intelligence/libero uses.

Features

keydtypeshapemeaning
imagevideo (AV1)256×256×3fixed third-person camera, one per environment
wrist_imagevideo (AV1)256×256×3wrist camera, mounted on panda_hand
statefloat32(8,)eef_pos (3) + axis-angle from eef_quat (3) + gripper joints (2)
actionsfloat32(7,)the executed Forge environment action
`ft`float32(6,)wrench at the wrist in the EE frame — force (3) then torque (3), smoothed
`ft_noisy`float32(3,)the force the policy actually observed, with Forge's observation noise

state is deliberately 8-D and named as in the openpi LIBERO conversion, so LeRobotLiberoDataConfig can be reused unchanged; ft / ft_noisy are extra keys that openpi's RepackTransform simply drops. Robot is a Franka Panda; fps 15 (Forge control rate); LeRobot dataset format v2.1.

Two force channels are kept on purpose: a detector can be trained on the clean wrench while being evaluated on the noisy signal the robot really had.

How it was collected

Sixteen environments were stepped in lockstep — Factory/Forge resets all environments together, so each window yields exactly N equal-length episodes — with the expert acting deterministically. Episodes were kept regardless of outcome and split by result afterwards.

taskexpert checkpointsuccess rate
PegInsert300-epoch PPO, trained 2026-06-30 on the stock task~96%
GearMesh300-epoch PPO, trained 2026-08-01~99%
NutThread300-epoch PPO, trained 2026-08-01~98%

⚠️ Reproducing PegInsert

The PegInsert episodes were collected under stock Forge dynamics, but the Isaac Lab checkout used for collection has ForgeTaskPegInsert modified for a separate study (higher and wider spawn, plus a ±10° tilt of the peg inside the gripper to induce jams). Collection therefore overrode six knobs back to their stock values:

python
hand_init_pos            = [0.0, 0.0, 0.047]
hand_init_pos_noise      = [0.02, 0.02, 0.01]
hand_init_orn_noise      = [0.0, 0.0, 0.785]
held_asset_pos_noise     = [0.003, 0.0, 0.003]
fixed_asset_init_tilt_deg = 0.0
held_asset_tilt_deg       = 0.0

On an unmodified Isaac Lab these are already the defaults, so run it as-is. GearMesh and NutThread were never modified. This matters: the 2026-06-30 PegInsert expert scores ~96% on stock dynamics and 0/12 on the modified variant, and a policy trained on the modified variant plateaus at a reward of 72.7 against 345.5 on stock — the same task name, two different problems.

Loading

python
from lerobot.common.datasets.lerobot_dataset import LeRobotDataset

ds = LeRobotDataset("angledusgar/forge-v1")
sample = ds[0]
sample["image"]      # (3, 256, 256)
sample["ft"]         # (6,)  force + torque

If video decoding fails with a torchcodec import error, the machine is missing FFmpeg shared libraries; pass video_backend="pyav" or install ffmpeg.

Known gaps

  • Arm joint angles are not included. Only the two gripper joints were recorded; state follows the LIBERO convention, which is end-effector-based. Adding joint_pos requires re-collection and is planned for a future version.
  • One shard was lost to a corrupted HDF5 file (a writer killed mid-write), costing at most 47 PegInsert episodes out of ~1,010 collected for that task.
  • Success rates are high by construction, so the failure set is small; see forge-failure-v1 for the 51 failures and read its card before treating them as a balanced negative set.