room sim
a room, drawn from a file
This is the room as defined: the floor outline, the wall materials and thicknesses, every piece of furniture at its real size and angle, and every ESP32 at the height it is declared to be mounted at. It is the input the rest of the system will be measured against — not an output of anything.
the scene
Three rooms. All three typed in.
The two example rectangles are a bedroom and a small office. The third is an L-shaped hall, and it is in the set because its floor is a six-sided polygon inside an 8 x 6 m box: a viewer that quietly draws the bounding box would report 48 m² of floor where there is 35.75 m², and a localizer that assumes a convex room goes wrong at the inner corner for the same reason.
The room is drawn with WebGL, which needs JavaScript. With JavaScript off nothing is drawn — no picture of a room is substituted for one that could not be built. Every claim on this page, including the dimensions of the three example rooms and the reason WiFi cannot supply them, is in the text below and reads normally. The scene files themselves are linked at the end.
Drag to rotate, scroll or pinch to zoom. With the view focused: ← ↑ ↓ → rotate, + − zoom. Every object is also in the list in the panel, which is the keyboard way to select one.
why the shapes come from a file
WiFi did not measure this room. It cannot.
The deciding quantity is coherent aperture extent — not antenna count and not
bandwidth. In the near field, depth comes from wavefront curvature, and the depth of focus is
4λR²/L². At λ = 12.3 cm, resolving a wall
at R = 3.5 m to 30 cm needs an aperture of
L ≈ 4.5 m, larger than the room.
Saans has L = 0. Two or three ESP32s bolted to walls form no aperture at all, their positions are typed in by a human, and each one's clock runs free with no phase reference to the others. Nothing in that configuration recovers a room outline, a wall position, or the shape of a sofa, and a wider channel does not fix it: the measured span is 56 subcarriers at 312.5 kHz, 17.19 MHz, so one path-length cell is 17.45 m and every first-order reflection in an ordinary room lands inside it.
That is why a scene is a file. The full argument, with the backup limit and the
sources, is in docs/CAPABILITY_LIMITS.md.
- Room size and wall layout
No. Needs an aperture larger than the room.
- Recognising a bed or a sofa
No. There is no imaging here at all, so there is nothing to recognise an object in.
- Where a node is
No. One RF chain gives no angle of arrival, and phase sanitization destroys absolute ranging. Node positions are surveyed by hand and typed in; any error in them lands in whatever is computed from them.
- What the material of a wall is
No. The materials named in these files are declarations, and their electrical constants come from a published table, not from this hardware.
the files this page reads
Served from this gateway, same origin, nothing fetched from anywhere else:
bedroom.json (4.2 x 3.6 x 2.7 m),
office.json (6 x 5 x 2.9 m) and
hall-l.json (an L-shaped floor of 35.75 m² inside an
8 x 6 m box). The format is scenes/scene.schema.json in the repository, and the same
three files are compiled into the simulator, so a room cannot mean one thing here and another
there.
Material constants are materials.json: ITU-R
P.2040 Table 3, evaluated at 2.437 GHz, which is 802.11 channel 6. They are a sourced default and
not a calibration — nothing in that file has been checked against a measurement made with this
hardware, and fabric has no row at all rather than an invented one.
The view is drawn with three.js, committed into the repository and served from this gateway. Nothing on this page is fetched from another origin, because the gateway may be running in a building with no route out. The licence is served beside the code, at three-LICENSE.txt.
next