Drones in warehouses
UAT 363 Unmanned Aircraft Systems Technology for Transportation and Smart Warehousing
Lesson
By the end of this module you will be able to
- Explain drone use in warehouses and the difference between stock taking and cycle counting
- Plan rack-scanning flights and estimate the time required
- Compare indoor positioning methods without GNSS, namely VIO, motion capture, UWB and AprilTag
- Compute position from ranges to UWB anchors by least squares
Why this matters
A medical store holds thousands of items on high racks. Counting by hand needs forklifts, takes a long time and often stops work. Differences between real stock and records mean medicines run out or expire unnoticed. A drone scanning the racks can count more often, but indoors there is no GNSS signal, so the drone must know its position some other way.
Drones in the warehouse
The ETH Zurich report (Wawrla and colleagues, 2019) studied 12 real deployments in three groups: inventory management, intra-logistics, and inspection and surveillance. It concludes that inventory management has the highest potential, while intra-logistics is not yet feasible because of battery and payload limits. The main challenges are limited flying space, navigation without GPS, integration with existing systems, and battery safety.
The same report distinguishes stock taking, counting the whole warehouse usually once a year, from cycle counting, counting part of it daily or weekly. Drones suit cycle counting, because they can recount often without stopping work.
Example 1. Number of locations and scan time
Assumed warehouse: 6 aisles, racks 40 m long divided into 16 bays and 5 levels high. The drone scans both faces of the aisle at once, level by level, at 0.5 m/s.
import math
AISLES, RACK_M, BAYS, LEVELS = 6, 40.0, 16, 5
SPEED, LEVEL_CHANGE_S, AISLE_CHANGE_S, BATTERY_MIN = 0.5, 10, 30, 15
locations = AISLES * 2 * BAYS * LEVELS
per_aisle_s = LEVELS * RACK_M / SPEED + LEVELS * LEVEL_CHANGE_S
total_s = AISLES * per_aisle_s + (AISLES - 1) * AISLE_CHANGE_S
flights = math.ceil(total_s / 60 / BATTERY_MIN)
print(f"{locations} locations, {per_aisle_s / 60:.1f} min per aisle, "
f"total {total_s / 60:.1f} min -> {flights} battery flights")
print(f"daily cycle count of one aisle covers {2 * BAYS * LEVELS} locations "
f"= all {locations} in {AISLES} working days")
960 locations, 7.5 min per aisle, total 47.5 min -> 4 battery flights
daily cycle count of one aisle covers 160 locations = all 960 in 6 working days
Counting the whole warehouse at once needs several battery changes, but cycle counting one aisle a day takes under 15 minutes and covers the whole warehouse every week.
Indoor positioning
| Method | Principle | Strengths | Limits |
|---|---|---|---|
| VIO (visual-inertial odometry) | Onboard camera plus IMU estimates motion | No installation in the building | Drift accumulates; plain walls or low light are hard |
| Motion capture | Cameras around the room track markers on the drone | Very high accuracy | Expensive, limited area |
| UWB | Ultra-wideband radio ranging to anchors at known positions | Wider coverage, independent of light | Anchors must be installed; obstructions bias ranges |
| AprilTag | Visual fiducial markers at known positions | Cheap, clearly identifiable | Must be seen; used to correct drift |
The PX4 guide explains feeding position from external systems (VIO or motion capture) into the EKF2 estimator and recommends a message rate of 30–50 Hz. UWB ranging is standardised in IEEE 802.15.4z-2020. The review by Alarifi and colleagues (2016) concludes that UWB performs better than other technologies for indoor positioning, while real accuracy depends on installation and environment and must be measured on site. AprilTag markers (Olson, 2011) serve both for positioning and as reference points on the racks.
Example 2. Position from UWB ranges by least squares
The measured ranges carry small errors (assumed values). Subtracting the first equation from the others gives a linear system, solved by least squares.
import math
anchors = [(0, 0), (20, 0), (20, 10), (0, 10)]
true_pos = (7, 4)
noise = [0.05, -0.03, 0.04, -0.02] # m
ranges = [math.dist(a, true_pos) + e for a, e in zip(anchors, noise)]
(x1, y1), r1 = anchors[0], ranges[0]
rows, rhs = [], []
for (xi, yi), ri in zip(anchors[1:], ranges[1:]):
rows.append((2 * (xi - x1), 2 * (yi - y1)))
rhs.append(r1 ** 2 - ri ** 2 + xi ** 2 - x1 ** 2 + yi ** 2 - y1 ** 2)
a11 = sum(r[0] * r[0] for r in rows); a12 = sum(r[0] * r[1] for r in rows)
a22 = sum(r[1] * r[1] for r in rows)
b1 = sum(r[0] * v for r, v in zip(rows, rhs)); b2 = sum(r[1] * v for r, v in zip(rows, rhs))
det = a11 * a22 - a12 * a12
x, y = (a22 * b1 - a12 * b2) / det, (a11 * b2 - a12 * b1) / det
print(f"ranges {[round(r, 2) for r in ranges]}")
print(f"estimate ({x:.2f}, {y:.2f}) m, error {math.dist((x, y), true_pos) * 100:.1f} cm")
ranges [8.11, 13.57, 14.36, 9.2]
estimate (7.01, 4.01) m, error 1.6 cm
Counting with images needs barcodes or labels on the boxes to be read. The RFly research (Ma and colleagues, 2017) instead used a drone as a relay to read and locate battery-free RFID tags in a warehouse, which does not require a direct view of the tag.
Module lab
Lab: scanning a mock rack
- Set up a mock rack in the lab with a barcode or AprilTag on every slot
- Apply Example 1 to the hospital store or lab dimensions and plan cycle counting
- Install the lab’s indoor positioning system (UWB or motion capture), feed positions into PX4 following the guide, and measure the error against reference points
- Apply Example 2 to real UWB ranges from several points and record the error
- Fly a manual or automatic scan in an enclosed area and record the tag read success rate
Common mistakes
Watch out
- Using GNSS-dependent flight modes indoors
- Not surveying UWB anchor positions accurately, shifting every position
- Flying near people and forklifts without separating time or space
- Trusting VIO for too long without references to correct drift
- Not checking the tag read success rate before concluding stock is missing
Summary
- Inventory management is the best-suited warehouse task according to the ETH report, and suits cycle counting
- Estimate scan time from aisles, levels and speed, then plan the counting cycle
- Indoors, use VIO, motion capture, UWB or AprilTag to feed position to the flight controller
- Ranges to several anchors give position by least squares
Check your understanding
- Four aisles, two faces each, 20 bays per face and 4 levels. How many locations?
- How many minutes does it take to scan 4 levels of a 30 m rack at 0.5 m/s?
- How does stock taking differ from cycle counting?
- Why does VIO need references such as AprilTags?
- How many UWB anchors are needed at minimum for 2D positioning?
Answers
- locations
- s = 4 minutes
- Stock taking counts the whole warehouse once a year; cycle counting counts part of it daily or weekly
- VIO error accumulates over time, and references reset it
- 3 (not in a straight line); a fourth reduces the error
Key formulas
| Range to an anchor | |
| Linear equation after subtracting the first |
Key references
- Wawrla, L., Maghazei, O., & Netland, T. (2019). Applications of drones in warehouse operations (White paper). ETH Zurich, D-MTEC, Chair of Production and Operations Management. link
- PX4 Autopilot. Using vision or motion capture systems for position estimation. PX4 guide (main). link
- Olson, E. (2011). AprilTag: A robust and flexible visual fiducial system. In 2011 IEEE International Conference on Robotics and Automation (pp. 3400–3407). IEEE. link
- IEEE. (2020). IEEE standard for low-rate wireless networks — Amendment 1: Enhanced ultra wideband (UWB) physical layers (PHYs) and associated ranging techniques (IEEE Std 802.15.4z-2020). link
- Alarifi, A., Al-Salman, A., Alsaleh, M., Alnafessah, A., Al-Hadhrami, S., Al-Ammar, M. A., & Al-Khalifa, H. S. (2016). Ultra wideband indoor positioning technologies: Analysis and recent advances. Sensors, 16(5), 707. link
- Ma, Y., Selby, N., & Adib, F. (2017). Drone relays for battery-free networks. In Proceedings of ACM SIGCOMM 2017 (pp. 335–347). ACM. link
Further reading
Study the assigned knowledge units in advance, review media and take the module quiz
In class / field
Intensive lab and field practice recorded in a lab notebook
Learning evidence: Lab notebook signed by the instructor