MLTE03 · Week 10 · Lab (capstone)

Team case study: integrate the six labs

Fly the complete autopilot on one mission, measure it honestly, and pick the gap your project will close.
~75 min 🧩 The full quadsim stack 📦 Deliverable: Team case study + proposal Team case study — 20%

← Back to the Week 10 slides Course home

Goal Run your accumulated autopilot (guidance → position → attitude → mixer, closed on the estimate) on a full take-off → waypoints → land mission under wind. Report four baseline numbers, then propose the final-project mission and the limitation an intelligent method will fix. This is the team case study — the capstone of the six labs.

1 · What you've built (5-min recap)

Across Labs 1–6 you assembled a complete cascade autopilot: the X-frame mixer (Wk 3), the inner attitude loop (Wk 5), the outer position/altitude loop (Wk 6), optionally LQR (Wk 7), state estimation (Wk 8), and trajectory tracking (Wk 9). Today they fly together, on the estimated state, under a disturbance — the realistic test.

No midterm — this is how the flight-dynamics half is assessed Your six lab reports (Wks 4–9) are 30% of the grade; this team case study (Week 10) is 20%. The case study integrates the whole autopilot, measured. The final project (40%) starts from the limitation you find here.

2 · Setup (1 min)

# from the simulator/ directory, venv active
export PYTHONPATH=.                 # Windows: set PYTHONPATH=.

Use your own StudentController if it passed Labs 2–3; otherwise the reference CascadePID is the baseline. Either way you wrap it in EstimatedStateController.

3 · Fly the capstone mission

1 Assemble the full stack on the estimate

One controller object closes guidance → control → estimation:

import numpy as np
from quadsim import Simulator, QuadParams
from quadsim.controllers import CascadePID          # or: from quadsim.controllers import StudentController
from quadsim.estimators import EstimatedStateController
from quadsim.dynamics import hover_state
from quadsim import trajectories as traj

p = QuadParams(); sim = Simulator(p)
ctrl = EstimatedStateController(CascadePID(p), p)    # fly on x̂, not x
2 Define a mission + wind, then run the test

Take off, fly a square of waypoints, land — under a steady cross-wind that a fixed-gain controller cannot fully reject:

mission = traj.waypoints([(0,0,1), (2,0,1.5), (2,2,1.5), (0,2,1), (0,0,1)])
log = sim.run(hover_state(position=(0,0,1.0)), ctrl, reference=mission,
              t_final=30.0, wind=lambda t: np.array([2.5, 0.0, 0.0]))   # strong gust in +x
3 Collect the four baseline metrics measure

Numbers, not impressions — these define what your project must beat:

rmse = log.position_rmse()
tilt = np.rad2deg(np.sqrt(log.euler[:,0]**2 + log.euler[:,1]**2))
sat  = np.mean(np.any(np.abs(log.f - p.f_max) < 1e-6, axis=1))   # fraction of steps saturated
drift = np.linalg.norm(log.position[-1] - [0,0,1.0])             # end-of-mission error
print(f"RMSE {rmse:.3f} m | max tilt {tilt.max():.1f} deg | saturated {sat*100:.0f}% | drift {drift:.3f} m")
4 Render the figures for the report plots
from quadsim import plotting as viz
viz.plot_pose_strobe(log,  save="capstone_strobe.png",  show=False)
viz.plot_tracking_error(log, save="capstone_error.png", show=False)
Checkpoint ⭐ The quad completes the mission but is clearly stressed; you have four baseline numbers and two plots. A typical reference baseline here is ~1.3 m RMSE with the commanded tilt hitting the 30° clamp — both are perfect project targets (disturbance rejection → RL/MPC; constraints → MPC).

4 · Find your limitation & propose the project

Look at your baseline and name one concrete weakness, then pick the method that addresses it:

If your baseline shows……the gap isProject method
Drift / large RMSE under windNo disturbance rejectionRL with domain randomization, or MPC
Motors saturating, tilt clampedNo constraint planningMPC (input/tilt limits)
Lag on fast trajectoriesNo preview / look-aheadMPC with reference preview

Self-check

5 · Deliverable & submission

CriterionWhat we look forWeight
Capstone runFull mission on the estimate under wind; four baseline metrics reported40%
Figures & analysisStrobe + tracking-error plots, read correctly (where/why it struggles)30%
Project proposalOne-page: mission + named limitation + candidate method, with a target metric30%

📤 Submit via the MUST LMS — Team case study (Week 10)

What
Team case study (≤4 pp, per team) + capstone_strobe.png & capstone_error.png + a 1-page project proposal
Filename
MLTE03_LabReport7_<studentID>.pdf + MLTE03_Proposal_<studentID>.pdf
Where
MUST LMS → MLTE03 → Team Case Study & Proposal LMS link — TO FILL
Deadline
date / time — TO FILL (before Week 11)

The six lab reports are 30% and this team case study 20% of the course grade; the final project is 40%.

Next → Week 11: Model Predictive Control. The tools to close your chosen gap start here; the final project is presented and demoed in Week 15.