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.
1const P = await (await fetch('bc_policy.json')).json();
2const 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);
3function policy(s){
4 const x = s.map((v,j)=>(v-P.xm[j])/P.xsd[j]);
5 const a1 = relu(mv(P.W1,x).map((v,j)=>v+P.b1[j]));
6 const a2 = relu(mv(P.W2,a1).map((v,j)=>v+P.b2[j]));
7 return mv(P.W3,a2).map((v,j)=>v+P.b3[j]).map((v,j)=>v*P.ysd[j]+P.ym[j]);
8}
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.