orbital-capture-bc

A tiny on-orbit capture policy — 1,282 parameters — distilled by behavior cloning from a Model Predictive Path Integral (MPPI) expert. It flies the approach of a chaser to a tumbling, non-cooperative target and runs as a plain forward pass in a browser tab, on the device.

Institute for Physical AI @ BMI · The Charlot Lab · Technical Report TR-2026-17

What it is

The 2026 frontier of autonomous rendezvous and proximity operations is learned control (e.g. NRL's APIARY, the first RL free-flyer control in space; transformer meta-RL; tube-MPC). Those run in the datacenter or on flight hardware. This policy makes the same idea runnable on any device, open: an MLP small enough to ship as JSON and evaluate with a for-loop.

  • Task: given the chaser's relative state to the target in the approach-corridor frame, output the control that flies a safe berth.
  • Input [along, lat, v_along, v_lat] — position and velocity in the corridor frame (metres, m/s).
  • Output [a_along, a_lat] — commanded acceleration (m/s²).
  • Arch: 4 → 32 → 32 → 2, ReLU, with input/output normalization. 1,282 parameters.

Training

  • Expert: the MPPI controller in orbital-logistics/core — it samples control sequences, rolls them out on the Clohessy–Wiltshire relative-motion dynamics, and takes the cost-weighted average (reach + soft-berth + corridor + effort).
  • Data: ~28k (state → control) pairs from 240 expert capture rollouts (policy/gen_bc_data.mjs).
  • Objective: behavior cloning, MSE on the control, Adam, 60 epochs (policy/train_bc.mjs).
  • Closed-loop validation: the learned policy captures 60/60 held-out starts in the expert's dynamics.

Use

Everything the runtime needs is in bc_policy.json (W1,b1,W2,b2,W3,b3, and the xm/xsd/ym/ysd normalization). A forward pass is ~20 lines of JavaScript (see the live instrument's policyFwd). No framework, no GPU required.

const P = await (await fetch('bc_policy.json')).json();
const mv = (W,a)=>W[0].map((_,j)=>a.reduce((s,ai,i)=>s+ai*W[i][j],0)), relu=z=>z.map(v=>v>0?v:0);
function policy(s){
  const x = s.map((v,j)=>(v-P.xm[j])/P.xsd[j]);
  const a1 = relu(mv(P.W1,x).map((v,j)=>v+P.b1[j]));
  const a2 = relu(mv(P.W2,a1).map((v,j)=>v+P.b2[j]));
  return mv(P.W3,a2).map((v,j)=>v+P.b3[j]).map((v,j)=>v*P.ysd[j]+P.ym[j]);
}

Honest scope

This is a research demonstrator, not flight software. The dynamics are the linearised CW model at a local scale; the expert's control is scaled to the sim's real-time pace; and the policy flies the approach to a capture box, where a capture effector closes the last metre (as real servicing does). It reports no flight result. It exists to show that the learned-control frontier can run, open and on-device, in a browser.

MIT licensed. Institute for Physical AI @ BMI · The Charlot Lab.

Downloads last month
-
Video Preview
loading