Instructions to use physicalai-bmi/orbital-formation-bc with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Keras
How to use physicalai-bmi/orbital-formation-bc with Keras:
# Available backend options are: "jax", "torch", "tensorflow". import os os.environ["KERAS_BACKEND"] = "jax" import keras model = keras.saving.load_model("hf://physicalai-bmi/orbital-formation-bc") - Notebooks
- Google Colab
- Kaggle
orbital-formation-bc
A tiny decentralized formation-flight policy — 1,474 parameters — distilled by behavior cloning from a distributed potential-field controller. Each satellite runs its own copy on local observations only (its slot error and its three nearest neighbours), holds a rotating formation, and reconfigures it collision-free — 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
- Live, in-browser: physicalai-bmi.org/assets/sims/formation — the formation-flight instrument, "Learned" mode.
- Code + physics core + benchmark: github.com/dcharlot-physicalai-bmi/orbital-logistics (
policy/,bench/formation_bench.mjs).
What it is
Multi-agent coordination — a constellation that holds its shape with no ground controller — is a distributed control problem: each agent decides from what it can sense locally. This policy is that decision, learned and made runnable on any device, open: one per-agent MLP small enough to ship as JSON and evaluate with a for-loop, run independently by every satellite in the formation.
- Task: hold an assigned slot in a rotating formation and reconfigure between patterns (ring / train / aperture / wedge) without colliding.
- Input (10):
[slot_err_x, slot_err_y, vel_err_x, vel_err_y, n1_dx, n1_dy, n2_dx, n2_dy, n3_dx, n3_dy]— the agent's error to its slot, its velocity relative to the (moving) slot, and the relative positions of its three nearest neighbours. All local; no agent sees the whole formation. - Output (2):
[a_x, a_y]— commanded thrust acceleration. - Arch:
10 → 32 → 32 → 2, ReLU, with input/output normalization. 1,474 parameters.
Training
- Expert: the distributed controller in
orbital-logistics/core(formationStep) — a PD toward the assigned slot, the slot's own velocity fed forward so the rotation tracks without lag, plus a pairwise potential-field avoidance from neighbours in a sensing radius. Slot assignment is a greedy nearest-free seed followed by 2-opt untangling (the minimum sum-of-squared-distance matching is provably non-crossing), which removes the crossing transfers that are the dominant collision risk. - Data: ~210k
(local obs → thrust)pairs from 60 expert reconfiguration rollouts across 8–14 agents and every pattern order (policy/gen_formation_data.mjs). Near-miss states (a neighbour inside the sensing radius) are upweighted 20× so the policy learns the rare avoidance reflex, not just the keeping. - Objective: behavior cloning, MSE on the thrust, Adam, 60 epochs (
policy/train_formation.mjs). - Closed-loop validation: every agent flown by the net through a full ring→grid→wedge→line reconfiguration, under a light reflexive safety filter.
Benchmark (Formation-Bench, 30 seeds, 12 agents)
| Controller | success | mean RMS | worst min-sep | mean Δv/agent |
|---|---|---|---|---|
| Distributed (analytic) | 100% | 0.09 m | 12.11 m | 303 m/s |
| Learned (this policy) | 100% | 0.15 m | 13.05 m | 302 m/s |
The learned policy matches the analytic controller's keeping and Δv and reconfigures collision-free with a 12–13 m margin. Reproducible with node bench/formation_bench.mjs.
Use
Everything the runtime needs is in formation_policy.json (W1,b1,W2,b2,W3,b3, the xm/xsd/ym/ysd normalization, and K=3 neighbours). A forward pass is ~20 lines of JavaScript, run once per agent per step:
const P = await (await fetch('formation_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(obs){ // obs = [ex,ey, vex,vey, n1dx,n1dy, n2dx,n2dy, n3dx,n3dy]
const x = obs.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]); // [ax, ay]
}
Honest scope
This is a research demonstrator, not flight software. The dynamics are a double-integrator at a local scale; the slot assignment (the non-crossing matching) is the safety-critical step and is computed outside the net; and the policy is run under a light reflexive safety filter, because behavior cloning reproduces the coordination and keeping but not the expert's anticipatory long-range avoidance. It exists to show that a decentralized multi-agent coordinator can run, open and on-device, one small net per agent.
MIT licensed. Institute for Physical AI @ BMI · The Charlot Lab.
- Downloads last month
- -