← all projects
Robotics · May 2025 · 8 min read

Decentralized Fleet Coordination for Airport Ground Operations

Multi-agent coverage control for airport ground vehicles using Buffered Voronoi Cells, Lloyd's algorithm, and game-theoretic demand response. Zero collisions across all test scenarios.

PythonMulti-Agent SystemsOptimal ControlGame Theory
Ground-support vehicles V10, V21, and V1 positioning near gate cluster G10–G15

Airport aprons run on tight tolerances. A delayed fuel truck cascades into a gate conflict; a misrouted baggage tug holds an aircraft at the jetbridge. At scale, centralized dispatch becomes the bottleneck; every new gate or vehicle makes the assignment problem harder. This project designs a fully decentralized coordination stack for airport ground-support vehicles: each agent sees only its local neighbors, computes its own service target, and filters its own motion for safety. The fleet self-organizes. No dispatcher required.

The final 16-vehicle, 32-gate simulation satisfies every safety constraint (zero vehicle-to-vehicle collisions, zero obstacle penetrations) while converging to within 8% of the centralized coverage optimum.

The Apron

SFO-style apron: 16 vehicles, 32 gates across Terminal A and Terminal B, service taxiway, vehicle positions colored by gate demand

The environment is an SFO International Terminal apron modeled as a rectangular domain Ω=[0,800m]×[0,400m]\Omega = [0, 800\,\text{m}] \times [0, 400\,\text{m}] with M=32M = 32 gates split across two terminal rows and a service taxiway running between them. The fleet has N=16N = 16 heterogeneous ground vehicles (fuel trucks, baggage tugs, catering lifts, and GPU units), each with planar position pi(t)Ωp_i(t) \in \Omega.

The first design decision is where to send vehicles. Gates and parked aircraft are static obstacles, not drivable targets, so each gate gjg_j is mapped to an apron-side service standoff point:

sj=gj+dsσjey,σj={+1,gj,y<H/21,gj,yH/2s_j = g_j + d_s\,\sigma_j\,e_y, \qquad \sigma_j = \begin{cases}+1, & g_{j,y} < H/2 \\ -1, & g_{j,y} \geq H/2\end{cases}

Vehicles converge toward these approach positions, close enough to serve the gate and far enough to avoid the aircraft footprint. The combined coverage domain Q={s1,,sM}Qgrid\mathcal{Q} = \{s_1,\ldots,s_M\} \cup \mathcal{Q}_{\text{grid}} adds a background density grid so vehicles spread across open apron space between demand events.

System Architecture

System pipeline: Schedule → Coverage → Safety → Replay → Metrics, closed-loop every Δt = 0.5s

The control loop runs at Δt=0.5s\Delta t = 0.5\,\text{s} using only local sensing and neighbor messages. Each tick: flight events update gate demands; each vehicle computes its Voronoi cell and demand-weighted centroid; the BVC quadratic program projects that centroid command to a collision-free velocity; and the command is integrated through the MuJoCo physics layer. Separation, clearance, and kinematic diagnostics are logged throughout.

The architecture has no shared state, no global solver, and no communication beyond pairwise position sharing with local neighbors within rcomm=160mr_{\text{comm}} = 160\,\text{m}.

Coverage Control

Gate demand changes continuously: a flight lands and eight service vehicles are needed at once; thirty minutes later that gate is quiet and three others are busy. The coverage controller tracks this without any explicit task assignment.

Demand pulse triggered by a flight arrival: nearby vehicles detect the centroid shift and begin converging

Each gate gjg_j carries a service demand ϕj(t)0\phi_j(t) \geq 0 that spikes on flight arrival and decays exponentially:

ϕj(t)=ϕ0+:k=ja  eλ(tτ)  1tτ\phi_j(t) = \phi_0 + \sum_{\ell:\, k_\ell = j} a_\ell\; e^{-\lambda_\ell(t - \tau_\ell)}\;\mathbf{1}_{t \geq \tau_\ell}

The coverage objective is the demand-weighted quantization cost, a measure of how far high-demand gates are from the nearest vehicle:

H(P,t)=i=1N  qVi(P)  12qpi2ρ(q,t)H(P,t) = \sum_{i=1}^{N}\; \sum_{q \in V_i(P)}\; \frac{1}{2}\|q - p_i\|^2\,\rho(q,t)

where Vi(P)={qQ:qpiqpk,  ki}V_i(P) = \{q \in \mathcal{Q} : \|q - p_i\| \leq \|q - p_k\|,\; \forall k \neq i\} is vehicle ii‘s Voronoi cell and ρ(q,t)\rho(q,t) is the demand density at point qq. Minimizing HH drives vehicles toward high-demand regions.

Lloyd’s algorithm gives the gradient descent step: move each vehicle toward the demand-weighted centroid of its Voronoi cell,

ci(P,t)=qVi(P)q  ρ(q,t)qVi(P)ρ(q,t),uides=k(cipi)c_i(P,t) = \frac{\displaystyle\sum_{q \in V_i(P)} q\;\rho(q,t)}{\displaystyle\sum_{q \in V_i(P)} \rho(q,t)}, \qquad u_i^{\text{des}} = k\,(c_i - p_i)

The command is speed-capped and tapered as the vehicle approaches its centroid to prevent overshoot near convergence:

u~i=αiuides,αi=min ⁣{1,  vmaxmin ⁣(1,cipi/rs)uides+ε}\tilde{u}_i = \alpha_i\,u_i^{\text{des}}, \qquad \alpha_i = \min\!\left\{1,\; \frac{v_{\max}\min\!\left(1,\,\|c_i - p_i\|/r_s\right)}{\|u_i^{\text{des}}\| + \varepsilon}\right\}

This u~i\tilde{u}_i is the desired command before safety filtering.

Voronoi cells reforming continuously as vehicles respond to shifting gate demand
Demand-weighted Voronoi partition at t = 330s: colored cells, density-weighted centroids marked with stars

The snapshot at t=330st = 330\,\text{s} shows cell boundaries biased toward high-demand gates; the density-weighted centroid CvC_v (star markers) sits closer to busy gates than to the geometric cell center. Vehicles chase their moving centroid targets; cells reform on every tick. No agent ever needs to know the global demand state.

3D view of the apron mid-simulation: Voronoi demand cells as ground-plane color regions, trajectory lines connecting vehicles to centroids

Collision Avoidance

The coverage law alone says nothing about collisions. Rather than stacking a separate avoidance layer on top, the design uses Buffered Voronoi Cells, a safety filter that wraps the coverage command in a convex QP. The result is a single optimization per vehicle per tick that simultaneously targets the coverage objective and guarantees collision freedom.

Buffered Voronoi Cell forming from halfplane constraints as neighbors close in

For vehicle ii with neighbor jj, the BVC halfplane constrains the next position pi+=pi+uiΔtp_i^+ = p_i + u_i\Delta t:

(pjpi)Tpi+pj2pi2δ22(p_j - p_i)^T p_i^+ \leq \frac{\|p_j\|^2 - \|p_i\|^2 - \delta^2}{2}

where δ\delta is the safety radius. Any velocity uiu_i whose resulting pi+p_i^+ lies inside the Buffered Voronoi Cell is provably collision-free. The safety-filtered command is the smallest deviation from u~i\tilde{u}_i that satisfies all neighbor halfplanes:

ui=argminuR2  uu~i2s.t.(pjpi)T(pi+uΔt)pj2pi2δ22,jiu_i^* = \arg\min_{u \in \mathbb{R}^2}\; \|u - \tilde{u}_i\|^2 \qquad \text{s.t.}\quad (p_j - p_i)^T(p_i + u\Delta t) \leq \frac{\|p_j\|^2 - \|p_i\|^2 - \delta^2}{2},\quad \forall j \neq i

Voronoi cell V₀ vs Buffered Voronoi Cell BVC₀: three neighbor halfplanes carve the safe feasible region Local communication graph: 8 edges, avg degree 1.3, r_comm = 160 m

The BVC construction (left) shows three neighbor halfplanes carving the safe feasible region BVC0BVC_0 out of the full Voronoi cell V0V_0; any command landing pi+p_i^+ in the dark region is provably safe. The communication graph (right) shows why the approach scales: each vehicle only shares positions with local neighbors within 160 m, averaging 1.3 neighbors per agent. There is no broadcast, no global state.

Gates and parked aircraft add a second class of static exclusion zones Om={p:pomrm}\mathcal{O}_m = \{p : \|p - o_m\| \leq r_m\} with radii rm=16mr_m = 16\,\text{m} for gates and 20m20\,\text{m} for parked aircraft. Each nearby obstacle contributes a tangent halfplane to the QP: nimT(pi+uΔtom)rmn_{im}^T(p_i + u\Delta t - o_m) \geq r_m, where nim=(piom)/piomn_{im} = (p_i - o_m)/\|p_i - o_m\|.

Gate-level view: circular BVC exclusion zones around parked aircraft at G0 and G1 force vehicles to service approach positions

The gate-level view shows the exclusion zones in practice: vehicles approach gates from the apron side, held back from the aircraft footprint by the obstacle halfplane constraints. The demand-field glow at each gate shows where centroid targets are pulling them.

Stress-test ablation: BVC on vs. off: obstacle clearance goes negative within 20s without BVC; stays positive throughout with BVC

The ablation runs the same stress scenario with and without BVC. Without it, vehicles penetrate static obstacles within the first 20 seconds: clearance drops to −4 m and never recovers (red). With BVC on, pairwise separation stays above the 10 m safety limit and obstacle clearance remains strictly positive throughout (green). The safety guarantee holds in practice, not just in theory.

Simulation

16-vehicle apron coordination: coverage control + BVC safety, MuJoCo physics backend

The full simulation runs 16 vehicles on the 32-gate SFO layout with MuJoCo integrating the force/torque dynamics. Each vehicle state is xi=[pix,  piy,  θi,  vix,  viy,  ωi]Tx_i = [p_{ix},\; p_{iy},\; \theta_i,\; v_{ix},\; v_{iy},\; \omega_i]^T; a first-order smoother low-passes the BVC output before it enters the physics layer, and longitudinal and lateral force controllers track the smoothed command while a yaw torque controller drives heading:

vicmd=vi+Δtτ+Δt(uivi),τi=Izkω(ωitarωi)v_i^{\text{cmd}} = v_i + \frac{\Delta t}{\tau + \Delta t}(u_i^* - v_i), \qquad \tau_i = I_z\,k_\omega(\omega_i^{\text{tar}} - \omega_i)

The 3D replay visualizes the same MuJoCo trajectory in a browser viewer: Voronoi cell boundaries, BVC circles, demand overlays, and vehicle labels are all rendered live from the logged state sequence.

Voronoi cells, 3D ground plane
3D replay: Voronoi cells rendered as colored ground-plane polygons, updating live
Fleet overview, demand overlay
3D replay orbital view: demand-weighted Voronoi overlay highlights high-demand gate region

Results

Vehicle trajectories under coverage control + BVC over 600s: all vehicles colored by ID, gate positions marked

Trajectories confirm the coverage law working as intended: vehicles fan out from starting positions to cover both terminal rows, converging on demand-weighted centroids without colliding. The curving paths near busy gate clusters are not hand-coded; they emerge from the BVC projection deflecting each vehicle around its neighbors as they converge on the same region.

SFO replay safety diagnostics: minimum vehicle separation over time, speed histogram, acceleration histogram, yaw rate histogram

The safety headroom plots show the full 300-second, 16-vehicle replay. Minimum pairwise separation (top-left) starts near 20 m as vehicles fan out from clustered starting positions, grows to over 130 m at peak distribution, and stays above the 10 m safety radius throughout. The three histograms show that the fleet operates well within actuator limits in normal service; the 95th-percentile speed is 3.95 m/s against a 5 m/s cap, and 95th-percentile acceleration is 0.52 m/s² against a 1.5 m/s² limit.

MetricValueLimit
Vehicle safety violations00
Obstacle penetrations00
Minimum vehicle separation31.6 m> 10 m
Min gate / aircraft clearance0.750 m> 0
Max speed4.997 m/s5 m/s
95th percentile acceleration0.242 m/s²< 1.5 m/s²
Max yaw rate0.619 rad/s0.8 rad/s

Extensions

Two higher-level analyses extend the base controller.

Worst-case demand game. The coverage cost H(P,ϕ)H(P,\phi) is a function of both fleet positions and the demand distribution. If an adversary could allocate demand to maximally hurt coverage, concentrating it at the gates farthest from the current fleet configuration, what positioning would the fleet choose to stay robust? The minimax problem

minP  maxϕΦB  H(P,ϕ),ΦB={ϕR+M:jϕj=B}\min_P\;\max_{\phi \in \Phi_B}\; H(P,\phi), \qquad \Phi_B = \left\{\phi \in \mathbb{R}_+^M : \textstyle\sum_j \phi_j = B\right\}

is solved via best-response iteration: the fleet takes a Lloyd step, then an adversary reallocates demand toward the currently worst-served gates, and the process repeats. The resulting positions are more robust to unexpected demand spikes than the unconstrained Lloyd solution.

MAPPO extension. Lloyd’s algorithm is reactive; it responds to current demand but cannot anticipate future arrivals. A MAPPO policy replaces the centroid command with a learned action conditioned on each agent’s local observation (own state, neighbor positions, local gate demand, time features). A centralized critic uses fleet-level information during training but is not available at deployment. The BVC filter stays in the loop as a hard safety layer: the policy proposes, the QP clears it for collision.

#coverage-control#multi-agent#voronoi#airport#decentralized

Related projects