一个零依赖、单文件即可运行的顶视图交互工具,用来实时仿真人在传感器(毫米波雷达类) 在不同安装方式、安装位置、下倾角、FOV 与探测距离下,对一个矩形房间的存在 / 运动覆盖情况。
适用于家装、智能家居、安防、办公空间等场景下的传感器选型与点位规划。
🌐 立即试用:https://eyaeya.github.io/presence-sensor-coverage/
- 三种安装方式:吸顶(ceiling)、侧装(side)、墙角(corner),切换即时刷新默认参数。
- 精确坐标定位:除鼠标拖拽外,右侧面板可直接键入距墙 mm 距离精确放置传感器(顶装四向 / 侧装沿墙),对向墙距离自动计算,拖拽与输入双向实时联动。
- 几何精确:基于椭圆锥波束模型 + 球形最大探测距离,覆盖区按 3D 欧氏距离裁切,而非简单 2D 投影。
- 多高度洋葱分层:同时显示 站立 1200 / 端坐 750 / 仰躺 600 / 落地 0 mm 四个被检测高度的覆盖切片。
- 双距离边界:分别绘制存在检测(presence)与运动检测(motion)的最大探测半径轮廓。
- 传感器预设:内置 5 个市售雷达预设(子擎 Trio / Celling / Lite、小米人在 Pro、小米人体 2S),一键应用规格,也可在 src/presets.js 自行扩展。
- 鼠标读数:悬停画布即可读到距各墙面的距离、所在高度的覆盖状态。
- 零构建 / 零依赖:纯 HTML + 原生 JS + SVG,离线打开
index.html即可用。 - 可自动化测试:浏览器内单元测试 179 条(
tools/run-tests.mjs)+ Node 端几何反推回归 + 属性模糊(fuzz-pipeline)、精确边界值(boundary-values)、变异测试(mutation-check)与 double-blind 五重 oracle 校验套件。
最快:直接打开在线版本即用,无需克隆:
➡️ https://eyaeya.github.io/presence-sensor-coverage/
本地运行(克隆或下载本仓库后):
# 方式一:直接打开(macOS)
open index.html
# 方式二:起一个本地静态服务器(推荐,便于跨域加载与刷新)
python3 -m http.server 8000
# 然后访问 http://localhost:8000/要求浏览器支持 SVG 与 ES5+(任何近 5 年的 Chrome / Safari / Firefox / Edge 都没问题)。
| 名称 | 安装方式 | 水平 FOV | 垂直 FOV | 存在 / 运动距离 |
|---|---|---|---|---|
| 子擎 Trio | 侧装 | 160° | 90° | 6000 / 7000 mm |
| 子擎 Celling | 吸顶 | 160° | 160° | 4000 / 5500 mm |
| 子擎 Lite | 吸顶 / 侧装 | 130° | 130° | 4000 / 8000 mm |
| 小米人在 Pro | 吸顶 / 侧装 / 墙角 | 110° | 60° | 4000 / 7000 mm |
| 小米人体 2S | 侧装(低位 200 mm) | 130° | 130° | 3000 / 8000 mm |
预设以**「一个传感器 = 多种安装形态变体」** 的结构组织。每个变体可独立定义安装高度、下倾角等参数,未填字段沿用该安装方式的全局默认值。详见 src/presets.js。
.
├── index.html # 主入口:布局、样式、加载脚本
├── src/
│ ├── geo.js # 纯几何数学(向量 / 椭圆锥 / 距离裁切)
│ ├── presets.js # 传感器预设清单
│ ├── state.js # 应用状态 + 安装方式切换的默认值
│ ├── render.js # SVG 绘制(房间、波束、洋葱层、距离环)
│ ├── info.js # 右侧信息栏 / hover compass / coverage 网格
│ ├── interact.js # 底部工具栏控件(滑杆 / 输入 / 预设下拉)
│ ├── tests.js # 浏览器内的单元测试断言
│ └── app.js # 启动逻辑:组装模块 + 渲染循环
├── docs/
│ ├── dev-log/ # 开发进度日志
│ └── superpowers/ # 设计 spec 与实施 plan
└── tools/
├── run-tests.mjs # Node 端运行 src/tests.js
├── geometry-blind-7000-cases.mjs # 盲测:覆盖反推回归
├── geometry-implicit-contour-cases.mjs # 隐式轮廓采样
├── geometry-inverse-cases.mjs # 逆向几何用例
└── double-blind/ # 五路独立 oracle 交叉验证
顶视图:x ∈ [0, W] 向右,y ∈ [0, D] 向上;z 是离地高度。传感器在房间中的位置由安装方式决定。
- 吸顶(ceiling):传感器贴顶,朝下;水平角 φ 控制波束在顶视平面上的旋转。
- 侧装(side):传感器贴左/右/下/上墙;ψ 控制波束相对墙法线的偏转(0° 垂直墙面、90° 平行墙面);同时可调下倾角 θ。
- 墙角(corner):传感器贴在四角之一,朝室内 45°;下倾角 θ 可调,水平角固定 45°。
- 中轴单位向量
d由安装方式 + ψ/φ + 下倾角 θ 决定。 - 水平 FOV 半角 αH、垂直 FOV 半角 αV 分别张在局部正交基
(u, v)上。 - 点
P在锥内 ⇔t = (P − S) · d > 0且椭圆约束成立。
按真实 3D 欧氏距离 R 度量。对被检测高度 h,其顶视圆环半径 = sqrt(R² − (S_z − h)²);若 R ≤ |S_z − h|,则该高度无有效覆盖。
四个被检测高度(站 1200 / 坐 750 / 躺 600 / 地 0 mm)固定,从外向内依次叠绘存在覆盖区,并以虚线圈出最大距离边界。
更详细的数学推导见 docs/superpowers/specs/2026-05-19-presence-sensor-visualizer-design.md。
项目同时维护浏览器单测与Node 端几何回归测试:
# 在 Node 里跑全部 src/tests.js 断言
node tools/run-tests.mjs
# 大规模反推回归(7000 例随机参数)
node tools/geometry-blind-7000-cases.mjs
# 隐式轮廓采样验证
node tools/geometry-implicit-contour-cases.mjs
# 五路 oracle 双盲交叉验证
ls tools/double-blind/浏览器内单测在打开 index.html 后会自动运行;可在控制台看到 PASS: / FAIL: 行与汇总。
修改 src/presets.js,往 window.SensorPresets 数组里追加一条:
{
id: "your-brand-model",
name: "你的牌子 X1",
variants: [
{ mount: "ceiling", label: "吸顶",
hFov: 120, vFov: 90, rangePresence: 5000, rangeMotion: 7000,
tilt: 0 },
{ mount: "side", label: "侧装",
hFov: 120, vFov: 90, rangePresence: 5000, rangeMotion: 7000,
height: 1800, tilt: 25 }
]
}variant 中未列出的字段(如 height、tilt)会沿用该 mount 的 MOUNT_DEFAULTS(见 src/state.js)。
当前版本只做:
- 矩形封闭空间
- 单个传感器
- 吸顶 / 侧装 / 墙角三种安装
- 4 个固定被检测高度的覆盖分层
- 实时重算重绘
不做:非矩形空间、多传感器联合覆盖、自定义检测高度档、3D 视图、覆盖率持久化/导出。这些都属于明确放弃的范围,避免特性蔓延。
欢迎提 Issue 反馈实际产品规格、安装姿态、几何模型修正建议。若要直接贡献代码,请:
- fork 本仓库;
- 在新分支上完成修改;
- 跑通
node tools/run-tests.mjs; - 提 PR,并在描述里说明涉及的安装方式 / 几何场景。
License 待定(如需引用本项目代码或预设数据,请先与作者确认)。