室内定位:Wi-Fi指纹定位原理、iBeacon与蓝牙定位、室内地图展示

说到室内定位,我得先跟你交个底——GPS在室内基本是废的。信号被楼板一挡,误差能跑到几十米开外。我早年做过一个商场导航项目,用户一进大门,定位点直接飘到隔壁街区去了。那场面,真是尴尬。

所以室内定位得另想办法。今天聊的这几个方案,都是实际项目中用得最多的。Wi-Fi指纹、iBeacon蓝牙、室内地图,这三板斧砍下去,大部分室内场景都能搞定。

Wi-Fi指纹定位原理

Wi-Fi指纹定位,说白了就是「用信号强度来猜你在哪」。你想想看,每个Wi-Fi热点在不同位置的信号强度是不一样的。我们把这种信号特征记录下来,就形成了一张「指纹地图」。

具体分两步走:

  1. 离线采集阶段:拿着设备在室内走一圈,每隔1-2米记录一次周围所有Wi-Fi热点的信号强度(RSSI)。每个位置对应一组信号向量,这就是指纹。
  2. 在线定位阶段:手机实时扫描周围的Wi-Fi信号,跟指纹库做匹配,找到最相似的那个位置。

匹配算法我常用的是KNN(K近邻)。简单说就是找指纹库里跟当前信号最像的K个点,然后取它们的平均坐标。

核心公式(简化版)

欧氏距离 = sqrt( (rssi₁ - ref₁)² + (rssi₂ - ref₂)² + ... )

距离越小,说明当前位置越接近那个指纹点。

我在项目中遇到过一个问题:Wi-Fi信号会随时间波动。早上和晚上,同一位置的RSSI能差5-6dBm。后来我加了个滑动窗口滤波,取最近5秒的信号平均值,效果好了不少。

我的经验:指纹采集时别偷懒。每个点至少采30秒,去掉最高最低的10%,剩下的取平均。这样建出来的指纹库才稳。

iBeacon与蓝牙定位

iBeacon是苹果推的蓝牙低功耗(BLE)方案。跟Wi-Fi指纹比,它有几个明显优势:

  • 功耗低——一颗纽扣电池能跑一年多
  • 部署简单——往墙上一贴就行
  • 精度更高——近距离能做到1-3米

iBeacon的工作原理其实不复杂。每个Beacon设备会定期广播一个数据包,里面包含:

UUID(唯一标识)
Major(主编号,比如楼层)
Minor(次编号,比如具体区域)
Tx Power(发射功率,用于估算距离)

手机收到广播后,根据接收到的RSSI和Tx Power,就能估算出距离。公式大概是:

distance = 10 ^ ((TxPower - RSSI) / (10 * n))

这里的n是环境衰减因子,一般取2-4。空旷环境取2,有遮挡取3-4。

注意:蓝牙信号受人体遮挡影响很大。我做过测试,手机放口袋和拿在手里,RSSI能差10dBm以上。所以定位时最好让用户把手机举起来。

实际项目中,我一般把Wi-Fi指纹和iBeacon结合起来用。Wi-Fi做粗定位(确定在哪个区域),iBeacon做精定位(确定在哪个货架前)。效果比单用一种好得多。

室内地图展示

定位数据有了,怎么展示给用户?室内地图跟室外地图完全是两码事。

室外地图有现成的SDK(Google Maps、高德、百度),室内地图你得自己画。常用的方案有两种:

方案 优点 缺点
SVG矢量图 缩放不失真,文件小 复杂场景绘制麻烦
瓦片地图(Tile Map) 加载快,支持大场景 需要切片工具

我个人习惯用SVG。室内地图一般就一层楼,几百平米,SVG完全够用。而且可以方便地添加交互——点击某个店铺弹出信息,长按某个位置设置目的地。

下面是一个室内定位的核心流程图,帮你理清整体逻辑:

室内定位系统核心流程 离线指纹采集 iBeacon部署 室内地图绘制 指纹库构建 信号滤波与校准 地图坐标映射 Wi-Fi信号扫描 蓝牙信号接收 位置计算(KNN) 室内地图渲染 + 定位点展示

地图展示这块,有几个关键点要注意:

  • 坐标系转换:定位算法算出来的是物理坐标(米),地图用的是像素坐标。中间需要一个映射关系。我一般用仿射变换,三个锚点就能搞定。
  • 楼层切换:多楼层场景下,用户走到楼梯口或电梯口时,要自动切换楼层。这个靠检测气压变化或者Wi-Fi信号突变来实现。
  • 路径规划:用户想去某个店铺,你得画一条导航线。室内路径规划跟室外不一样,不能用车行道路,得用步行通道。我习惯用A*算法,把地图网格化后搜索最短路径。

避坑指南:室内地图的缩放级别别搞太多。我见过有人做了20级缩放,结果手机卡成PPT。3-5级就够了,再多了用户也看不清。

嗯,说到这,室内定位的核心内容基本都覆盖了。Wi-Fi指纹适合大范围粗定位,iBeacon适合小范围精定位,室内地图是展示层。三者配合好了,用户体验能做得相当不错。

最后提醒一句:室内定位没有银弹。别指望一种方案解决所有问题。根据场景选方案,该混合就混合,该妥协就妥协。这才是工程思维。


公众号:蓝海资料掘金营,微信deep3321