L1 Adaptive Control — Race Drone Testbed
Custom race drone built as a high-bandwidth hardware testbed for validating L1 adaptive augmentation on a real agile platform
Built a custom race drone from scratch as a hardware testbed for validating L1 adaptive control on a highly agile, lightweight platform with significant model uncertainty.
Components selected and staged for assembly
Platform assembled and ready for integration
Motivation
Race-class quadrotors are an ideal testbed for adaptive control research — they operate at high bandwidth, have poorly characterized aerodynamic interactions between rotors at high speed, and experience significant gyroscopic and inertial cross-coupling during aggressive maneuvers. These are exactly the conditions where L1 adaptive augmentation provides the most benefit over a fixed-gain baseline.
L1 Adaptive Architecture
The L1 controller augments a baseline LQR attitude controller. A state predictor runs in parallel at high rate:
\[\dot{\hat{x}} = A_m \hat{x} + B\left(\hat{\sigma}(t) + u\right), \quad \hat{\sigma}(t) = \hat{\theta}^\top \phi(x)\]The adaptive law updates at the predictor rate:
\[\dot{\hat{\theta}} = -\Gamma \text{Proj}(\hat{\theta},\ \tilde{x}^\top P B \phi(x))\]where \(\tilde{x} = \hat{x} - x\) is the prediction error and \(\Gamma > 0\) is the adaptation gain. A low-pass filter \(C(s)\) on the adaptive signal provides the bandwidth separation that guarantees robustness:
\[u_{\text{ad}}(s) = C(s)\hat{\sigma}(s), \quad \|C(s)\|_{\mathcal{L}_1} < \frac{1}{L}\]The \(\mathcal{L}_1\) gain condition bounds the transient response and ensures the adaptive loop does not destabilize the plant.
Platform Specifications
| Parameter | Value |
|---|---|
| Frame size | 5” race class |
| Flight controller | Custom (STM32-based) |
| Motor KV | High-KV for agile response |
| Control loop rate | 1 kHz inner loop |
| Adaptive predictor rate | 1 kHz |
<!--
See https://www.debugbear.com/blog/responsive-images#w-descriptors-and-the-sizes-attribute and
https://developer.mozilla.org/en-US/docs/Learn/HTML/Multimedia_and_embedding/Responsive_images for info on defining 'sizes' for responsive images
-->
<source
class="responsive-img-srcset"
srcset="/assets/img/personal/l1_race_drone_flight.gif"
sizes="95vw"
>
<img
src="/assets/img/personal/l1_race_drone_flight.gif"
class="img-fluid rounded z-depth-1"
width="100%"
height="auto"
alt="L1 race drone flight"
data-zoomable
loading="lazy"
onerror="this.onerror=null; $('.responsive-img-srcset').remove();"
>
</picture>
</figure> –>