MIME-VER-123 — RobotArmNode Gravity-Compensated Static Hold#

Date: 2026-04-30 Node under test: mime.nodes.actuation.robot_arm.RobotArmNode Algorithm ID: MIME-NODE-102 Benchmark type: Analytical (Mode 2 independent) Test file: tests/verification/test_robot_arm.py::test_ver123_gravity_hold Acceptance: max joint drift $< 10^{-3}$ rad after 1000 steps at $\Delta t = 10^{-3}$ s


Goal#

Drive the arm with a gravity-compensation torque $\tau = g(q)$ re-evaluated at the current configuration each step, integrate for 1000 steps at $\Delta t = 10^{-3}$ s, and verify that the joint angles do not drift more than $10^{-3}$ rad from the initial pose. This is a closed-loop check on the integrator: if integration error or any sign mistake leaked through, gravity compensation would no longer cancel gravity and the arm would fall.

Configuration#

Parameter

Value

URDF

tests/control/fixtures/three_link_planar.urdf

Initial $q$

$(0.3, -0.4, 0.5)$ rad

Initial $\dot q$

$0$

External wrenches

$0$

Joint friction

$0$ (overridden in test fixture)

Gravity

$(0, 0, -9.80665)$ m/s²

Timestep

$10^{-3}$ s

Steps

1000 (1 s of simulated time)

JAX precision

x64 enabled at module load

Hot loop

jax.jit-compiled step(q, qd) (q', qd')

Procedure#

  1. Set initial state $(q_0, \dot q_0 = 0)$.

  2. JIT-compile a step closure that recomputes $\tau_{\mathrm{cmd}} = g(q)$ from the current $q$ and calls arm.update.

  3. Run 1000 jitted steps.

  4. Compute drift $\max_i |q_{1000,i} - q_{0,i}|$.

  5. Assert drift $< 10^{-3}$ rad.

Result#

PASS. The arm holds within the tolerance — semi-implicit Euler is symplectic, so even tiny gravity-comp residuals do not accumulate secularly over the 1000-step horizon.

Scope and Limitations#

  • One initial pose. A more thorough test would sweep multiple poses, but the integrator is linear in the residual so a single pose is representative.

  • Tests integrator drift, not steady-state error under disturbance. Disturbance rejection is implicitly exercised by MIME-VER-124.

Reproducibility#

  • Run: JAX_PLATFORMS=cpu .venv/bin/python -m pytest tests/verification/test_robot_arm.py::test_ver123_gravity_hold -x -q.