Newton · SolverMuJoCo · Real2Sim Validation

Replaying HRDexDB dexterous picking — fully dynamically

How faithful is Newton physics when a real robot's recorded joint commands are replayed against a completely passive object? We take paired real-world grasping episodes from HRDexDB (xArm6 + Allegro V5 and Inspire F1 hands), drive the simulated robot only through PD joint targets, and measure how closely the simulated object trajectory matches the motion-captured ground truth — with no attachment tricks, no kinematic object driving, and only a small, honest CMA-ES calibration of per-hand simulation parameters.

Episodes replayed12035 objects, 2 hands, fully dynamic
Median object ADD RMSE6.3 cmtuned params, all valid episodes
Lift outcome match82%sim lifts iff the real robot lifted
Control interfacejoint_target_qPD targets only — object 100% passive

Dataset & setup

HRDexDB (SNU VCLab) provides ~2.1K real dexterous grasping sequences across 100+ scanned objects and multiple hand embodiments, with synchronized robot joint signals and 6D object tracking from a 23-camera rig. We use the two robot embodiments:

Allegro V5 (16-DOF hand)

xArm6 + Wonik Allegro V5. Hand commands and measured joint states recorded at ~97 Hz in radians; arm joints at ~130 Hz.

Inspire F1 (6-DOF hand)

xArm6 + Inspire F1 with 12 finger joints, 6 actuated + 6 linkage-coupled (URDF mimic joints). Raw counts converted to radians with the vendor mapping.

Object ground truth

Per-video-frame 6D poses (~33 Hz) of the scanned object mesh, transformed into the robot base frame via the released camera-to-robot calibration.

We evaluate 120 episodes covering 35 objects (up to two scenes per object and hand). Every stream carries wall-clock timestamps on a shared epoch clock, so arm, hand, and object signals are time-aligned exactly, then resampled to a uniform 100 Hz control clock.

Method: dynamic replay, no cheating

Each episode is rebuilt as a Newton scene: the fixed-base xArm6+hand articulation imported from the HRDexDB URDFs, the scanned object as a free rigid body at the first ground-truth pose, and a support plane at the object's initial resting height. The raw scans are frequently open shells (non-watertight), so the object collides as a watertight CoACD convex decomposition (ModelBuilder.approximate_meshes, ≤16 hulls, original scan kept as a visual-only shape) with mass, center of mass, and inertia integrated analytically over the watertight parts. The simulation runs SolverMuJoCo (implicitfast, Newton solver, elliptic cones) at 400 Hz, and a 100 Hz control loop writes the recorded joint trajectory into Control.joint_target_q — nothing else touches the simulation.

Rules. The object is never attached, welded, or kinematically driven; its state is set once at t=0 from the first ground-truth frame. The robot is driven exclusively by PD position targets from the dataset. Simulation parameters are tuned once per hand on five training episodes and then frozen for all evaluation, including held-out objects. Episodes whose calibration places the object out of the hand's reach (palm-to-object distance never below 25 cm) are flagged and excluded from aggregates.

Which signal should drive the robot?

The dataset stores both commanded and measured joint signals for the hands (the arm's commands are Cartesian end-effector poses, so the arm always follows measured joint positions). A pilot on five objects per hand compared the two as PD target sources:

HandTarget sourceEpisodesADD RMSE median [cm]lift match
Allegro V5recorded commands125.867%
Allegro V5measured joints125.642%
Inspire F1recorded commands73.050%
Inspire F1measured joints73.162%

Both sources track similarly in ADD; recorded commands match the lift outcome markedly better on the Allegro (67% vs 42%) and slightly worse on the Inspire. We use commands as the headline — they are what the real controller received, including the intentional squeeze beyond contact that measured joint states hide.

CMA-ES calibration

Default gains and material parameters are not documented for this hardware, so we calibrate seven scalar parameters per hand with CMA-ES (log-space, population 8), minimizing the mean object ADD RMSE over five training episodes (banana, apple, baseball, book, beige brush — one scene each). Candidates are evaluated population-parallel in a multi-world Newton model with per-world gains, friction, mass, and armature. Allegro V5: 22 generations, 176 rollout sets, training ADD RMSE 5.4 → 5.3 cm · Inspire F1: 22 generations, 176 rollout sets, training ADD RMSE 2.9 → 2.8 cm.

ParameterSearch rangeAllegro V5 (tuned)Inspire F1 (tuned)
arm_ke[500, 20000]9020590
arm_kd[10, 500]297.8228.7
hand_ke[5, 500]40.245.692
hand_kd[0.1, 20]8.3440.419
friction[0.2, 2.5]2.4291.655
object_mass[0.03, 1]0.051240.2036
joint_armature[0.001, 0.1]0.075370.02514
CMA-ES convergence
CMA-ES convergence per hand: population range (shaded), population mean, and best-so-far objective (mean ADD RMSE over the five training episodes).

How much of the improvement is real? Winner's curse on a chaotic objective

Grasp outcomes are contact-chaotic: re-running the same episode with the same parameters in a fresh solver instance shifts ADD RMSE by up to ~10% (and can flip a marginal lift). Selecting the best of ~160 noisy evaluations therefore biases the reported optimum low. We revalidate the frozen tuned parameters with fresh rollouts on the training episodes:

HandCMA-ES reported best [cm]Tuned, revalidated [cm]Defaults [cm]
Allegro V55.36.15.6
Inspire F12.82.53.1

The two hands behave differently. For the Inspire F1, the tuned parameters survive revalidation and transfer to held-out objects — a genuine calibration gain. For the Allegro V5, the revalidated optimum is indistinguishable from the defaults: with 16 independently driven fingers, grasp outcomes are chaotic enough that the CMA-ES "improvement" is mostly selection noise. Within this parameter family, Allegro replay fidelity is limited by contact chaos, geometry approximation, and dataset calibration error rather than by poorly chosen gains.

Results

Aggregate object-tracking fidelity across all evaluated episodes (calibration outliers excluded; holdout = objects never seen by the tuner). ADD is the mean vertex distance between the simulated and ground-truth object pose — it penalizes both translation and rotation without symmetry ambiguity.

HandParamsEpisodesADD RMSE median [cm]ADD RMSE mean [cm]p90 [cm]holdout median [cm]pos RMSE median [cm]rot RMSE median [°]lift match
Allegro V5default688.39.314.88.87.241.581%
Allegro V5tuned688.39.814.99.27.538.079%
Inspire F1default524.95.911.65.24.621.079%
Inspire F1tuned524.35.19.84.84.317.885%
Default vs tuned, Allegro
Default vs tuned, Inspire
Default vs CMA-ES-tuned parameters, split into training and held-out episodes. Tuning transfers to unseen objects — evidence it corrects genuinely miscalibrated physical parameters rather than overfitting individual trajectories.

Per-object breakdown

Per-object error, Allegro
Per-object error, Inspire
Mean ADD RMSE per object. Compact, high-friction objects (balls, fruit, books) replay with a few centimeters of error; thin, flat, or slippery objects are the hardest — a near-miss of a few millimeters at the fingertips decides between a firm grasp and a slip.

Representative episodes

Best Allegro episode
Median Allegro episode
Worst Allegro episode
Median Inspire episode
Object position components (sim vs ground truth), position error, and rotation error over time for best/median/worst episodes by ADD RMSE.
Lift fidelity scatter
Peak-lift-height error vs ADD RMSE per episode. Points near the vertical line lift the object to the same height as the real robot.

Overlay videos

Headless ViewerGL renders with the ground-truth object pose overlaid as a translucent green ghost (per-shape opacity from PR #3053). The solid object is simulated; the ghost is where the real object actually was.

Allegro V5: banana (best) — ADD RMSE 1.6 cm, lift matched (sim lifted, real lifted). Green ghost = ground-truth object pose.
Allegro V5: blue vase (median) — ADD RMSE 8.6 cm, lift matched (sim lifted, real lifted). Green ghost = ground-truth object pose.
Allegro V5: cactus2 (worst) — ADD RMSE 59.3 cm, lift matched (sim lifted, real lifted). Green ghost = ground-truth object pose.
Inspire F1: baseball (best) — ADD RMSE 1.2 cm, lift matched (sim missed, real no lift). Green ghost = ground-truth object pose.
Inspire F1: blue vase (median) — ADD RMSE 4.4 cm, lift matched (sim lifted, real lifted). Green ghost = ground-truth object pose.
Inspire F1: black holder with handle (worst) — ADD RMSE 16.3 cm, lift matched (sim lifted, real lifted). Green ghost = ground-truth object pose.

Honest limitations

Reproduce

All code lives on the eric/hrdexdb-replay branch of eric-heiden/newton under scripts/hrdexdb/.

git clone -b eric/hrdexdb-replay https://github.com/eric-heiden/newton
cd newton && uv sync --extra examples && uv pip install huggingface_hub cma imageio-ffmpeg
git clone https://github.com/snuvclab/HRDexDB ~/repos/HRDexDB   # robot URDFs
cd scripts/hrdexdb
uv run python download_all.py                 # fetch episodes (no videos)
uv run python replay.py --hand allegro_v5 --object banana --scene 2
uv run python tune.py --hand allegro_v5       # CMA-ES calibration
uv run python evaluate.py --hand allegro_v5 --tag tuned --params results/tuned_params_allegro_v5_cmd.json
uv run python render.py --hand allegro_v5 --object banana --scene 2   # overlay video