Learning-Based Methods (AI Navigation)
Seven phases built the classical machine. This one asks, module by module, whether a neural network does the job better — and keeps score honestly: some answers are "yes, shipped years ago", some are "promising", and some are "not without a classical safety net".
8.1Where Learning Plugs In
"AI navigation" is not one idea; it is five distinct surgeries on the classical pipeline, each replacing a different organ. Sorting any paper or product claim into the right slot is half the literacy this phase teaches:
8.2Learned Front-Ends: SuperPoint, LightGlue, DROID-SLAM
Phase 2’s visual front-end had two handcrafted organs — detect features, match features — and both fell to networks first. SuperPoint detects interest points and descriptors in one forward pass, trained by self-supervision: synthetic corners bootstrap a detector, then "homographic adaptation" (aggregating detections over many random warps of real images) labels its own training data — no human annotation, and dramatically better repeatability than ORB under lighting and viewpoint change. SuperGlue replaced nearest-neighbor descriptor matching with a graph neural network doing cross-image attention — matching becomes a joint assignment problem informed by geometry-ish context — and LightGlue made it fast enough for real-time SLAM by letting easy pairs exit early. The pragmatic 2026 recipe for a robust visual front-end is literally: ORB-SLAM3’s architecture, SuperPoint + LightGlue features, classical RANSAC verification unchanged.
DROID-SLAM goes deeper: instead of replacing pieces, it makes the whole visual-SLAM loop differentiable. A recurrent GRU repeatedly predicts dense optical-flow revisions between keyframes, and each iteration ends in a dense bundle adjustment layer — a real Gauss-Newton solve over poses and per-pixel depth, implemented as a differentiable operator, so the network learns flow that makes geometry converge:
DROID-SLAM update, per iteration:
flow revision + confidence ← GRU(correlation features, current estimate)
poses, depths ← dense BA: argmin Σ ‖ predicted_flow − flow(T, d) ‖²_Σ
(a real damped Gauss-Newton step — Phase 1.8 as a layer)
the network never outputs poses; it outputs measurements FOR the optimizer.
that division of labor is why it generalizes across cameras and datasets.
DeepMapping 2.0 applies the same philosophy to lidar: registration of large point-cloud collections as self-supervised optimization, with networks providing the data association that classical ICP guesses by proximity. The pattern across all of these — networks propose, optimizers dispose — is Phase 4’s funnel again, and it is the single most reliable design rule in learned robotics.
| System | Replaces | Trained by | Classical part kept |
|---|---|---|---|
| SuperPoint | ORB/SIFT detection | self-supervision (homographic adaptation) | everything downstream |
| SuperGlue / LightGlue | NN descriptor matching | supervised matches, attention GNN | RANSAC + pose solvers |
| DROID-SLAM | the whole VO/VSLAM front half | end-to-end through a differentiable BA layer | bundle adjustment itself — as a layer |
| DeepMapping 2.0 | ICP’s data association at map scale | self-supervised registration objectives | the optimization backbone |
8.3Neural Maps: NeRF and 3D Gaussian Splatting SLAM
Phase 3 stored the world as grids and distance fields. The neural alternative stores it as a function you can render: give me a camera pose, I give you the photograph. NeRF represents the scene as an MLP mapping position and view direction to density and color, rendered by integrating along rays; 3D Gaussian Splatting represents it as millions of explicit anisotropic Gaussians, rendered by rasterizing them — orders of magnitude faster, which is what made real-time SLAM on these representations plausible:
NeRF render (per pixel, sample points along the ray):
C = Σᵢ Tᵢ·(1 − exp(−σᵢδᵢ))·cᵢ, Tᵢ = exp(−Σ_{j<i} σⱼδⱼ)
→ tens–hundreds of MLP queries per pixel: photoreal, slow
3DGS render: project each Gaussian, sort, alpha-composite front-to-back
→ pure rasterization: real-time, and the map is explicit and editable
neural SLAM = tracking (optimize T against the render: "photometric ICP")
+ mapping (optimize the representation from posed views)
The SLAM systems: Nice-SLAM and Vox-Fusion anchor neural implicit features in voxel grids for RGB-D dense mapping (the hierarchical-grid trick that made implicit SLAM tractable at room scale); SplaTAM and GS-SLAM do tracking-and-mapping directly on Gaussian splats, exploiting rasterization speed and per-Gaussian silhouette masks to know what the map does and doesn’t yet explain. What these buy over TSDF maps: photorealism (sim-and-rehearse anywhere, appearance-based relocalization for free) and continuous, differentiable geometry. What they still owe: mature loop-closure handling (deforming a splat field after Phase 3’s jump is an open craft), large-scale memory management, and the honest admission that for a planner’s "how far is the wall", Phase 3’s ESDF remains the cleaner answer. Watch this space per quarter, not per decade.
8.4Deep RL for Local Navigation
Phase 5’s local planners optimize a hand-written cost at runtime. Deep reinforcement learning moves the optimization offline: train a policy π(action | observation) across millions of simulated episodes, then run it as a cheap forward pass. The formulation is the standard MDP, and two algorithms carry the field — PPO, whose clipped objective keeps policy updates conservatively close to the data-collecting policy (stable, forgiving, the default), and SAC, whose entropy bonus keeps exploration alive (sample-efficient off-policy learning):
objective: max_θ E[ Σₜ γᵗ r(sₜ, aₜ) ] reward: progress − collision
− jerk − social margins…
PPO: maximize E[ min( ρₜAₜ, clip(ρₜ, 1±ε)·Aₜ ) ], ρₜ = π_θ/π_old
→ never trust one batch enough to leap far. boring. works.
the real enabler is the simulator: Isaac Gym/Lab runs 10,000+ environments
on one GPU — months of robot-time per wall-clock hour — and sim-to-real is
bridged by domain randomization: train across randomized physics, sensor
noise, and layouts until reality is just another sample.
Where DRL genuinely earns its complexity in navigation: dense dynamic crowds, where costmap-based planners freeze (Phase 5’s warfield) but a policy trained among simulated pedestrians learns anticipatory, socially-plausible motion; mapless goal-seeking from raw sensors when maps are unavailable; and legged locomotion (adjacent, and the field’s clearest DRL success). Where it doesn’t: anywhere a Phase 5 stack already meets spec — the classical planner is debuggable, verifiable, and parameter-changeable in the field, and a policy is none of those. Production deployments therefore wrap policies in classical clothing: a safety monitor (velocity limits, lidar-based emergency stop) that the network cannot override, and a fallback planner when the policy’s inputs go out of distribution.
8.5Neural Planners: MPNet, Neural A*, VIN
Between "hand-written planner" and "end-to-end policy" sits the most transferable idea of this phase: learn the proposal, keep the guarantee. MPNet trains a network to propose the next configuration toward the goal, plugged into a classical framework that collision-checks every proposed segment and falls back to sampling when the network stalls — so it inherits RRT-grade completeness while cutting planning time by large factors in learned domains. Neural A* learns the guidance map (effectively a heuristic field) through a differentiable A* relaxation, so search effort concentrates where paths actually go — the trained heuristic pays for itself in expansion counts, exactly the currency Setup A of Phase 5 measured. Value Iteration Networks made the founding observation: value iteration on a grid is a convolution (each cell’s value updates from its neighbors) iterated k times, so a planner can live inside a network as a differentiable module and be trained through:
value iteration (what VIN unrolls as conv layers):
V_{k+1}(s) = min_a [ cost(s, a) + V_k(next(s, a)) ]
→ k sweeps of a 3×3 min-convolution ≈ shortest-path field
→ Setup A implements the real thing; VIN learns cost(s,a) end-to-end
Setup A: value iteration, the algorithm VIN bakes into a network — one evening, zero dependencies. Goal: run real value iteration on a gridworld, watch the cost-to-go field flow around obstacles, and extract the greedy policy — the exact computation VIN’s conv layers approximate. Save as vi.cc, compile with g++ -O2 -std=c++17 vi.cc -o vi:
// vi.cc — value iteration on a grid: the planner inside VIN, run honestly.
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
std::vector<std::string> map = {
"........................",
"..####......##########..",
"..#..........#.......#..",
"..#..######..#..####..#..",
"..#..#....#..#..#..#..#..",
"S.#..#.G..#.....#..#....",
"..#..#....#######..#..#..",
"..#..######........#..#..",
"..#.........########..#..",
"..####................#..",
"........................",
};
const int H = map.size(), W = map[0].size();
int gx, gy, sx, sy;
for (int y = 0; y < H; ++y) for (int x = 0; x < W; ++x) {
if (map[y][x] == 'G') { gx = x; gy = y; }
if (map[y][x] == 'S') { sx = x; sy = y; }
}
const double INF = 1e9;
std::vector<double> V(W * H, INF);
V[gy * W + gx] = 0.0;
const int DX[4] = {1, -1, 0, 0}, DY[4] = {0, 0, 1, -1};
int sweeps = 0;
for (bool changed = true; changed; ++sweeps) { // V ← min(1 + V')
changed = false;
for (int y = 0; y < H; ++y) for (int x = 0; x < W; ++x) {
if (map[y][x] == '#') continue;
for (int a = 0; a < 4; ++a) {
const int nx = x + DX[a], ny = y + DY[a];
if (nx < 0 || ny < 0 || nx >= W || ny >= H || map[ny][nx] == '#') continue;
if (1.0 + V[ny * W + nx] < V[y * W + x] - 1e-12) {
V[y * W + x] = 1.0 + V[ny * W + nx];
changed = true;
}
}
}
}
std::cout << "converged after " << sweeps << " sweeps (VIN: k conv layers)\n\n";
auto shade = [&](double v) { // render the field
const char* ramp = "@%#*+=-:. ";
return (v >= INF) ? '#' : ramp[std::min(9, int(v / 5))];
};
auto shown = map; // greedy rollout
for (int x = sx, y = sy; !(x == gx && y == gy);) {
int ba = -1; double bv = INF;
for (int a = 0; a < 4; ++a) {
const int nx = x + DX[a], ny = y + DY[a];
if (nx < 0 || ny < 0 || nx >= W || ny >= H || map[ny][nx] == '#') continue;
if (V[ny * W + nx] < bv) { bv = V[ny * W + nx]; ba = a; }
}
x += DX[ba]; y += DY[ba];
if (shown[y][x] == '.') shown[y][x] = 'o';
}
for (int y = 0; y < H; ++y) {
for (int x = 0; x < W; ++x) std::cout << shade(V[y * W + x]);
std::cout << " " << shown[y] << "\n";
}
}
Expected: the left field renders cost-to-go flowing outward from G like heat — around walls, through gaps, brightest far away — and the right map shows the greedy path S→G descending that field. Note the sweep count: information propagates one cell per sweep, which is exactly why VIN needs k conv layers to plan k steps deep, and why VIN-style planners struggle on large maps — the depth of the network is the planning horizon. That single observation is the honest summary of neural planning’s scaling problem.
Sanity checks: (1) close the lower gap in the wall and rerun — the field re-routes and the sweep count grows: horizon follows geometry. (2) Make diagonal moves legal at cost 1.4 and watch the field turn from diamonds to circles — the cost model shapes everything (Phase 5’s lesson, recurring). (3) Add a "mud" cell type with step cost 3 — this per-cell cost field is precisely what Neural A* learns from data instead of being told.
8.6Vision-Language-Action: Navigation You Can Talk To
The newest surgery replaces the goal specification. Classical stacks navigate to coordinates; VLA-era systems navigate to meaning: "find the office coffee machine" with no coordinate, no prior detection class list, often no prior map. The enabling artifact is the pretrained vision-language embedding (CLIP and descendants): images and text in one space, so "does this camera view contain a coffee machine" becomes a dot product — zero-shot, no robot-specific training. CLIP on Wheels established the recipe: classical exploration (frontier-based, Phase 3’s unknown-space logic) + CLIP saliency deciding which frontier smells like the target. VLFM matured it: build the occupancy map as usual, score each frontier with a vision-language model’s similarity between the view toward it and the query, and go — zero-shot semantic navigation that wins ObjectNav benchmarks while remaining, structurally, a Phase 3+5 stack with a learned scoring function:
Beyond navigation-specific systems sit the generalist robot policies: OpenVLA and Octo, transformers pretrained on hundreds of thousands of robot episodes, mapping images + language directly to actions, fine-tunable to new embodiments. Today their center of gravity is manipulation; their trajectory matters to navigation because the interface — "language in, behavior out, one model across robots" — is a plausible endgame for the whole goal-specification layer. The literate position: track them, benchmark them, and hold them to the same standard as everything else in this chapter — what happens when they’re wrong, and who catches it?
| System | Kind | What it does zero-shot | Classical spine kept |
|---|---|---|---|
| CLIP on Wheels (CoW) | zero-shot object nav | find category X in a novel scene | frontier exploration, classical planner |
| VLFM | VL frontier scoring | semantic goal-seeking, SOTA ObjectNav | occupancy map, frontiers, A* |
| Octo | generalist policy (open) | manipulation from language + images | none — policy is the stack |
| OpenVLA | 7B open VLA | fine-tunable manipulation skills | none — policy is the stack |
8.7What Survives Contact With Reality
The deployment scorecard, module by module, as of this book’s writing:
| Learned component | Status | Failure containment |
|---|---|---|
| Features & matching (8.2) | shipped — use by default where compute allows | RANSAC/optimizer vetoes bad proposals — fails soft |
| Place recognition (Ph 4.5) | shipped | geometric verification gate — fails soft |
| Semantic segmentation for dynamics (Ph 7.6) | shipped | missed detections degrade, not break |
| Neural maps (8.3) | promising — real products emerging | keep a classical ESDF beside it for planning |
| DRL local policies (8.4) | niche-proven (crowds, legs) | hard safety monitor + classical fallback, non-negotiable |
| Neural planners (8.5) | research-mature, deployment-rare | classical collision checking on every proposal |
| VLA / generalist policies (8.6) | frontier | an open research question — treat accordingly |
Setup B: REINFORCE on a gridworld — one evening, zero dependencies. Goal: train a navigation policy from scratch with vanilla policy-gradient RL — reward in, behavior out, no labels — and watch both the magic (it learns) and the pathologies (variance, seed-sensitivity) that PPO exists to tame. Save as pg.cc, compile with g++ -O2 -std=c++17 pg.cc -o pg:
// pg.cc — REINFORCE with a baseline on a walled gridworld. Pure C++.
#include <algorithm>
#include <cmath>
#include <iostream>
#include <random>
#include <vector>
const int N = 8; // 8×8 world
bool blocked(int x, int y) { // a wall with one gap
return x == 4 && y != 6 && y >= 2;
}
int main() {
std::mt19937 rng(2);
std::uniform_real_distribution<double> U(0.0, 1.0);
// tabular policy: logits[state][action], actions = E,W,N,S
std::vector<std::array<double, 4>> th(N * N, {0, 0, 0, 0});
const int DX[4] = {1, -1, 0, 0}, DY[4] = {0, 0, 1, -1};
const double alpha = 0.05, gamma = 0.98;
double baseline = 0.0;
for (int ep = 1; ep <= 4000; ++ep) {
int x = 0, y = 0;
std::vector<int> S, A; std::vector<double> R;
for (int t = 0; t < 60; ++t) { // rollout
const int s = y * N + x;
double e[4], z = 0.0; // softmax over logits
for (int a = 0; a < 4; ++a) z += (e[a] = std::exp(th[s][a]));
double u = U(rng) * z; int a = 0;
while (a < 3 && u > e[a]) u -= e[a], ++a;
int nx = x + DX[a], ny = y + DY[a];
double r = -0.05; // small step penalty
if (nx < 0 || ny < 0 || nx >= N || ny >= N || blocked(nx, ny)) {
nx = x; ny = y; r = -0.25; // bump
}
S.push_back(s); A.push_back(a);
x = nx; y = ny;
if (x == N - 1 && y == N - 1) { R.push_back(10.0); break; }
R.push_back(r);
}
double G = 0.0; std::vector<double> Gs(R.size());
for (int t = int(R.size()) - 1; t >= 0; --t) Gs[t] = G = R[t] + gamma * G;
baseline += 0.01 * (Gs[0] - baseline); // running-mean baseline
for (size_t t = 0; t < S.size(); ++t) { // ∇ log π · (G − b)
double e[4], z = 0.0;
for (int a = 0; a < 4; ++a) z += (e[a] = std::exp(th[S[t]][a]));
for (int a = 0; a < 4; ++a) {
const double grad = (a == A[t] ? 1.0 : 0.0) - e[a] / z;
th[S[t]][a] += alpha * grad * (Gs[t] - baseline);
}
}
if (ep % 500 == 0) { // evaluate greedily
int gx = 0, gy = 0, steps = 0;
while (!(gx == N - 1 && gy == N - 1) && steps < 64) {
const int s = gy * N + gx;
const int a = std::max_element(th[s].begin(), th[s].end()) - th[s].begin();
const int nx = gx + DX[a], ny = gy + DY[a];
if (nx < 0 || ny < 0 || nx >= N || ny >= N || blocked(nx, ny)) break;
gx = nx; gy = ny; ++steps;
}
std::cout << "ep " << ep << " baseline " << baseline
<< " greedy: " << (gx == N - 1 && gy == N - 1 ?
"reaches goal in " + std::to_string(steps) + " steps"
: "stuck") << "\n";
}
}
}
Expected: for the first ~1000 episodes the baseline crawls and greedy rollouts get stuck at the wall; then the gap is discovered, returns jump, and by episode 2500–4000 the greedy policy runs start → gap → goal in the optimal ~16 steps. You have trained a navigator from a scalar reward — the entire conceptual content of 8.4 in one file. Now the pathologies: change the seed and watch discovery happen thousands of episodes earlier or later (variance is the disease; PPO’s clipping and batched advantage estimation are the treatment), and note the world is 64 states — Isaac Gym’s 10,000 parallel environments exist because real observation spaces are 10⁶× bigger.
Sanity checks: (1) remove the baseline (use raw G) — learning gets visibly noisier and often slower: variance reduction is not a nicety. (2) Set the bump penalty to 0 — the policy happily grinds against walls en route; reward shaping is behavior specification, which is exactly how sim-trained robots learn to exploit simulator quirks. (3) After training, wall off the gap and watch the greedy policy march into the wall forever — distribution shift in eight lines, and the whole argument for the safety monitors of 8.7.
8.8Reading List
SuperPoint: Self-Supervised Interest Point Detection and DescriptionHomographic adaptation — the self-labeling trick that ended a decade of handcrafted detectors. LightGlue: Local Feature Matching at Light SpeedSuperGlue’s attention matching with adaptive early exit — the version fast enough to live inside a real-time front-end. DROID-SLAM: Deep Visual SLAM for Monocular, Stereo, and RGB-D CamerasThe differentiable dense-BA design of 8.2 — networks proposing, optimizers disposing, end to end. NeRF: Representing Scenes as Neural Radiance Fields for View SynthesisThe volume-rendering equation that launched neural mapping — and the speed problem 3DGS was built to solve. 3D Gaussian Splatting for Real-Time Radiance Field RenderingExplicit Gaussians + rasterization: photorealism at frame rate, and the representation behind splat-SLAM. SplaTAM: Splat, Track & Map 3D Gaussians for Dense RGB-D SLAMTracking and mapping directly on splats, with silhouette masks telling the system what its map doesn’t know yet. NICE-SLAM: Neural Implicit Scalable Encoding for SLAMHierarchical voxel-anchored features — the design that made implicit dense SLAM work beyond a single desk. Proximal Policy Optimization AlgorithmsThe clipped objective that made deep RL boring enough to use. The default trainer for every navigation policy in 8.4. Isaac Gym: High Performance GPU-Based Physics Simulation for Robot Learning10,000 environments on one GPU — the infrastructure paper that turned sim-to-real from patience into engineering. Motion Planning Networks (MPNet)Learned proposals inside a completeness-preserving classical wrapper — the template for trustworthy neural planning. Value Iteration NetworksPlanning as a differentiable module — the observation Setup A makes concrete, and its scaling limit. VLFM: Vision-Language Frontier Maps for Zero-Shot Semantic NavigationFig 8.2 in full: classical frontiers scored by a vision-language model — zero-shot ObjectNav with a classical spine. OpenVLA: An Open-Source Vision-Language-Action ModelThe open 7B generalist policy — where the "language in, behavior out" endgame currently stands, honestly documented.8.9Interview Questions
Why did learned features (SuperPoint + LightGlue) displace ORB, and where does ORB still win?
Learned detectors are trained for repeatability under the exact nuisances that kill handcrafted ones — lighting change, viewpoint change, weak texture, blur — and attention-based matchers use cross-image context instead of per-descriptor nearest neighbors, surviving repetitive structure that fools Hamming distance. The system-level win: fewer tracking losses and far more robust relocalization, with RANSAC unchanged as the safety gate. ORB still wins on CPU-only and embedded platforms (it costs microseconds), in controlled lighting where its weaknesses don’t bind, and wherever the marginal robustness isn’t worth a GPU in the power budget — which is a real fraction of deployed indoor robots.
What is the key architectural idea of DROID-SLAM, and why does it generalize so well?
It never lets the network output poses. A recurrent unit predicts dense flow revisions and per-pixel confidences — measurements — and a differentiable dense bundle-adjustment layer solves for poses and depths that best explain them, every iteration, with gradients flowing through the solver during training. Geometry is enforced by construction rather than hoped for from data, so the learned part only has to be good at what networks are good at (correspondence under nuisance), while the optimizer does what optimizers are good at (consistent state estimation). Result: trained on synthetic data, it transfers across cameras and datasets — the "networks propose, optimizers dispose" pattern at its purest.
NeRF vs 3D Gaussian Splatting as a SLAM map — what actually decides between them?
Rendering mechanics. NeRF answers a pixel by querying an MLP at tens-to-hundreds of samples along the ray — photoreal but brutally slow, and "where is the surface" requires marching the density field. 3DGS renders by projecting and alpha-compositing explicit Gaussians — rasterization-fast, which makes per-frame tracking (optimize pose against the render) and mapping (optimize Gaussians) feasible in real time; the map is also explicit, hence editable, prunable, and semantically taggable. That is why the real-time dense-SLAM wave (SplaTAM, GS-SLAM) rides splats, while implicit-grid hybrids (NICE-SLAM, Vox-Fusion) were the transitional RGB-D form. Shared open problems: loop-closure deformation of the map and honest distance queries for planners — where Phase 3’s ESDF still rules.
What breaks when you move a sim-trained navigation policy to a real robot, and what actually helps?
The gaps: dynamics (friction, motor lag, battery sag), perception (real sensor noise, materials, lighting), and layout distribution (real clutter isn’t procedurally generated). The policy exploits simulator regularities you didn’t know existed — reward hacking against physics bugs is a genre. What helps, in rough order of leverage: domain randomization broad enough that reality is inside the training distribution (physics, sensor noise, layouts, textures); training on abstracted observations that transfer (lidar scans and ESDF patches transfer far better than RGB); system identification to center the randomization; and short fine-tuning on-robot when feasible. What helps most of all: a deployment wrapper — safety monitor, OOD detection, classical fallback — because some gap always survives.
Why do MPNet-style planners keep a classical algorithm in the loop, and what guarantee does that preserve?
The network proposes waypoints; classical machinery collision-checks every proposed segment against the real map, repairs locally when a proposal is infeasible, and falls back to uniform sampling (plain RRT-style) when the network stalls. That wrapper restores probabilistic completeness: the system finds a path if one exists, regardless of how wrong the network is — the network only modulates speed, cutting search time dramatically in-domain and degrading to baseline out-of-domain. This is the general contract for trustworthy learned planning: learn the proposal distribution (fails soft), never the feasibility check (must not fail). A learned component whose failure mode is "slower" is deployable; one whose failure mode is "through the wall" is not.
How does zero-shot semantic navigation (CoW, VLFM) find objects it was never trained to find?
It borrows the semantics from a web-pretrained vision-language embedding. CLIP-style models place images and text in one space, so "does the view toward this frontier look like it leads to a coffee machine" is a similarity score — no robot data, no category list, no fine-tuning. The navigation itself stays classical: build occupancy (Phase 3), extract frontiers, plan with A* (Phase 5); the VLM only replaces the frontier-selection heuristic (nearest/biggest) with a semantic score, plus a detector to confirm arrival. It inherits VLM failure modes — spatial reasoning is weak, uncommon objects and paraphrases confuse it, scores are uncalibrated — which is why the classical spine, which guarantees coverage eventually, is what makes the system safe to run.
When is a DRL local planner actually justified over DWA/TEB/MPPI, and what must ship around it?
Justified where the classical cost function is the bottleneck, not the optimizer: dense human crowds (anticipation and social compliance are learnable but nearly unwritable as costs), recovery-rich cluttered spaces, and platforms whose dynamics defeat simple models. Not justified where Phase 5 already meets spec — the classical stack is debuggable, certifiable, and field-tunable, and a policy is none of those. The mandatory wrapper: a hard safety monitor the policy cannot override (lidar-based velocity limiting and e-stop, geometric last-resort checks), out-of-distribution detection on the policy’s inputs, a classical fallback planner on OOD or watchdog trip, and shadow-mode statistics proving the policy beats the baseline on your site before it ever controls the robot. The policy is an optimization; the wrapper is the product.
Your team wants to "add AI" to a working classical navigation stack. Sequence the adoptions by risk-adjusted return.
(1) Learned place recognition and features (Phases 4.5, 8.2): biggest robustness win, fails soft behind geometric verification — do first, it’s 2020s-standard. (2) Semantic segmentation for dynamic filtering (Phase 7.6): keeps people and vehicles out of maps and registration — shipped tech, contained failure. (3) Learned traversability / cost layers from experience (feeding Phase 5’s planners): improves route quality; wrong costs mean suboptimal, not unsafe, paths. (4) MPPI with learned cost terms, then guarded DRL for specific pain points like crowded lobbies — with the full 8.7 wrapper. (5) Neural dense mapping where photorealism or appearance-relocalization pays its GPU rent. (6) VLA-style language goals last — the interface is transformative, the reliability envelope is still being mapped. At every step the classical stack stays as shadow baseline and fallback — the moment you can’t answer "how do we know when it’s wrong", stop.