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


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