Long-form companion to generated_reports/math/dynamics_modifications_7dof.md (§5–§7) and generated_reports/math/derivation_7dof.md (§6, the honest open-list), building directly on generated_reports/math/passivity_proofs.md (Lemma 1, §7.2). Equation numbers in parentheses, e.g. (37), refer to the framing paper GNC/Framing_Paper_coordinated_control/coordinated_control.md. Every algebraic claim is machine-checked in validation/test_lyapunov_extension_p3p4.py (ALL PASS). This file derives now from in-repo sources and standard control theory; the two places that need external references are flagged, and the precise reading list is §11.
The redundant arm has one extra, invisible degree of freedom — the self-motion velocity \(v_n\) (the null-space motion of the coordinated task map \(\boldsymbol\Gamma\): the arm reconfigures along \(\hat{\boldsymbol n}\) while the base counter-translates, so nothing the mission watches moves — not the fixed-base joint null space, and not a free-floating reactionless mode; see wiki/terminology.md). Left alone it drifts (we measured \(|v_n|\approx 0.23\ \mathrm{rad/s}\), not decaying). The fix is one number, \(d_n>0\): a damper on the invisible motion. The fear is that adding a coordinate stirs up new Coriolis cross-terms (P3) between \(v_n\) and the task, and that those terms might wreck the energy argument that proves stability (P4).
The punchline: the cross-terms are real, but they cost us nothing. They are the off-diagonal blocks of a skew matrix, and a skew matrix vanishes inside the energy-rate quadratic form — by the very Lemma we proved in passivity_proofs.md. So the closed-loop energy still only ever decreases, at the clean rate
\[ \dot V = -\,\breve{\boldsymbol v}^T\breve{\boldsymbol D}\breve{\boldsymbol v}\;-\;d_n\,v_n^2\;\le\;0 . \]
P3 and P4 are, in the end, the same fact looked at twice. That is the whole story; the rest of this file is us earning the right to say it.
Adding the seventh joint gave the robot a motion the mission coordinates cannot see (the self-motion, derivation_7dof.md §3). We built a speedometer for it, \(v_n\), and proved that kinetic energy decouples it from the task (the block-diagonal \(\hat{\boldsymbol M}_a\), obligation P1). Two questions remained open, and they are the ones that decide whether the controller is provably stable:
The reason P3 is frightening is that the entire nominal stability proof hangs on the Coriolis terms doing no work (the passivity property (23)). If the new cross-terms did work, \(\dot V\) could turn positive and the proof would collapse. So we must understand the cross-terms precisely before we can trust the energy argument.
Before touching the seventh joint, let us be sure we understand the proof we are extending. This is the \(n=6\) argument of (34)–(38), walked through with nothing skipped, because the 7-DOF version is this argument plus one scalar coordinate.
The closed loop (34) splits into two pieces:
A cascade is proved in two moves: show the driven block is stable when the forcing is off, then argue the vanishing forcing cannot destabilize it (the cascade step, §8). The heart is the first move.
Set \(\dot{\tilde{\boldsymbol x}}_c=\boldsymbol 0\) and study the driven block alone. The Lyapunov candidate (37) is the total mechanical energy in the chosen coordinates — kinetic plus a fictitious spring storing the tracking error:
\[ V = \tfrac12\,\breve{\boldsymbol v}^T\breve{\boldsymbol M}\,\breve{\boldsymbol v} \;+\; \tfrac12\,\tilde{\boldsymbol x}^T\breve{\boldsymbol K}\,\tilde{\boldsymbol x}, \qquad \breve{\boldsymbol M}=\breve{\boldsymbol M}^T\succ0,\ \ \breve{\boldsymbol K}=\breve{\boldsymbol K}^T\succ0 . \]
Differentiate along the motion. Because \(\breve{\boldsymbol M}\) and \(\breve{\boldsymbol K}\) are symmetric, the two halves give
\[ \dot V = \breve{\boldsymbol v}^T\breve{\boldsymbol M}\dot{\breve{\boldsymbol v}} + \tfrac12\breve{\boldsymbol v}^T\dot{\breve{\boldsymbol M}}\breve{\boldsymbol v} + \tilde{\boldsymbol x}^T\breve{\boldsymbol K}\dot{\tilde{\boldsymbol x}} . \]
Now substitute the dynamics. From (34b) with the forcing off, \(\breve{\boldsymbol M}\dot{\breve{\boldsymbol v}} = -\breve{\boldsymbol C}\breve{\boldsymbol v} - \breve{\boldsymbol D}\breve{\boldsymbol v} - \boldsymbol J_{\tilde x}^T\breve{\boldsymbol K}\tilde{\boldsymbol x}\), and from (34c), \(\dot{\tilde{\boldsymbol x}} = \boldsymbol J_{\tilde x}\breve{\boldsymbol v}\). Inserting both,
\[ \dot V = \underbrace{\tfrac12\breve{\boldsymbol v}^T\big(\dot{\breve{\boldsymbol M}} - 2\breve{\boldsymbol C}\big)\breve{\boldsymbol v}}_{\text{(i) Coriolis}} \;\underbrace{-\,\breve{\boldsymbol v}^T\boldsymbol J_{\tilde x}^T\breve{\boldsymbol K}\tilde{\boldsymbol x} + \tilde{\boldsymbol x}^T\breve{\boldsymbol K}\boldsymbol J_{\tilde x}\breve{\boldsymbol v}}_{\text{(ii) stiffness cross-terms}} \;\underbrace{-\,\breve{\boldsymbol v}^T\breve{\boldsymbol D}\breve{\boldsymbol v}}_{\text{(iii) damping}} . \]
Two of these three vanish:
What survives is (38):
\[ \boxed{\;\dot V = -\,\breve{\boldsymbol v}^T\breve{\boldsymbol D}\breve{\boldsymbol v}\;\le\;0\;} \]
Energy only leaves, through the dampers \(\breve{\boldsymbol D}\succ0\). By LaSalle, the trajectory settles on the largest invariant set in \(\{\dot V=0\}=\{\breve{\boldsymbol v}=\boldsymbol 0\}\), and the dynamics there force \(\tilde{\boldsymbol x}=\boldsymbol 0\) as well. The driven block is asymptotically stable. (The cascade step §8 then restores the CoM forcing.)
The moral of the template. Stability rests on exactly two cancellations — passivity kills Coriolis, transposition kills the stiffness cross-terms — and one sign, \(\breve{\boldsymbol D}\succ0\). Our job for the 7-DOF case is to show both cancellations still happen when we append the coordinate \(v_n\), and to supply the one new dissipation \(d_n\).
We now carry the self-motion coordinate through the same machinery. Stack it onto the driven block:
\[ \boldsymbol\xi \;=\; \begin{bmatrix}\breve{\boldsymbol v}\\ v_n\end{bmatrix}=\begin{bmatrix}\boldsymbol\omega_b\\ \boldsymbol\nu_e^\oplus\\ v_n\end{bmatrix}\in\mathbb R^{10}, \qquad \tilde{\boldsymbol x}_a \;=\; \begin{bmatrix}\tilde{\boldsymbol x}\\ \tilde x_n\end{bmatrix}\in\mathbb R^{10}, \]
where \(\tilde x_n\) is the integrator state of the self-motion, \(\dot{\tilde x}_n = v_n\) (its geometric meaning carries a caveat we defer to §9). The augmented inertia, Coriolis, stiffness, damping, and error-rate map are
\[ \hat{\boldsymbol M}_a=\begin{bmatrix}\breve{\boldsymbol M}&\boldsymbol 0\\ \boldsymbol 0&\hat m_n\end{bmatrix}, \quad \hat{\boldsymbol C}_a=\begin{bmatrix}\breve{\boldsymbol C}&\hat{\boldsymbol C}_{Tn}\\ \hat{\boldsymbol C}_{nT}&\hat c_{nn}\end{bmatrix}, \quad \hat{\boldsymbol K}_a=\begin{bmatrix}\breve{\boldsymbol K}&\boldsymbol 0\\ \boldsymbol 0&k_n\end{bmatrix}, \quad \hat{\boldsymbol D}_a=\begin{bmatrix}\breve{\boldsymbol D}&\boldsymbol 0\\ \boldsymbol 0&d_n\end{bmatrix}, \quad \hat{\boldsymbol J}_a=\begin{bmatrix}\boldsymbol J_{\tilde x}&\boldsymbol 0\\ \boldsymbol 0&1\end{bmatrix}. \]
Three things to read off this:
The full driven dynamics, with the CoM forcing off, is then the tidy stacked system
\[ \hat{\boldsymbol M}_a\dot{\boldsymbol\xi} + \hat{\boldsymbol C}_a\boldsymbol\xi + \hat{\boldsymbol D}_a\boldsymbol\xi + \hat{\boldsymbol J}_a^T\hat{\boldsymbol K}_a\tilde{\boldsymbol x}_a = \boldsymbol 0, \qquad \dot{\tilde{\boldsymbol x}}_a = \hat{\boldsymbol J}_a\boldsymbol\xi . \]
This is identical in shape to the nominal driven block of §2.2 — only larger by one row. If we can show the same two cancellations, we are done.
Everything in P4 hinges on the structure of \(\hat{\boldsymbol C}_a\)’s cross-blocks, so we settle P3 before attempting the energy argument.
The temptation is to hope \(\hat{\boldsymbol C}_a\) is block-diagonal like \(\hat{\boldsymbol M}_a\). It is not, and here is the clean reason. The Coriolis matrix is built from the configuration derivatives of the inertia (the Christoffel construction): its entries involve terms like \(\partial\hat M_{a,ij}/\partial q_k\). Block-diagonality of \(\hat{\boldsymbol M}_a\) says the task–ghost entries \(\hat M_{a,Tn}\) are zero for every \(\boldsymbol q\) — but it says nothing about the derivative of the task–task or ghost–ghost entries with respect to the ghost direction. Those derivatives are generally nonzero, and they land in the cross-blocks of \(\hat{\boldsymbol C}_a\). Giordano’s thesis confirms this in print: the internal Coriolis “is still fully coupled.” So we must not claim a block-diagonal \(\hat{\boldsymbol C}_a\).
Here is the part that turns P3 from a worry into a theorem. We know two facts:
Combine them block by block. A skew matrix \(\boldsymbol A\) has \(\boldsymbol A^T=-\boldsymbol A\), so its diagonal blocks are themselves skew and its off-diagonal blocks are negative-transposes: \(\boldsymbol A_{Tn} = -\boldsymbol A_{nT}^T\). Apply this to \(\boldsymbol A = \dot{\hat{\boldsymbol M}}_a - 2\hat{\boldsymbol C}_a\), remembering \(\dot{\hat{\boldsymbol M}}_a\) contributes nothing off-diagonal:
\[ \textbf{(P3a)}\quad \boxed{\;\hat{\boldsymbol C}_{Tn} = -\,\hat{\boldsymbol C}_{nT}^T\;} \qquad\text{(the cross-blocks are negative-transpose paired)}, \]
and on the scalar ghost–ghost block, a \(1\times1\) skew matrix is zero, so \(\dot{\hat m}_n - 2\hat c_{nn}=0\):
\[ \textbf{(P3b)}\quad \boxed{\;\hat c_{nn} = \tfrac12\,\dot{\hat m}_n\;} \qquad\text{(the scalar ghost Coriolis is half the inertia rate)}. \]
And generically \(\hat{\boldsymbol C}_{Tn}\neq\boldsymbol 0\) (P3c) — the coupling is real, not an artifact. So P3’s verdict, sharpened: the cross-terms exist; they are precisely the off-diagonal blocks of a skew matrix, paired by negative-transpose; and the lone scalar ghost-Coriolis is fixed at half the inertia rate. This is strictly more than “expect them to exist” — and it is exactly the structure P4 will exploit.
Derivation note. The general Coriolis consistent with a given inertia rate is the Christoffel form \(\hat{\boldsymbol C}_a = \tfrac12\dot{\hat{\boldsymbol M}}_a - \tfrac12\boldsymbol S\) with \(\boldsymbol S\) any skew matrix; substituting it reproduces (P3a)–(P3c) immediately, since the block-diagonal \(\dot{\hat{\boldsymbol M}}_a\) drops out of every off-diagonal block and out of the scalar’s skew part. The symbolic check in §10 uses exactly this parameterization.
Now the payoff. We mirror §2.2 line for line, with \(\boldsymbol\xi\) in place of \(\breve{\boldsymbol v}\) and \(\tilde{\boldsymbol x}_a\) in place of \(\tilde{\boldsymbol x}\).
Extend the energy by exactly the terms P4 prescribes — a kinetic term for the self-motion and a spring for its integrator:
\[ V_a = \tfrac12\,\boldsymbol\xi^T\hat{\boldsymbol M}_a\,\boldsymbol\xi + \tfrac12\,\tilde{\boldsymbol x}_a^T\hat{\boldsymbol K}_a\,\tilde{\boldsymbol x}_a \;=\; \underbrace{\tfrac12\breve{\boldsymbol v}^T\breve{\boldsymbol M}\breve{\boldsymbol v} + \tfrac12\tilde{\boldsymbol x}^T\breve{\boldsymbol K}\tilde{\boldsymbol x}}_{\text{the nominal }V} \;+\; \underbrace{\tfrac12\hat m_n v_n^2 + \tfrac12 k_n\tilde x_n^2}_{\text{the P4 extension}} . \]
Because \(\hat{\boldsymbol M}_a\) is block-diagonal (P1), the cross-multiplication produces no \(\breve{\boldsymbol v}\,v_n\) term: \(V_a\) is literally the old energy plus the new energy, and it is positive definite as long as \(\hat m_n>0\) (always, on \(\Omega\)) and \(k_n\ge0\).
Differentiate, using symmetry of \(\hat{\boldsymbol M}_a\) and \(\hat{\boldsymbol K}_a\) exactly as in §2.2:
\[ \dot V_a = \boldsymbol\xi^T\hat{\boldsymbol M}_a\dot{\boldsymbol\xi} + \tfrac12\boldsymbol\xi^T\dot{\hat{\boldsymbol M}}_a\boldsymbol\xi + \tilde{\boldsymbol x}_a^T\hat{\boldsymbol K}_a\dot{\tilde{\boldsymbol x}}_a . \]
Substitute the augmented dynamics \(\hat{\boldsymbol M}_a\dot{\boldsymbol\xi} = -\hat{\boldsymbol C}_a\boldsymbol\xi - \hat{\boldsymbol J}_a^T\hat{\boldsymbol K}_a\tilde{\boldsymbol x}_a - \hat{\boldsymbol D}_a\boldsymbol\xi\) and \(\dot{\tilde{\boldsymbol x}}_a = \hat{\boldsymbol J}_a\boldsymbol\xi\). The result is the exact analogue of the three-term split, now over the augmented vectors:
\[ \dot V_a = \underbrace{\tfrac12\boldsymbol\xi^T\big(\dot{\hat{\boldsymbol M}}_a - 2\hat{\boldsymbol C}_a\big)\boldsymbol\xi}_{\text{(i) ALL Coriolis, incl. P3}} \;\underbrace{-\,\boldsymbol\xi^T\hat{\boldsymbol J}_a^T\hat{\boldsymbol K}_a\tilde{\boldsymbol x}_a + \tilde{\boldsymbol x}_a^T\hat{\boldsymbol K}_a\hat{\boldsymbol J}_a\boldsymbol\xi}_{\text{(ii) stiffness cross-terms}} \;\underbrace{-\,\boldsymbol\xi^T\hat{\boldsymbol D}_a\boldsymbol\xi}_{\text{(iii) damping}} . \]
And the two cancellations fire exactly as before, now doing more work:
What remains is the clean, strictly dissipative rate:
\[ \boxed{\;\dot V_a = -\,\boldsymbol\xi^T\hat{\boldsymbol D}_a\,\boldsymbol\xi = -\,\breve{\boldsymbol v}^T\breve{\boldsymbol D}\,\breve{\boldsymbol v} \;-\; d_n\,v_n^2\;\le\;0\;} \]
The only new term is \(-d_n v_n^2\): the self-motion now leaks energy at rate \(d_n v_n^2\), and only if \(d_n>0\). (This boxed identity is what the §10 symbolic check confirms for a generic passive system.)
With \(\hat{\boldsymbol D}_a\succ0\) (i.e. \(\breve{\boldsymbol D}\succ0\) and \(d_n>0\)), invoke LaSalle on the autonomous driven block. The set \(\{\dot V_a = 0\}\) is \(\{\boldsymbol\xi = \boldsymbol 0\} = \{\breve{\boldsymbol v}=\boldsymbol 0,\ v_n=0\}\). On the largest invariant subset there, the dynamics force the elastic terms to zero as well: \(\breve{\boldsymbol v}\equiv\boldsymbol 0\Rightarrow\boldsymbol J_{\tilde x}^T\breve{\boldsymbol K}\tilde{\boldsymbol x}=\boldsymbol 0\Rightarrow\tilde{\boldsymbol x}=\boldsymbol 0\) (as in the nominal proof), and \(v_n\equiv0\Rightarrow k_n\tilde x_n = 0\), so \(\tilde x_n=0\) whenever \(k_n>0\). Hence the augmented equilibrium \(\boldsymbol\xi=\boldsymbol 0,\ \tilde{\boldsymbol x}_a=\boldsymbol 0\) is asymptotically stable — the self-motion is regulated, not merely bounded.
The moral. We did not have to bound the P3 cross-terms, estimate their size, or assume anything about them. We only had to recognize them as the off-diagonal of a skew matrix — which Lemma 1 guarantees — and let the same quadratic-form magic that kills the task Coriolis kill them too. P1 (block-diagonal \(\hat{\boldsymbol M}_a\)) made \(V_a\) a clean sum; the §7.2 Lemma made \(\dot V_a\) a clean drain; P4’s \(d_n>0\) opened the drain for \(v_n\). Three obligations, one interlocking argument.
The symbolic check (§10) deliberately used a general symmetric \(\hat{\boldsymbol M}_a\) — not a block-diagonal one — and the cancellation in (i) still happened. That is worth stating plainly, because it separates the roles cleanly and will pre-empt a committee question:
| Property | What it earns | What breaks without it |
|---|---|---|
| Lemma 1 (§7.2): \(\dot{\hat{\boldsymbol M}}_a-2\hat{\boldsymbol C}_a\) skew | The Coriolis cancellation (i): \(\dot V_a\) has no Coriolis residual. This alone suffices for \(\dot V_a\le0\). | \(\dot V_a\) carries an uncontrolled Coriolis term; stability lost. |
| P1: \(\hat{\boldsymbol M}_a\) block-diagonal | \(V_a\) splits as old-energy + new-energy with no \(\breve{\boldsymbol v}\,v_n\) cross-term; and the clean P3 structure (P3a)–(P3b). | \(V_a\) still a valid Lyapunov function (still PD), but not a clean sum; P3’s negative-transpose pairing no longer holds. |
| P4: \(d_n>0\) | The dissipation \(-d_n v_n^2\); LaSalle gives \(v_n\to0\). | \(v_n\) undamped — marginal, non-decaying (see §7). |
The honest consequence: passivity is the load-bearing wall, and it holds for any smooth invertible augmentation (that is the whole content of Lemma 1). This is why §10 can confirm the cancellation without ever assuming block-diagonality.
The single new term \(-d_n v_n^2\) deserves emphasis because it is where theory meets the logged data. Consider the self-motion subsystem in isolation (task settled, \(\breve{\boldsymbol v}=\boldsymbol 0\)), with pure damping (\(k_n=0\)):
\[ \hat m_n\dot v_n + \hat c_{nn}v_n = -d_n v_n, \qquad \hat c_{nn}=\tfrac12\dot{\hat m}_n \ \text{(by P3b)} . \]
Using P3b, \(\hat m_n\dot v_n + \tfrac12\dot{\hat m}_n v_n = -d_n v_n\), i.e. \(\tfrac{d}{dt}(\hat m_n v_n) = -(\tfrac12\dot{\hat m}_n + d_n)v_n\). The self-motion momentum \(\hat m_n v_n\) decays exponentially when \(d_n>0\) and is conserved up to the inertia-rate term when \(d_n=0\) — there is no restoring or dissipating mechanism at all. That is the mathematical fingerprint of a drifting, non-decaying mode.
And that is exactly what was measured. Running the unregulated controller (effectively \(d_n=0\)) on the 7-DOF arm produced \(\max|v_n|\approx0.23\ \mathrm{rad/s}\), non-decaying (derivation_7dof.md §7). Switching on the \(\boldsymbol M\)-orthogonal reconstruction (the \(d_n\to\infty\) limit, §9 below) drove the in-loop mean \(|v_n|\) from \(0.234\) to \(0.0058\) over the full mission (dynamics_modifications_7dof.md §5.3). Theory and telemetry agree: \(v_n\) does not decay until something supplies \(d_n\). The the physical reading makes the same point — real hardware carries mechanical joint friction, an effective \(d_n\) that a frictionless simulation simply lacks, so our self-motion has nothing to damp it and rings on (citation status pinned in §11; the often-quoted “Giordano 2021 hardware” reference is unverified — the damping law is the 2020 thesis §5.8c).
§5 proved the driven block stable with the CoM forcing switched off. The full theorem restores \(\dot{\tilde{\boldsymbol x}}_c\neq\boldsymbol 0\), making the system the cascade
\[ \dot{\boldsymbol z}_1 = \boldsymbol g_1(\boldsymbol z_1) \ \text{(CoM error, GAS, linear)},\qquad \dot{\boldsymbol z}_2 = \boldsymbol g_2(\boldsymbol z_1,\boldsymbol z_2)\ \text{(augmented driven block)}, \]
with the interconnection vanishing as \(\boldsymbol z_1\to\boldsymbol 0\). The standard conclusion — a GAS driver feeding an ISS-with-respect-to-the-input driven block yields a GAS cascade — carries over verbatim from the nominal proof, because appending the coordinate \(v_n\) did not change the cascade structure: the CoM still decouples (P2), and the augmented driven block is the same shape with one more stable, dissipative coordinate.
This is the one step I am not deriving from scratch here, for the same reason the framing paper does not: it relies on standard cascade/ISS theory whose hypotheses (a global boundedness/growth condition on the interconnection term) must be stated precisely to be rigorous. The nominal paper asserts it (“via the Lyapunov function and the passivity property (23)”); we should hold the extension to at least that bar, and ideally tighten it. The precise lemmas to cite are pinned in §11 (Khalil’s ISS/cascade results; Panteley & Loría’s growth conditions). Until then, the honest status of P4 is: asymptotic stability of the augmented driven block is proved (§5); the full cascade theorem is reduced to the same standard cascade lemma the nominal proof already invokes, now to be cited explicitly.
The argument above treats \(\tilde x_n\) as the integrator state \(\dot{\tilde x}_n = v_n\). Two regimes hide here, and they are a genuine design fork (the “three competing objectives” note in derivation_7dof.md §6):
The Lyapunov argument of §5 is rigorous either way (\(\tilde x_n\) is a legitimate auxiliary state with \(\dot{\tilde x}_n=v_n\)). But the interpretation of “regulating \(\tilde x_n\)” differs, and the clean, singularity-free recommendation is pure damping (\(k_n=0\)) for stabilization, with any posture objective handled separately and explicitly. I flag this rather than bury it; it is a real choice for you to make with the committee.
This is where a referee should push hardest, so we state it ourselves. The clean cancellation in §5 is exact for the \(\boldsymbol M\)-consistent augmented reduction — the square, invertible \(\boldsymbol\Gamma_a\) whose inverse defines the coordinates, for which Lemma 1 applies directly. But dynamics_modifications_7dof.md §6 records that the implemented controller builds \(\breve{\boldsymbol M},\breve{\boldsymbol C}\) from the Euclidean right-inverse \(\boldsymbol\Gamma^{-R}\in\mathbb R^{13\times12}\) (a non-square map), not from \(\boldsymbol\Gamma_a^{-1}\). Two consequences:
So the clean result here proves stability of the \(\boldsymbol M\)-consistent, square-\(\boldsymbol\Gamma_a\) controller. Closing the gap to the as-built Euclidean controller is precisely obligation P1’s remaining bookkeeping (rebuild the reduction with \(\boldsymbol\Gamma_a^{-1}\)) plus, if one insists on analyzing the Euclidean controller directly, a perturbation bound dominating the residual \(\tfrac12\boldsymbol\xi^T(\dot{\hat{\boldsymbol M}}_a-2\hat{\boldsymbol C}_a)\boldsymbol\xi\neq0\) by the damping — the “block + perturbation (ISS)” route. The §8/§11 sources cover that route too. The mission-scale results to date carry whatever (small, feedback-handled) cost this mismatch imposes; they do not contradict the theorem, because feedback absorbs bounded model error.
What is proved here (re-derivable by hand, machine-checked):
| Obligation | Result | Where |
|---|---|---|
| P3 | Cross-terms exist; \(\hat{\boldsymbol C}_{Tn}=-\hat{\boldsymbol C}_{nT}^T\) and \(\hat c_{nn}=\tfrac12\dot{\hat m}_n\) (off-diagonal of a skew matrix) | §4.2, check §10 |
| P4 (driven block) | \(\dot V_a=-\breve{\boldsymbol v}^T\breve{\boldsymbol D}\breve{\boldsymbol v}-d_n v_n^2\le0\); asymptotically stable for \(d_n>0\) | §5, check §10 |
| \(d_n>0\) necessity | \(d_n=0\Rightarrow\) self-motion momentum non-decaying; matches measured \(|v_n|\approx0.23\) | §7 |
What is reduced to standard results (the surgical reading list):
docs/new) is the 2nd ed. (1996)
(metadata-confirmed); the 3rd ed. (2002) is the
more-cited canonical version with a refined ISS chapter
(library/purchase — no legal free PDF). Pin the exact theorem/lemma
numbers from whichever edition you cite — they differ between editions;
do not quote from memory.10.1016/S0167-6911(97)00119-9); and the follow-up “Growth
rate conditions for uniform asymptotic stability of cascaded
time-varying systems,” Automatica
37(3):453–460, 2001 (DOI
10.1016/S0005-1098(00)00169-2). Both Elsevier (paywalled);
free author copies on academia.edu / ResearchGate. These give the
precise boundedness/growth hypotheses that make the GAS-driver +
driven-block conclusion rigorous.elib.dlr.de/127691) — explicitly assumes a nonredundant
manipulator, so it does not treat the self-motion
or \(d_n\); it is the \(n=6\) base our extension builds on.
Research-pass note (Jun 16): a distinct “Giordano 2021” hardware
paper could not be located (Semantic Scholar + web, by
author/title/year). The “2021” pin — here and in derivation_7dof.md
§7 — is unverified; cite the 2020 thesis for the damping law and the
2019 RA-L for the coordinated control unless a 2021 source
surfaces.These are the “missing books.” The derivation above does not wait on them; they harden §8 and supply citations for §7/§9.
Both structural claims are verified symbolically in validation/test_lyapunov_extension_p3p4.py, using generic symbolic matrices and the Christoffel parameterization \(\hat{\boldsymbol C}_a=\tfrac12\dot{\hat{\boldsymbol M}}_a-\tfrac12\boldsymbol S\) (with \(\boldsymbol S\) skew) for the general passive Coriolis:
CHECK 1 (P3 structure):
(a) Chat_Tn = -Chat_nT^T (skew-paired cross-blocks) : PASS
(b) chat_nn = (1/2) d/dt(mhat_n) : PASS
(c) Chat_Tn generically NONZERO : PASS
(-) sanity: d/dt(Mhat_a) - 2 Chat_a is skew : PASS
CHECK 2 (P4 cancellation):
Vdot == - xi^T Dhat_a xi (all Coriolis + stiffness cross-terms cancel) : PASS
ALL PASS
CHECK 2 uses a general symmetric \(\hat{\boldsymbol M}_a\) (not block-diagonal), confirming the §6 point that the energy-rate cancellation rests on passivity alone. Regenerate with:
python validation/test_lyapunov_extension_p3p4.py