How do you teach two very different robots to follow one person?

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.

Heterogeneous Multi-Robot Person-Following in Constrained Environments
M.S. Thesis, University of Denver, August 2024 · Advisor: Dr. Christopher Reardon
Published as Miller, Gregory & Reardon, IEEE SSRR 2024, New York City

What this project exercised

Multi-agent RL (MADDPG) Sim-to-real transfer Person detection & tracking LiDAR–camera fusion EKF state estimation Motion prediction SLAM & path planning Multi-robot task allocation ROS · Unity · PettingZoo

It started as a robot that could play tag

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.

camera field of view 2D LiDAR 4 m range TurtleBot within 4 m camera bearing + LiDAR range beyond 4 m range from bounding-box size

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.

Line chart of estimated versus ground-truth distance from the robot to a person stepping closer over 30 seconds; the estimate tracks the ground-truth staircase within roughly a meter

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?"

Crazyflie micro-drone and TurtleBot ground robot on the lab floor
The first team on the lab grid: a Crazyflie micro-UAV (left) and a TurtleBot (right).
TurtleBot ground robot with lidar
The TurtleBot up close: 2D LiDAR on top, camera up front, not built for speed.
Ori Miller presenting the ground-air cooperative tracking research poster
Presenting this early ground-air tracking work at DU, including the camera-only range estimate.
The ARISE Lab robot fleet including ground robots, drones, and AR headsets
The ARISE Lab fleet at the University of Denver, where this research lived.

Robots that follow people are useful — until the person turns a corner

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.

Search & Rescue Healthcare Military Teaming 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:

obstacle line of sight blocked ground robot person didn't wait ?

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.

1

Occlusion

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.

2

Speed

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.

3

No prior knowledge

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.


Pair an odd couple: a thinker and a scout

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:

The Follower

Ground robot · UGV

Slow but capable — carries the payload, the sensors, and the compute. Its job: physically reach the person's position.

The Observer

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.

The Target

Person

Walks their own path to their own destination — faster than the ground robot, with zero obligation to cooperate.

The speed ordering that shapes everything UGV < Person < UAV

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.


Who decides where each robot goes?

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.

Strategy 1 · FORWARD-PF (heuristic)

The forecaster: predict, score, assign

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:

1

Model the person's motion

Fit a third-degree polynomial to the person's recent positions — a smooth curve describing where they've been heading.

2

Project it forward

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."

3

Score a grid of candidate spots

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.

4

Send each robot to its best spot

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.

obstacle UAV goal UGV goal person observed trail predicted motion cloud high score medium low score

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.

Under the hood: the scoring math
Tracking the person
Camera detections are projected onto the shared map and filtered with an extended Kalman filter over position and velocity to suppress sensor noise.
Motion model
A cubic polynomial P(t) is fit to the filtered positions over a sliding position-history window, then sampled once per second out to the time horizon z. Each predicted point seeds 10 Gaussian samples (σ = 0.9 m, tuned to the obstacle spacing), giving the motion cloud Fp(z).
Follower score (lower is better)
Distance from candidate cell c to the center of the predicted cloud. In simulation, the goal was to get within a 5 m buffer of the person. follower(c) = ‖ c − avg(Fp(z)) ‖₂
Observer score (higher is better)
How many predicted points are visible from c (raycast against the live occupancy grid), minus how far c strays from the preferred stand-off distance ds (10 m in simulation). observer(c) = los(c, Fp) − | ds − ‖ c − avg(Fp(z)) ‖₂ |
Keeping the camera on target
While it moves, the drone yaws to face the person's current position. θgoal = atan2(Ty − Uy, Tx − Ux)
Avoiding dithering
Each cycle, a robot's current goal is re-scored against the updated map and person position. It is only re-tasked if a new candidate actually beats it, so the robots don't twitch between near-equal cells.
Top-down simulation view showing the drone's visible area as a translucent blue cone, a cloud of black dots for the person's possible future positions, and the chosen goals for drone and ground robot

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.

Strategy 2 · Multi-Agent RL

The learner: let the robots figure it out

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.

2D particle world (MPE) obstacles target follower observer sim-to-real 3D world, real robots non-holonomic UGV UAV

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:

10 Hz 1 s average
Gap 1 · Actions

Discrete moves → smooth driving

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.

Gap 2 · Observations

Any number of obstacles → a fixed-size input

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.

~100 × 100 m 2 × 2 [−1, 1]
Gap 3 · Scale

A 2 × 2 training box → a 100 m world

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.

Two RViz views of the simulator showing colored spheres on the nearest obstacle in each sector around the ground robot and the drone, plus a green action vector on the ground robot

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.

Baseline · Closed-loop point-and-shoot

The sprinter: just aim at the person and drive

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.


Nine paths, three levels of chaos

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.

Top-down view of the simulated village environment with nine numbered person paths drawn in dashed, dot-dashed, and solid lines, and three blue starting locations

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.

Success rate — did the UGV reach the person's final position? Arrival time — how long after the person stopped? Time in view — % of the run with eyes on the person Cumulative & max distance — how efficient was the route?

The forecaster beat the learner — and both crushed the baseline

Point-and-Shoot MARL FORWARD-PF
Success rate by path difficulty 100% 67% 33% 0% 100100100 Easy paths 0 100100 Medium paths 0 33 89 Hard paths

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 viewP1P2P3P4P5P6P7P8P9
Point-and-Shoot0.610.85*0.48*0.510.35*0.38*0.690.24*0.34*
MARL1.000.711.001.001.000.14*1.000.960.20*
FORWARD-PF0.981.001.001.001.000.981.000.970.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)P1P2P3P4P5P6P7P8P9
Point-and-Shoot21.2——30.6——19.4——
MARL84.965.227.986.977.7—91.476.4—
FORWARD-PF43.930.97.656.955.043.146.075.915.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.

The unexpected bonus: shortcuts

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.

person's winding route UAV shadows them UGV cuts straight through start end

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.

Top-down simulation trajectories: the person's yellow path loops around a building, the drone's blue path traces the loop, and the ground robot's red path cuts through the middle

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.


Real robots, real lab

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.

Side-by-side of the lab: on the left a person, the Jackal ground robot, and the Crazyflie drone near a cardboard wall, circled in yellow, red, and blue; on the right the matching RViz occupancy grid with scored candidate goals

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.

What this was, and wasn't. This was a validation, not a full experiment. The Crazyflie's onboard localization drifted and its 320×320 grayscale camera was too unreliable for detection, so an OptiTrack motion-capture system provided positions, and the team received the person's true position whenever the Jackal's map showed a clear line of sight. That kept the runs inside the lab. Only FORWARD-PF was flown: the MARL policy was too unpredictable to run around people. It shows the system works on hardware; it isn't evidence of how well it works there. A more capable drone is the obvious next step.

What I'd tell you over coffee

1

Heterogeneous teams unlock behavior neither robot has alone

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.

2

The method that scores best isn't automatically the right choice

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.

3

Sim-to-real was the bottleneck, not learning

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.

4

Visibility predicts success

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.

5

The person being followed matters too

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.

If you cite this work:
O. A. Miller, "Heterogeneous Multi-Robot Person-Following in Constrained Environments," M.S. thesis, Dept. of Computer Science, University of Denver, Denver, CO, USA, Aug. 2024.

O. A. Miller, J. M. Gregory, and C. Reardon, "Heterogeneous Multi-Robot Person-Following in Constrained Environments," 2024 IEEE International Symposium on Safety, Security, and Rescue Robotics (SSRR), New York City, USA, Nov. 2024.