MIME-VER-120 — RobotArmNode Forward Kinematics#

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_ver120_fk_vs_analytical Acceptance: $\max|p_{\text{node}} - p_{\text{analytic}}|_\infty < 10^{-10}$ m over 5 random configs


Goal#

Verify that RobotArmNode.compute_boundary_fluxes produces an end-effector tool-tip position that agrees with the closed-form 3-link planar formula

$$ \begin{aligned} x &= L_1\cos q_1 + L_2 \cos(q_1+q_2) + L_3 \cos(q_1+q_2+q_3),\ y &= L_1\sin q_1 + L_2 \sin(q_1+q_2) + L_3 \sin(q_1+q_2+q_3). \end{aligned} $$

This validates the entire FK chain: URDF parse → joint transforms → link_world_poses → tool-offset composition.

Configuration#

Parameter

Value

URDF

tests/control/fixtures/three_link_planar.urdf

Link lengths $L_1, L_2, L_3$

$1.0, 1.0, 0.5$ m

end_effector_link_name

link_3

end_effector_offset_in_link

$(L_3/2, 0, 0, 1, 0, 0, 0)$ — link COM is at $L_3/2$, tool tip is +$L_3/2$ further

gravity_world

$(0, 0, -9.80665)$

Configurations

5 samples from $\mathcal{U}[-\pi, \pi]^3$ (seed 20260430)

JAX precision

x64 enabled at module load

Procedure#

For each random $q$:

  1. Build state = {joint_angles: q, joint_velocities: 0}.

  2. Call arm.compute_boundary_fluxes(state, {}, dt) and read the first 3 components of end_effector_pose_world.

  3. Compute the analytical reference with double-precision NumPy.

  4. Track $\max_i|p_{\text{node},i} - p_{\text{analytic},i}|_\infty$ across all configs.

Result#

PASS. The maximum component error across the 5 configurations is recorded by the test and is well below the $10^{-10}$ acceptance.

Scope and Limitations#

  • Validates planar revolute FK only (the fixture has all axes along $+\hat z$). Spatial FK with non-planar axes is exercised indirectly by the kinematics-package tests (tests/control/test_kinematics.py), which include 3-D placements.

  • Does not validate orientation, only position.

  • Does not exercise prismatic joints or fixed-joint merging — those have their own coverage in the kinematics-package suite.

Reproducibility#

  • Seed: NumPy default_rng(20260430) for joint angles.

  • Hardware: any platform with JAX ≥ 0.4 in float64 (jax_enable_x64).

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

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