GNC/breve_core_controller.py — BreveCoreController

Shared template sitting between CC_Controller and the two leaves.

Template Method pattern — shared methods call per-subclass leaves.

CC_Controller (CoM loop + Γ\Gamma^\top force map) → BreveCoreController (base attitude + v˘\breve{\bm v} step) → { BaseController, BreveController }

Error-rate Jacobian (eq 4.2)

The shared method J_xb and the block-diagonal assembly J_x.

Jx~b=ηbbdE+εbbd×R3×3\bm J_{\tilde x_b} = -\eta_{bb_d} \bm E + \bm\varepsilon_{bb_d}^\times \in\mathbb R^{3\times3}

Jx~=blkdiag ⁣(Jx~b,Jx~e)R9×9\bm J_{\tilde x} = \mathrm{blkdiag}\!\left(\bm J_{\tilde x_b}, \bm J_{\tilde x_e}\right)\in\mathbb R^{9\times9}

Jx~e\bm J_{\tilde x_e} comes from the leaf (J_xe): 0\bm 0 in BaseController, full EE Jacobian in BreveController.

(Giordano eq 25 / current_sota §4.1)

Block-diagonal gain assembly

block9 assembles the 9×9 stiffness/damping from two 3×3 (base) and 6×6 (arm) blocks.

K˘=blkdiag(Kb,Ke)R9×9D˘=blkdiag(Db,De)R9×9\breve{\bm K}=\mathrm{blkdiag}(\bm K_b, \bm K_e)\in\mathbb R^{9\times9} \qquad \breve{\bm D}=\mathrm{blkdiag}(\bm D_b, \bm D_e)\in\mathbb R^{9\times9}

Arm blocks come from the leaf (arm_breve_gains):

Arm gains are the leaf's: Ke=De=0\bm K_e=\bm D_e=\bm 0 in BaseController; the configured gain matrices in BreveController.

(Giordano eq 31 / current_sota §4.2)

Impedance derate ramp γ(σG)\gamma(\sigma_G) (eq 6.4)

conditioning_scale — a single ramp shared by every derate mechanism (Option A).

γ(σG)={σcrit,1σGσcrit,21σGσcrit,1σcrit,1+(1σcrit,1)σGσcrit,2σcrit,1σcrit,2otherwise\gamma(\sigma_G)= \begin{cases} \sigma_{\mathrm{crit},1} & \sigma_G\le\sigma_{\mathrm{crit},2}\\[4pt] 1 & \sigma_G\ge\sigma_{\mathrm{crit},1}\\[4pt] \sigma_{\mathrm{crit},1}+(1-\sigma_{\mathrm{crit},1})\dfrac{\sigma_G-\sigma_{\mathrm{crit},2}}{\sigma_{\mathrm{crit},1}-\sigma_{\mathrm{crit},2}} & \text{otherwise} \end{cases}

σGσmin(Γ)\sigma_G\equiv\sigma_{\min}(\bm\Gamma); thresholds σcrit,1=v/xmax0.143\sigma_{\mathrm{crit},1}=v/x_{\max}\approx0.143, σcrit,2=σcrit,12\sigma_{\mathrm{crit},2}=\sigma_{\mathrm{crit},1}^2

(current_sota §6.3)

How γ\gamma enters the control law

γ\gamma scales gains, not the command — the slowdown is emergent.

τbγτb(Ke,De)γ(Ke,De)\bm\tau_b^\oplus \leftarrow \gamma \bm\tau_b^\oplus \qquad (\bm K_e,\bm D_e) \leftarrow \gamma(\bm K_e,\bm D_e)

Softening K˘\breve{\bm K} shifts the cruise-lag equilibrium:

x~ss= ⁣(Jx~K˘)1 ⁣[C˘v˘d+(Cc+D˘G˘vc)x~˙c]1γx~ss\tilde{\bm x}_{ss} = -\!\left(\bm J_{\tilde x}^\top\breve{\bm K}\right)^{-1}\!\left[\breve{\bm C}\breve{\bm v}_d + (\bm C_c+\breve{\bm D}\breve{\bm G}_{v_c})\dot{\tilde{\bm x}}_c\right] \longrightarrow \tfrac{1}{\gamma}\tilde{\bm x}_{ss}

Arm goes slack; σmin\sigma_{\min} is held, not driven lower.

(current_sota §4.5 + §6.3)