RP3: TVC Landing Simulation
Landing a thrust-vector-controlled sounding rocket after main-chute deployment: a 3-DOF Simulink simulation, a phased LQR controller and a 300-run Monte-Carlo campaign.

Land a rocket after the chute
My Year-3 research project (AENG30017), supervised by Prof. Tom Richardson: land a sounding rocket softly and upright after it has already come down under its main chute. The vehicle descends at about 8 m/s; at 200 m a phased LQR and thrust-vector-control system arrests the wind-driven pendulum swing and flies the last 25 seconds to touchdown. If the controller fails, the rocket keeps riding the chute, a survivable parachute landing rather than a lost vehicle. The plant is a 3-DOF MATLAB/Simulink model of a 78 kg, 3.97 m, 20:1-fineness airframe (HyPower's Waxwing) with a hypothetical deep-throttle 5 kN LOx-class engine, Isp 180 s, gimbal ±10°.


The controller
Four gates, three modes. The controller arms at 200 m and runs three LQR modes in phase: damping to kill the swing, stabilisation to hold the vehicle vertical once it is calm, and a flare from 25 m targeting 1.8 m/s. Each mode carries dynamic lead compensation (τ 0.12-0.22 s) to cover the engine lag and rate limits, which I fitted to BristolSEDS hotfire data. Two safety layers sit on top. Predictive recovery cuts thrust above |θ| 50° or |ω| 160°/s and lets the chute re-right the vehicle before the controller re-engages; an emergency max-thrust override is the last resort. The passive plant it fights has ω_n 4.264 rad/s and ζ ≈ 0.014, so a 19° swing takes 45 s to decay below 2° on its own.



Three hundred runs
Wind shear, gusts and Dryden turbulence are random, so one landing proves nothing. I ran 300 Monte-Carlo descents with the L controller. 209 landed inside the success box of |v_z| below 3 m/s and |θ| below 5° at touchdown, 22 landed out of spec and 69 spun: 69.7 % success, 70 ± 5.2 % at 95 % confidence. The running success rate flattens well before run 300, which is why I stopped there rather than growing the 12 GB of batches further. The passive baseline is the same vehicle drifting down at 8.24 m/s terminal velocity, its swing decaying only through aerodynamic damping.



The best landing
Run #59 is the one I would show a sceptic. The controller activates at 200 m with the vehicle still swinging through −25°, damps the oscillation, holds the descent near 4 m/s, then flares at 25 m to touch down at θ −0.63° and v_z 0.963 m/s. The gimbal sits on its ±10° limit for much of the flight, which says the actuator, not the control law, is the constraint. A representative median-grade run lands at −1.23° and 1.60 m/s, still inside the box, with two brief spikes to full thrust during the flare.


Where it fails
Failure is decided at the moment the controller arms. A logistic regression on the 300 trigger states puts the 50 % failure boundary at |ω_trigger| ≈ 119°/s: the rate matters (β_ω 0.45, p < 0.001) and the attitude barely does (β_θ 0.17, p = 0.221). That boundary is where the LQR linearisation stops describing the plant. I also ran a second controller, R, over 100 runs: 48 successes and 52 out-of-spec, χ² = 109.2 against L, p < 0.001. R records no spin-class landings, but that is a classification convention, not a raw result. Its failures cut thrust and ride the chute down at about 8 m/s, so they are counted as out-of-spec chute landings; the raw spin flag catches 31 of them.



Fuel
Mean propellant over the campaign is about 12.6 kg, roughly a third of the ~40 kg a pure powered-descent-guidance landing of the same vehicle would need, because the chute does most of the braking for free. Flare height is the trade I tested: the 25 m flare the campaign flies costs 1.39 kg more than a 10 m flare (11.0 %, p = 0.003, 300 runs against 100). The 10 m case is the cheaper alternative I benchmarked against.

Noise and turbulence
The atmosphere is log wind shear plus MIL-F-8785C gusts plus Dryden turbulence. I verified my Dryden filter against the NASA Langley LaSRS++ acceptance criteria; the reconstructed spectrum sits on the ideal curve on both linear and log axes. The plant was checked against BristolSEDS 6-DOF flight IMU tilt data: simulation and flight both concentrate their energy below 1 Hz, in the pendulum band. Sensors are modelled on a Murata SCH16T IMU and a u-blox MAX-M10S GPS, fused through a complementary filter; the residual plots show what the controller actually sees rather than the truth state.








Paper and poster
The full paper, 31 pages, compiled from the public repo. The conference poster was presented before the Monte-Carlo campaign existed: planar model, no sensor noise, preliminary results. It is here as the mid-project snapshot, not the final word. The engine lag model, the airframe and the validation data all come from the other projects on this site: BristolSEDS hotfires, HyPower's Waxwing, and the BristolSEDS flight IMU.