Aether · UWB + IMU positioning mesh · reality check
An honest, physics-first read on the ask. Short version: the field trouble is not a code defect — it is the predictable signature of an over-stacked target, and the decisive lever is provisioning, not more software.
The thesis, as one number
Spare inter-anchor constraints = C(n,2) − (3n−6). At 4 anchors it is exactly 0 — a biased or body-blocked link is mathematically undetectable. Every reliability property the project wants begins at 5.
Bottom line, up front
A cooperative, self-solving indoor UWB+IMU mesh is sound and buildable. The reliable version is a static mesh of ≥5–6 geometrically- and vertically-diverse anchors, with NLOS mitigation, solved-and-locked over time, a ranging schedule for clients, interior coverage, and decimetre expectations. What the physics does not support is the maximalist reading of today's ask — survey-free · sub-centimetre · phone-only · 4-anchor · widely-spaced · indoor · exterior clients · live human traffic — all at once.
What we are actually judging, from the code, the roadmap, capture4, and the layout video.
4 anchors, one the root — physically 3 on tripods at ~1.2–1.45 m plus one low in a red cup at ~0.89 m, in a ~2.3 m × 3.7 m footprint inside a small furnished living room. Phone-class UWB (Galaxy-class anchors; Pixel observer), not dedicated RTLS hardware. Survey-free: the frame is solved purely from inter-anchor ranges — for 4 anchors that is 6 ranges = 6 DOF, an exactly-rigid graph with zero redundancy. In the field, A3's cross-room links read +0.57 / +0.75 m long (a stable NLOS bias where the links physically cross furniture), devices disagreed on the shape, the mesh didn't reliably lock, and one link went dark. Production intent adds wider spacing and several clients wandering interior and exterior through human line-of-sight blockage.
Four UWB-positioning invariants — not Aether-specific, each externally sourced — govern every answer below.
UWB is LoS-accurate, NLOS-biased. ~10 cm in clear line of sight; a human body pushes it to ~0.5 m, positive-biased. Capture4's +0.57/+0.75 m is a textbook NLOS bias, not a bug — and NLOS is the dominant indoor error source.
Range budget is finite; phones sit at the bottom of it. Dedicated modules reach 50–100 m; phone-class HRP UWB is “several tens of metres, ~Bluetooth range,” and far less through walls or bodies. Android AoA is coarse or absent.
Position error = ranging error × GDOP. Multilateration is well-conditioned inside the convex hull of the anchors and blows up outside it; it needs angular diversity and enclosed volume. A near-coplanar set is weak vertically and carries a mirror ambiguity.
Redundancy buys reliability. The inter-anchor graph has spare constraints only at N ≥ 5; at 4, a biased or blocked edge is undetectable. RTLS guidance: 4 is the floor, 5–6 preferred, 8+ diminishing.
A fifth fact governs scale, not accuracy: two-way ranging scales poorly with many tags unless coordinated by a TDMA schedule (or moved to TDoA).
The questions as asked, answered without hedging.
Can a 4-anchor phone mesh solve reliably and withstand clients + humans crossing LoS?
No — not reliablyIt can be solved in a clean moment and held (worth doing), but with zero redundancy any single blocked/biased link has nothing to out-vote it, and indoors a body may be sitting on one at any instant. There is no built-in error detection by construction.
Can software solve it — developed, COTS, or a mix?
Mitigate, not overcomeOn a zero-redundancy graph, no estimator — robust least-squares, RANSAC, a neural NLOS classifier, factor graphs, anything COTS — can detect a lone biased edge; the residual is identically zero. That is an information limit. Software wins only with the right geometry, or by using time (average a static mesh) or extra sensors (IMU/observer).
Is success guaranteed by adding hardware (more anchors)?
Highest-leverage leverNear-sufficient — with caveats. 4→5 flips redundancy 0→1 (a biased edge becomes detectable); 6–8 gives graceful degradation and LoS diversity against blockage. But added anchors must bring geometric + height diversity, and many radios need a schedule. Boxes placed badly don't help.
Is it the shape of the constellation?
SecondarilyThe set is near-coplanar (weak vertical + mirror ambiguity) and its small hull dooms exterior clients to runaway GDOP. But shape is downstream of the deeper issues — redundancy = 0 and uncorrected NLOS. Fix those and the shape problem largely dissolves.
Could they be spaced further apart and still range/solve?
Inverted indoorsFarther links mean lower SNR and more obstructions per link — indoors with phones, wider spacing makes reliability worse, not better. Wide spacing is an open-LoS / better-antenna property. Denser, well-placed anchors win.
Is the indoor setting the cause?
Primarily, yesMultipath, NLOS, and human-body blockage are the dominant error sources; the same 4 phones outdoors in clear LoS would solve far more reliably. “Indoor” is the difficulty multiplier; “4 anchors” and “no survey” remove the margin that would absorb it.
HARD a physics/geometry/information wall no code crosses on this hardware. SOFT addressable in software or protocol. The two problems the project spent most on — agreement and accuracy — both sit on top of L1, which is hard.
| # | Limitation | Kind | Caps | Lever |
|---|---|---|---|---|
| L1 | 4 anchors = 0 redundancy — a biased/blocked edge is undetectable | HARD | reliability of the anchor solve | ≥5–6 anchors |
| L2 | Near-coplanar — weak vertical, mirror ambiguity | HARD | vertical accuracy, lock stability | ≥3 distinct heights |
| L3 | Exterior clients outside the anchor hull | HARD | exterior accuracy | anchors around coverage |
| L4 | Indoor NLOS / human blockage — time-varying bias & dropouts | SOFT·ish | instantaneous accuracy | NLOS reject · average+lock · redundancy |
| L5 | Phone-class radios — short range, coarse AoA, thin CIR, session caps | HARD·ish | range, AoA, client capacity | dedicated anchors; phones as clients |
| L6 | Many clients over TWR — channel capacity | SOFT | simultaneous clients / rate | TDMA schedule or TDoA |
| L7 | Survey-free — no external scale reference | CHOICE | immunity to a wrong-scale edge | one known baseline, or redundancy |
Ranked by leverage. The numbering is the priority order — do them roughly in sequence.
Provision ≥5–6 anchors with geometric + height diversity. The biggest lever. Five flips redundancy to 1; six gives graceful degradation and LoS diversity. Place them convex around the coverage area at ≥3 heights — and this activates the #63/#69 software that is inert on 4.
Turn NLOS mitigation from stub to real (#62 → classifier). Capture first-path/RSSI (started) and reject or down-weight blocked links — the standard technique. Accept that phone radios cap how good it gets.
Solve-once-and-lock the static mesh; average over time. Anchors don't move: solve in a clean window, lock, re-solve only on a persistent change. Turns transient human blockage from a solve-killer into a non-event.
Add a ranging schedule (TDMA) — or move clients to TDoA. Uncoordinated TWR hits a capacity wall for several clients (and is a prime suspect for the dark link). This is how COTS RTLS reaches many tags.
Keep the over-determination software (#63/#69). No change — it earns its keep once step 1 lands.
Set exterior-client expectations honestly. Outside the hull, multilateration can't be accurate. Ring the exterior with its own anchors, or declare it “presence, not precision.”
Consider a hardware-tier split. Dedicated UWB anchors for fixed infrastructure (real antennas, CIR, range); phones as clients only — what every serious indoor RTLS does.
Today's criteria conflate asks that conflict: wide spacing vs indoor NLOS; exterior clients vs a clustered hull; survey-free sub-cm vs a biased edge; phone-only vs range + NLOS rejection. Split the definition of done.
Static 4–6-anchor mesh, interior clients, solved-and-locked, decimetre, NLOS-mitigated, low client count. Essentially the convergence gate with a realistic tolerance and a 5th anchor. A real, demonstrable product.
Several clients, blockage-resilient, via 6–8 anchors + a ranging schedule. Needs the provisioning and scheduling levers (steps 1 & 4).
Survey-free sub-cm and exterior clients and phone-only and wide spacing. Pick one or two to relax — all four together isn't supported by the physics on this hardware.
A later framing fixes four constraints and relaxes the rest. Freeing anchor count and survey dissolves the hard limits above (L1/L2/L3/L7) and activates the #63/#69 over-determination code that was inert on 4 anchors — the geometry problem becomes a provisioning problem, and provisioning is now allowed.
The new binding tension
Centimetre + rapid motion + consumer-only collide. Consumer per-range ≈ 8–12 cm; a dense surveyed field lands position at ≈5–10 cm — single-digit cm, not sub-cm. A moving tag can't average ranges down; true ≤1 cm needs carrier-phase, which phone APIs don't expose; and consumer clocks can't sync to the sub-ns TDoA needs (1 ns ≈ 30 cm), so ranging stays two-way. Human traffic is now beaten by anchor density + NLOS rejection + IMU coasting.
8–16 surveyed, height-diverse consumer anchors (≥6–8 in LoS everywhere) · robust redundant multilateration (#63/#69, now active) · NLOS rejection (#62) · ES-EKF IMU fusion (predict 100–200 Hz → low latency + smooth fast motion) · TDMA scheduling. ≈5–10 cm, low-latency, traffic-robust — built on the existing stack.
Where a client exposes direction (iPhone U1/U2; some Samsung), fuse the angle for a tighter fix. Real but coarse and device-specific — a refinement on A, not a foundation.
Sub-cm on fast movers isn't reachable consumer-only. Relax exactly one: (i) a dedicated commercial UWB anchor tier (CIR + carrier-phase + sync → TDoA RTLS; phones stay clients), or (ii) cm → few-cm and take A's ≈5–10 cm. A product decision.
Recommendation. Build CoA A now (consumer-only optimum, mostly wiring the existing engine), instrument the achieved σ, and let that number drive the CoA C decision — the walk-capture in progress measures exactly it. Net-new engine work: a TDMA ranging scheduler, dense-anchor auto-survey / calibration, an IMU-forward low-latency output, and live NLOS rejection (mandatory at cm budget).
Sub-cm is relaxed to CoA-A's ≈5–10 cm on one condition: the geometric-predicate triggers stay accurate and low-latency. They do — because of one reframe.
The reframe
Predicate reliability ≠ position accuracy. Evaluate a predicate against the position and its covariance (the EKF already emits per-axis σ), and coarser position costs granularity — the smallest resolvable zone / object / gap, not reliability. Margins are spatial, so latency is untouched — crossings can even fire predictively off the fused velocity. The only real cost: at σ ≈ 5–10 cm, features closer than ~0.5 m can't be cleanly separated.
Enter / leave a zone. Two-threshold hysteresis (enter when confidently inside by ~2–3σ; leave when confidently outside) + a covariance gate. No boundary chatter; correct within a defined band.
Point at an object. Angular, and dominated by orientation error, not position (10 cm at 3 m ≈ 1.9°) — so relaxing position sub-cm barely touches it; the real lever is the heading reference (#64). A σ-driven pointing cone, evaluated in the shared frame so common-mode error cancels.
Cross a lane / plane. Velocity-gated crossing (a genuine directional transit from the IMU-fused velocity) + directional hysteresis. Separates a real crossing from jitter in one–two fixes — reliable and low-latency, even predictive.
Forward-compatible by design
Make every margin σ-driven and reintroducing sub-cm is automatic: feed lower-variance measurements (better radios, a dedicated-anchor tier, or carrier-phase) → the covariance drops → every predicate margin shrinks on its own and the triggers sharpen, with no predicate change. So better tech is a recalibration (anchor positions + delays) at most; a new modality (carrier-phase / TDoA) enters as one added EKF factor; the predicate logic never moves. Design mandate: never hardcode a spatial tolerance — derive it from the live covariance. The accuracy tier becomes a dial, not a rebuild.
Real predicates put entities <1 m apart (a huddle is ~0.3–0.5 m) — below §08's ~0.5 m granularity floor, so it needs better than 5–10 cm. Does more hardware get there?
More anchors ≠ sub-cm
Range error is random (averages ~1/√(N·M)) ⊕ systematic (antenna delay, multipath, NLOS bias, timestamp quantization — persistent, not zero-mean). ToF resolution is set by bandwidth (UWB 0.5–1 GHz → ~15–30 cm raw, few-cm refined), not anchor count. So anchors asymptote at the systematic floor (~2–5 cm) and never reach sub-cm — and in a huddle the bodies NLOS the anchor links, degrading it further. Crossing the floor needs a different measurement modality, not more boxes.
The unlock — relative, not absolute. The huddle is a tell-them-apart question, and relative accuracy is cheaper: direct peer-to-peer ranging measures a separation with no anchors, and common-mode anchor error cancels between co-located devices. Match need to rung:
| Resolve | Needs error | Reachable by |
|---|---|---|
| ~1.0 m | ~0.50 m | CoA A (5–10 cm) — already fine |
| ~0.5 m loose huddle | ~0.25 m | CoA A + dense anchors |
| ~0.3 m huddle | ~0.15 m | CoA D — P2P relative ~5–10 cm |
| ~0.1 m | ~0.05 m | CoA E / G — carrier-phase / optical |
| ~0.02 m sub-cm | ~0.01 m | CoA E / F — carrier-phase, RTLS |
Peer-to-peer relative ranging + joint solver. Achieves relative ~5–10 cm (resolves 0.3–0.5 m huddles; identities never confused). Needs client↔client ranging + a P2P scheduler + a joint factor-graph solver. Trade-off air-time/capacity; still ToF-limited (not sub-cm); solver cost grows with cluster size. Consumer-safe.
Carrier-phase / PDoA ranging. Achieves mm–cm → true sub-cm; the only path below ~2 cm. Needs phase/CIR-exposing radios (dedicated modules, not phones) + integer-ambiguity resolution + CIR multipath exclusion. Trade-off new hardware tier; multipath-fragile (huddle bodies can break phase lock → falls back to cm); highest complexity.
Synced dedicated-anchor TDoA + phase (industrial RTLS). Achieves sub-cm–mm. Needs wired/RF-synced dedicated anchors + pro survey; dedicated tags for sub-cm. Trade-off cost, cabling, fixed + not portable, not consumer — opposite of the vision.
Multi-modal fusion (UWB + optical / acoustic). Achieves relative cm at short range (camera photogrammetry, or phone acoustic chirp) fused with UWB. Needs a fusion layer + camera/mic. Trade-off light/quiet/LoS dependence, privacy, new failure modes.
Predicate redesign to identity + relative. Achieves the intent of many huddle predicates for free — UWB identity (never confuses people) + direct P2P range/bearing + §08's uncertainty logic. Trade-off no <10 cm discrimination; the rest need E/F/G. Free.
Layer them — accuracy becomes per-zone
Because the engine is σ-driven, these aren't rival tiers — each is a measurement factor you add. Default to A + H + D (all consumer-safe; resolves the huddle, keeps identities); add E or G only in the zones that truly need <5 cm; reserve F for guaranteed-mm fixed installs. You never need one global tier — a huddle zone runs P2P + optical while the rest runs anchor-only, and every predicate consumes whatever covariance its region delivers.
Constraint restored to consumer devices only. Can layering multiple meshes over a shared band reach sub-cm? Yes — but not by stacking UWB.
Stacking UWB doesn't cross the floor
More UWB — spatial, frequency-diverse, or differential (RTK-style) — all shares the same ToF/bandwidth/multipath floor, so it clusters at low-cm (~2–3 cm), never sub-cm on a mover. Consumer APIs give a distance per channel, not raw phase, so you can average channels but not coherently synthesize bandwidth; and UWB multipath decorrelates within ~one wavelength (~4 cm), so a differential reference can't cancel the rover's local multipath. Same physics floor, N times.
The crossing needs a different-physics layer — and one is pure consumer: acoustic. Sound is ~10⁶× slower than RF, so the sub-ns timing that's brutal for UWB is trivial for sound: a 48 kHz mic samples every ~7 mm, cross-correlated to cm — sub-cm at short range. Speaker + mic are on every phone; ultrasonic (18–24 kHz) keeps it inaudible. Its weaknesses (short range, noise, bodies) are exactly UWB's strengths — which is why you layer them.
Heterogeneous layered mesh over the shared band. Achieves sub-cm relative in the huddle (acoustic) + cm absolute (UWB) + low-latency (IMU), consumer-only. Needs an acoustic-ranging subsystem, shared-band time-sync + a cross-mesh schedule (extend the netcode), mesh-to-mesh association (via UWB IDs), and a joint multi-modal factor-graph solver. Trade-off acoustic is short-range + noise/NLOS/temperature-sensitive → a huddle-zone layer, not global; sub-cm relative, not absolute (true absolute sub-cm still needs the non-consumer E/F).
Why it fits Aether
The shared band already exists — BroadcastBand + the Raft fabric is the cross-mesh sync + measurement-exchange channel the question posits. The ES-EKF becomes a σ-weighted joint factor graph ingesting heterogeneous edges (UWB range, P2P, acoustic, IMU, optical). Accuracy is then per-edge and per-zone: a huddle lights its acoustic layer for sub-cm relative; open areas run UWB-only. You beat the UWB floor not by stacking UWB, but by interlacing a slower-wave mesh over the same band.
Accept cm (not sub-cm) accuracy for now and make the mesh solve reliably first — because accurate client aiming can't sit on a frame that isn't dependable. Can 4 anchors do it, at what cost, and what do more anchors measurably buy?
4 anchors: reliable only if you trade away four freedoms
With zero spare constraints (masthead), a 4-mesh can't detect its own bad edge — so to be dependable it must surrender survey-free operation (pin the frame to the survey), arbitrary placement (non-coplanar, clean LoS on all 6 edges), continuous re-solve (solve-once-and-lock), and self-healing (manual re-commission if bumped). It reliably solves a static, surveyed, locked, lightly-trafficked mesh — not a survey-free, mobile, trafficked, self-healing one.
What more anchors buy · (1) survives human traffic
Each anchor independently body-blockable at p=0.7; a good 3-D fix needs ≥4 clean anchors. Going 4 → 6 takes a mesh from dying when a person walks through it (24%) to solving 3 of 4 moments (74%). This is the resilience metric that matters under real traffic.
What more anchors buy · (2) accuracy — but only down to the floor
Illustrative σ ≈ floor + A/(N−3). More anchors shrink the geometric/GDOP error and asymptote at the ToF systematic floor — real gains, but never sub-cm. The takeaway divides cleanly: add anchors for reliability & traffic-resilience (charts above), not to change the accuracy class (that needs §09–§10's different-physics layers).
Courses of action for a dependable solve — the R-series, ordered from zero-hardware-today to the robust target:
Surveyed & frame-locked 4-anchor. now · 0 hw Pin to the recorded survey, solve once, lock. Sacrifice survey-dependent · manual re-commission · 24% traffic coverage. Dependable for a static, light-traffic solve today.
Observer-walk self-survey + lock. near-term The #69b-i walk over-determines the frame → self-solve then lock, dropping the tape-measure. Sacrifice a commissioning walk · still static-lock · still 24% traffic. Fixes how you get the frame, not 4-anchor fragility.
Provision to 6 anchors. target 3 spare constraints → detect & drop a bad edge, 74% coverage, survey-free (self-checks), continuous re-solve, self-diagnosis, mobility-tolerant. Sacrifice two more devices — the only real cost. Software is already over-determined-ready (#69).
Static solve-and-LOCK + NLOS/σ gate. cross-cutting Freeze the frame while clean; gate client range updates by an NLOS/σ test so a body-blocked spike can't corrupt a position. Mandatory at N=4, belt-and-suspenders at N≥6. Makes any N dependable.
Recommendation — lock now, provision to six for traffic
NOW (0 hardware): R1 + R4 — pin to survey, solve-once-and-lock, add the NLOS/σ gate → today's mesh is dependable for a static, light-traffic solve, enough to start validating aiming against a frame that won't move under you. NEAR-TERM: R2 drops the tape-measure (validated by the walk capture). TARGET: R3 — provision to 6 anchors, the honest precursor to reliable aiming under real traffic: 4 can be made reliable only by giving up mobility, blockage-tolerance and self-healing — 6 buys all three back for the price of two devices. Keep R4's lock-and-gate as the invariant.
The mission, honestly
The premise is right and the software built so far is largely correct and necessary — it is simply operating under a geometry that gives it nothing to work with. Spend the next effort on anchors, placement, NLOS signal, and a scheduler, tier the acceptance criteria, and the achievable version is close at hand. The walk-capture in progress will quantify exactly how much of the 4-anchor gap the observer lever can close — which tells us whether a 5th anchor is optional or mandatory for the target tier.
Sources
Full analysis + citations: design/MISSION_AND_FEASIBILITY.md · basis: MOFE engine, roadmap, capture4 NDJSON, aether_mesh_survey.mp4