tikhonov_regularization — damped least squares near the reach singularity
Concept
Tikhonov regularization (damped least squares, DLS) is the numerical lever the controller pulls to
keep a near-singular matrix invertible: it replaces1/σwithσ/(σ² + λ²), trading exactness for a
bounded inverse asσ → 0. It appears in two places that look unrelated until you read both — the
dampedJ⊕pseudoinverse (utils/robot.py) and the coordinatedΓvelocity solve
(GNC/breve_controller.py) — so this page documents the shared idea; the per-file pages document each site.
COM vs base — read this first
The regularization does NOT damp "the base" — the first channel it touches is the COM velocity
v_cA documentation agent confused the system center of mass with the base spacecraft body. They are
different channels, and only one of them is damped by theΓsolve.
p_cis the system CENTER OF MASS position — the whole-system circumcentroidal mass center, which
shifts as the arm slews. It is computed kinematically by Pinocchio FK asp_c = as_col3(self.data.com[0])
atutils/robot.py:137— a KINEMATIC quantity, never damped directly.- The BASE is the free-flyer spacecraft body frame. Its error channels are the base attitude
z_b(a
pointing versine) and the base angular rateomega_b. These are a different channel from the COM. - The coordinated (circumcentroidal,
⊕) reduced velocity solved by the dampedΓsystem is
y = [v_c, omega_b, nu_e_oplus], assembled atGNC/breve_controller.py:479— andv_c(COM velocity)
is the FIRST block. So when theΓ-Tikhonov term addsλ²I, the leading block it regularizes is the
COM velocity, not the base. - One-line correction: Tikhonov on the
Γsolve damps the COM velocityv_cfirst; it does not
“damp the base.”
What this spans
utils/robot.py(robot) — the dampedJ⊕inverse: the middle (Tikhonov) tier of the 3-tier
damped_inverse, applied to the circumcentroidal EE Jacobian.GNC/breve_controller.py(breve_controller) — the dampedΓvelocity solve in
reconstruct_generalized_velocity: the normal-equations form(ΓᵀΓ + λI) v = Γᵀ ythat recovers the full
generalized velocity fromy = [v_c, omega_b, nu_e_oplus].- Thesis: the same DLS trick guards two singular maps that go singular together (the
Γ/J⊕
lower-right block); the damping band acts on the COM velocity channel (v_cleadsy) and the EE
inverse — never directly on the base — and itsλis keyed to the live distance-to-singularitys_min_G.
Constituent pages
Down-links to the per-file pages that hold each part’s contract:
- robot —
GiordanoRobot: ownsdamped_inverse(3-tier) andregularized_svd(the Tikhonov tier), plus
the raw witnessess_min_J/s_min_G. The equations live here; the controllers consumeself.dyn.*. - breve_controller —
BreveController: ownsreconstruct_generalized_velocity, theΓ-Tikhonov solve,
and the conditioning ramp that readss_min_G. The canonical onset footgun lives on its page
(breve_controller > Footguns).
Mechanism (where it lives in code)
Site 1 — Tikhonov on the J⊕ inverse (the middle tier of three):
damped_inverseis the 3-tier dispatcher: exact/Moore-Penrose abovesoft_floor→ Tikhonov between the
floors → hold-last (last_J_plus_inv) at/belowhard_floor—utils/robot.py:217.regularized_svdis the Tikhonov tier:s_inv = s/(s² + λ²)withλ = max(damping, soft_floor − s_min)—
utils/robot.py:249(thes_invformula atutils/robot.py:255).
Site 2 — Tikhonov on the Γ velocity solve (acts on the COM channel):
reconstruct_generalized_velocitybuildsy = [v_c, omega_b, nu_e_oplus]—GNC/breve_controller.py:479.- It solves the regularized normal equations
(ΓᵀΓ + λI) v = Γᵀ ywithλ = max(damping, floor² − s_min_G²),
s_min_G = self.dyn.s_min_G—GNC/breve_controller.py:488/ solve atGNC/breve_controller.py:490. Because
v_cis the leading block ofy, the damping acts on the COM velocity channel. - The
Γtop block is what maps[v_b, omega_b, qdot] → v_c—utils/robot.py:294(assembled into
Γatutils/robot.py:297); this is why aΓ-side perturbation lands onv_c.
Why the singularity is real, not a logging artifact:
- The raw witnesses
s_min_J(utils/robot.py:286) ands_min_G(utils/robot.py:298) come straight from
sigma_min_and_condon the undampedJ⊕/Γ— they are independent of the regularization, which only
shapes the commanded inverse. The controller logs them with the explicit note that the ramp drives off
s_min_Gonly —GNC/breve_controller.py:502(ands_min_Jas the physical witness at
GNC/breve_controller.py:504). So when both witnesses collapse in lockstep, the singularity is physical.
Evidence
The daily checkin overlaid 9 controller variants on the same logged mission (run_PM0314, 2026-06-21). The
three figures below isolate the COM channel the damped Γ solve actually touches, and the s_min_G signal
that sets λ.

COM position error p_c across 9 controller variants — the kinematic COM channel, never damped directly.

COM velocity error v_c — the channel the damped Γ solve (ΓᵀΓ + λI)v = Γᵀy acts on directly (v_c leads y).

Distance-to-singularity s_min_G — the live signal that sets λ = max(damping, floor² − s_min_G²).
Figure provenance
Produced by the daily checkin pipeline (
analysis/analysis_YAMLs/templates/checkin.yaml→Orchestrator,
run_PM0314, 2026-06-21) and copied intowiki/assets/byvalidation/place_wiki_evidence.py. Numbers come
from the pipeline reducer, never re-derived here (see.claude/rules/MEASUREMENT.md).
The rejected low-onset variant. Lowering the Γ-Tikhonov onset
(controller.base.gamma_regularization.floor) from 0.05 → 0.020 makes EE tracking look spectacular — but
only by flying the arm through a sustained reach singularity. On the full targeting-ON mission: pe_p99
0.178→0.107 (−40%) and pe_median 0.156→0.074 (−52%), yet s_min_J min collapses 0.0279→1.44e-6 with
99.6% of the operational window below the 0.025 safety floor, s_min_G collapses in lockstep (1.43e-6),
reach p99 over-extends 0.32→0.465 m, coverage falls below the 0.99 gate, and base attitude z_b triples.
Committed write-ups (gitignored): logs/logs_Jun19_26/CLAIMS.md (the REJECT adjudication, ~19:30 EDT entry),
logs/logs_Jun21_26/CLAIMS.md, and the run report logs/logs_Jun21_26/full_control_single/run/reports/run_PM0528/report.tex.
The canonical footgun for this onset lives on breve_controller > Footguns.
Footguns
p_c(COM) is not the base — the dampedΓsolve touchesv_cfirstAn agent reading only
breve_controller.pymay say “the regularization damps the base.” It does not: the
first block ofy = [v_c, omega_b, nu_e_oplus]is the COM velocity, and theΓtop block maps tov_c
(utils/robot.py:294).p_citself is a pure Pinocchio-FK kinematic output (utils/robot.py:137) — it
shifts as the arm slews and is never damped directly.
Removing the damping "improves"
p_conly by destroying the protective singular marginThe onset is regime-dependent. With camera targeting OFF, lowering the onset improves conditioning
(a targeting-OFF probe showeds_min_Jfrac_below 0.597→0.027). With targeting ON, the same change
collapses it (s_min_Jmin → 1.4e-6, 99.6% sub-floor): the damping band is the only thing holding
the camera-pose demand off the reach-singular wall. A lower onset that looks like ap_c/pewin is
over-extending the arm into a rank-1 singularity. Incumbent onset 0.05 STAYS (REJECT, 4-lens adversarial).
Never tune this onset on a targeting-OFF proxy. (logs/logs_Jun19_26/CLAIMS.md; breve_controller > Footguns.)
The witnesses are independent of the reg — a lockstep collapse is a real singularity
s_min_J/s_min_G(utils/robot.py:286,298) are computed on the undamped maps; Tikhonov only shapes the
commanded inverse. So ifs_min_Jands_min_Gboth crater together, the matrix really is singular — it is
not a damping/logging artifact. (GNC/breve_controller.py:502-504.)
Equations & references
Key equations mirrored from current_sota — the math source of truth; see there for derivations.
Layer 1 — Tikhonov regularization (squared, variable damping) — §6.2, eq (6.3):
Layer 3 — damped inverse (three-tier) — §6.4, eq (6.5):
References:
- Singularity handling & conditioning — Layer 1 Tikhonov
Γregularization and Layer 3 the 3-tier damped
J⊕inverses_i/(s_i² + λ_J²)(§6, §6.2, §6.4): current_sota > 6. - eq↔code cross-check (
reconstruct/damped_inverse↔ §6):generated_reports/GNC/cross_check.md.
Related
robot · breve_controller · circumcentroidal_control · com_vs_base · coupled_dynamics · speed_gain_derate · terminology