Seven Franka and Allegro cloth manipulation cases from the collision benchmark, each run twice with the same source, settings, seeds and hand commands. The only difference is the new SolverVBD option contact_damping_bidirectional: False (one-sided: damping only while a contact gap closes; the constructor default when these runs were made) versus True (bidirectional: damping also while the gap opens, with the matching Hessian; the constructor default on the branch since the afternoon of 2026-11-04).
Standard VBD elasticity, fast math off, rigid-soft DAT on, merged OGC edge rule, contact stiffness capped at 10x the membrane coefficient, 30 Hz frames, ten substeps (dt = 1/300 s), 60 s hold. Contact damping coefficient kd = 0.1 in every scene. Single runs; they do not establish repeatability.
Update, 2026-11-04 afternoon
Anka decided to make the bidirectional damping the default. The branch now carries the option (b989e846c), the default change (36590004e) and the rebase onto upstream main 7f0c13af6. Two more commits followed: the tuning-guide additions (81fd7250a) and an objective gap rate for the self-contact and rigid-rigid dampers (68c18328a), which the repo's rigid-motion test required once the two-sided gate became the default. The arm labels on this page were changed to match: One-sided (closing only; previous default) is the run with contact_damping_bidirectional=False, Bidirectional (new default) the run with True. The runs themselves were made at commit c49851e53, before these follow-up commits, and are unchanged. The poker-card results below were added in the same update.
Poker cards: the issue #3494 scene
The shipped example_cloth_poker_cards is the scene behind issue #3494 (the card stack never settles). Two measurements, both at commit c49851e53, with the same two damping modes.
1. The demo itself with the ball disabled (issue-3494 harness)
52 cards, 60 Hz, 20 substeps, 10 iterations, soft_contact_ke 1e5, soft_contact_kd 100, sphere velocity set to zero. Settle score = mean over frames 40 to 79 of the largest card-vertex speed; lower is more settled, 0.1 m/s was the threshold of the 2026-07 investigation. Two runs per mode.
2. The benchmark's passive card scene s4_poker_cards_no_ball
Benchmark recipe: 60 Hz, ten substeps (dt 1/600 s), ten iterations, platform contact stiffness capped at 1e5, observation 5 to 65 s, no hold or release criteria. In both arms the deck spills off the platform within the first seconds and cards keep slipping later, as in the synced-main run. The J* and V* windows are dominated by those falls, so this scene does not separate the two modes.
Arm
J* mm
V* m/s
Windows
Overlap mm
Substep ms
Finite
One-sided (closing only; previous default)
16.36
0.421
120
0.782
4.53
yes
Bidirectional (new default)
15.61
0.422
120
0.864
6.19
yes
Synced-main campaign of 2026-11-04 (one-sided, different source revision)
19.33
0.402
n/a
0.800
n/a
n/a
One-sided (closing only; previous default)
J* 16.36 mm, V* 0.421 m/s, overlap 0.782 mm, solver 4.53 ms per substep, wall 239 s. Status completed, finite True, contact overflow False.
Means are arithmetic means of per-case worst values over the 7 cases completed in both arms. J* is the largest cloth-vertex displacement RMS after removing a fitted linear drift over complete 0.5 s hold windows; V* is the largest cloth-vertex speed RMS over the same windows; the static overlap is the largest sampled overlap of the cloth particle shell with the declared table or ground. Hold retention uses the benchmark's conservative sampled whole-hand separation test: 'retained' means no sampled state proved full separation during the hold. The tables are measurements, not pass or fail verdicts.
Per case
Case
Robot
Rows
Arm
Hold
Release
J* mm
V* m/s
Windows
Overlap mm
Substep ms
Finite
m2_franka_pouch
Franka
512
One-sided (closing only; previous default)
separated at 4.5 s
hand clear at end (from 4.5 s)
16.96
0.695
120
0.998
57.66
yes
m2_franka_pouch
Franka
512
Bidirectional (new default)
separated at 42.0 s
hand clear at end (from 42.0 s)
28.34
0.532
120
0.998
23.29
yes
m3_franka_tote_empty
Franka
128
One-sided (closing only; previous default)
separated at 7.3 s
hand clear at end (from 7.3 s)
50.08
1.072
120
1.838
10.47
yes
m3_franka_tote_empty
Franka
128
Bidirectional (new default)
separated at 17.9 s
hand clear at end (from 17.9 s)
53.65
1.233
120
1.006
9.97
yes
r5_allegro_towel
Allegro
512
One-sided (closing only; previous default)
retained through hold
hand clear at end (from 68.6 s)
22.88
0.371
120
0.901
11.11
yes
r5_allegro_towel
Allegro
512
Bidirectional (new default)
retained through hold
hand clear at end (from 68.7 s)
21.61
0.372
120
2.938
11.20
yes
r5_franka_dress
Franka
512
One-sided (closing only; previous default)
retained through hold
hand clear at end (from 68.6 s)
24.55
0.344
120
0.209
27.20
yes
r5_franka_dress
Franka
512
Bidirectional (new default)
retained through hold
hand clear at end (from 69.4 s)
23.34
0.348
120
0.000
30.73
yes
r5_franka_patch_contact_v2
Franka
512
One-sided (closing only; previous default)
retained through hold
hand clear at end (from 68.4 s)
20.67
0.324
120
0.712
15.44
yes
r5_franka_patch_contact_v2
Franka
512
Bidirectional (new default)
retained through hold
hand clear at end (from 68.4 s)
21.16
0.334
120
2.710
20.44
yes
r5_franka_towel_contact_v2
Franka
512
One-sided (closing only; previous default)
retained through hold
hand clear at end (from 68.3 s)
24.45
0.359
120
0.799
16.31
yes
r5_franka_towel_contact_v2
Franka
512
Bidirectional (new default)
retained through hold
hand clear at end (from 69.0 s)
20.50
0.355
120
0.000
12.46
yes
r5_franka_trousers
Franka
64
One-sided (closing only; previous default)
retained through hold
hand clear at end (from 68.7 s)
18.52
0.301
120
0.000
27.98
yes
r5_franka_trousers
Franka
64
Bidirectional (new default)
retained through hold
hand clear at end (from 69.4 s)
17.85
0.301
120
0.000
23.38
yes
Rows: self-contact vertex and edge row storage per primitive. The towel cases stopped on the benchmark's 64-row capacity guard during release in one arm each (after a complete hold); the tables use their 512-row repeats in both arms, listed with every attempt below. The solver substep time is a secondary measure here: four cases ran at the same time on four GPUs of one host, and a dropped cloth changes the contact load.
All attempts
Case
Arm
Storage
Status
Stopped at s
Hold
J* mm
V* m/s
Windows
m2_franka_pouch
One-sided (closing only; previous default)
as selected by the synced-main campaign
completed
completed
separated at 4.5 s
16.96
0.695
120
m2_franka_pouch
Bidirectional (new default)
as selected by the synced-main campaign
completed
completed
separated at 42.0 s
28.34
0.532
120
m3_franka_tote_empty
One-sided (closing only; previous default)
as selected by the synced-main campaign
completed
completed
separated at 7.3 s
50.08
1.072
120
m3_franka_tote_empty
Bidirectional (new default)
as selected by the synced-main campaign
completed
completed
separated at 17.9 s
53.65
1.233
120
r5_allegro_towel
One-sided (closing only; previous default)
as selected by the synced-main campaign
completed
completed
retained through hold
22.91
0.374
120
r5_allegro_towel
One-sided (closing only; previous default)
512-row repeat
completed
completed
retained through hold
22.88
0.371
120
r5_allegro_towel
Bidirectional (new default)
as selected by the synced-main campaign
error
67.90
run error
23.60
0.375
120
r5_allegro_towel
Bidirectional (new default)
512-row repeat
completed
completed
retained through hold
21.61
0.372
120
r5_franka_dress
One-sided (closing only; previous default)
as selected by the synced-main campaign
completed
completed
retained through hold
24.55
0.344
120
r5_franka_dress
Bidirectional (new default)
as selected by the synced-main campaign
completed
completed
retained through hold
23.34
0.348
120
r5_franka_patch_contact_v2
One-sided (closing only; previous default)
as selected by the synced-main campaign
completed
completed
retained through hold
20.67
0.324
120
r5_franka_patch_contact_v2
Bidirectional (new default)
as selected by the synced-main campaign
completed
completed
retained through hold
21.16
0.334
120
r5_franka_towel_contact_v2
One-sided (closing only; previous default)
as selected by the synced-main campaign
error
68.67
run error
24.11
0.358
120
r5_franka_towel_contact_v2
One-sided (closing only; previous default)
512-row repeat
completed
completed
retained through hold
24.45
0.359
120
r5_franka_towel_contact_v2
Bidirectional (new default)
as selected by the synced-main campaign
completed
completed
retained through hold
22.77
0.351
120
r5_franka_towel_contact_v2
Bidirectional (new default)
512-row repeat
completed
completed
retained through hold
20.50
0.355
120
r5_franka_trousers
One-sided (closing only; previous default)
as selected by the synced-main campaign
completed
completed
retained through hold
18.52
0.301
120
r5_franka_trousers
Bidirectional (new default)
as selected by the synced-main campaign
completed
completed
retained through hold
17.85
0.301
120
Context: the synced-main campaign (2026-11-02)
Same recipes, one-sided damping, upstream main 351b9d9f (43 commits before this branch's base), Warp 1.19.0+cu12. Shown only to judge run-to-run sensitivity; it is a different source revision.
Case
Hold
J* mm
V* m/s
Overlap mm
Substep ms
m2_franka_pouch
separated at 49.5 s
27.72
0.458
0.998
14.18
m3_franka_tote_empty
separated at 13.0 s
53.47
1.330
2.683
11.68
r5_allegro_towel
retained through hold
23.05
0.369
0.892
11.00
r5_franka_dress
retained through hold
25.84
0.383
0.098
22.34
r5_franka_patch_contact_v2
retained through hold
20.47
0.328
0.822
12.30
r5_franka_towel_contact_v2
retained through hold
24.67
0.356
0.592
11.64
r5_franka_trousers
retained through hold
18.21
0.301
0.277
19.17
m2_franka_pouch (Franka)
M2 | Franka hand and pouch: prepared rim hold, carry, release
One-sided (closing only; previous default)
Hold: separated at 4.5 s. Release: hand clear at end (from 4.5 s). J* 16.96 mm, V* 0.695 m/s, overlap 0.998 mm, solver 57.66 ms per substep, wall 1266 s. Status completed, finite True, contact overflow False, source guard unchanged True.
Hold: separated at 42.0 s. Release: hand clear at end (from 42.0 s). J* 28.34 mm, V* 0.532 m/s, overlap 0.998 mm, solver 23.29 ms per substep, wall 533 s. Status completed, finite True, contact overflow False, source guard unchanged True.
Hold: separated at 7.3 s. Release: hand clear at end (from 7.3 s). J* 50.08 mm, V* 1.072 m/s, overlap 1.838 mm, solver 10.47 ms per substep, wall 268 s. Status completed, finite True, contact overflow False, source guard unchanged True.
Hold: separated at 17.9 s. Release: hand clear at end (from 17.9 s). J* 53.65 mm, V* 1.233 m/s, overlap 1.006 mm, solver 9.97 ms per substep, wall 257 s. Status completed, finite True, contact overflow False, source guard unchanged True.
Hold: retained through hold. Release: hand clear at end (from 68.6 s). J* 22.88 mm, V* 0.371 m/s, overlap 0.901 mm, solver 11.11 ms per substep, wall 301 s. Status completed, finite True, contact overflow False, source guard unchanged True.
Hold: retained through hold. Release: hand clear at end (from 68.7 s). J* 21.61 mm, V* 0.372 m/s, overlap 2.938 mm, solver 11.20 ms per substep, wall 302 s. Status completed, finite True, contact overflow False, source guard unchanged True.
Hold: retained through hold. Release: hand clear at end (from 68.6 s). J* 24.55 mm, V* 0.344 m/s, overlap 0.209 mm, solver 27.20 ms per substep, wall 701 s. Status completed, finite True, contact overflow False, source guard unchanged True.
Hold: retained through hold. Release: hand clear at end (from 69.4 s). J* 23.34 mm, V* 0.348 m/s, overlap 0.000 mm, solver 30.73 ms per substep, wall 756 s. Status completed, finite True, contact overflow False, source guard unchanged True.
Hold: retained through hold. Release: hand clear at end (from 68.4 s). J* 20.67 mm, V* 0.324 m/s, overlap 0.712 mm, solver 15.44 ms per substep, wall 435 s. Status completed, finite True, contact overflow False, source guard unchanged True.
Hold: retained through hold. Release: hand clear at end (from 68.4 s). J* 21.16 mm, V* 0.334 m/s, overlap 2.710 mm, solver 20.44 ms per substep, wall 532 s. Status completed, finite True, contact overflow False, source guard unchanged True.
Hold: retained through hold. Release: hand clear at end (from 68.3 s). J* 24.45 mm, V* 0.359 m/s, overlap 0.799 mm, solver 16.31 ms per substep, wall 421 s. Status completed, finite True, contact overflow False, source guard unchanged True.
Hold: retained through hold. Release: hand clear at end (from 69.0 s). J* 20.50 mm, V* 0.355 m/s, overlap 0.000 mm, solver 12.46 ms per substep, wall 331 s. Status completed, finite True, contact overflow False, source guard unchanged True.
Hold: retained through hold. Release: hand clear at end (from 68.7 s). J* 18.52 mm, V* 0.301 m/s, overlap 0.000 mm, solver 27.98 ms per substep, wall 723 s. Status completed, finite True, contact overflow False, source guard unchanged True.
Hold: retained through hold. Release: hand clear at end (from 69.4 s). J* 17.85 mm, V* 0.301 m/s, overlap 0.000 mm, solver 23.38 ms per substep, wall 596 s. Status completed, finite True, contact overflow False, source guard unchanged True.