Chapter 1 of 6 · 3 min read

Building the airport

Why I switched my thesis to air traffic control in late December, and how I built a simulated Birmingham Airport to test it in.

This wasn’t my first thesis idea. I started on reconstructing images from EEG brain signals, but by mid-December it was clear it wasn’t doable in the time I had. So just before New Year I switched to air traffic control, with under four months left.

Why air traffic control

I love planes. Anyone who knows me knows that. The idea came to me randomly one day, while I was looking back at old games and came across Flight Control, a 2009 game where you draw paths to land planes before they crash into each other. It’s discontinued now, and it’s still really hard. Playing it, I thought: it would be really interesting if an AI could do this.

Air traffic controllers do a hard job with tools that mostly just help them see. Those tools work a bit like a spell checker: they point things out, but the controller makes every decision. Even with radar and decision aids, they’re the ones keeping a picture of the whole airfield in their heads, and they can be let down by the same things as anyone: attention lapses, memory and workload. In the US alone, more than 26,000 runway incursions were recorded between 2002 and 2020, rising faster than air traffic itself, and around 70% of aviation accidents are put down to human error. The runway collision at Tokyo Haneda in January 2024 is a recent example.

There’s a lot of AI research in air traffic control, but almost all of it supports a human controller rather than making decisions itself. Ground movement, getting aircraft between stands and runways, gets much less attention. So the question for my thesis was: could deep learning actually run ground control, at least in a simulation?

Choosing an airport

I built the simulation from scratch in Python with Pygame. Existing simulators like BlueSky focus on aircraft en route, not on taxiways. For the airport, I picked Birmingham: it has one runway and a simple layout, but enough taxiways and stands to be interesting.

The background is a satellite picture from Google Earth, rotated 60° so the runway runs straight across the screen, and cleaned up by hand to remove aircraft, shadows and labels. The 3 km runway comes out at about 1,170 pixels, so one pixel is about 2.5 metres.

The taxiway network

Aircraft don’t drive freely around the picture. They move along a network I traced by hand from the official aerodrome chart: every intersection and holding point is a node, every stretch of taxiway between them is an edge, and every stand has a position, a heading, and the taxiway it joins. The names, like A1 and T2, are made up, but in the same style as real ones.

Routes come from Dijkstra’s algorithm. I picked it over A* because on a network this small, A*’s extra speed doesn’t matter and Dijkstra gives stable results.

The aircraft

Every aircraft is the same type, about 42 metres long, roughly a Boeing 737. Its sprite took a few goes to get right at that size.

Four versions of the aircraft sprite, from a large detailed first attempt to the small, simple final oneFour versions of the aircraft sprite, from a large detailed first attempt to the small, simple final one

The aircraft sprite, from the first attempt to the final one.

Each aircraft moves through a set of states. Departures prepare, push back, taxi, take off and leave. Arrivals are new aircraft: they land, roll out and taxi to a free stand, and they keep coming until every stand is full. For the stress tests, parked aircraft eventually leave again, so the simulation can run forever. Pushback, take-off and landing follow fixed rules. Taxiing is where the AI comes in.

The physics are simple. Thrust pushes an aircraft forward, drag slows it down, and it turns more slowly the faster it goes. It also can’t turn while standing still. I tuned all of it by driving a single aircraft around with the keyboard until the turning, acceleration and braking felt right.

That was the airport. The next chapters go through each part that runs it, starting with the model that drives the aircraft.