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.

Race drone components

Components selected and staged for assembly

Race drone assembled

Platform assembled and ready for integration

L1 adaptive control render

CAD render


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> –>