# Contact-free hinge — September 21, 2026

Public reproduction note: archive aliases and `SIMCOMPARE_ROOT` are portable placeholders; use your own archive and checkout locations. Private deployment identifiers are omitted.

One uniform box link: mass 1 kg, dimensions .04 × .04 × .30 m. COM .15 m
below Y-axis hinge at world (0,0,.45). Initial q=.5 rad, qdot=0. Gravity
9.81 m/s². Identical effort pulse +.2 Nm on [.1,.2) s. No collisions,
native position drives, damping, passive stiffness, friction loss or armature.
COM inertia diagonal (.0076333333333,.0076333333333,.0002666666667) kg m².
Hinge inertia J=Iyy+m*.15²=.0301333333333 kg m².

Reference: J*qdd = torque - m*g*.15*sin(q). Independent scalar RK4 at 10 µs,
holding the discontinuous pulse on exact substep boundaries. Native timestep
1 ms plus one 0.5 ms refinement. Fixed initial conditions, seeds 0/1/2;
Genesis init and process hash seed set. There is no randomized input sampling
and no claim these seeds govern all native computation.

CPU MuJoCo 3.11 and Newton 1.5.2 use the same fixed-base MJCF. Genesis 1.4.1
imports that MJCF. PhysX/Isaac Sim 6.1 uses explicit USD fixed base + revolute
joint; geometry scales live on a visual child, not on the rigid joint frame.
PhysX and Newton float32, CPU MuJoCo and Genesis float64; Genesis/Newton GPU.
Native force/effort APIs used, not per-step joint teleports. State setters only
initialize the experiment. Native link COM transforms are checked against the
analytical hinge geometry at every recorded step; acceptance tolerance 10 µm.
Worst accepted error: PhysX 0.087 µm, Newton 0.027 µm, others below 1e-9 µm.

## Corrections, not excluded physical outcomes

- Initial root-only hinge mapping failed in PhysX (no articulation DOF) and
  Genesis (wrong kinematics). Added explicit fixed parent, then reran.
- Scaling the PhysX rigid primitive also scaled its local joint anchor,
  producing 105 mm COM error. Moved geometry scale to its child; joint frame
  stays unscaled. Diagnostic rejected by the same FK gate.
- Genesis imported armature=[0.1] despite MJCF armature=0. Damping, stiffness,
  frictionloss read back zero. Recorded the imported values, explicitly set
  all four to zero, and recorded post-correction readbacks. This removes an
  extra .1 kg m² of joint inertia, not a solver-performance issue. Uncorrected
  trajectory max angle error 51.36° vs the intended zero-armature reference.

Readback moving-link masses/inertias match the common model to numerical
precision. PhysX has a 1 kg fixed anchor that does not move; it is not included
in the pendulum inertia. No contact-cooking comparison is made here.

## Results

All 3 recorded repeats per stack are exactly equal, including Newton.
Maximum angle error at 1 ms: PhysX .084013°, Newton .083967°,
MuJoCo CPU .083903°, Genesis .083903°. At 0.5 ms:
.042470°, .041963°, .041897°, .041897° respectively.
Discrete equation residual J*Δqdot/dt-(u-mgr*sin(q)) maxima:
PhysX 5.622e-6 Nm, Newton 3.874e-6 Nm, CPU/Genesis 6.717e-15 Nm.
This is not the multi-object linear momentum/contact-force audit.

Replay includes recorded COM and joint angle; orientation and COM velocity
reconstructed from audited single-axis kinematics. Gravity is explicit.
Joint support force is not measured; torque remains a separate Nm signal,
not a fabricated point-force arrow. No complete joint wrench comparison yet.

Evidence: state-of-robot-aug-2026/experiments/simcompare/output/archive-rigid/
hinge-02 (CPU/Newton accepted, Genesis uncorrected, failed PhysX logs),
hinge-03 (accepted PhysX), hinge-04 (accepted Genesis), hinge-report (figures).
Earlier hinge-01 attempts are downloaded too and are diagnostic only.
Scripts: hinge.py, hinge_report.py, setup/hinge.py, test_hinge.py.

Limits: one DOF, no contact, no coupled robot dynamics, one timestep
refinement, no real-world validation or performance claim. Does not certify
Panda asset/controller parity. Does not establish the cause of Newton's
multi-contact repeat variation.
