Radio geometry · interactive demos

02Known BS/UE pose and Map

Scope of §2. The map, finite wall segments, BS pose, UE pose, and both array headings are known. For each MPC, test ordered wall sequences directly with the image-source method; no lower-order prefix path is required. The demos use synchronized/calibrated path length, and convert UE-frame AoA plus BS-frame AoD into world-frame rays with the known headings. In 3D, wall lines become planes and angular measurements become unit directions or azimuth/elevation pairs.
01 · hypothesizeChoose an ordered wall sequence from the known map.
→
02 · mirrorReflect the known BS successively to build VA¹…VAᵏ.
→
03 · foldTrace UE→VAᵏ back through the walls to locate Pₖ…P₁.
→
04 · predictPredict calibrated delay, UE-frame AoA, and BS-frame AoD.
→
05 · decideRetain feasible matching sequences; each sequence length is a candidate bounce count.
view selectorChoose one mapped path candidate
interactive candidateOne map-consistent route at a time
POSES + MAP FIXED

2.1LoS: verify the direct zero-bounce path

the data (drives the drawing)

layers

drag the green UE dot — the direct-path measurements re-sync to the known pose
Read it. Ray-casting through the known map first verifies that the BS↔UE segment is unobstructed. Known array headings rotate the measured local angles into the global frame. A LoS MPC must then satisfy three gates at once: AoD points from BS to UE, reverse AoA points from UE to BS, and cτ = ‖UE−BS‖. When they agree, there is no incidence point and the bounce count is zero.

2.2Single bounce: mirror the BS in one known wall

known-map candidate

A · one mapped wall → one mirror → one reflection point

observed MPC

map-known construction — step

drag the green UE dot — the map prediction and clean measurement re-sync
Read it. Wall A comes from the map. Reflect BS across A to obtain VA¹, then intersect the straight UE→VA¹ line with A to obtain P₁. Folding that line gives BS→P₁→UE. The candidate is accepted only when its predicted delay, global AoA, and global AoD match the observed MPC; then the bounce count is one. No wall or anchor is estimated from this MPC.

2.3Double bounce: mirror through an ordered wall pair

known-map candidate

A → B · ordered mapped walls → VA¹, VA² → P₂, P₁

observed MPC

map-known construction — step

drag the green UE dot — the map prediction and clean measurement re-sync
Read it. The candidate order A→B comes from the known map. Mirror BS in A to obtain VA¹, then mirror VA¹ in B to obtain VA². Trace UE→VA² to wall B for P₂; fold toward VA¹ and intersect wall A for P₁. The resulting BS→P₁→P₂→UE path predicts one tuple (L₂, φ, ψ). A match accepts this two-wall sequence and reports bounce count two—without any lower-order measurement.

2.4Triple bounce: extend the known-map image-source chain

known-map candidate

A → B → C · three mapped walls → VA¹…VA³ → P₃…P₁

observed MPC

map-known construction — step

drag the green UE dot — the map prediction and clean measurement re-sync
Read it. For candidate A→B→C, mirror the known BS successively to VA¹, VA², and VA³. Starting at UE, intersect the line to VA³ with C for P₃, then fold toward VA² to get P₂ on B and toward VA¹ to get P₁ on A. This known-map route predicts the triple's delay and endpoint bearings directly; the MPC is classified as three-bounce only if all three measurements match and every point lies on its finite mapped wall.

2.5Corridor double bounce: test the mapped sequence R → L

known-map candidate

R → L · the order matters even though the walls are parallel

observed MPC

map-known construction — step

drag the green UE dot — the map prediction and clean measurement re-sync
Read it. The map supplies both corridor walls and the candidate order R→L. Two mirrors place VA² on the far side of the left wall. Folding UE→VA² first at L and then at R produces P₂ and P₁. The even-bounce bearing parity is a useful check, but the full decision still compares the map-predicted delay, AoA, and AoD and verifies both points lie on the finite walls.

2.6Corridor triple bounce: test the mapped sequence R → L → R

known-map candidate

R → L → R · a repeated wall is allowed when the ordered route is feasible

observed MPC

map-known construction — step

drag the green UE dot — the map prediction and clean measurement re-sync
Read it. For R→L→R, the image source moves right, left, then right as the known BS is mirrored through the ordered wall sequence. Folding the UE→VA³ line returns P₃ on R, P₂ on L, and P₁ on R. Odd-bounce angle parity alone could resemble a one-bounce path, so the map resolves the ambiguity: only a feasible ordered sequence whose finite-wall points and complete (L₃, φ, ψ) prediction match is accepted.

03Known UE/BS Pose, Unknown Map

Scope of §3. The BS and UE positions and both array headings are known, but the walls are not. Each 2D construction conditions on synchronized/calibrated timing and first converts local AoA/AoD to world-frame rays using the known headings. The recursive construction shown here additionally uses correctly associated nested prefix MPCs—for example, the one-bounce path associated with a two-bounce path. Reference walls and hollow anchors explain the synthetic scene; they are not estimator inputs. In 3D, delay ellipses become prolate ellipsoids and inferred wall lines become planes.
01 · resolveTake one tuple \((L,\varphi^U,\psi^B)\) and rotate its local angles with the known headings.
→
02 · walkExtend the reverse-AoA ray by the full measured length to obtain a VA candidate.
→
03 · intersectIntersect the bearing ray with its delay ellipse to locate an incidence point and infer a wall.
→
04 · bootstrapUse associated lower-order prefix VAs to peel successive bounces from higher-order paths.
→
05 · assessCheck path order and consistency, then retain any remaining wall ambiguity explicitly.
view selectorChoose one unknown-map hypothesis
measurement-derived constructionOne unknown-map hypothesis at a time
MAP UNKNOWN

3.1Single bounce: draw everything from (τ, φ, ψ)

the data (drives the drawing)

layers

drag the green UE dot — sliders re-sync to its specular measurement
Read it. d₁ + d₂ = L puts P on the orange ellipse; the mirror makes ‖P→VA‖ = d₂, so the same ray, extended to the full measured length L, ends exactly at VA. The inferred wall is the perpendicular bisector of BS↔VA through P; no wall map is supplied. The dashed orange rings mark the two foci of the ellipse. The σ slider is only an illustrative incidence-point smear, not a physical diffuse-scattering fraction.

3.2Double bounce: two virtual anchors, two incidence points

the data — path 1 (single bounce)

the data — path 2 (double bounce)

not an input — and not fixed by path 2’s (τ, φ, ψ) alone: locating P₂ needs VA¹, bootstrapped here from path 1. Given it, the AoA pins P₂ and L₁ = L₂ − ‖UE→P₂‖ follows.

construction — step

drag the green UE dot · σ = 0 removes the illustrative smear
Legend. ■ BS · ● UE (draggable) · ◆ purple = virtual anchors: VA¹ bootstrapped live from path 1, VA² (hollow = reference, filled = measured full-length walk) · orange = the associated one-bounce prefix that supplies VA¹ · thin purple = the VA¹ family that path 2 alone permits · ● teal = measurement-derived P₁ and P₂ · red = rejected one-bounce test, because the AoA and AoD select different points on the same delay ellipse · green = the peeled bounce-1 ellipse. Reference walls and clouds make the synthetic answer visible; neither is an input to the construction.

3.3Triple bounce: the recursion run in full

the data — path 1 (single bounce)

the data — path 2 (double bounce)

the data — path 3 (triple bounce)

not inputs — each peel subtracts one leg; the splits exist only once VA¹ and VA² do.

construction — step

drag the green UE dot · σ = 0 removes the illustrative smear
Legend. ■ BS · ● UE (draggable) · ◆ purple = the data-derived anchor ladder VA¹, VA², VA³ (hollow VA³ is only a reference) · orange and gold = the associated one- and two-bounce prefixes · red = rejected lower-order hypotheses · teal ellipse = bounce 3, pinned at VA² and UE · green ellipse = bounce 2, whose direction comes from the bootstrapped VA² constraint · blue ellipse = bounce 1, selected by the measured AoD. Teal dots are the recovered incidence points; reference walls and perturbation clouds show the synthetic answer but are not map inputs.

3.4Double bounce, corridor edition: two parallel walls

the data — path 1 (single bounce)

the data — path 2 (double bounce)

construction — step

drag the green UE dot · σ = 0 removes the illustrative smear
Legend. Same as the corner demos above — dashed rings mark each ellipse's foci · red = rejected 1-bounce hypothesis with its implied wall · note the AoD arrow at the BS is exactly anti-parallel to the AoA arrow at the UE, and stays so while you drag: that lock is the parallel-wall signature.

3.5Triple bounce, corridor edition: parity, and a hypothesis that angles cannot kill

the data — path 1 (single bounce)

the data — path 2 (double bounce)

the data — path 3 (triple bounce)

construction — step

drag the green UE dot · σ = 0 removes the illustrative smear
Legend. Orange and gold are the associated prefix paths; teal / green / blue ellipses peel bounces 3 / 2 / 1; ◆ purple is the data-derived ladder VA¹, VA², VA³. Angles alone leave the red one-bounce hypothesis alive. Once the prefixes infer corridor walls R and L, its BS ray crosses R before reaching the apparent bounce on the mirrored image of L, so forward visibility rejects it. The statline also exposes parity: odd paths mirror (ψ = −φ), while even paths are anti-parallel (ψ = φ ± 180°).

3.6Two-bounce ambiguity: motion alone need not recover the two walls

A composite virtual anchor identifies an ordered reflection transform, not necessarily its individual reflecting planes. For two nonparallel walls meeting at c, rotate both walls by the same angle about c. Their relative angle—and therefore both ordered two-reflection transforms—stay fixed. Every known UE pose keeps exactly the same delay, AoA, and AoD, while the two incidence points and individual walls move.

What motion does not resolve. Two pose-specific candidate curves do not generically provide a unique transverse crossing in this construction; they share the same ambiguity orbit. Finite wall support, visibility, a separately observed one-bounce prefix, or a calibrated incidence-dependent path-gain model can add the missing information.

one unobservable mode

layers

Move Δα: the physical explanation changes, but geometric observables remain fixed to numerical precision.
Read it. FB′FA′ = FBFA and FA′FB′ = FAFB under a common rotation about the wall intersection. The purple composite VA, the reverse-order image that fixes AoD, and both UE measurements therefore stay put. Teal incidence points slide along the rotated walls. The orange loss bar is deliberately separate: angle- or material-dependent radiometry can vary along this otherwise invisible geometric mode and may help identify it.

04Known BS Pose, Unknown UE Pose and Map

Scope of §4. The BS position and array heading are known, so the measured BS-frame AoD can be rotated into a world-frame departure ray. The UE position, UE heading \(\theta_t\), and wall map are unknown. The demos condition on calibrated timing, while a real one-way model must retain \(\delta_{ts}\). UE AoA remains body-frame data, so each hypothesis uses \(\varphi^W=\operatorname{wrap}_{\pi}(\theta_t+\varphi^U)\). These recursive demonstrations use associated prefix paths; this is not a necessary condition for every joint multi-view SLAM method. Faint reference walls and UEs are explanatory truth overlays, never estimator inputs; the displayed slider is one slice of the full feasible family.
01 · anchorStart from the fixed BS pose and rotate its measured BS-frame AoD into the world frame.
→
02 · walkForm E = BS + Ld̂ψ, the mirrored-UE endpoint.
→
03 · hypothesizeChoose a first bounce P and candidate UE heading θ.
→
04 · recurseUse prefix paths; enforce forward intersections and positive delay budgets.
→
05 · diagnoseKeep the feasible family, or expose its rank and null direction.
view selectorChoose one joint pose–map hypothesis
joint pose–map constructionOne UE/map hypothesis at a time
BS FIXED · UE + MAP UNKNOWN

4.1Single bounce: draw from (τ, φbody, ψ) with unknown θ

the data (drives the drawing)

construction — step

P and θ are both optimization hypotheses; no heading measurement is supplied — the green UE(P) is an estimate, not the truth
Read it. E = BS + L·d̂ is the full measured length walked along the AoD — the mirror image of the UE across the unknown wall, the exact dual of §3.1's virtual-anchor walk (there: UE-side walk lands on the mirrored BS; here: BS-side walk lands on the mirrored UE). The foci change with it: the delay string, un-pinnable at the unknown UE, is re-pinned at P and E — a bounce hypothesis P on the AoD ray keeps ‖P→E‖ = L − ‖BS→P‖, so every point of the orange circle is at the correct leftover distance, and the candidate UE(P) is where the reverse-AoA ray out of P crosses it. The implied wall runs along the middle between P→UE(P) and P→E — the bisector at P, equivalently the perpendicular bisector of E↔UE(P) — and stays parallel to the true wall for every P. Slide P: finding P is really finding the wall — each P fixes the wall (the bisector through it) and the wall fixes the UE, so every position is a fully coherent (wall, UE) explanation, and the candidates sweep a straight line perpendicular to the true wall (step ⑥). But that line was drawn with a borrowed compass: the AoA is measured in the UE's own frame, and promoting it to a global direction spends a heading the UE does not know. Slide θ — the heading hypothesis — and the whole line pivots, every point still coherent, the implied wall tilting by |θ|/2 as it goes: heading and wall tilt are indistinguishable from one path. With both P and θ free the candidates fill the entire delay disk ‖x − BS‖ ≤ L: one path leaves a two-parameter family, and the AoA, on its own, localizes nothing. What breaks it is a second path off a differently-oriented wall — the next subsections.

4.2Double bounce: two virtual anchors, two incidence points

the data — path 1 (single bounce)

the data — path 2 (double bounce)

construction — step

both walls and θ are unknown: the control selects one θ slice of the joint family — the green dots are estimated UEs, never the truth
Read it. Path 1 runs §4.1 with candidate heading θ: E⁽¹⁾ = BS + L⁽¹⁾·d̂⁽¹⁾ is the mirrored UE, P⁽¹⁾ hypothesizes the bounce, and UE₁ follows from the body-frame AoA rotated by θ. That fixes a wall-A hypothesis. Path 2 then intersects that wall with its forward AoD ray, reflects, and spends only the remaining delay budget. Its second candidate line must meet UE₁ at a point reachable along the forward reflected ray. Green means all ordered segment lengths are positive; red rejects a mathematically intersecting pair of infinite lines that is not a physical two-bounce path. Across the feasible subset, changing θ rotates both AoAs together and changes both wall hypotheses and the UE while leaving a two-parameter ambiguity (P⁽¹⁾, θ). Thus the double bounce prunes impossible hypotheses but does not identify heading by itself.

4.3Triple bounce: the recursion run in full

the data — path 3 (triple bounce)

construction — step

all three walls and θ remain hypotheses; this control selects one θ slice — the green dots are estimated UEs, never the truth
Read it. The ladder of §4.1–§4.2 runs one rung further with the same unknown θ applied to every body-frame AoA. Path 1 supplies a candidate UE and wall A; the ordered two-bounce prefix must first be feasible before wall B exists. Path 3 then intersects wall A along its forward AoD ray, reflects to wall B in the forward direction, and spends the remaining positive delay on the final leg. Only a final crossing reached along that forward segment defines P₃ and wall C. The heading slider therefore changes the entire three-wall construction. It preserves a joint ambiguity over the feasible subset, while red states correctly reject line-extension intersections that imply reversed bounces or negative path lengths.

4.4Double bounce, corridor edition: two parallel walls

the data — path 2 (double bounce)

construction — step

the corridor walls and θ are unknown; this control selects one θ slice — the green dots are estimated UEs, never the truth
Read it. The corner scene at least produced a crossing; the corridor cannot. Path 1 hypothesizes wall R exactly as in §4.1 — candidates sweep line 1 ⊥ wall R, which in a corridor means across the corridor. Path 2 must first hit that wall along its forward AoD ray and retain positive delay; only then does its stripped candidate line exist. At the reference heading, line 2 is parallel to line 1 and with clean data it coincides with it exactly. There is no crossing to solve; wall L is fixed only by declaring UE₂ = UE₁ on the shared line and checking that its bounce lies on the remaining forward segment. Within the feasible heading subset, a nonzero θ tilts the wall hypotheses, the lines wedge apart, but their admissible crossing remains the sliding UE₁: heading uncertainty merely re-dresses the corridor as a wedged one. Red states reject backward bounces or exhausted delay rather than drawing walls from infinite line extensions. The corridor slide therefore survives every valid double-bounce hypothesis, although higher-order data can prune invalid slices.

4.5Triple bounce in a corridor: the third hit must reuse wall R

the data — path 3 (triple bounce)

construction — step

Exact-consistency test: move P⁽¹⁾ or θ to see a repeated-wall hypothesis rejected. Perturbed measurements need a noisy optimizer, not exact closure.
Read it. Path 1 proposes wall R and a UE; path 2 proposes wall L using that same UE. The third associated route is R→L→R, not R→L→a new wall. After the first two forward reflections, its final bounce must lie on the original R and obey R's reflection law. A crossing of candidate lines alone does not enforce this. The demo now checks all three conditions: positive remaining length, arrival at the same UE, and reuse of the original wall. Move the first-bounce or heading slider: many previously accepted sliding solutions are rejected. Coincident candidate lines do not prove unobservability of the complete repeated-wall model.
Accuracy audit · September 5, 2026.

Observability depends on the complete measurement model. In the noise-free 2D single-A plus double-A→B construction, the seven unknowns are UE position (2), UE heading (1), and two infinite walls (2 each). Although there are six measured scalars, the shared-wall model is generically rank five, leaving a local two-parameter family. Counting rows only gives a bound; it does not establish rank six. Finite support, visibility, priors, and extra observations can further restrict that family.

A repeated wall is an additional constraint. For a parallel corridor, take the BS as the origin, the normal coordinate as x, and walls R:x=r, L:x=l. The associated images are \(\mathbf v_1=2r\mathbf e_x\), \(\mathbf v_2=2(l-r)\mathbf e_x\), and \(\mathbf v_3=(4r-2l)\mathbf e_x\). Therefore \(\mathbf v_3+\mathbf v_2=\mathbf v_1\). With globally referenced, back-to-source AoA directions \(\mathbf u_i\) and calibrated path lengths, \(\mathbf v_i=\mathbf p+L_i\mathbf u_i\), so \[\mathbf p=L_1\mathbf u_1-L_2\mathbf u_2-L_3\mathbf u_3.\] This directly disproves a universal sliding ambiguity for correctly associated R, R→L, R→L→R paths. It does not resolve an unknown heading by itself; AoD or other constraints must also be used. A reproducible nondegenerate rank-seven example with unknown heading and two initially unconstrained walls is included in the repository tests. Local full rank is not a proof of global uniqueness.

Keep the special case separate. The rank/line demo in §4.6 uses globally referenced directions, single-bounce constraints, and translation variables. Its corridor null direction is valid for that reduced model—not a theorem about every multi-bounce, unknown-heading SLAM problem. Exact ray tests reject inconsistent slider settings; a noisy estimator must instead optimize a covariance-weighted likelihood with physical feasibility constraints.

Model selection can stay ambiguous. A known map does not guarantee a unique bounce count. Retain all statistically plausible, visible ordered sequences; none passing the gate may indicate calibration error, an incomplete map, or an interaction absent from the specular model.

3D residuals and map parameters. The direction-vector version of a delay + AoA + AoD measurement belongs to \(\mathbb R\times\mathbb S^2\times\mathbb S^2\): seven ambient coordinates but five intrinsic residual coordinates, or six with scalar gain. Use a local two-dimensional tangent residual for each direction, with correctly transformed covariance; do not assign an invertible independent three-dimensional Gaussian covariance to a unit vector. A tangent logarithm needs a nonsingular chart and is not uniquely defined at the antipode. An infinite plane has only three geometric degrees of freedom \((\mathbf n,d)\); finite-patch edge position, in-plane orientation, and extent require edge/visibility information or priors. Likewise, use normal plus signed distance for an infinite 2D wall rather than an unobservable tangential center coordinate.

Inference demonstrations. The BP and PMBM animations illustrate structure, not computed posterior accuracy. The GraphSLAM teaching lab supplies associations and optimizes a fixed graph; it is not the separate unlabeled-MPC benchmark. Loopy BP is generally approximate. PMBM formulas require disjoint-set partition sums and the stated detection/clutter model. iSAM2 targets the same fixed-graph objective as a batch solver, but thresholded relinearization and nonlinear local minima need not give identical numerical estimates at every update.

Sources. Leitinger et al., shared-surface multipath data fusion; Leitinger et al., BP-SLAM; Kim et al., PMBM-SLAM; Kaess et al., iSAM2; Ceres, robust loss definition. The rank examples and corridor identity above are independently derived regression checks, not claims attributed to those papers.

4.6Special observability case: globally referenced displacement vectors

This compact derivation grants each translation oᵢ = pᵢ₊₁ − pᵢ directly in the map frame. That is stronger than wheel/IMU odometry expressed in the moving body frame: it effectively supplies an external orientation reference. Under this assumption, same-wall motion can reveal a wall direction from n̂ ∝ ΔE − o, and a link between two nonparallel wall families can determine their offsets. The animation is a useful linear observability special case, not the general nonlinear unknown-heading GraphSLAM backend.

Condition. The normal formula fails when motion is parallel to the wall because ΔE − o = 0, and is ill-conditioned near that case. With body-frame odometry, heading and displacement must instead remain pose variables in the nonlinear graph.

the unknown split — two families

layers

The supplied o₁,o₂,o₃ are map-frame vectors; ordinary body-frame odometry would require heading variables.
Read it. E = BS + L·d̂ uses the BS-side departure angle and is the mirror of the UE across its wall. For two observations of the same wall, the supplied global displacement o and ΔE have equal length; their difference gives the normal direction when it is nonzero. The offset remains free, which creates each candidate rail. The cross-family equation p₃ − p₂ = o₂ is linear in the two offsets, with matrix [−2n̂_A | 2n̂_B]; it is invertible only when the normals are not parallel. Press solve to zero this residual. This is an exact special case for globally referenced translation, while a practical SE(2)/SE(3) graph must estimate orientation and body-frame motion jointly.

corridor edition — the family that survives the graph

layers

same construction, parallel walls — the solve returns a line of answers, not a point; the third slider walks it
Read it. With the same globally referenced displacement assumption in a corridor, the recovered normals are parallel. The cross-family matrix [−2n̂_R | 2n̂_L] is rank one: one combination of wall offsets is fixed and the other remains a null direction in which walls and trajectory slide together. Solve therefore returns a line, not a point. The smallest singular value is the useful output here—optimization reports missing information rather than manufacturing it. An off-axis wall, LOS interval, second anchor, or other independent factor can close the null direction.