Online tightly coupled multi-modal fusion for open-vocabulary semantic SLAM in dynamic environments.
You strap a webcam to a robot and tell it: "go pick up the red mug on the shelf." To do this, the robot needs three things simultaneously:
Existing systems force you to choose two out of three. Geometric SLAM (ORB-SLAM3) gives you 1 + 2 but knows nothing about "mugs." Open-vocabulary scene understanding (ConceptGraphs, HOV-SG) gives you 2 + 3 but requires pre-calibrated posed RGB-D — you need an expensive depth sensor, known camera parameters, and an offline processing pass. No system does all three online from a raw phone video.
But there's a deeper problem. Real environments move. People walk through your frame. Someone pushes a chair. A door swings open. Traditional SLAM treats every pixel as belonging to a rigid world — when that assumption breaks, the entire map corrupts. And it breaks constantly in any space with humans.
The simulation above shows why this matters. Static features (blue) give consistent reprojections across frames. Moving objects (orange) create impossible geometric constraints — the optimizer tries to explain their motion as camera motion, corrupting the entire trajectory. The system needs to know which points to trust.
Why can't we just run an open-vocabulary model (like CLIP) on each frame independently and skip the SLAM entirely?
RADIO-ViPE's breakthrough is a single architectural decision: don't just use semantics as a post-processing layer — inject them directly into the geometry optimization itself.
Previous approaches have a two-stage pipeline: first do SLAM (geometry only), then paste semantic labels onto the resulting point cloud. This means semantics can't help geometry, and geometry can't help semantics. If the SLAM drifts, the semantic map drifts with it. If an object moves, the SLAM has no semantic signal to detect that motion.
The second insight is about robustness. Instead of trying to detect and mask dynamic objects (which requires knowing what's dynamic a priori), RADIO-ViPE lets the optimization itself figure it out. A pixel that gives consistent semantic embeddings across multiple views over time is probably static. A pixel whose embeddings fluctuate wildly is probably moving. This temporal stability signal controls how much the optimizer trusts each pixel — via an adaptive Barron loss kernel that smoothly transitions from full trust (ℓ₂) to near-rejection (Cauchy).
The diagram above shows the three-way coupling. Traditional SLAM has one energy term (photometric). RADIO-ViPE adds a semantic energy term that penalizes embedding inconsistency across views, and wraps both in an adaptive kernel that downweights dynamic regions. All three interact in one joint optimization.
What's the key difference between "tight coupling" and the previous approach of running SLAM first, then adding semantics?
Before diving into RADIO-ViPE's method, we need to understand what it's building on. The core framework is factor graph optimization — specifically, dense bundle adjustment as formulated in DROID-SLAM.
A factor graph G = (V, E) represents a joint optimization problem. Variable nodes V are the unknowns — camera poses Ti ∈ SE(3), per-pixel disparity maps di, and camera intrinsics K. Factor nodes (edges E) encode constraints between variables — "the pixel at position u in frame i, when reprojected into frame j, should land near position v."
In words: for every pair of connected keyframes, for every pixel, measure how well our current geometry (poses + depths) explains the observed optical flow. Minimize the total discrepancy using Gauss-Newton.
DROID-SLAM (Teed & Deng, 2021) made this framework practical by: (a) learning the flow prediction with a neural network that also predicts per-pixel confidence w(u), (b) operating at 1/8 resolution for speed, and (c) using iterative correlation volume lookups for sub-pixel flow. The baseline ViPE system extends DROID-SLAM to work without calibration by jointly optimizing intrinsics.
ViPE bootstraps camera intrinsics from uniformly sampled frames using GeoCalib — a foundation model that estimates focal length and principal point from single images. These are then co-optimized within bundle adjustment. This means RADIO-ViPE requires zero setup — point a phone camera at a scene and go.
The interactive factor graph above shows variable nodes (poses, depths) and the constraints connecting them. In standard SLAM, edges encode only photometric consistency. RADIO-ViPE will add semantic edges — but we need to understand the foundation model first.
In the photometric energy Ephoto, what does w(u) represent and why is it important?
Let's trace a frame through the entire RADIO-ViPE system, from raw pixel to semantic 3D map. This is the paper's Figure 2 made concrete.
1. Frame arrives — Raw RGB at arbitrary resolution. No depth. No pose. No intrinsics.
2. Camera initialization (first few frames only) — GeoCalib estimates [fx, fy, cx, cy] from uniformly sampled frames. These are later refined in bundle adjustment.
3. Keyframe selection — Compute weighted dense optical flow between this frame and the last keyframe. If relative motion exceeds a threshold → this frame becomes a keyframe and enters the factor graph.
4. Multi-modal feature extraction — Run RADSeg (built on RADIO) in sliding-window mode over the keyframe. Output: dense embeddings at (H/8, W/8) spatial resolution. Then PCA-compress from full dimensionality to D=256.
5. Depth estimation — Run a monocular depth foundation model (MoGe or UniDepth). Convert to inverse depth (disparity). Downsample to match flow resolution (1/8).
6. Semantic flow initialization — Augment the photometric flow prior with a semantic correspondence term: for each pixel, find its best match in the other frame using RADIO embedding cosine similarity. Blend with photometric flow using confidence-weighted fusion (Eq. 1).
7. Bundle adjustment — Jointly optimize poses, depths, and intrinsics by minimizing Etotal = γphoto·Ephotoark + γembed·Eembed + Ereg. Factor graph connectivity includes both geometric proximity AND embedding-based co-visibility links.
8. Non-keyframe poses — Estimated in parallel via photometric alignment to their two nearest keyframes (no per-frame depth needed).
9. Open-vocabulary query — At any time, a text query is encoded with SigLIP's text encoder, then matched against the decompressed RADIO features of all 3D map points via cosine similarity.
Why does the system convert depth to inverse depth (disparity) before optimization?
The semantic backbone is what gives RADIO-ViPE its superpowers. But why RADIO specifically? Why not just CLIP? Let's trace the data flow through the embedding pipeline to understand.
RADIO (Reduce All Domains Into One) is an agglomerative model — it distills multiple specialist teachers into one student:
The student inherits all three capabilities. For SLAM, this is perfect: we need spatial discriminability (for flow/matching), language alignment (for open-vocabulary queries), and boundary awareness (for clean object maps).
RADSeg extends RADIO to produce dense per-pixel embeddings (rather than patch-level). It uses a sliding-window approach with self-attention refinement across overlapping regions. The output for each keyframe is:
Storing 1024-dim embeddings per pixel per keyframe is expensive. With 100 keyframes at 60×80 resolution, that's 100 × 4800 × 1024 × 4 bytes ≈ 1.9 GB just for embeddings. RADIO-ViPE applies PCA to compress to D=256:
The simulation above shows how PCA dimensionality affects semantic segmentation quality (mIoU). The paper's ablation (Fig. 4) shows D=256 loses less than 1% mIoU compared to full-dimensional — the sweet spot between memory and accuracy.
Let's trace the numbers for a 60-second clip at 30 FPS (selecting ~1 keyframe per 5 frames = 360 keyframes):
RADIO-ViPE computes PCA during the BA initialization period rather than using a pre-computed basis. What advantage does this give?
This is the core technical contribution. RADIO-ViPE doesn't just use semantic embeddings — it optimizes through them. The bundle adjustment energy has three terms that are jointly minimized.
For each edge (i, j) in the factor graph, reproject every pixel from frame i into frame j using current geometry estimates, then compare against the optical flow network's prediction:
This is new. For each edge, after reprojecting pixel u from frame i to its landing position in frame j, look up the RADIO embedding at that position (using bilinear interpolation because the landing point won't be at integer coordinates), then measure cosine similarity:
The simulation above demonstrates the embedding similarity computation. When geometry is correct, a pixel in frame i reprojects to the same semantic region in frame j — high cosine similarity, low residual. When geometry is wrong OR the object moved, the reprojection lands on a semantically different region — low similarity, high residual. The optimizer then adjusts poses/depths to maximize cross-view semantic consistency.
Standard SLAM connects keyframes that are geometrically nearby (within a temporal window). RADIO-ViPE adds semantic edges: compute a global descriptor per keyframe (mean-pool its RADSeg embeddings + ℓ₂-normalize), then for each new keyframe, find all non-recent keyframes with cosine similarity above threshold η. These get bidirectional edges.
This means: if the robot revisits a semantically similar area (loop closure!), the factor graph gets a direct constraint even if the frames are temporally distant. And it's free — the embeddings are already in the buffer.
If a pixel in frame i reprojects to a DIFFERENT object in frame j (e.g., it was occluded by a moving person), what happens to the embedding similarity term for that pixel?
Here's the problem the previous chapter left unresolved: when a person walks through the frame, both the photometric and embedding terms see large residuals for those pixels. The optimizer could try to "explain" the person's motion by warping the camera pose — corrupting the entire map. We need a way to ignore dynamic pixels without knowing in advance which pixels are dynamic.
The key observation: a moving pixel gives inconsistent embeddings across different viewpoints over time, while a static pixel gives consistent ones. Compute the temporal mean and variance of cosine similarity for each pixel across all edges connected to keyframe i:
Think about what this captures:
The Barron loss ρα is a single parametric family that recovers different robust losses depending on α:
Map stability S to shape α via piecewise-linear mapping:
The interactive simulation above lets you explore how the stability field S maps to the Barron loss shape α, and how this affects the per-pixel weight in the optimization. Drag the slider to see how a pixel transitions from "fully trusted" to "nearly ignored" as it becomes more dynamic.
The weight wark smoothly downweights pixels based on BOTH their residual magnitude AND their temporal stability. A pixel on a moving person gets α near 0 (Cauchy), so even moderate residuals produce tiny weights. A pixel on a static wall gets α=2 (ℓ₂), so it contributes fully regardless of residual.
A sofa is static for the first 200 frames, then someone pushes it at frame 200. By frame 250, what does the stability field S look like for pixels on the sofa?
The final piece: now that we have a 3D map where every point carries a 256-dim RADIO embedding, how do we answer "where is the red mug?"
This is "open-vocabulary" because the text query can be anything — no pre-defined class list. You can ask for "red mug," "the chair near the window," "something to sit on," or even "potential trip hazards." The RADIO/SigLIP embedding space captures semantic similarity broadly.
The simulation above shows a schematic 3D point cloud colored by relevance to a query. High-scoring regions (warm colors) cluster around the queried object. The system returns the 3D centroid and bounding region.
The projection fproj(zfull) is a small MLP — negligible cost. The expensive part is the cosine similarity computation over all map points. For a typical room with ~100K points, this is a single batched matrix-vector multiply — fast on GPU.
The paper's qualitative results (Fig. 5) show queries like "teddy bear," "painting on wall," "blue cushion" correctly localizing objects in Replica scenes, despite never training on object categories.
Why does RADIO-ViPE perform PCA in encoder space but query in SigLIP language space? Why not compress directly in language space?
RADIO-ViPE is evaluated on two axes: SLAM robustness (can it track accurately despite moving objects?) and semantic segmentation quality (are the open-vocabulary labels correct?).
The TUM-RGBD benchmark has sequences where people walk, sit, and move objects in front of the camera. The metric is Absolute Trajectory Error (ATE) in centimeters — lower is better.
Key results from Table II:
The Replica benchmark evaluates open-vocabulary 3D segmentation. Unlike competing methods, RADIO-ViPE operates without ground-truth depth, pose, or calibration:
The small gap between RADIO-ViPEGT and RADIO-ViPE confirms that the geometry estimation is reliable — removing all geometric supervision (depth, pose, calibration) barely degrades semantic performance.
The paper shows RADIO-ViPE (no kernel) at 1.90 cm ATE and RADIO-ViPEark at 1.63 cm. Why does the adaptive kernel help SLAM accuracy when its primary purpose is handling dynamic objects?
What is the single most important architectural decision that makes RADIO-ViPE possible (something that didn't exist in prior work)?