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{split} \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} \end{split}\]

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

float64 (via @pytest.mark.x64)

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.