观察如何变成基站位置?拆解Mozilla Ichnaea的四因子加权算法(精度/时效/速度/信号)
【免费下载链接】ichnaeaMozilla Ichnaea项目地址: https://gitcode.com/gh_mirrors/ic/ichnaea
Mozilla Ichnaea 是 Mozilla 开发的基站定位引擎,它靠收集海量手机"观察数据",用**四因子加权算法(精度、时效、速度、信号)**把每一次观察换算成一个权重,再累加成一个持续更新的基站/WiFi/蓝牙位置模型。本文用图表带你完整拆解这套算法:为什么弱信号数据会被直接丢弃?为什么"平均观察"的权重恰好是 1.0?看完你也能看懂官方算法文档 docs/algo/observations.rst 里的每一张曲线图。
📍 先搞懂"观察点":Ichnaea 定位的不是发射器,而是"被看见的地方"
很多人以为基站定位系统要算出基站铁塔的坐标,Ichnaea 的设计思路恰恰相反:
每个基站被建模成一个圆:圆心是所有观察点的加权平均位置,半径大到能包住全部历史观察。
这很巧妙——WiFi 路由器通常在楼内,但行人走在楼外马路上时 GPS 信号最好、观察最可信,所以 Ichnaea 的模型中心会偏向"被看见最多的地方",而不是路由器物理位置。官方算法说明在docs/algo/observations.rst,位置更新任务实现在ichnaea/data/station.py。
新观察点到达后,系统会给每个点打分,权重为 0 的直接丢弃;存活下来的观察点按权重影响基站中心,中心同时向新数据"缓慢漂移"——老基站权重累积得越高,单次新观察的影响越小。
⚖️ 核心公式:四个权重相乘,一票否决
每条观察的最终权重只有一个公式:
总权重 = 精度权重 × 时效权重 × 速度权重 × 信号权重
前三个因子共用同一种"三段式"算法(0.0 ~ 1.0),任何一个因子为 0,整条观察直接作废。
1️⃣ 精度权重(Accuracy):GPS 误差半径越小越可信
取的是"上报位置与真实位置之间的预期距离"(米):
| 精度半径 | 权重 |
|---|---|
| ≤ 10 m | 1.0(满分) |
| 40 m | 0.5 |
| 90 m | ≈ 0.33 |
| ≥ 200 m(WiFi)/ 100 m(蓝牙)/ 1000 m(蜂窝) | 0.0(丢弃) |
阈值定义在ichnaea/models/constants.py(如WIFI_MAX_OBSERVATION_ACCURACY = 200.0)。
2️⃣ 时效权重(Age):看到信号和记录位置的时间差
| 时间差 | 权重 |
|---|---|
| ≤ 2 s | 1.0 |
| 8 s | 0.5 |
| 18 s | ≈ 0.33 |
| ≥ 20 s | 0.0(丢弃) |
时间差越大,说明你看到信号时和 GPS 定位时距离已经拉开了,数据越不可信。
3️⃣ 速度权重(Speed):开车飞驰时看到基站不可靠
| 速度 | 权重 |
|---|---|
| ≤ 5 m/s(步行) | 1.0 |
| 20 m/s | 0.5 |
| 45 m/s | ≈ 0.33 |
| ≥ 50 m/s | 0.0(丢弃) |
三个因子都未知时,该因子按 1.0 计——未知不扣分,离谱才丢弃,这是该算法对数据不完整场景的宽容之处。
4️⃣ 信号权重(Signal):唯一能"超过 1.0"的因子
WiFi 和蜂窝信号强度以 dBm 衡量,权重随信号增强指数上升、随减弱指数下降,但永远不会到 0:
| 无线电类型 | 权重 0.5 | 权重 1.0(平均值) | 权重 2.0 | 权重 4.0 |
|---|---|---|---|---|
| WiFi | -98.9 dBm | -80 dBm | -64.1 dBm | -50.7 dBm |
| GSM | -113.9 dBm | -95 dBm | -79.1 dBm | -65.7 dBm |
| WCDMA | -118.9 dBm | -100 dBm | -84.1 dBm | -70.7 dBm |
| LTE | -123.9 dBm | -105 dBm | -89.1 dBm | -75.7 dBm |
信号强度未知时按平均值处理;蓝牙信号权重恒为 1.0,因为蓝牙信号强度波动太大、参考价值低。
💡 设计意图一目了然:精度/时效/速度是"生死线",信号强度只是"加分项"——弱信号不会让你的数据作废,只会让它影响力变小。
🔁 加权之后:观察点如何改写基站数据库
每个分片队列攒够一批观察后,ichnaea/data/station.py会把同属一个基站的观察分组处理(如果有 GPS 级观察,就只用 GPS 级的,丢弃定位查询级的)。系统用 7 个"是/否"事实(基站是否存在?位置是否一致?位置是否已一年未确认?是否基于 GNSS?……)推导出 7 种更新状态:
- New— 新增基站
- Change— 按加权平均微调现有基站位置
- Confirm— 确认基站今天仍活跃
- Replace— 用 GPS 级观察直接替换旧位置(查询级升级为 GNSS 级的"越级"路径)
- Block— 位置被移除,基站从定位查询中屏蔽
- New Block— 新增即被屏蔽
- No Change— 不做任何修改
还有一个防"移动基站"的巧思:被屏蔽的基站 48 小时后自动复查;如果一年内被屏蔽 12 次以上,会被判定为移动基站(比如车载 WiFi 热点)长期屏蔽。
🔬 想读源码?只看这两个文件就够了
- 权重公式本体:
ichnaea/models/observation.py(BlueObservation、CellObservation、WifiObservation各自的weight属性) - 全部阈值常量:
ichnaea/models/constants.py - 官方算法图解(本文所有图片出处):
docs/algo/observations.rst
📝 一句话总结
Mozilla Ichnaea 的四因子加权算法本质是一套数据信用评分系统:精度、时效、速度三关定生死(任一归零即丢弃),信号强度定贡献度(越强权重越高,蓝牙免检);活下来的观察点按权重持续拉扯基站模型的中心和半径,让全球基站位置数据库在无人工标注的情况下越用越准。
【免费下载链接】ichnaeaMozilla Ichnaea项目地址: https://gitcode.com/gh_mirrors/ic/ichnaea
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考