base_controller — BaseController (base-attitude-only diagnostic mode)

Purpose

Base-attitude-only Γ-coordinated controller (controller.name == "base"): the same circumcentroidal
machinery as breve_controller but with every EE/arm slot zeroed. A diagnostic mode that backs
the base baseline and frame A/B smokes — not the live mission controller.

Role in the system

  • extends breve_core_controller (BreveCoreController, the shared base-attitude/breve template) →
    com_controller (CC_Controller, the per-step control loop root). Reparented 2026-06-22; sibling of breve_controller.
  • Reference trajectory comes from the guidance tower → base_guidancecom_guidance (no EE layer; self.traj is a bare BaseGuidance).
  • Dynamics (Γ, , , s_min_G) come from utils/robot.py as self.dyn.*.
  • Selected by controller.name == "base". The user wants to retire it; it survives as the byte-identical diagnostic.

Inputs / Outputs

  • In: State (q, v, dynamics cache), base Desired (CoM + base attitude), config gains, s_min_G.
  • Out: base reduced torque τ_b⊕, reduced step-integration derivatives (omega_b_dot, nu_e_oplus_dot); EE terms return zeros.

Key methods

Only the forked leaves are defined here; the shared base-attitude/breve methods (incl.
compute_tau_b_oplus, conditioning_scale, x_tilde/J_x, all_control_terms) are now inherited
from breve_core_controller — see that page.

  • RHS34b — reduced working-control RHS (damping-on-error + K + coupling + posture + FF) — GNC/base_controller.py:66
  • v_breve_dot — reduced acceleration M̆⁻¹ · RHS (base path keeps the explicit solve) — :121
  • calc_posture — joint-space posture regularization toward q_arm_ref:92
  • reconstruct_generalized_velocity — full v from (v_c, omega_b, nu_e_oplus) via the (damped) Γ solve — :134
  • arm_breve_gains / rhs_feedforward / x_e_rhs — the EE override hooks, inert (zero) here:58 / :62 / :44
  • omega_b_damping_error / nu_e_damping_error / x_e_tilde / J_xe — the other EE/arm leaves, all zeroed — :48 / :52 / :36 / :40

Footguns

EE/arm slots are deliberately zero — the override hooks are stubs

arm_breve_gains returns (None, None) (zeroing the arm D/K slots in the block9 9×9 breve gains),
rhs_feedforward returns 0.0, and x_e_rhs returns the raw x_e_tilde (itself zero). These are
the seams the EE layer overrides; here they intentionally do nothing. (GNC/INSIGHTS.md [control])

Base damping rides τ_b⊕, not the RHS damping term

v_breve_damping_error returns [omega_b_err; nu_e_err] with both blocks zero in the base path.
Base angular damping is applied through compute_tau_b_oplus (-D_b · omega_b_err), not the RHS
D̆ v̆_err term. (GNC/INSIGHTS.md [control])

One γ ramp drives every derate mechanism (Option A)

conditioning_scale is the single ramp γ(s_min_G) = scale_by_svd(s_min_G, sigma) — per F4, Γ is
singular iff J_ν_e is, so all derates key off s_min_G alone. (GNC/INSIGHTS.md [derate] [config])

Do not re-pin — this is a frozen byte-identical baseline

Behaviour is unchanged even though the class shrank on 2026-06-22: the 13 shared methods moved
verbatim up into breve_core_controller (Template Method), leaving only the forked leaves here.
validate_base_baseline.py still reproduces at max_abs_diff = 0.000e+00 (checked, not re-pinned);
any logic edit — here or in the shared base — breaks that contract.
(GNC/INSIGHTS.md [history] [baseline]; generated_reports/GNC/controller_twin_extraction.md)

Pseudocode (one control step)

build_desired_for_step(t)            # base reference only (CoM + base attitude); no EE goal
τ_b⊕  = compute_tau_b_oplus(des)     # attitude PD, γ-scaled, saturated
γ     = conditioning_scale(s_min_G)  # single ramp (Option A)
rhs   = RHS34b                       # -C̆v̆ - JᵀK x̃ - D̆ v̆_err + COM coupling (+ posture)
                                     #   arm K/D slots = 0, rhs_feedforward = 0 (EE hooks inert)
v̆_dot = M̆⁻¹ · rhs                    # reduced acceleration → integrate (omega_b, nu_e_oplus)
v     = reconstruct_generalized_velocity(st)   # damped Γ solve back to full velocity

Equations & references

Key equations mirrored from current_sota — the math source of truth; see there for derivations.

Base attitude error + error-rate Jacobian§4.1, eqs (4.1–4.2):

Base torque law () — §4.2, eq (4.5):

References:

  • Coordinated control + working eq (§4.4–4.12): current_sota > 4.
  • Singularity / derate stack (§6): current_sota > 6 · eq↔code in generated_reports/GNC/cross_check.md.

breve_controller · com_controller · base_guidance · com_guidance · terminology · com_vs_base · circumcentroidal_control