Skip to main content
Contents8 / 8 ▾
08
Phase Eight · Where the Networks Actually Plug In

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:

FIVE SURGERIES ON THE CLASSICAL PIPELINE features & odometry (Ph 2) mapping (Ph 3) localization (Ph 4) planning (Ph 5) local control (Ph 5) SuperPoint·LightGlue DROID-SLAM (8.2) NeRF · 3DGS SLAM (8.3) NetVLAD · CosPlace (done — Ph 4.5) MPNet · Neural A* VIN (8.5) DRL policies (8.4) VLA agents (8.6) each swap is independent — and each keeps the classical version as its benchmark
Fig 8.1: the five learned surgeries, mapped onto the phases they operate on. Note the middle column: learned place recognition was so decisively better that Phase 4 already treated it as standard — the pattern every other column is trying to repeat.
The question is never "learned or classical?" — it is "which module, and what happens when the network is wrong?" Learned perception failed gracefully (a bad match is vetoed by RANSAC) and shipped a decade ago. Learned control fails at 2 m/s with no veto — which is why it arrives last, wrapped in classical safety nets.

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.

SystemReplacesTrained byClassical part kept
SuperPointORB/SIFT detectionself-supervision (homographic adaptation)everything downstream
SuperGlue / LightGlueNN descriptor matchingsupervised matches, attention GNNRANSAC + pose solvers
DROID-SLAMthe whole VO/VSLAM front halfend-to-end through a differentiable BA layerbundle adjustment itself — as a layer
DeepMapping 2.0ICP’s data association at map scaleself-supervised registration objectivesthe 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
Learned planning’s honest scorecard: heuristics, samplers, and cost maps — learn them, they fail soft (worst case: a slower classical search). Feasibility, collision checking, and optimality certificates — keep them classical, they must not fail at all. Every credible neural planner in the literature respects this line; every embarrassing demo crossed it.

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:

VLFM: FRONTIERS, SCORED BY LANGUAGE query: "find the coffee machine" explored (occupancy, Phase 3) robot frontier A · 0.71 frontier B · 0.22 frontier C · 0.09 VLM scores each frontier's view against the query — plan to argmax (A), rescore as the map grows. Detector confirms → Phase 5 drives.
Fig 8.2: VLFM keeps the entire classical machine — occupancy map, frontiers, A* — and lets a vision-language model answer the one question classics never could: which unknown is most likely to contain a "coffee machine"? Semantics as a scoring function, not a new stack.

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?

SystemKindWhat it does zero-shotClassical spine kept
CLIP on Wheels (CoW)zero-shot object navfind category X in a novel scenefrontier exploration, classical planner
VLFMVL frontier scoringsemantic goal-seeking, SOTA ObjectNavoccupancy map, frontiers, A*
Octogeneralist policy (open)manipulation from language + imagesnone — policy is the stack
OpenVLA7B open VLAfine-tunable manipulation skillsnone — policy is the stack

8.7What Survives Contact With Reality

The deployment scorecard, module by module, as of this book’s writing:

Learned componentStatusFailure containment
Features & matching (8.2)shipped — use by default where compute allowsRANSAC/optimizer vetoes bad proposals — fails soft
Place recognition (Ph 4.5)shippedgeometric verification gate — fails soft
Semantic segmentation for dynamics (Ph 7.6)shippedmissed detections degrade, not break
Neural maps (8.3)promising — real products emergingkeep 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-rareclassical collision checking on every proposal
VLA / generalist policies (8.6)frontieran open research question — treat accordingly
The failure mode all learned modules share is distribution shift: the network is confidently wrong precisely where its training data ran out — a lighting condition, a floor texture, a crowd density, a sensor degradation it never saw. Classical algorithms fail loudly (residuals explode, fitness collapses); networks fail smoothly, which is worse. Deployment discipline: out-of-distribution monitors on inputs (not just outputs), shadow-mode evaluation against the classical baseline before any takeover, staged rollouts, and logging rich enough to retrain on every disagreement. If you cannot answer "how will we know when it’s wrong?", the module is not ready, whatever the benchmark says.

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 DescriptionDeTone, Malisiewicz & Rabinovich · CVPR Workshops 2018Homographic adaptation — the self-labeling trick that ended a decade of handcrafted detectors. LightGlue: Local Feature Matching at Light SpeedLindenberger, Sarlin & Pollefeys · ICCV 2023SuperGlue’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 CamerasTeed & Deng · NeurIPS 2021The differentiable dense-BA design of 8.2 — networks proposing, optimizers disposing, end to end. NeRF: Representing Scenes as Neural Radiance Fields for View SynthesisMildenhall, Srinivasan, Tancik, Barron, Ramamoorthi & Ng · ECCV 2020The volume-rendering equation that launched neural mapping — and the speed problem 3DGS was built to solve. 3D Gaussian Splatting for Real-Time Radiance Field RenderingKerbl, Kopanas, Leimkühler & Drettakis · SIGGRAPH 2023Explicit Gaussians + rasterization: photorealism at frame rate, and the representation behind splat-SLAM. SplaTAM: Splat, Track & Map 3D Gaussians for Dense RGB-D SLAMKeetha, Karhade, Jatavallabhula, Yang, Scherer, Ramanan & Luiten · CVPR 2024Tracking 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 SLAMZhu, Peng, Larsson, Xu, Bao, Cui, Oswald & Pollefeys · CVPR 2022Hierarchical voxel-anchored features — the design that made implicit dense SLAM work beyond a single desk. Proximal Policy Optimization AlgorithmsSchulman, Wolski, Dhariwal, Radford & Klimov · 2017The 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 LearningMakoviychuk et al. · NeurIPS 2021 Datasets & Benchmarks10,000 environments on one GPU — the infrastructure paper that turned sim-to-real from patience into engineering. Motion Planning Networks (MPNet)Qureshi, Miao, Simeonov & Yip · IEEE TRO 2020Learned proposals inside a completeness-preserving classical wrapper — the template for trustworthy neural planning. Value Iteration NetworksTamar, Wu, Thomas, Levine & Abbeel · NIPS 2016Planning as a differentiable module — the observation Setup A makes concrete, and its scaling limit. VLFM: Vision-Language Frontier Maps for Zero-Shot Semantic NavigationYokoyama, Ha, Batra, Wang & Bucher · ICRA 2024Fig 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 ModelKim et al. · CoRL 2024The 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.