Thesis, Illustrated
A slow ground robot that thinks deeply. A fast little drone that sees everything. My master's research put them on the same team — and pitted a hand-built forecasting algorithm against reinforcement learning to find out which one keeps up with a person best.
What this project exercised
01 · Origins
Before any of the multi-robot work, the goal was simple: build a robot that could play tag with a person. That splits into two problems: put the robot and the person in the same coordinate frame, then decide how to move toward them.
The first platform was a TurtleBot with a 2D LiDAR and a forward-facing monocular camera. The camera detected the person and gave a bearing; the LiDAR gave a precise range, but only out to 4 meters. Past that, I estimated distance from the size of the person's bounding box in the image.
Two range sources, one estimate: inside the LiDAR's 4 m reach, the camera supplies the direction and the LiDAR the distance. Outside it, the camera alone has to guess the distance.
Camera-only range estimate against ground truth as a person steps toward the robot (thesis Fig. 4.3). Because it assumes typical human proportions, it was the fallback to the LiDAR, not a replacement.
The TurtleBot following a person: camera detections on the left, the occupancy grid it builds and the person's estimated position in RViz on the right.
Then the team grew. A palm-sized Bitcraze Crazyflie joined, at first with no camera at all. Once the two robots' coordinate frames were aligned, the ground robot could localize a person and send the drone to their position. That idea, one robot's perception tasking another robot, is the seed of everything that follows.
The TurtleBot localizes a person, then spatially tasks the Crazyflie to their position. RViz is on the right; the camera feed and a room view of the drone in flight are on the left.
The hardware then grew up: the TurtleBot gave way to a Clearpath Jackal with a 3D LiDAR and an RGB-D camera, and the Crazyflie gained a small grayscale camera. With perception on both robots, the question changed from "can they find a person?" to "how should two very different robots share the job of following one?"
02 · The Problem
A robot that can autonomously follow a person is a building block for a lot of real missions: hauling gear for a search-and-rescue team, assisting patients, carrying supplies for soldiers, or providing social assistance.
Most existing systems quietly assume the person will cooperate: walk at robot speed, stay in the open, glance back to make sure their robot buddy is keeping up. In high-stakes settings, nobody has time for that. The person moves how they move — and the robot has to deal with three hard constraints:
The core failure mode: the moment the person rounds a corner, a single ground robot is blind — and it's already slower than they are.
Indoors — or under a roof line or tree cover — you can't just fly a camera high above the scene. At low altitude, walls and clutter constantly break the robot's view of the person.
The robot's top speed is the same order of magnitude as the person's. There's no catching up after a mistake, so every navigation decision has to be timely and correct.
The robots get no map, no planned route, and no model of the person — nothing but a bound on how fast they could possibly move.
03 · The Idea
No single robot solves all three constraints at once. So the thesis pairs two robots whose strengths are exactly each other's weaknesses, plus the person they're trying to keep up with:
Ground robot · UGV
Slow but capable — carries the payload, the sensors, and the compute. Its job: physically reach the person's position.
Micro-drone · UAV
Fast but simple — little compute, locked to one low altitude. Its job: keep the person in view and report where they are.
Person
Walks their own path to their own destination — faster than the ground robot, with zero obligation to cooperate.
Max velocities: UGV < person < UAV. The drone can always keep up but can't act on what it sees; the ground robot can act but can't keep up. Teamwork is the only way through.
The drone becomes the ground robot's eyes around the corner: it races to wherever it can see the person and streams their position, while the ground robot uses that feed to plan the smartest possible route — even a route that temporarily gives up its own view.
04 · Three Strategies
The heart of the thesis is a bake-off between three motion strategies — a hand-engineered forecaster, a learned multi-agent policy, and a deliberately simple baseline.
FORWARD-PF (Forecasting Optimization of Robotic Way-point Assignment for Robust and Dynamic Person-Following) treats the problem like a chess player thinking one move ahead:
Fit a third-degree polynomial to the person's recent positions — a smooth curve describing where they've been heading.
Extend the curve a few seconds into the future, then scatter Gaussian samples around each predicted point — a cloud of "places they might plausibly be."
Lay a grid of candidate goal locations around the person. Score each one twice: for the follower, closeness to the predicted position; for the observer, how many predicted points it can see (line-of-sight), minus travel cost.
The follower gets the best proximity cell, the observer the best visibility cell — unless the spot each is already standing on scores higher, in which case: don't move. Repeat every cycle.
Every cycle, a grid of candidate goals is scored around the person. Green cells promise proximity or a clear view of the predicted motion cloud; the best cell for each robot becomes its next waypoint.
follower(c) = ‖ c − avg(Fp(z)) ‖₂
observer(c) = los(c, Fp) − | ds − ‖ c − avg(Fp(z)) ‖₂ |
θgoal = atan2(Ty − Uy, Tx − Ux)
What the observer is optimizing (thesis Fig. 5.4). The light-blue cone is the drone's current view; the dark-blue circle is its chosen goal and the view it will have from there. Black dots are the person's predicted positions, and the red circle is the ground robot's goal.
FORWARD-PF running in simulation: candidate goals colored from green (best) to red (worst), the blue circle marking the selected goal as the target moves.
The learned approach uses MADDPG — Multi-Agent Deep Deterministic Policy Gradient — with centralized training and decentralized execution. Three agents train together in a simple 2D particle world (PettingZoo's Multi-Particle Environment): a target that learns to evade, a follower rewarded for closing distance, and an observer rewarded for keeping line-of-sight, all penalized for collisions.
The catch: policies learn in a flat world of frictionless holonomic particles, then must drive a real differential-drive robot through 3D clutter. Bridging that gap — smoothing discrete actions, simplifying observations, rescaling coordinates — was half the battle.
Each agent observes its own position and velocity, the other agents' positions and velocities, and nearby obstacles. Its action is one of five discrete moves: stay, up, down, left, or right. Training is the easy part. Getting a policy that learned on frictionless 2D particles to drive a real differential-drive robot through 3D clutter meant closing three gaps:
The policy picks a discrete move 10 times a second, which a differential-drive robot can't execute directly. For the ground robot, I averaged the last second of actions into one direction vector, so alternating "right" and "up" becomes up-right. That vector is projected 5 m ahead and handed to the local planner. The holonomic drone executes moves directly.
Every agent works in the world frame, so "up" means the same thing whichever way the robot faces. The local planner also catches small obstacles the LiDAR saw inconsistently, which had been causing collisions.
Training expected the position of every obstacle, so a map with 11 obstacles broke a model trained on 10, and training time grew exponentially with obstacle count. A "10 closest obstacles" list didn't work either, because its order reshuffled as the robot moved.
The fix was to split the 360° around the robot into 10 sectors and report only the nearest obstacle in each, with its distance bucketed into 5 proximity levels. The input is the same size in any environment.
The model trained in a 2 × 2 unit space with coordinates normalized to [−1, 1]; the deployment world was roughly 100 × 100 m. Positions were scaled down and offset from the experiment's starting point, then hand-tuned by about 10%.
Scale matters more than it looks. Shrink a cluttered world too far and the model perceives obstacles as closer and its own moves as less consequential. Past a certain size and obstacle density, performance degrades however you tune it.
The adapted observation in the 3D simulator (thesis Fig. 4.12). Spheres mark the nearest obstacle in each of the 10 sectors around the ground robot (left) and the drone (right). The green arrow is the averaged action sent to the planner.
The baseline is a single ground robot doing the obvious thing: keep the person's bounding box centered in the camera with a proportional controller on its horizontal offset (ω = −kp·Δx) while driving forward at a constant speed. No drone, no prediction, no planner. It's fast and cheap, and as the experiments show, it works right up until the person does anything interesting.
Point-and-shoot in action: pure reactive pursuit. Great on straight lines; helpless the moment line-of-sight breaks.
05 · The Gauntlet
All three strategies ran in a Unity simulator driven by Phoenix, the Army Research Laboratory's ground autonomy stack, which handles person detection and tracking, online SLAM, and global and local planning. A simulated Clearpath Warthog played the follower and a generic quadrotor the observer, each with a forward camera that detects the person out to 20 m.
In each of three areas, the simulated person walked an easy, a medium, and a hard path. Difficulty is measured by tortuosity, the path's length divided by the straight-line distance from start to end: about 1.0 for easy, 1.3 for medium, and 2.0 for hard. That's 9 paths × 3 methods = 27 configurations, each run repeatedly. The robots start side by side, and the clock starts when the person first enters their view.
The full test course (thesis Fig. 4.8). Blue circles are the three starting locations, white circles mark where each path ends, and the line style shows difficulty: dashed easy, dot-dashed medium, solid hard.
06 · Results
Point-and-shoot only survives the easy routes. MARL holds through medium difficulty but collides on hard paths. FORWARD-PF completes every path and still succeeds 89% of the time on the hardest ones.
9/9
paths completed by FORWARD-PF — the only method to finish them all
1.95×
faster arrival at the target with FORWARD-PF vs. the learned MARL policy
≥71%
time-in-view in every successful two-robot run — the drone earns its keep
The visibility numbers tell the underlying story. When the drone keeps the person in sight, the ground robot always knows where to go; every MARL failure came on runs where visibility collapsed below 20%.
| Time in view | P1 | P2 | P3 | P4 | P5 | P6 | P7 | P8 | P9 |
|---|---|---|---|---|---|---|---|---|---|
| Point-and-Shoot | 0.61 | 0.85* | 0.48* | 0.51 | 0.35* | 0.38* | 0.69 | 0.24* | 0.34* |
| MARL | 1.00 | 0.71 | 1.00 | 1.00 | 1.00 | 0.14* | 1.00 | 0.96 | 0.20* |
| FORWARD-PF | 0.98 | 1.00 | 1.00 | 1.00 | 1.00 | 0.98 | 1.00 | 0.97 | 0.72 |
Fraction of each run the person stayed visible to the robot team, per path. * marks failed runs.
The baseline deserves some credit. On the three easy paths it finished, it had the shortest arrival delay, the shortest route, and the smallest gap to the person, because a purely reactive controller moves the instant it sees the person while the two-robot methods pay for planning time. Its problem is recovery: once it loses sight, it's done.
| Arrival delay (s) | P1 | P2 | P3 | P4 | P5 | P6 | P7 | P8 | P9 |
|---|---|---|---|---|---|---|---|---|---|
| Point-and-Shoot | 21.2 | — | — | 30.6 | — | — | 19.4 | — | — |
| MARL | 84.9 | 65.2 | 27.9 | 86.9 | 77.7 | — | 91.4 | 76.4 | — |
| FORWARD-PF | 43.9 | 30.9 | 7.6 | 56.9 | 55.0 | 43.1 | 46.0 | 75.9 | 15.6 |
Seconds between the person stopping and the ground robot arriving, per path (thesis Appendix A). Bold marks the fastest finisher on each path; — marks a method that didn't complete it. Averaged per path, FORWARD-PF arrived 1.95× faster than MARL.
Something emerged that wasn't programmed in. Because the drone keeps reporting the person's position, the slow ground robot doesn't have to retrace the person's winding path. It can cut the corner and plan the shortest route to wherever they are now. Both two-robot methods found this on path 3, FORWARD-PF found it again on path 9, and it showed up in the hardware validation too.
Emergent efficiency: with the drone maintaining eyes-on, the ground robot plans point-to-point instead of playing follow-the-leader, covering less distance than the person did.
The real thing (thesis Fig. 5.9): person in yellow, drone in blue, ground robot in red. The drone traces the loop to keep the person in view while the ground robot cuts through the middle.
07 · Off the Screen
FORWARD-PF also ran on real hardware: a Clearpath Jackal running the same Phoenix autonomy stack, with a Velodyne VLP-16 LiDAR for SLAM and an Intel RealSense camera for detection, paired with a palm-sized Crazyflie 2.1 drone.
The hardware validation side by side with RViz (thesis Fig. 4.13): person in yellow, Jackal in red, Crazyflie in blue. The green-to-red shading is FORWARD-PF scoring candidate goals on the Jackal's live map.
The run from the corner of the lab: the Jackal works its way around a cardboard wall to reach the person.
The same run from inside the robot's head: the live occupancy grid, the tracked person, and the goals FORWARD-PF assigns in real time.
08 · Takeaways
The shortcut behavior wasn't designed. It fell out of splitting "see the person" and "reach the person" across two platforms. That, more than any single algorithm, is the main result.
FORWARD-PF finished all 9 paths to MARL's 7 and arrived about twice as fast. It also took significantly more time and effort to build than training and deploying the MARL model. FORWARD-PF is dependable and consistent; the learned policy got most of the way there for far less engineering. Which to use depends on the job.
MARL's failures were mostly collisions on the hardest paths, traced to stretching a model trained in a 2D toy world across a cluttered 3D one. Robust domain adaptation, and knowing when a pre-trained policy is ready for a new platform, is where I'd push next.
Every successful two-robot run kept the person in view at least 71% of the time, and both MARL failures fell below 20%. How much visibility a team needs to succeed is an open question this work raises.
This thesis measured robustness and efficiency, not how it feels to be followed by two robots. As robots share more spaces with people, methods designed and evaluated with that person in mind are the natural next step.