Skip to main content
← Projects

Indoor Tracking

2016

An indoor positioning system built from off-the-shelf products using Bluetooth Low Energy (BLE) and Raspberry Pi devices.

aws · bluetooth · node · python · raspberry-pi

Indoor Tracking hero

Problem

Around 2016, computational design had architects hungry for evidence: if you could measure how a building was actually used, you could argue for how the next one should be designed. The catch was getting the data. GPS stops at the front door, and there was no cheap, deployable way to answer indoor questions like which desks are occupied, how people move between zones, or where the crowding is.

In my honours year at the University of New South Wales I got to work on exactly that with Arup and BVN: design, build, and deploy an indoor positioning system out of off-the-shelf parts, cheap enough to scatter through a real office. The research team was three students; the positioning system was my responsibility.

Approach

After surveying the options we settled on Bluetooth Low Energy (BLE) as the cheapest, most ubiquitous technology with a proven method behind it. The system has two device types:

  • Beacons are small battery-powered tags that constantly broadcast a unique ID, worn by each participating employee, and
  • Agents are Raspberry Pis in custom enclosures that scan for those broadcasts and upload each beacon ID with its signal strength.
System diagram: a beacon broadcasts over Bluetooth to a Raspberry Pi agent, which forwards readings to a live database and a time-series store, feeding a floor-plan visualisation with occupancy dots

Signal strength gives a rough distance, so with a map of where every agent sits, a beacon’s position can be estimated. Each agent forwards its readings to a small AWS pipeline (a live store for current positions, a time-series store for history) which a floor-plan view reads from. Querying the history surfaced occupancy hotspots in the office; the live store gave the near-realtime position of an individual.

A laser-etched acrylic beacon tag reading "Alexander Lee · WHERE-IN SPACE" with a QR code, sitting in a 3D printer

Decisions

BLE over the alternatives. Wi-Fi RSSI meant leaning on infrastructure we didn’t control; ultra-wideband was accurate but expensive per node; camera-based tracking dragged in privacy problems we didn’t want near people’s desks. BLE was the pragmatic floor: cheap tags, cheap scanners, good-enough resolution for occupancy-scale questions.

Raspberry Pi agents over microcontrollers. A full Linux box per scanning point costs more than an ESP32, but it bought a real OS, Wi-Fi, Python, and remote SSH, so an agent in the field could be debugged and updated without a site visit. Given how many of these were going onto walls and poles, that mattered more than the unit price.

The parts of a single agent laid out flat: a clear acrylic tube, 3D-printed end caps, a Raspberry Pi labelled "ACE", a sensor board, an SD card, and jumper wires

Custom enclosures. Each agent was 3D-printed and named, so a unit could be identified on sight when something went wrong in the field.

Outcome

The system was deployed at multiple client sites, scanning live across working offices and feeding the floor-plan visualisation.

An assembly line of agents on an office desk: over a dozen clear acrylic tubes with Raspberry Pis inside, power plugs attached, being put together by two team members

A Raspberry Pi agent named "Oscar" in a clear enclosure, mounted by an office window with the city skyline behind it

The honest takeaway: I went in underprepared for what it takes to run a fleet of distributed hardware. The positioning maths was the easy part. The real lessons were in troubleshooting flaky units remotely, pushing software updates to machines I couldn’t reach, and keeping the database healthy as readings piled up. It reshaped how I think about anything that has to stay running rather than just demo once.

References

Student research at UNSW, in collaboration with Arup and BVN.