Doctoral Research · Space Robotics Inspection with a Free-Flying Space Manipulator
A Doctoral Research Journal Aerospace Engineering

Phase 00 round-1 verdict — configuration shootout + ±2% sensitivity probe

Date: Jun 12, 2026. Protocol: tasks/phase00_protocol.md (pre-registered before any run). Chain: tasks/daily_log/Jun11_26/CHAIN_8.md (task IDs T0–T9 decoded there; T8 = the user-released round-2 scope decision referenced at the end of this report).

Legend

Runs (full inspection path — a pole-to-pole spiral around the target, 30 revolutions — simulation capped at 1800 s; matched knobs, no per-config tuning). Speed variants below are written in the fixed order nominal (0.90 m/s) / −2% (0.882) / +2% (0.918). “Arm” in this report always means the robot manipulator, never an experiment branch.

Run Plain language
r0_6dof_path 6-joint arm, orbit path drives the camera (the adopted Mission-1 architecture)
r0_6dof_minus2pct / plus2pct same, cruise speed −2% / +2%
r1_7dof_path 7-joint arm, orbit path drives the camera
r1_7dof_minus2pct / plus2pct same, speed −2% / +2%
r2_7dof_reactive 7-joint arm, no orbit path — reactive scorer picks targets
r3_7dof_anchor 7-joint arm, hybrid — path-scheduled COM-orbit vantage anchors the scorer

Metrics (direction and gate/stretch for each; EE = end effector, the camera-carrying hand; twist = linear + angular velocity stacked, m/s with rad/s — hence “mixed units”):

Metric Meaning Better Gate / stretch
pe_p99 [m] camera position error beaten 99% of the time lower GATE < 0.2; stretch < 0.1
coverage fraction of target surface inspected higher GATE ≥ 0.99; stretch 1.000
completion [s] when the full inspection orbit finished lower gate: completed
dwell total [s] time the arm lingered near-singular (singular = a pose where the arm locks up, σ₆ → 0) lower
throttled fraction share of steps the vehicle slowed for poor arm conditioning lower
stalled fraction share of steps with zero forward inspection progress lower
ze_p99 camera pointing-axis error ‖z_e − z_e_des‖ (chord between unit vectors ≈ rad; 0.86 ≈ 51°) lower stretch < 0.001
nu_jump_p99 per-step EE twist change (smoothness witness; mixed units — compare across runs only) lower round-2: no >10% regression

Results

Headline numbers (full console tables: generated_reports/GNC/phase00_round1_table.txt, generated_reports/GNC/phase00_round1_with_probe_table.txt; regen commands at the end):

r0 nominal r0 −2% r0 +2% r1 nominal r1 −2% r1 +2% r2 r3
gates 3/3 3/3 3/3 2/3 2/3 2/3 2/3 2/3
pe_p99 [m] 0.1651 0.1703 0.1660 0.2294 0.2804 0.3092 0.5667 0.3531
coverage 0.9981 0.9989 0.9981 1.0000 1.0000 1.0000 1.0000 1.0000
completion [s] 1070.8 1100.2 1051.8 868.7 761.5 676.4 816.6 747.6
dwell [s] 631.5 655.2 614.1 430.9 231.0 3.27 299.6 185.1
throttled 0.644 0.649 0.639 0.553 0.343 0.006 0.409 0.281
stalled 0.1401 0.1486 0.1360 0.0148 0.0016 0.0000 0.0209 0.0031
ze_p99 0.0549 0.0541 0.0559 0.8627 0.7006 0.2815 1.7905 1.4913
nu_jump_p99 0.0594 0.0595 0.0593 0.0844 0.0735 0.0640 0.1021 0.1343

Verdict (by the pre-registered ranking rule, applied verbatim)

Rule: 1) gates passed (pe_p99 < 0.2, coverage ≥ 0.99, completed) 2) pe_p99 3) completion 4) dwell. Fragility rule: a winner that loses its gates under ±2% speed is FRAGILE → prefer a robust runner-up.

  1. WINNER: r0_6dof_path — and it is ROBUST. The only configuration passing all three gates, and it keeps all three at both ±2% speed variants (pe_p99 nominal/−2%/+2%: 0.1651 / 0.1703 / 0.1660; coverage ≥ 0.9981; completed in every run). The fragility rule does not fire.
  2. Runner-up r1_7dof_path fails the pe gate at every speed (nominal/−2%/+2%: 0.2294 / 0.2804 / 0.3092) — robustly failing, not marginally: no ±2% nudge rescues it.
  3. r3_7dof_anchor third by the rule; r2_7dof_reactive last (pe_p99 0.567).

Tie-break by ze_p99 was not needed.

Who wins what, stated symmetrically: r0 wins the gate discriminator (pe_p99) plus pointing (ze_p99 5–30× lower than every 7-DOF run) and command smoothness (nu_jump_p99 0.059 vs 0.064–0.134). The 7-DOF family wins coverage (1.000, the stretch target), completion (−19% at matched nominal speed, −37% at +2%), and every conditioning metric (dwell, throttled, stalled).

Provenance sanity (the fragility study’s E2 check applied early: the nominal run should reproduce the adopted headline): the r0 nominal-speed run reproduces the adopted Mission-1 numbers to three digits on the gate metric — pe_p99 0.1651 vs the adopted 0.1654, completion 1070.8 s vs 1064.5 s, coverage 0.9981 vs 0.9990. Residuals are attributed (not isolated) to the 1800 s cap vs the adopted run’s 1100 s and the Phase 00 runner vs the Jun-10 c4_chain5_verdict script; bit-for-bit determinism holds only for identical config + script, which this deliberately is not.

Mechanism story — why the ranking looks like this

r0’s conditioning picture is structurally saturated — and that is also why it is robust. Throttled ~64% of steps, dwell ~630 s, stalled ~14% — at every speed. This is the known pre-existing reach/shoulder singular factor of the 6-DOF arm (singular factor = the arm geometry, here shoulder near full reach, that drives σ₆ toward zero; reference runs measured ~32% derated, and the adopted Mission-1 config has run 0.64–0.80 throttled all along — high_level_plans/decisions.md, CHAIN_5 entry). Saturation means ±2% cannot meaningfully worsen a regime already pinned at its conditioning floor. The cost of crawling: completion ~1071 s vs the 7-DOF’s 676–869 s.

r1’s gate failure is consistent with the velocity-lag mechanism, with an honest gap. Prior art (decisions.md CHAIN_6 entry; trusted log logs/m7_on_s45_freeze.npz): 7-DOF matched-pace runs at 0.45 m/s hit pe_p99 0.140, and the v_c sweep found pe median scaling ~linearly with speed. Strict linear scaling from 0.140 at 0.45 m/s predicts ~0.28 at 0.90 m/s; the observed 0.229 is better than that, and the probe arms are non-monotone in speed (−2% 0.2804 > nominal 0.2294 < +2% 0.3092) where pure lag predicts monotone. So lag is the dominant term but not the whole p99 story — event-driven contributions (dwell/aim transients) are plausible and are handed to CHAIN_10’s peak analysis, not explained away here. (r0 shows the same non-monotone ordering at only ~3% amplitude, 0.1651–0.1703; no replicate-pair noise band exists for these schedule-confounded runs, so that swing is noted as unquantified rather than excused. r1’s 35% swing is far outside any plausible band.)

The 7-DOF dwell cliff — the sharpest schedule-sensitivity signature yet recorded, and it is NOT a clean monotone story. r1’s dwell at nominal/−2%/+2%: 431 s / 231 s / 3.27 s. A +2% timetable nudge all but eliminates near-singular dwell (throttled 0.6%, stalled exactly 0.0000, ze_p99 3× better at 0.2815) — consistent in direction with CHAIN_6 P2 (slower = worse). But the −2% variant (231 s) is better than nominal (431 s), which CHAIN_6’s direction does not predict: dwell is non-monotone in speed at this operating point, peaking at nominal. Both facts go to CHAIN_10 as open questions (tasks/daily_log/Jun12_26/chain10_kappa_forensics_design.md). The 6-DOF, by contrast, is schedule-INSENSITIVE (dwell 614–655 s across variants) because it sits on a saturated floor. Schedule sensitivity is therefore a property of the 7-DOF’s marginal regime — the timetable decides how closely commanded reach approaches the singular manifold (the set of arm poses where the arm locks up), and the contrast pair r1 nominal (431 s) vs r1 +2% (3.27 s) — differing in ONE knob by 2% — is CHAIN_10’s primary specimen.

Round-2 lever assignments (winner = 6-DOF ⇒ the lever list narrows)

Pre-registered levers (protocol): L1 velocity-lag feedforward, L2 σ-gradient null-space pull (σ-gradient pull = steer the spare 7th-joint motion uphill in σ₆), L3 pointing smoothing retune, L4 kernel-freeze thaw policy.

Regen commands (provenance, copy-paste complete)

/Users/antoniahoffman/miniforge3/envs/new-pin-env/bin/python validation/run_mission.py run --robot UR3   --orbit pose   --suppress off --cap 1800 --npz logs/phase00/r0_6dof_path.npz
/Users/antoniahoffman/miniforge3/envs/new-pin-env/bin/python validation/run_mission.py run --robot UR3   --orbit pose   --suppress off --cap 1800 --speed 0.882 --npz logs/phase00/r0_6dof_minus2pct.npz
/Users/antoniahoffman/miniforge3/envs/new-pin-env/bin/python validation/run_mission.py run --robot UR3   --orbit pose   --suppress off --cap 1800 --speed 0.918 --npz logs/phase00/r0_6dof_plus2pct.npz
/Users/antoniahoffman/miniforge3/envs/new-pin-env/bin/python validation/run_mission.py run --robot UR3_7 --orbit pose   --suppress on  --cap 1800 --npz logs/phase00/r1_7dof_path.npz
/Users/antoniahoffman/miniforge3/envs/new-pin-env/bin/python validation/run_mission.py run --robot UR3_7 --orbit pose   --suppress on  --cap 1800 --speed 0.882 --npz logs/phase00/r1_7dof_minus2pct.npz
/Users/antoniahoffman/miniforge3/envs/new-pin-env/bin/python validation/run_mission.py run --robot UR3_7 --orbit pose   --suppress on  --cap 1800 --speed 0.918 --npz logs/phase00/r1_7dof_plus2pct.npz
/Users/antoniahoffman/miniforge3/envs/new-pin-env/bin/python validation/run_mission.py run --robot UR3_7 --orbit off    --suppress on  --cap 1800 --npz logs/phase00/r2_7dof_reactive.npz
/Users/antoniahoffman/miniforge3/envs/new-pin-env/bin/python validation/run_mission.py run --robot UR3_7 --orbit anchor --suppress on  --cap 1800 --npz logs/phase00/r3_7dof_anchor.npz

/Users/antoniahoffman/miniforge3/envs/new-pin-env/bin/python validation/run_scoreboard.py logs/phase00/r0_6dof_path.npz logs/phase00/r1_7dof_path.npz logs/phase00/r2_7dof_reactive.npz logs/phase00/r3_7dof_anchor.npz > generated_reports/GNC/phase00_round1_table.txt
/Users/antoniahoffman/miniforge3/envs/new-pin-env/bin/python validation/run_scoreboard.py logs/phase00/r0_6dof_path.npz logs/phase00/r0_6dof_minus2pct.npz logs/phase00/r0_6dof_plus2pct.npz logs/phase00/r1_7dof_path.npz logs/phase00/r1_7dof_minus2pct.npz logs/phase00/r1_7dof_plus2pct.npz logs/phase00/r2_7dof_reactive.npz logs/phase00/r3_7dof_anchor.npz > generated_reports/GNC/phase00_round1_with_probe_table.txt

npz files (~25–27 MB each) are NOT committed — provenance via the commands above (deterministic: same config + seed + script reproduces bit-for-bit).