EXOKERN Skill v0 β Peg Insertion with Force/Torque
The first publicly available contact-rich manipulation skill trained with calibrated 6-axis force/torque data.
Part of the EXOKERN Skill Catalog β The Data Engine for Physical AI.
Overview
This model is a Diffusion Policy trained for precision peg insertion in simulation (NVIDIA Isaac Lab / FORGE). It demonstrates that force/torque (F/T) sensing data consistently reduces contact forces during assembly tasks.
Two model variants are provided:
full_ftβ Trained with joint states + 6-axis force/torque feedback (22-dim observation)no_ftβ Trained with joint states only (16-dim observation)
Key Results
F/T Ablation (3 Seeds Γ 100 Episodes)
| Condition | Success Rate | Avg Force (N) | Peak Force (N) |
|---|---|---|---|
| full_ft (with F/T) | 100.0% | 3.2 Β± 0.5 | 10.5 Β± 0.4 |
| no_ft (without F/T) | 100.0% | 5.2 Β± 0.1 | 12.1 Β± 0.3 |
| Force Reduction | β | 38.2% | 13.2% |
Per-seed breakdown
| Seed | full_ft Force | no_ft Force | Reduction |
|---|---|---|---|
| 42 | 3.7 N | 5.3 N | 30.4% |
| 123 | 3.4 N | 5.0 N | 32.3% |
| 7 | 2.5 N | 5.2 N | 52.0% |
F/T-aware policies produce 38% less contact force at identical success rates.
Cross-Architecture Comparison
This skill was also benchmarked against simpler architectures on the same dataset:
| Architecture | full_ft Force | no_ft Force | F/T Reduction | Parameters |
|---|---|---|---|---|
| V1 (MLP, single-frame) | 0.1 N | 6.4 N | 98.4% | 534K |
| V2 (Temporal CNN, 10-frame) | 3.0 N | 4.7 N | 36% | 273K |
| Diffusion Policy (this model) | 3.2 N | 5.2 N | 38.2% | 71.3M |
The F/T advantage is consistent and robust across all architectures and seeds.
Architecture
1D Temporal U-Net with FiLM conditioning (Diffusion Policy, Chi et al. 2023).
| Component | Details |
|---|---|
| Observation encoder | MLP: obs_horizon Γ obs_dim β 256-dim condition vector |
| Noise prediction | 1D U-Net with 3 encoder/decoder stages, channel mults (1, 2, 4) |
| Conditioning | FiLM (Feature-wise Linear Modulation) via timestep + observation |
| Noise schedule | Cosine schedule (100 training steps) |
| Sampling | DDIM, 16 denoising steps at inference |
| Action chunking | Predict 16 actions, execute 8 (receding horizon) |
| Parameters | 71.3M (full_ft) / 71.3M (no_ft) |
| EMA | Exponential Moving Average, decay=0.995 |
Observation Space
| Component | Dimensions | Included in |
|---|---|---|
| Joint positions | 7 | both |
| Joint velocities | 7 | both |
| Joint torques | 2 | both |
| Force/Torque (wrench) | 6 | full_ft only |
| Total per frame | 22 / 16 | |
| Observation horizon | 10 frames | both |
Action Space
| Component | Dimensions |
|---|---|
| Joint position targets | 7 |
| Prediction horizon | 16 steps |
| Execution horizon | 8 steps |
Usage
Quick Start
import torch
from inference import DiffusionPolicyInference
# Load the full_ft model (with force/torque)
policy = DiffusionPolicyInference("full_ft_best_model.pt", device="cuda")
# During rollout:
obs = get_observation() # (22,) for full_ft, (16,) for no_ft
# Feed observations over time to build the 10-frame window
policy.add_observation(obs)
# When ready to act:
actions = policy.get_actions() # Returns up to 8 actions
for action in actions:
env.step(action)
Loading Weights
checkpoint = torch.load("full_ft_best_model.pt", map_location="cuda")
print(f"Condition: {checkpoint['condition']}")
print(f"Val Loss: {checkpoint['val_loss']:.6f}")
print(f"Obs Dim: {checkpoint['obs_dim']}")
Training Details
| Parameter | Value |
|---|---|
| Dataset | EXOKERN/contactbench-forge-peginsert-v0 |
| Episodes | 2,221 (330,929 frames) |
| Train/Val split | 85% / 15% (episode-based) |
| Epochs | 300 |
| Batch size | 256 |
| Optimizer | AdamW (lr=1e-4, weight_decay=1e-4) |
| LR schedule | Cosine annealing (eta_min=1e-6) |
| Seeds | 42, 123, 7 |
| Training time | ~3h per run (RTX 4090) |
| Normalization | Min-max to [-1, 1] |
Evaluation Environment
| Parameter | Value |
|---|---|
| Simulator | NVIDIA Isaac Lab (Isaac Sim 4.5) |
| Environment | Isaac-Forge-PegInsert-Direct-v0 |
| Robot | Franka Emika Panda (7-DOF) |
| Control mode | Joint position targets |
| Physics step | 120 Hz |
| Control frequency | 15 Hz (decimation=8) |
| Episodes evaluated | 100 per condition |
| Domain Randomization | None (v0) |
Files
| File | Description |
|---|---|
full_ft_best_model.pt |
Best checkpoint β trained WITH force/torque |
no_ft_best_model.pt |
Best checkpoint β trained WITHOUT force/torque |
config.yaml |
Model hyperparameters and training config |
inference.py |
Standalone inference script with action chunking |
results.json |
Full evaluation results (all seeds) |
training_curve_full_ft.png |
Training loss curves (full_ft) |
training_curve_no_ft.png |
Training loss curves (no_ft) |
Limitations
- Sim-only: Trained and evaluated in simulation. No real-robot validation yet.
- Fixed environment: No domain randomization. Performance under physical variation is unknown.
- Single robot: Franka Emika Panda only. Joint-space actions, not task-space.
- Single task: Peg insertion only.
These are addressed in upcoming versions β see EXOKERN Roadmap.
Citation
@misc{exokern2026skill,
title={EXOKERN Skill v0: Force/Torque-Aware Diffusion Policy for Peg Insertion},
author={EXOKERN},
year={2026},
url={https://huggingface.co/EXOKERN/skill-forge-peginsert-v0},
}
Related
- Dataset: EXOKERN/contactbench-forge-peginsert-v0
- Organization: EXOKERN on HuggingFace
- Website: exokern.com
- Diffusion Policy Paper: Chi et al., 2023
- Downloads last month
- -
Dataset used to train EXOKERN/skill-forge-peginsert-v0
Paper for EXOKERN/skill-forge-peginsert-v0
Evaluation results
- Success Rate (%) on contactbench-forge-peginsert-v0self-reported100.000
- Force Reduction with F/T (%) on contactbench-forge-peginsert-v0self-reported38.200