Navigation and exploration
Notes on the decision layers of an autonomous drone: given a pose estimate and a map (the subject of VIO and SLAM), how the vehicle decides where to go and how to get there safely. Companion to the earlier system-design notes, which chose an architecture; this one surveys the field the way the VIO/SLAM notebook does.
Core take: once a goal is chosen, flying to it is mature engineering; choosing the goal is the open problem. Finding a route through a mapped building, turning it into a smooth trajectory, and not hitting things on the way are solved problems with healthy open implementations. What remains genuinely open — and where an indoor-capture product differentiates — is deciding where the drone should go next. That decision comes in two distinct flavors: exploration (observe all the space) and capture planning (photograph all the surfaces, well). They look similar, optimize different quantities, and only the first has mature public solutions.
A second theme runs through everything below: no single planner can be both globally smart and instantly reactive, so the work is split into layers. Each layer solves a coarser version of the problem over a longer horizon, less often; the layer below fills in the detail faster. Most of the design judgment in a navigation stack is deciding what each layer is allowed to ignore.
The stack
Every deployed system decomposes the same way, whatever the vehicle:
| Layer | Question | Rate | Horizon |
|---|---|---|---|
| Mission / goal selection | what is worth visiting next? | 0.1–1 Hz | mission |
| Global planner | which route through known space? | 0.5–5 Hz | whole map |
| Local planner / trajectory optimizer | which dynamically feasible curve for the next few seconds? | 5–30 Hz | 2–10 m |
| Tracking controller | which attitude/thrust right now? | 100–500 Hz | one step |
| Flight controller | which motor commands? | 1 kHz | none |
Two structural facts about this table:
- Commands flow down, failures flow up. Each layer hands the one below a reference to follow — a route, a trajectory, an attitude — and receives back failure signals: blocked, infeasible, degraded. A stack is healthy when each failure is handled at the lowest layer able to absorb it: a newly seen obstacle should bend the local trajectory, not wake the mission planner.
- The layers assume different world models. The global planner reads the full (drifting, occasionally corrected) map; the local planner trusts only the recent, high-confidence neighborhood; the controller assumes free space entirely. This is why map jump-on-loop-closure semantics (REP-105
mapvsodomframes, covered in VIO and SLAM) are a planning-layer concern: layers above the local planner may see jumps, layers below must never.
For a quadrotor specifically, one property makes the whole stack tractable: differential flatness. A quadrotor’s full 12-dimensional state and its motor inputs can be recovered algebraically from just the position trajectory and yaw, plus their derivatives. Planners therefore never simulate the vehicle: they draw smooth curves in x, y, z, yaw, and checking that a curve is flyable reduces to bounding its derivatives (velocity, acceleration, jerk). A car offers no such shortcut — its no-sideways-motion constraint must be honored by the planner itself — which is why drone trajectory optimization is in some ways simpler than parking.
Global planning: routes through known space
Input: the map (occupancy or ESDF — Euclidean signed distance field, per-voxel distance to the nearest obstacle) and a goal. Output: a collision-free path, geometric only — no dynamics yet. Two families:
Search-based — discretize space, run graph search:
- A* on a grid/octree: optimal, complete, the default indoors where maps are volumetric anyway. JPS (Jump Point Search) exploits grid symmetry to run an order of magnitude faster with identical results; standard in drone stacks.
- D* Lite / incremental variants repair the previous solution when the map changes instead of replanning from scratch — historically important, less critical now that full A* on a house-sized map takes milliseconds.
Sampling-based — throw random configurations, connect feasible ones:
- RRT (rapidly-exploring random tree) and descendants — RRT* (asymptotically optimal), Informed RRT*, BIT* (batch informed trees); PRM (probabilistic roadmap) when many queries hit one static map. OMPL packages the whole family.
- Sampling planners earn their keep in high-dimensional configuration spaces (a 7-joint arm) or spaces too large to discretize. A drone searching 3D positions in a building-sized voxel map is neither: grid search is simpler, faster to reason about, and effectively optimal there. Sampling planners still show up in drone stacks (the VOXL SDK’s
voxl-mapperplans with a vendored RRT*) — more by lineage than by necessity.
One level of abstraction up sits topological planning: extract a sparse graph — rooms as nodes, doorways as edges — from the metric map, and route on that instead of on voxels. It is cheap at building scale, it is where semantic labels (“kitchen”, “hallway”) naturally attach, and a multi-room capture mission ends up needing exactly this graph anyway to order its work.
Compute is a non-issue at this layer: milliseconds per solve on one core at house scale. In fact the whole planning stack is cheap — the only decision-side layer with real compute weight is goal selection above it, where estimating what a candidate view would reveal means ray-casting the map thousands of times.
Local planning and trajectory optimization
The geometric path is not flyable: it has corners and no notion of time. The local layer converts it into a smooth, dynamically feasible, collision-free trajectory over the next few seconds, replanned continuously. The lineage that leads to the current defaults:
- Minimum-snap polynomials (Mellinger & Kumar 2011) — the founding result: with differential flatness, encode the trajectory as piecewise polynomials and minimize snap (4th derivative of position, a proxy for control effort); the optimization is a small QP (quadratic program). Everything since is about adding obstacles and time allocation.
- Safe flight corridors — carve a chain of overlapping convex regions (boxes or polyhedra) out of free space around the path, then constrain the trajectory inside them. Convex constraints keep the optimization fast and make safety auditable: trajectory inside corridor, corridor inside known-free space, done. FASTER (MIT) is the reference for doing this with a hard safety guarantee — it always maintains a committed backup trajectory ending in a stop inside known-free space.
- B-spline / gradient methods — represent the trajectory as a B-spline and push control points away from obstacles by descending the ESDF gradient. Fast-Planner (HKUST) is the classic kinodynamic-search-plus-B-spline pipeline; EGO-Planner (ZJU) made it ESDF-free — computing gradients only along the trajectory — cheap enough for a 20 g computer, and EGO-Swarm extended it to decentralized multi-drone.
- MINCO / GCOPTER (ZJU) — the current state of the art in trajectory representation: minimum control effort polynomials with waypoints and segment times jointly optimized through a clever sparse parameterization, corridors handled by diffeomorphic mapping. Most 2023+ academic planners build on it.
- MPC (model predictive control) — re-solve a short-horizon optimal control problem every cycle. The natural home for dynamic obstacles and aggressive tracking; heavier per-cycle, and the flat-output planners above cover most static-world needs without it.
Two concerns cut across all of these methods. Time allocation: deciding how many seconds each trajectory segment gets. Allocate too generously and the flight is slow; too tightly and the segment demands infeasible accelerations. Naive planners fix durations by heuristic and suffer either way; MINCO optimizes durations jointly with geometry, which is much of why it wins. Perception awareness: the trajectory determines what the camera sees, and the estimator (VIO) needs to see somewhere useful. In practice this means scheduling yaw so the camera faces the direction of travel (new obstacles) or feature-rich structure (tracking quality), rather than letting yaw be an afterthought.
Compute: the entire local layer is CPU-light by design — EGO-class planners report sub-millisecond replans, corridor QPs take single-digit milliseconds. Like VIO, this layer is never why you buy a bigger computer; budget well under one core at 10–30 Hz replanning.
Safety: the layers under the planner
Obstacle avoidance is not one mechanism but a hierarchy of increasingly dumb, increasingly trustworthy fallbacks — designed so that each catches the failures of the smarter layer above:
- The planner itself — trajectories constrained to known-free space with an inflation margin (obstacle cells grown by vehicle radius plus stopping distance plus pose uncertainty — the derivation our collision-margin lesson works through). The subtle rule for unknown space: unknown is not free. A safe planner only commits to trajectories it can stop within space already observed to be free — FASTER’s committed-backup formalizes this.
- Reactive avoidance — a fast loop consuming raw depth or a local ESDF, bending or braking the current trajectory when something appears where the map said nothing was. Dynamic obstacles (people, pets — guaranteed in an occupied house) live here: velocity-obstacle methods or simply generous margins plus braking, since houses leave no room for elegant evasion.
- Autopilot-level guards — PX4/ArduPilot collision prevention: rangefinder or
DISTANCE_SENSOR-fed speed limiting and hard stops near obstacles, working even when everything above is dead. ModalAI’s VOA (Voxl Obstacle Avoidance) invoxl-vision-hubis this tier. - Failsafes — offboard-link-loss, geofence, battery: land or hold. Not avoidance, but the reason a planner bug is an abort, not a crash.
The architectural principle from the system-design notes bears repeating here because the literature quietly assumes it: layers 2–4 must run on the vehicle. A planner on a ground station may command; nothing off-board may be load-bearing for not hitting the wall.
Exploration: choosing where to look next
The first of the two goal-selection problems. Exploration is goal selection when the map is incomplete: repeatedly pick the motion that reveals the most unknown space, until nothing reachable remains unknown. Every method is built from the same three ingredients — generate candidate goals, estimate the gain of each, order the visits — and methods differ mainly in which ingredient they invest in:
Frontier-based (Yamauchi 1997, still the backbone): a frontier is a boundary cell between observed-free and unknown. Cluster frontiers, pick one (nearest, biggest, cheapest), go, repeat. Complete by construction — no frontiers left means nothing reachable remains unseen — and greedy by nature, which costs travel distance.
Sampling / next-best-view: sample candidate viewpoints, score each by expected information gain (unknown voxels visible from there, weighted by sensor model), pick the best. The receding-horizon variant (NBVP, ETH 2016) grows an RRT of viewpoints, executes only the first edge of the best branch, and regrows — handling the fact that the map changes underfoot. Gain evaluation (ray-casting from every candidate) is the expensive step and the reason this layer, unlike planning, can eat a core.
Hierarchical hybrids — the current state of the art. Greedy frontier chasing wastes travel (it ping-pongs across the building as the “nearest” frontier flips); deep view-tree lookahead pays exponentially for foresight. Modern planners escape the dilemma by splitting the problem by scale — global visit order computed cheaply over the whole map, motion optimized expensively only nearby:
- FUEL (HKUST 2021) maintains incremental frontier information and solves a TSP (traveling salesman problem) over frontier clusters for global tour order, then optimizes an aggressive local trajectory toward the next one. The quantitative reference for fast single-drone exploration.
- TARE (CMU 2021) — coarse global coverage tour over a sparse representation, fine trajectory only inside a local horizon. Ground-robot-born, the other standard baseline.
- The 2024–2026 crop refines the same recipe — better frontier structures, omnidirectional sensing, spatio-temporal candidate memory (FSMP, OPAL, STExplorer) — without changing the shape: frontiers + gain + tour.
Multi-robot extends the tour problem to task allocation (RACER, decentralized pairwise workload partition); relevant to us only as evidence the single-drone formulation is stable.
Caveats that matter in practice: published comparisons run in favorable sim worlds, and house interiors — doorway bottlenecks, mirrors, furniture clutter — degrade all of these systems. And “exploration complete” means every voxel got classified, not that every surface got photographed well — the gap the next section is about.
Capture planning: coverage of surfaces, not space
Exploration’s objective — no unknown voxels — is the wrong objective for reconstruction. A room can be fully explored while half its surfaces were seen exactly once: obliquely, from across the room, motion-blurred. Reconstruction needs every surface observed well — close enough, head-on enough, from several angles, with overlap between shots — and no exploration planner optimizes for that. The planning problem that does appears in the literature under several names:
- Coverage path planning (CPP) — geometry known in advance, compute a sweep (lawnmower passes, orbits). The mature, boring case: bridge inspection, agriculture. Indoors it applies only after a first pass has produced geometry — which is exactly what a two-pass architecture exploits.
- NBV for reconstruction — the online version: score candidate views by expected reconstruction gain (poorly observed surface area, grazing-angle penalties, revisit needs) instead of unknown-voxel count. The surface- quality ledger from the system-design notes — per-surface-patch view count, best angle, best distance, blur — is precisely the data structure this planner reads.
- Active reconstruction in the radiance-field era (the lively 2024–2026 thread): when the online map is the photometric model — 3DGS (3D Gaussian Splatting) — view gain can be computed in the target representation itself, e.g. Fisher information over Gaussian parameters (AG-SLAM), Shannon mutual information (GauSS-MI), or rendering- completeness heuristics (ActiveSplat, ActiveGS, HGS-Planner). The promise over voxel-gain NBV: the planner optimizes what the final product actually is — rendered image quality — closing the loop that classical pipelines leave open between “covered” and “reconstructs well”. Compute today is desktop-GPU class, so on our architecture this planner lives PC-side, commanding the drone over the offboard link.
The two objectives map directly onto mission structure: explore first (fast, gain = unknown space), then capture (deliberate, gain = surface quality), then verify (re-render or re-project the model and hunt for holes). GLEAM-class learned exploration policies (the Week-1 GLEAM report) solve only the first phase. The capture phase on house interiors has no off-the-shelf solution — the same gap the landscape survey’s autonomy scorecard found when approaching from the product side.
Planning under uncertainty, and active SLAM
Everything above quietly assumed the pose is right and the map is rigid. Over a whole-house mission neither holds (drift is structural), and there are two disciplined responses:
- Inflate for uncertainty. Fold pose covariance into the obstacle margin — fly wider when less sure. Cheap, local, and the reason the margin derivation treats uncertainty as a first-class term. The subtle failure it guards against: a doorway that is passable at 5 cm pose error and a wall strike at 20 cm.
- Plan to stay localized — active SLAM. Treat estimator health as part of the objective: prefer trajectories through feature-rich, well-mapped space; schedule deliberate revisits of mapped regions so loop closures fire before drift corrupts the map, not after; penalize candidate views whose approach crosses texture deserts. Formally this is belief-space planning over pose uncertainty; practically, deployed systems use heuristics — revisit intervals, localization-quality costmaps, perception-aware yaw. The AG-SLAM-style objectives above (gain minus localization risk) are the same idea in the 3DGS setting.
For a capture product the two pressures happen to align: capture already wants revisits (surfaces need views from multiple angles), and revisits are exactly what loop closure needs. Order the capture tour with the estimator in mind and drift correction comes nearly free. This is a real argument for one planner that owns both objectives, rather than an off-the-shelf exploration library with a capture pass bolted on top.
Systems worth knowing by name
| System | Layer | License | Note |
|---|---|---|---|
| Nav2 | full stack (ground) | Apache-2.0 | The ROS 2 reference navigation architecture (behavior trees over global/local planners). Read it for the structure; its planners are ground-robot 2D, not flight code |
| OMPL | global planning | BSD-3 | The sampling-planner library (RRT*/PRM/BIT* and dozens more) |
| Fast-Planner | local planning | GPL-3.0 | Classic kinodynamic search + B-spline pipeline |
| EGO-Planner / EGO-Swarm | local planning | GPL-3.0 | ESDF-free gradient planner; the lightweight default; swarm variant decentralized |
| GCOPTER (MINCO) | trajectory optimization | MIT | State-of-the-art trajectory representation; base of most 2023+ planners |
| FASTER | local planning | BSD-3 | Hard safety via committed backup trajectories in known-free space |
| NBVP | exploration | BSD-3 | The receding-horizon next-best-view original; a baseline now |
| FUEL | exploration | GPL-3.0 | Incremental frontiers + TSP tour + aggressive local trajectories; the quantitative reference |
| TARE | exploration | BSD-like (custom) | Hierarchical coarse-global/fine-local coverage; CMU, ground-born |
| RACER | multi-robot exploration | GPL-3.0 | Decentralized workload partition over FUEL machinery |
| GLEAM | learned exploration | CC BY-NC 4.0 | RL goal-selection policy generalizing across 1000+ indoor scenes; sim benchmark GLEAM-Bench |
voxl-mapper / voxl-vision-hub |
mapping + local planning | BSD-3 (ModalAI clause) | voxblox + vendored RRT*/loco planners + VOA reactive tier on VOXL; no exploration layer |
| Isaac ROS / nvblox + planners | mapping + planning | NVIDIA proprietary, free | GPU mapping feeding Nav2-style planning; Jetson-native path |
Selection logic mirrors the estimation chapter: the planning and exploration layers are healthy open code (mind the GPL where it matters); the capture layer is not on this table because nothing shippable exists to put there.
Fit to the indoor capture project
- Adopt, don’t write, everything below the goal. Global search, corridor or gradient local planning, and the safety hierarchy are commodity layers with multiple open implementations; on VOXL some of it (voxblox mapping, RRT* local planning, VOA) already ships. Writing our own trajectory optimizer would be recreational.
- The product lives in the goal-selection layer, and it is two planners, not one. Exploration (space) has strong open baselines — FUEL/TARE-class classical, GLEAM-class learned — and should be selected, not invented. Capture (surface quality) has no off-the-shelf answer: the coverage-ledger NBV planner, its termination criterion (“this house is done”), and its interaction with estimator health are the parts a competitor cannot download.
- The two-pass architecture keeps being right. Recon pass = exploration objective, onboard-safe, conservative; capture pass = coverage objective, PC-planned over the recon map, still onboard-guarded. The 3DGS-era active reconstruction results reinforce it: the heavy view-gain computation belongs off-board, and its output is goals, never trajectories.
- Mission-level state is a first-class artifact. Frontier sets, the coverage ledger, tour order, revisit schedule — persistent, inspectable, resumable after battery swaps. The literature’s single-battery missions quietly skip this; a product cannot.
- Near-term experimental path: B2’s occupancy/planning scaffold → frontier selection over it (B4’s photo-coverage metric as gain) → a small frozen exploration benchmark in Isaac/Pegasus scenes → swap in FUEL-style tour ordering and a GLEAM policy as comparisons on the same metric. That reproduces the field’s evaluation loop on our fixtures before any hardware flight.
References
Foundations:
- Yamauchi 1997, frontier-based exploration
- Mellinger & Kumar 2011, minimum-snap trajectories
- Bircher et al. 2016, receding-horizon NBV planning
- LaValle, Planning Algorithms — the free textbook for the search/sampling half.
Trajectory planning:
- FASTER — hard safety in unknown space.
- EGO-Planner and GCOPTER/MINCO — the current defaults.
- Fast-Planner
Exploration:
- FUEL and TARE — the two standard baselines; RACER for the multi-drone extension.
- FSMP, OPAL — representative 2025–2026 refinements.
- Decision-making-based path planning for UAVs: a survey
Active reconstruction and learned goal selection:
- AG-SLAM, ActiveSplat, GauSS-MI — 3DGS-era active capture.
- GLEAM and the local Week-1 evaluation.
- awesome-NeRF-and-3DGS-SLAM — maintained index of the radiance-field SLAM/active-mapping literature.
Learned flight:
- Kaufmann et al. 2023, champion-level racing (Swift)
- Loquercio et al. 2021, agile flight in the wild
- Vision-based learning for drones: a survey; UAV vision-and-language navigation roadmap; See, Point, Fly
Related notes: VIO and SLAM for the estimation layer below this one, system-design notes for the architecture decisions, the NVIDIA Isaac ecosystem and VOXL 2 Mini for what candidate platforms ship, and the flight compute landscape for who else is attacking the same problem.