Base-Angular-Velocity Ripple Is a Forward-Euler Instability, Not a Control or Singularity Pathology

Statement

The persistent ripple observed in the base angular velocity of the
coordinated free-flying controller is a period-2 (Nyquist) limit cycle produced by integrating
the reduced-impedance loop’s velocity-damping term with explicit forward Euler
at a timestep
larger than the loop’s stiffest damping mode can resolve. It is a pure discretization artifact:
the underlying continuous-time loop is unconditionally stable, and the ripple is near-zero-mean so
it integrates out of the configuration (pointing and
coverage are unharmed).

Linearizing the reduced velocity error
about the desired velocity, the damping term dominates the unstable mode (stiffness contributes
, comfortably stable):

Diagonalizing
with decay rates , the continuous solution decays
monotonically. Forward Euler with step replaces this with the scalar recurrence

so the discrete mode is unstable (a growing period-2 cycle, ) exactly when

At a representative near-singular step () the largest decay rate is
, giving . The nominal
sits above the stability limit ();
at () the ripple vanishes.

Why blows up near the singular configuration. Since
,
at full arm extension has large entries, develops a
light mode (small eigenvalue), and grows. With
held at full strength,
grows. The singularity therefore enters through the reduced inertia , not
the damped pseudo-inverse — which is why the obvious lever (raising base damping) makes things
worse: it increases , pushing further past 2.

This exonerates two suspects. The -regularized velocity reconstruction is a passive,
sign-stable SPD map that cannot self-oscillate, and the singularity / conditioning layer
(singularity_threshold_cascade) is downstream of the artifact.
The driver is upstream, in the explicit integration of .

Assumptions

  • Free-flying regime (fully-actuated 6-DOF base). The result is about the time-discretization of
    the reduced attitude+EE impedance loop, not about momentum conservation or the free-floating GJM
    machinery.
  • The reduced state is and the
    loop integrates with explicit
    forward Euler at fixed , followed by a configuration step.
  • Linearization about with the damping term dominating the stiffest mode;
    the stiffness contribution () is stable and dropped from the instability
    analysis.
  • is SPD and is SPD, so
    has real positive eigenvalues (real, diagonalizable spectrum — no complex damping modes).
  • Numerical values (, ) are configuration-specific,
    measured at with exact and gains from the controller
    config (base.derate.gain = false, so the base block runs at full strength).
  • The velocity clip () does not bind — it is far above the ripple
    amplitude — so the limit cycle is bounded by the configuration-dependence of ,
    not by saturation.

Proof sketch

Full derivation: omega_b_forward_euler_instability.md.

  1. Reduce the loop. Write the per-step update ;
    linearize about in the error ;
    keep the dominant damping term .
  2. Diagonalize and discretize. Spectral decomposition ;
    per-mode forward Euler gives .
  3. Read off the stability map. : monotone decay (), decaying
    ring (), marginal period-2 (), growing period-2 limit cycle
    (). Hence the critical step .
  4. Locate . Trace its growth to blowing up near the
    singular configuration via , with fixed.
  5. Numerical confirmation — four independent ways (full table in the derivation):
    (i) the dt-independent lag-1 autocorrelation of the dominant data direction flips
    between and (period-2 smooth);
    (ii) the theory ratio vs , and the discrete-map
    dominant eigenvalue (real, period-2) vs ;
    (iii) mode alignment theory-vs-data ;
    (iv) a causal re-run of the mission at (spec omega_ripple_dt010) removed the
    ripple exactly as predicted ( amplitude drop, every direction’s autocorr
    flipping to ).

The principled fix (deferred — a separate decision with its own baseline re-pin) is to treat the
stiff damping implicitly (backward Euler / IMEX):
gives for all and all — unconditionally stable,
monotone, no timestep bound, no gain re-tuning.

Source / provenance

  • Ours — the project’s own numerical finding. Full derivation, code references, and the
    four-way confirmation table:
    omega_b_forward_euler_instability.md.
  • Verification script: validation/omega_b_ripple_mechanism.py; causal re-run spec
    omega_ripple_dt010; provenance and verdicts in logs/logs_Jun21_26/CLAIMS.md (omega_b entries)
    and validation/INSIGHTS.md.
  • Code: the forward-Euler velocity step and reduced-inertia live in the GNC
    controller and utils/robot.py (cited in the derivation).
  • Notation: notation.md.

Caveats

  • and are configuration-specific
    (measured at ); shrinks as the system approaches
    singularity, so a single global timestep that is safe in open configurations can violate the bound
    near full extension.
  • The analysis drops the stiffness term (). This is justified at the nominal
    operating point but is not a proof for arbitrarily large stiffness gains; with much stiffer
    the stiffness mode could itself approach the bound.
  • The limit-cycle amplitude is bounded by nonlinearity, not by
    the velocity clip; if operating conditions push the ripple toward the bounding mechanism —
    and the near-zero-mean property that protects pointing — would have to be re-checked.
  • This note establishes the mechanism and the form of the fix; it does not adopt the
    implicit/IMEX integrator, shrink , or lower . Any of those is a separate
    change requiring its own baseline re-pin.
  • The result is about discretization of the coordinated impedance loop and is orthogonal to the
    Lyapunov stability of the continuous cascade
    (coordinated_control_lyapunov_stability): continuous
    stability is necessary but not sufficient for stability under explicit integration.