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

Does the forward-Euler \(\omega_b\) instability change the cruise-lag error floor?

Short answer: no. The floor formula is untouched. The two results live on different layers — the floor is the equilibrium of the continuous closed loop, the \(\omega_b\) ripple is a property of the explicit integrator — and a continuous-time quantity cannot be moved by the choice of time-stepping. There is exactly one genuine seam between them (the steady-state assumption \(\breve{\bm v}\to\breve{\bm v}_d\)), and the \(\omega_b\) note’s own near-zero-mean finding is what keeps that seam from biasing the floor. Separately, one prose sentence in error_floor.tex now sits in tension with the \(\omega_b\) verdict and should be reconciled (it is an attribution issue, not a formula error).

Sources compared: - Floor: error_floor.tex eq x_ss; steady_state_error_floor (current_sota eq 4.14 / final.tex eq 34b), built on giordano2019coordinated. - Ripple: omega_b_forward_euler_instability.md; discretization_stability_omega_b.


1. The two objects, side by side

It pays to write each result as what it actually is, because the confusion only arises when both are described loosely as “the near-singularity oscillation.”

The floor is a fixed point. Impose the steady-state condition \(\dot{\tilde{\bm x}}=\bm 0\) on the reduced attitude+EE closed loop (current_sota eq 4.12). When the error-rate Jacobian \(\bm J_{\tilde x}\) is invertible this forces \(\breve{\bm v}=\breve{\bm v}_d\), which cancels the inertial terms and the velocity-error damping \(\breve{\bm D}(\breve{\bm v}-\breve{\bm v}_d)\). What survives is an algebraic balance whose solution is

\[ \tilde{\bm x}_{ss}=-\big(\bm J_{\tilde x}^\top\breve{\bm K}\big)^{-1}\Big[\breve{\bm C}\,\breve{\bm v}_d+\big(\bm C_c+\breve{\bm D}\,\breve{\bm G}_{v_c}\big)\dot{\tilde{\bm x}}_c\Big]. \]

Read the right-hand side: it is built from \(\bm J_{\tilde x}\), \(\breve{\bm K}\), \(\breve{\bm C}\), \(\breve{\bm v}_d\), and the CoM-coupling block. There is no \(dt\) anywhere in it. The floor is a property of the continuous closed-loop ODE — specifically of its equilibrium manifold — and is defined whether you integrate the loop with forward Euler, backward Euler, or solve it in closed form.

The ripple is a multiplier of the integrator. Linearize the velocity error \(\bm e=\breve{\bm v}-\breve{\bm v}_d\) about the demand and keep the dominant damping mode, \(\dot{\bm e}=-\breve{\bm M}^{-1}\breve{\bm D}\,\bm e\). In continuous time every mode decays monotonically, \(e_i(t)=e_i(0)\,e^{-\mu_i t}\) with \(\mu_i>0\)unconditionally stable. Forward Euler replaces that decay with the recurrence \(e_i^{k+1}=(1-dt\,\mu_i)\,e_i^k\), whose multiplier \(\rho_i=1-dt\,\mu_i\) crosses \(-1\) — a growing period-2 cycle — exactly when

\[ dt\,\mu_{\max}>2,\qquad \mu_{\max}=\max\operatorname{eig}\!\big(\breve{\bm M}^{-1}\breve{\bm D}\big). \]

Read this right-hand side: it is all \(dt\) and spectrum of \(\breve{\bm M}^{-1}\breve{\bm D}\). It says nothing about where the loop settles, only about whether the explicit step tracks the continuous decay or overshoots and reverses sign each step.

So the floor answers “where does \(\tilde{\bm x}\) settle?” and the ripple answers “does the integrator converge to the continuous trajectory or limit-cycle around it?” Different questions, different variables (\(\tilde{\bm x}\) vs \(\bm e\)), different parameters (\(\breve{\bm K}\) vs \(dt\)).

2. Why the ripple cannot move the floor

The clean argument is the one already made: \(\tilde{\bm x}_{ss}\) is a function of continuous-time quantities with no \(dt\) dependence, and the \(\omega_b\) instability is a statement purely about \(dt\). Changing \(dt\) — even across the stability boundary \(dt^\star=2/\mu_{\max}\) — changes whether the transient rings, not the equilibrium it rings about. Setting \(dt=0.01\) (the causal re-run, spec omega_ripple_dt010) removed the ripple while leaving the closed-loop ODE, and hence its floor, identical. That is the cleanest possible evidence the two are independent: a manipulation that annihilates one leaves the other’s defining equation unchanged.

A small quantitative sanity check makes the separation concrete. The ripple is a near-zero-mean period-2 oscillation in \(\breve{\bm v}\) of amplitude \(\sim0.3\); integrating a \(\sim16.7\,\mathrm{Hz}\) (\(=1/2dt\) at \(dt=0.03\)) velocity wobble of that size gives a pose wobble on the order of \(0.3/(2\pi\cdot16.7)\approx 3\times10^{-3}\,\mathrm{rad}\approx0.16^\circ\) — a fraction of the \(\sim0.8^\circ\) pointing budget. So in the simulator the measured pose error is

\[ \tilde{\bm x}(t)\;\approx\;\underbrace{\tilde{\bm x}_{ss}}_{\text{floor: continuous equilibrium}}\;+\;\underbrace{\tilde{\bm x}_{\text{ripple}}(t)}_{\text{zero-mean, } \mathcal O(0.16^\circ),\ dt\text{-artifact}} . \]

The two contributions add; they do not multiply or shift one another. The floor is the mean; the ripple is fluctuation about it.

3. The one genuine seam — and why it holds

There is a place the two results actually touch, and it is worth stating precisely rather than waving away. The floor derivation’s load-bearing step is \(\breve{\bm v}\to\breve{\bm v}_d\) at steady state — this is what cancels the damping term and collapses the dynamics to the algebraic balance. But the \(\omega_b\) result says that under forward Euler at \(dt>dt^\star\), the velocity error \(\bm e=\breve{\bm v}-\breve{\bm v}_d\) does not decay to zero — it limit-cycles. So does the floor’s premise fail in the discrete sim?

No, and the reason is the property the \(\omega_b\) note already establishes for an unrelated purpose: the limit cycle is near-zero-mean. The floor is an equilibrium statement, which in the rippling discrete system corresponds to the time-averaged balance. Taking the time average of the velocity error over a period-2 cycle gives \(\langle\bm e\rangle\approx\bm 0\), so \(\langle\breve{\bm v}\rangle\approx\breve{\bm v}_d\) and the averaged damping term \(\breve{\bm D}\langle\bm e\rangle\) still vanishes. The algebraic balance that defines \(\tilde{\bm x}_{ss}\) is recovered in the mean. The ripple injects a zero-mean fluctuation but no DC offset, so the floor — a DC quantity — survives intact.

This is the precise condition under which the two results stay decoupled: the floor is robust to the discretization artifact exactly because the artifact is zero-mean. Were the period-2 cycle ever to acquire a non-zero mean (the note flags that the bounding mechanism and the zero-mean property would need re-checking if the ripple approached the velocity clip \(v_{\max}=50\), which it does not here), that DC component would bias the measured offset away from the analytic floor. It does not, so the floor stands — but now we know why it stands, not merely that it does.

4. A prose tension to reconcile in error_floor.tex (not a formula problem)

One sentence in error_floor.tex (the paragraph after eq x_ss) now sits awkwardly against the \(\omega_b\) verdict:

“when the arm and base are enabled … Tikhonov damping is applied homogeneously to all coordinates. This causes spikes in \(\tilde{\bm x}_c\) and \(\dot{\tilde{\bm x}}_c\) near singularity.”

Two things to check against the new result, both of which need your eyes on the sim data (I have not edited the .tex — per the LaTeX rule I only flag, I do not rewrite your derivations):

  1. Attribution. The sentence pins the near-singular spikes on the Tikhonov / \(\gamma\)-regularized damping. The \(\omega_b\) note explicitly exonerates the \(\gamma\)-regularized reconstruction (“a passive, sign-stable SPD map … cannot self-oscillate”) and reassigns near-singular oscillation to the forward-Euler integration of \(\breve{\bm M}^{-1}\breve{\bm D}\), noting that raising damping makes it worse (it increases \(\breve{\bm D}\), pushing \(dt\,\mu\) past 2). If the CoM spikes share that mechanism, “Tikhonov damping causes the spikes” is at best incomplete and at worst the wrong suspect.

  2. Which loop. The spikes in the .tex are in \(\tilde{\bm x}_c,\dot{\tilde{\bm x}}_c\) — the decoupled \(3\times3\) CoM loop (\(m\ddot{\tilde{\bm x}}_c+\bm D_c\dot{\tilde{\bm x}}_c+\bm K_c\tilde{\bm x}_c=\bm 0\)). The \(\omega_b\) instability is derived for the reduced \(9\times9\) \([\bm\omega_b;\bm\nu_e^\oplus]\) block, a different subsystem with its own well-conditioned inertia. So the two may genuinely be separate phenomena — in which case the .tex is fine as written and simply describes a CoM-loop effect the \(\omega_b\) note does not cover. But the same large-\(dt\) / large-\(\mu\) mechanism would afflict the CoM loop too if \(\bm M_c^{-1}\bm D_c\) ever developed a fast mode near singularity. The decisive check is the one the \(\omega_b\) note already pioneered: the \(dt\)-independent lag-1 autocorrelation of the logged \(\dot{\tilde{\bm x}}_c\) — if it reads \(\approx-1\) at \(dt=0.03\) and flips to \(\approx+1\) at \(dt=0.01\), the CoM spikes are the same forward-Euler artifact and the “Tikhonov damping” sentence should be rewritten to match.

Either way, the floor formula eq x_ss is unaffected — this is about the explanatory sentence beneath it, not the equation.

5. Verdict and moral

The moral. Continuous and discrete stability are different theorems about the same loop: continuous stability is necessary but not sufficient for stability under explicit integration (discretization_stability_omega_b makes this its closing caveat). The cruise-lag floor lives entirely on the continuous side, so the discrete-side artifact leaves it formally untouched — but the only reason the simulator measures the right floor is the empirical zero-mean of the discrete artifact. Keep the layers separate in the writing, and the one quantitative thing linking them (zero-mean) explicit.