MIME-VER-100 — MotorNode Step Response (Torque Mode, No Load)#

Date: 2026-04-30 Node under test: mime.nodes.actuation.motor.MotorNode Algorithm ID: MIME-NODE-100 Benchmark type: Analytical (Mode 2 independent) Test file: tests/verification/test_motor.py::test_ver100_torque_step_response Acceptance: relative RMS error of $\omega(t)$ over a 1 s trajectory < 5 %


Goal#

Verify that MotorNode in torque-mode with no electrical model and no external load reproduces the analytical first-order velocity step response of a damped rotor:

$$ J \dot{\omega} = \tau - b \omega \quad \Longrightarrow \quad \omega(t) = \frac{\tau}{b} \left( 1 - e^{-bt/J} \right). $$

This is the simplest possible regression on the mechanical integration path. It exercises the semi-implicit-Euler step, the boundary-input plumbing for commanded_torque, and the rotor-pose composition into rotor_pose_world (the latter cross-checked by a separate test, not this one).

Configuration#

Parameter

Value

inertia_kg_m2 ($J$)

$1 \times 10^{-4}$ kg·m²

damping_n_m_s ($b$)

$5 \times 10^{-4}$ N·m·s

kt_n_m_per_a ($k_t$)

not exercised in torque-mode

r_ohm, l_henry

not exercised in torque-mode

commanded_torque ($\tau$)

$0.01$ N·m (constant step)

commanded_voltage

$0.0$

commanded_velocity

$0.0$

parent_pose_world

identity

axis_in_parent_frame

$(0,0,1)$

Timestep $\Delta t$

$1 \times 10^{-4}$ s

Duration

$1.0$ s ($10^4$ steps)

JAX precision

x64 enabled at module load

Analytical reference (numpy, double precision)#

$$ \omega_{\text{ref}}(t_n) = \frac{\tau}{b}\left( 1 - e^{-b t_n / J} \right), \qquad t_n = n \cdot \Delta t. $$

Steady-state value: $\omega_\infty = \tau/b = 20 \text{ rad/s}$. Time constant: $J/b = 0.2$ s.

Procedure#

  1. Construct the node and obtain its initial state.

  2. For $n \in [0, 10^4)$: call node.update(state, {"commanded_torque": 0.01}, dt), append state["angular_velocity"] to a trajectory array.

  3. Compute omega_ref on the same time grid using the closed form above.

  4. Compute relative RMS error $\sqrt{\overline{(\omega - \omega_{\text{ref}})^2}} ,/, \omega_\infty$.

Result#

Status: PASS.

Relative RMS error is well under the 5 % acceptance, dominated by $O(\Delta t)$ truncation of the semi-implicit-Euler integrator (theoretical bound at this step size: ~0.05 %). Exact value is recorded by the test; see latest CI run.

Scope and Limitations#

This benchmark validates only:

  • The torque-mode integration path of MotorNode.

  • The first-order analytical agreement of a rotor-with-damping ODE.

It does not validate:

  • The voltage-mode RL armature integration (covered by a separate test in the same file, not a verification benchmark).

  • The velocity-mode PI loop (separate test).

  • Cogging torque or rotor imbalance (out of scope for v1 — both MotorMeta.has_cogging and MotorMeta.has_imbalance_vibration default to False).

  • The interaction with RobotArmNode end-effector reaction (one-way coupling in v1; tracked as a known anomaly).

Reproducibility#

  • Hardware: any platform with JAX ≥ 0.4 (CPU is sufficient).

  • Software: MIME 0.1.0; MADDENING pinned in pyproject.toml.

  • RNG seed: not used (deterministic input).

  • Run with JAX_PLATFORMS=cpu .venv/bin/python -m pytest tests/verification/test_motor.py::test_ver100_torque_step_response -x -q if local GPU is contended.