Doctoral Research · Space Robotics Inspection with a Free-Flying Space Manipulator
A Doctoral Research Journal Aerospace Engineering

TASK A1 — Why the analytic FF twist disagrees with d/dt(desired.p_e), and what it means for the floor

Generated: 2026-06-23 (EDT) · Method: 5-agent investigation workflow (3 parallel code-readers → synthesis → adversarial refutation) + from-NPZ floor cross-check Builds on: nu_e_residual_taskA_Jun23b.md (TASK A: world-frame Δ tiny, EE tracks the pose velocity; EE-local nu_e error 54° is an FF inconsistency) Question: Why is the analytic feedforward twist desired.nu_e ~54° off d/dt(desired.p_e) — bug or different quantity? And what does it imply for the p_e-above-floor gap?


Answer first


The floor reframing (the headline that matters)

The analytic FF feeds forward a velocity for a different trajectory than the loop tracks. The cruise-lag floor formula x_ss = −(JᵀK)⁻¹[C·v_des + …] is fed that v_des — so in analytic runs it predicts a phantom-low floor.

v_des fed to floor floor_med p_e (pe_med) ratio p_e/floor
fd (off) d/dt(desired.p_e)what the EE tracks 0.123 0.106 0.86 (AT floor)
analytic (on) the ideal-standoff FF twist — not tracked 0.044 0.107 2.46 (phantom)

We are AT the architectural cruise-lag floor. The honest floor (consistent v_des, fd) is ~0.12 m and p_e ≈ 0.107 sits just below it. The advertised 0.044 m was a mis-prediction from feeding the floor a v_des the loop never follows; even the perfectly-consistent fd FF reaches only 0.106, never 0.044. The 0.063 m “gap” was a ghost.


Actionable defects surfaced

D1 — The nu_e tracking metric is ill-posed in analytic runs. It compares desired.nu_e (in R_ed, an idealized reference) against actual.nu_e (in R_te, the realized motion) — different reference and different frame. The honest tracking question (“does the EE follow the commanded pose?”) is answered cleanly by the world-frame p_e / Δ (TASK A: 1.6%). Fix: judge EE tracking by p_e/pointing, or compare the FF against the ideal-standoff reference it is derived from — not by nu_e-vs-FD agreement.

D2 — Floor logging is misleading in analytic runs. diagnostics.cruise_lag.floor_pe uses the analytic FF v_des the loop doesn’t track → the “0.044 / 2.46×” headline. Fix: log the floor with the consistent (committed-pose) v_des, or report both and label which v_des each uses.

D3 — Doc/code sign mismatch (one-line, harmless). current_sota.md eq 5.7 writes p_ed = p_c − r_cam·r̂ (outward); the code uses p_ed = p_cd + r_cam·u (inward, analytic_feedforward.py:131). The doc is internally inconsistent (its own z_ed = +r̂), and the twist eq 5.10 already matches code. Flagged for the user to verify and fix in the canonical sheet (the math is theirs to own).


Proposed next steps (pick by goal)

  1. If the goal is the clean 54° attribution (frame vs reference): re-run the analytic floor spec with R_ed/R_te logged, then compare the FF twist and d/dt(desired.p_e) in a common world frame (agrees in world ⇒ frame; disagrees ⇒ reference). Cheap code A/B: swap p_cd → measured p_c at ee_guidance.py:283 and re-measure the angle. (Scientific completeness; does not change the decision.)
  2. If the goal is lower p_e: it is not a feedforward lever (fd ≈ an). The remaining axis is EE position stiffness K_e — a separate study (raise K_e, watch the actuator-effort / pointing trade and s_min margin).
  3. If satisfied we’re at the floor: fix D2 (floor logging v_des) so the headline metric stops reporting a phantom gap, document the limit, and ship the nominal. The cruise-lag floor (~0.12 m) is then the stated architectural p_e.

Provenance