室内定位:Wi-Fi指纹定位原理、iBeacon与蓝牙定位、室内地图展示
说到室内定位,我得先跟你交个底——GPS在室内基本是废的。信号被楼板一挡,误差能跑到几十米开外。我早年做过一个商场导航项目,用户一进大门,定位点直接飘到隔壁街区去了。那场面,真是尴尬。
所以室内定位得另想办法。今天聊的这几个方案,都是实际项目中用得最多的。Wi-Fi指纹、iBeacon蓝牙、室内地图,这三板斧砍下去,大部分室内场景都能搞定。
Wi-Fi指纹定位原理
Wi-Fi指纹定位,说白了就是「用信号强度来猜你在哪」。你想想看,每个Wi-Fi热点在不同位置的信号强度是不一样的。我们把这种信号特征记录下来,就形成了一张「指纹地图」。
具体分两步走:
- 离线采集阶段:拿着设备在室内走一圈,每隔1-2米记录一次周围所有Wi-Fi热点的信号强度(RSSI)。每个位置对应一组信号向量,这就是指纹。
- 在线定位阶段:手机实时扫描周围的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完全够用。而且可以方便地添加交互——点击某个店铺弹出信息,长按某个位置设置目的地。
下面是一个室内定位的核心流程图,帮你理清整体逻辑:
地图展示这块,有几个关键点要注意:
- 坐标系转换:定位算法算出来的是物理坐标(米),地图用的是像素坐标。中间需要一个映射关系。我一般用仿射变换,三个锚点就能搞定。
- 楼层切换:多楼层场景下,用户走到楼梯口或电梯口时,要自动切换楼层。这个靠检测气压变化或者Wi-Fi信号突变来实现。
- 路径规划:用户想去某个店铺,你得画一条导航线。室内路径规划跟室外不一样,不能用车行道路,得用步行通道。我习惯用A*算法,把地图网格化后搜索最短路径。
避坑指南:室内地图的缩放级别别搞太多。我见过有人做了20级缩放,结果手机卡成PPT。3-5级就够了,再多了用户也看不清。
嗯,说到这,室内定位的核心内容基本都覆盖了。Wi-Fi指纹适合大范围粗定位,iBeacon适合小范围精定位,室内地图是展示层。三者配合好了,用户体验能做得相当不错。
最后提醒一句:室内定位没有银弹。别指望一种方案解决所有问题。根据场景选方案,该混合就混合,该妥协就妥协。这才是工程思维。
公众号:蓝海资料掘金营,微信deep3321