← All projects

Scenario-Based MPC for Free-Flyer Inspection with Thruster Failures

A model predictive controller that keeps a small inspection spacecraft safe next to a space station when its thrusters fail, without having to wait until it knows which one did.

HostNASA JPL
MentorsDr. Federico Rossi · Dr. David Sternsberg
FormatM.Sc. thesis, PoliTo
HardwareTested on JPL's GSAT sled
JPL's GSAT air-bearing sled flying a square waypoint circuit around an obstacle under the robust scenario-based NMPC. Plays muted at 2× speed.
01

Inspecting outposts with nobody on board

Future outposts such as Gateway will spend long periods uncrewed, but their exterior still needs regular inspection. A small free-flyer could do it on demand, but only if it stays safe when its own hardware fails.

Today, inspection for micrometeoroid damage, leaks or degraded insulation means an EVA or a robotic arm. A free-flyer replaces both, but it has to meet four requirements:

1Fly safely next to the target

Keep-out zones are hard constraints, not cost terms.

2Survive thruster faults

On small spacecraft, propulsion is the usual point of failure.

3Decide on board, every step

The optimisation must return inside each control period.

4Keep flying after a failure

Without stopping to diagnose it first. This is the gap the thesis targets.

02

One plan that survives every failure scenario

Instead of waiting to find out which thruster failed, the controller plans against several candidate failures at once and commits to a single input sequence that is safe for all of them.

Existing approaches either use a single nominal model and fail on unexpected faults, detect the fault and then adapt (which takes identification time), or need a known disturbance distribution. Scenario-based MPC fills the gap between them.

Failure model

Each failure is a diagonal matrix Γ, with Γjj = 1 if thruster j works and 0 if it is stuck off, so the applied wrench becomes B u Γ.

Optimal control problem

The controller propagates S copies of the dynamics, one per failure scenario, and finds one shared input sequence that satisfies every constraint on every branch. It is re-solved at every control step:

minU  Σs=1…S ws Js(U)
s.t.  xsk+1 = F(xsk, uk; Γs),   xs0 = x̂k
  uk ∈ [0, umax]8,   |vsk| ≤ vmax,   hj(xsk) ≥ 0

Choosing which failures to hedge

Hedging every possible fault is intractable. At each step, the nominal plan is flown in prediction under each candidate failure, and each one is scored by how soon and how far it goes wrong (time to first violation, distance from the nominal path). The most critical failures fill the scenario slots.

Scenario pruning: the nominal rollout and candidate failure rollouts around a keep-out zone, with the selected scenarios highlighted
One control step: candidate failure rollouts under the nominal plan, with the selected scenarios highlighted.

Adding fault identification

Worst-case hedging is permanently conservative. The final version also estimates what is actually broken: each step, the last transition is scored against 163 candidate failures, and the controller hedges only the nominal model plus the most likely failure. That is two model copies instead of ten.

03

162 failure modes, four geometries, 648 runs

Every controller flew identical test cases with up to four stuck-off thrusters, including pairs that remove a whole translational axis.

A run counts as a clean success only if every waypoint is reached with no constraint violation. The controller was tuned over the horizon N, the step time Ts and the number of scenarios S. The lookahead (N × Ts) mattered more than either one alone, while S set the cost, since the stacked state grows as 6S.

Lower boundNominal MPC

Assumes all eight thrusters are healthy.

This workScenario MPC

Hedges the most critical failures; never told which one occurred.

This workScenario MPC + FDI

Adds residual-based identification of the failure.

Upper boundFailure-aware MPC

Told the true failure at t = 0.

Four test geometries: tube, point to avoid, inspection circuit, and circuit inside a box
The four geometries.
Tuning results: success rate against number of scenarios, coloured by step time
Tuning: success rate against the number of scenarios.
04

Fault identification closes the gap

With fault identification, the controller reaches 69.3% clean success, against 26.4% for nominal MPC, and matches a controller that is told the failure in advance (67.4%).

Clean success rate by number of failed thrusters

  • Robust MPC + FDI
  • Scenario MPC
  • Failure-aware (told the failure at t = 0)
  • Nominal MPC
Clean success rate by number of failed thrustersRobust MPC with fault identification: 100, 99.1, 79.9 and 45.4 percent for one to four failed thrusters. Scenario MPC: 100, 74.1, 37.5, 11.8. Failure-aware MPC, told the failure in advance: 87.5, 87.5, 76.3, 50. Nominal MPC: 93.8, 62.5, 25, 5.4.0%25%50%75%100%1234Failed thrusters (stuck off)Robust MPC + FDI · 1 failed: 100%Robust MPC + FDI · 2 failed: 99.1%Robust MPC + FDI · 3 failed: 79.9%Robust MPC + FDI · 4 failed: 45.4%Robust MPC + FDI · 45.4%Scenario MPC · 1 failed: 100%Scenario MPC · 2 failed: 74.1%Scenario MPC · 3 failed: 37.5%Scenario MPC · 4 failed: 11.8%Scenario MPC · 11.8%Failure-aware (told the failure) · 1 failed: 87.5%Failure-aware (told the failure) · 2 failed: 87.5%Failure-aware (told the failure) · 3 failed: 76.3%Failure-aware (told the failure) · 4 failed: 50%Failure-aware · 50%Nominal MPC · 1 failed: 93.8%Nominal MPC · 2 failed: 62.5%Nominal MPC · 3 failed: 25%Nominal MPC · 4 failed: 5.4%Nominal MPC · 5.4%
Show the data
Controller1 failed234
Robust MPC + FDI100%99.1%79.9%45.4%
Scenario MPC100%74.1%37.5%11.8%
Failure-aware (told the failure)87.5%87.5%76.3%50%
Nominal MPC93.8%62.5%25%5.4%
648 runs per controller on identical test cases. A run is a clean success only if every waypoint is reached with no constraint violation.
Hedging works

Scenario MPC beats nominal at every failure count: 54.1% against 42.4% with one to three failed thrusters, and the gap widens as more fail.

It fits in real time

0.141 s per step for scenario MPC and 0.063 s with FDI, both well inside the 0.5 s control step.

It saves propellant

Hedging flies more conservatively: 23% less total impulse than nominal MPC.

05

Tested on JPL's GSAT air-bearing sled

On the real 8-thruster sled, the robust controller reached the target in 14 of 19 runs (74%) with thrusters physically disabled, against 3 of 9 (33%) for the nominal controller, which succeeded only when nothing had failed.

The controller is implemented in F´ (F Prime) and runs on the sled with motion-capture state estimates, real thrust and real model mismatch. After each test condition, the most-used thruster was disabled for the next one, avoiding pairs that would remove a whole degree of freedom. Porting the solver from Python to C++ had cut the mean step time on a Raspberry Pi by about 3× (0.337 s to 0.114 s).

GSAT runs that settled within 15 cm of the target

  • Robust scenario NMPC
  • Nominal NMPC
GSAT hardware runs that settled within 15 cm of the targetNominal NMPC: 3 of 3 runs with no failure, 0 of 3 with one failed thruster, 0 of 3 with two. Robust scenario NMPC: 3 of 3 with no failure, 8 of 8 with one, 3 of 5 with two, 0 of 3 with three.0%25%50%75%100%0Nominal NMPC, 0 failed: 3/3 runs3/3Robust scenario NMPC, 0 failed: 3/3 runs3/31Nominal NMPC, 1 failed: 0/3 runs0/3Robust scenario NMPC, 1 failed: 8/8 runs8/82Nominal NMPC, 2 failed: 0/3 runs0/3Robust scenario NMPC, 2 failed: 3/5 runs3/53not runRobust scenario NMPC, 3 failed: 0/3 runs0/3Thrusters physically disabled
Show the data
Controller0 failed123
Robust scenario NMPC3/38/83/50/3
Nominal NMPC3/30/30/3not run
28 point-to-point runs on the sled, test session of 24 September 2026. The controller is never told which thrusters are disabled.
Nominal NMPC with thrusters 2 and 8 disabled: the sled drifts past the target and the solver fails
Nominal NMPC, two thrusters disabled: drifts past the target (★) and the solver fails.
Robust scenario NMPC with thrusters 1 and 7 disabled: the sled recovers and settles on the target
Robust scenario NMPC, two thrusters disabled: recovers and settles on the target.

Three failed thrusters is where the robust controller's margin runs out, with larger residual errors and repeated solver difficulty. The square-trajectory run in the video at the top of the page, flown with no failures, shows the controller tracking a full waypoint circuit around an obstacle.

Square trajectory run: the actual path with every nominal and fault-scenario prediction made along the way
The square run, with every prediction the controller made: 909 nominal and 8,181 fault-scenario predictions, each 6 s long.