GNC/guidance/guidance_rollout.py — guidance-only rollout

Integrates the guidance tower over orbit windows without controller dynamics. A fake motion state replaces the plant — fast coverage and selection oracle.

Arclength clock

At step kk the arclength progress along the active window is:

sk=min ⁣(kΔtvref,send)s_k = \min\!\bigl(k \Delta t\cdot v_{\mathrm{ref}}, s_{\mathrm{end}}\bigr)

Local fractional progress is then recovered by linear interpolation over the precomputed arclength samples {si}\{s_i\}:

progressk=istart+interp(sk,{si},{i})\text{progress}_k = i_{\mathrm{start}} + \operatorname{interp}(s_k, \{s_i\}, \{i\})

Nominal CoM kinematics at step kk

Desired CoM velocity and centripetal acceleration (from §5.2–5.3):

vcd=vreft^(progressk),acd=vref2κ(progressk)(5.3)\bm v_{cd} = v_{\mathrm{ref}} \hat{\bm t}(\text{progress}_k),\qquad \bm a_{cd} = v_{\mathrm{ref}}^2 \bm\kappa(\text{progress}_k) \tag{5.3}

t^\hat{\bm t} and κ\bm\kappa are the unit tangent and curvature vector of the discrete helix Λ\Lambda.

Fake motion state

The plant is replaced by a fake motion state:

fakek={pc,vc,acdesired CoM at step kpe,ze,Re,νedesired EE command at step k1\text{fake}_k = \begin{cases} \bm p_c,\bm v_c,\bm a_c & \leftarrow \text{desired CoM at step } k \\ \bm p_e,\bm z_e,\bm R_e,\bm\nu_e & \leftarrow \text{desired EE command at step } k-1 \end{cases}

On step k=0k=0 no previous EE command exists; the base desired alone is used.

Per-step recurrence

desk=G ⁣(fakek,deskbase,desk1)\text{des}_k = \mathcal G\!\left(\text{fake}_k, \text{des}^{\text{base}}_k, \text{des}_{k-1}\right)

where G\mathcal G is the EE-goal map (add_ee_goal). FOV marking fires every Ns=5N_s = 5 steps when a valid pose exists:

kmodNs=0 and pemark FOV(pe,Re)k \bmod N_s = 0 \text{ and } \bm p_e \neq \varnothing \Rightarrow \text{mark FOV}(\bm p_e, \bm R_e)

Output

Each step appends a StepLog to the logger:

StepLogk=(desk,actual=,guidance,inspection)\text{StepLog}_k = \bigl(\text{des}_k, \text{actual}=\varnothing, \text{guidance}, \text{inspection}\bigr)

inspection=(ntri,Acov),Acov=unique triangles seentotal triangles\text{inspection} = \bigl(n_{\text{tri}}, A_{\text{cov}}\bigr),\qquad A_{\text{cov}} = \frac{\text{unique triangles seen}}{\text{total triangles}}

The function returns Package(logger, log_path=None) — no NPZ is written.

Coverage is traversal-driven

Acov1    progresskpath endA_{\text{cov}} \approx 1 \iff \text{progress}_k \to \text{path end}

A short run covers only the southern orbital cap (Acov0.47A_{\text{cov}} \approx 0.47). The full 30-revolution helix is required for Acov1A_{\text{cov}} \to 1.

Marking stride NsN_s (not angular resolution) is the dominant cost lever.