基于Wi-Fi的室内定位在美团总部的实践和应用(上)

室内定位技术的商业化必将带来一波创新高潮,尤其是在O2O领域,各种基于此技术的应用将出现在我们的面前。我们可以想象一些比较常见的应用场景,比如在大型商场里面借助室内导航快速找到目标商铺,商店根据用户的具体位置向用户推送更多关于商品的介绍等等,这些应用会极好的服务于O2O,提高用户体验。

目前室内定位技术有很多,如A-GPS、蓝牙、超声,红外、信标、射频、Wi-Fi、计算机视觉等,这些技术综合比较,其中以基于Wi-Fi的室内定位技术最为突出,无论从硬件投入、软件投入、实施难度、可控性,还是定位效果方面考察,都是有优势的。

本文描述了作者在美团总部从零开始构建基于Wi-Fi的室内定位系统的过程,具有广泛的借鉴意义。

基于Wi-Fi的室内定位原理

  • 为提供Wi-Fi服务,室内会部署有热点(AP),每一个无线AP都有一个全球唯一的MAC地址,并且一般来说无线AP在一段时间内是不会改变的。
  • 设备可以程序控制扫描并收集周围的AP信号,无论是否加密,是否已连接,甚至信号强度不足以显示在无线信号列表中,都可以获取到AP广播出来的MAC地址。
  • 对应每个AP,这里有两个重要数据,AP的MAC地址和信号强度,MAC地址可以决定是哪个AP;信号强度理论上是和AP之间的距离有函数关系的,就是根据信号强度可以算出和AP的距离。
  • 设备将这些数据发送到位置服务器,服务器就可以用一个算法计算出设备的地理位置并返回到用户设备。
  • 定位的精度取决于AP的个数,信号的稳定程度,以及算法的选择。

美团总部Wi-Fi部署情况

美团总部于2014年1月搬入了望京科技园3期,新的办公室地上共4层,建筑面积一万多平米,共部署有86台无线AP,覆盖很充分,没有死角,这为良好的定位效果打下了基础。

无线AP使用的是,ArubA AP-135,这是一款优秀的商用无线路由器,2.4-GHz/5-GHz双频。

基础数据测绘

第一步,建立AP的基础数据库是关键,至少需要如下信息:

  • AP的MAC地址,这里是双频的AP,就是有2个无线MAC地址
  • AP的物理位置

关于AP的物理位置,这里因为范围太小,加之无法找到足够精度的参考点,所以AP的物理位置无法使用GPS坐标,只能使用自定义坐标系。 这里有2种选择:

  • 以建筑的东南角为参考点(坐标原点),这样就可以测绘AP相对原点的坐标,包含Z轴,单位是米
  • 以测绘图的图片为参考,以AP在图中的像素位置为坐标,单位是1像素点

这里选用了后一种方法,因为后一种方法容易测绘,大部分工作在电脑上操作即可;前一种方法需要更多的实地测绘工作。

关于AP的MAC地址,从IT那里要到了一个列表,如图所示:

但是很不幸,这里的MAC地址是路由器的WAN口的MAC地址,而我们需要的是两个无线模块的MAC地址。 这里只能自己测绘了,我写了一小段android程序,可以排序出最近的AP的MAC地址,然后挨个跑到各个AP下,运行程序,记下两个MAC地址;同时记录下AP的真实物理位置。

WifiManager wm = (WifiManager) getSystemService(Context.WIFI_SERVICE);
wm.startScan();  //开始扫描AP
//等待一段时间,时间可长可短
List<ScanResult> results = wm.getScanResults();  //拿到扫描的结果
Collections.sort(results,this);  //this是个Comparator,按照level排序
//去掉非sankuai的SSID
//在UI线程中,显示到界面上
int max=Math.min(30,results.size());
for(int i=0;i<max;i++) {ScanResult one = results.get(i);text1.append("\n"+one.BSSID+"\t\t"+one.level);
}

图中信号最强的就是当前AP的MAC地址,然后地址与它相近的是这个AP另一个频段的MAC地址,两个MAC地址都是0结尾,尾数相差1,容易辨认。 MAC地址后面的数字是信号强度,单位是dBm,是个负数。

然后在底图中标注好AP的准确的物理位置,图中红色圆点即是AP位置,其圆心的像素坐标当作AP的坐标。

测绘的数据应该存入数据库,这里设计了一个POJO,服务器端程序可以使用:

public class MtApLoc {private int id;        //数字ID    人工定,有一定含义private String id1;    //字符串ID  从IT给表中来private String mac1;   //WAN MAC地址,有线口的private String sn;     //AP的 SN  从IT给表中来private String sku;    //资产编号 N  从IT给表中来private String mac2;  //无线MAC 1 ,测绘得来private String mac3;  //无线MAC 2 ,测绘得来private int pn;       //图号  对应楼层private float x;      //物理坐标 x  自定义坐标系中private float y;      //物理坐标 y  自定义坐标系中}

然后将测绘的数据录入数据库,最后得到的数据如:

其中的x,y是此AP在对应楼层的测绘图的图片中的坐标。

MAC2和MAC3是AP的两个MAC地址(这里没有区分2.4G和5G),和上面的测绘客户端的截图比较,能看出当时我是站在AP7下的。

把所有86个AP的物理位置和MAC地址测绘收集全后,测绘过程完成。

Android客户端示例

这里写了一个Demo用的android客户端,来测试定位结果,先看客户端运行截图:

点击定位按钮,系统会扫描AP,然后把结果请求到服务器。

HttpPost post = new HttpPost(BaseUrl + "/gar/locate/ap-locate.html");
List<NameValuePair> parameters = new ArrayList<NameValuePair>();
for (ScanResult result : results) {parameters.add(new BasicNameValuePair("mac", result.BSSID.toUpperCase()));parameters.add(new BasicNameValuePair("rssi", String.valueOf(result.level)));
}
post.setEntity(new UrlEncodedFormEntity(parameters, "UTF-8"));
String res;
synchronized (hc) {HttpResponse response = hc.execute(post);res = EntityUtils.toString(response.getEntity(), "UTF-8").trim();
}
Log.w(TAG, res);

服务器返回其所在位置,是一个JSON字符串

{"accuracy":0.0,"message":"ok Least Squares","pn":1,"status":0,"x":237.97249473061038,"y":1241.8270604002646}

然后客户端显示pn对应的底图,然后在底图的x,y位置上显示定位到的标志,即图中跳动的红心。 客户端大部分代码都是UI相关代码,这里不贴出了。

定位算法

常见的室内定位的算法主要分为两类:基于测距技术的定位算法和距离无关的算法。基于测距技术的算法一般是通过节点之间的距离或者角度来计算出未知节点的位置,实际运用中常见的有:基于接收信号强度指示算法(RSSI)、到达角度算法(AOA)、到达时间算法(TOA)等。距离无关的算法有:质心法、APIT算法、凸规划算法等。这些算法都是利用节点之间的邻近关系实现定位的。一般来说,基于测距技术的算法比无需测距的精度要高,这里适合采用。

首先确定一个信号强度和距离之间的关系,这需要了解电波传播模型。在自由空间环境中,不考虑阻挡和多径传播,设发射端与接收端的距离为d,则接收端的接收功率Pr可表示为:

其中Pt为发射功率;Gt和Gr分别为发射和接收天线增益;λ为电波波长;Pt和Pr的单位是瓦特;Gt和Gr无量纲。由上式可以看出,在自由空间中,接收功率与距离d2成反比。

在实际环境中,由于存在多径、障碍物、绕射等随机因素,无线电传播损耗与上式相比还是有较大变化。此时,常采用对数-常态分布模型更为合理:

其中Pr单位为dBm ,d0一般取1。在一般室内定位中,考虑到环境、成本、定位精度要求等因素,所使用的RSSI测距信号衰减模型进一步简化为:

d为定位节点与参考点之间的距离,单位m;A为定位节点与参考点之间的距离d为1m时测得的RSSI值;n为信号衰减因子,范围一般为2~4。

在美团的环境中,我们取A为-50,n为2.1。

这样根据信号强度,就能估算设备和AP之间的距离。

定位方法一般是根据几何模型建立方程,然后求解方程得到节点坐标。 只有一个AP的情况:

这里目标点坐标只能取AP的坐标,精度取半径

两个AP的情况:

这里取AB的中间位置,精度取AB的长度。

三个AP的情况:

这里取三个圆的一个共同交点。

不过实际没有这么简单,因为距离都有误差,两个AP时,可能是这种情况:

三个AP可能是这种情况

甚至这种:

这只是三个AP,有更多AP时怎么办?

这里考虑一般的情况:

考虑一般的情况,设有n个AP,AP1,AP2,…,APn,坐标是(xi,yi)。目标点到这n个AP的距离是di。 设目标点的坐标是(X,Y),则可列一个方程组,有n个等式:

大家都减第一个等式,就消去了二次项,得到另一个方程组,有n-1个等式:

常数项换个名字,得到:

等式除以X的系数ai,变量换个名字,得到:

等式有n-1个,现在问题变成了:已知一组点(ui,vi)满足p+uq=v,求最合适的系数p,q,这是典型的最小二乘法

Java里可以用Apache Commons Math3这个library来解决最小二乘法,文档见 SimpleRegression

这里还有一个问题,AP的坐标(xi,yi)是像素坐标,那di相应的需要是像素距离,需要做一个比例尺变换

比例很容易算,相关代码:

public double getPicLen(double rssi) {double f=(-rssi-50)/22.0;return 41.785*Math.pow(10,f);
}

服务器端代码示例

通过上面的描述,服务器端代码就很容易写了,这里给出主要代码:

private String[] macs;  //输入mac地址
private float[] rssis;  //输入信号强度
private int pn;     //输出,楼层
private double x,y,accuracy;  //输出,定位到的坐标 和 精度
List<MtApLoc> aps=new ArrayList<>(map.keySet());
MtApLoc first=aps.get(0);  //信号最强的那个ap
for (MtApLoc one : aps) {   //以信号最强的ap的楼层作为最终楼层,因为可能搜到其它楼层的信号if(one.getPn()!=first.getPn()) {  //干掉其它楼层的apmap.remove(one);}
}
aps.clear();
aps.addAll(map.keySet());
size=aps.size();
this.pn=first.getPn();
if(size==1) {setStatus(0);setMessage("ok one point");this.x=first.getX();this.y=first.getY();this.accuracy=getPicLen(map.get(first).floatValue());return JSON;
} else if(size==2) {setStatus(3);setMessage("to impl");
} else {float minRssi=-65;  //信号强大要达到 -65 才参与运算int min=4;    //至少需要4个ap,这个条件比上个条件优先size=0;for(Iterator<MtApLoc> it = aps.iterator();it.hasNext();) {MtApLoc ap = it.next();if(map.get(ap).floatValue()<minRssi && size>=min) {it.remove();} else {size++;}}//map的key之前是信号强度,现在变为 像素距离aps.forEach(ap -> map.put(ap,getPicLen(map.get(ap).floatValue())));double[][] ps=new double[size-1][4];  //看 size-1double r1=map.get(first).doubleValue();r1=r1*r1;double r2=first.getX()*first.getX()+first.getY()*first.getY();int n=0;for (MtApLoc ap : aps) {  //生成数据if(ap!=first) {ps[n][0]=ap.getX()*ap.getX()+ap.getY()*ap.getY()-r2;ps[n][1]=2*(first.getX()-ap.getX());ps[n][2]=2*(first.getY()-ap.getY());double r=map.get(ap).doubleValue();ps[n][3]=r*r-r1;n++;}}assert n==(size-1);for(int i=0;i<n;i++) {  //生成数据double k=ps[i][1];ps[i][1]=(ps[i][3]-ps[i][0])/k;ps[i][0]=ps[i][2]/k;}SimpleRegression reg=new SimpleRegression(true);  //最小二乘法reg.addData(ps);setStatus(0);setMessage("ok Least Squares");this.x=reg.getIntercept();this.y=reg.getSlope();
}

效果检验

系统完成了,这里需要检验一下定位效果。为了简化过程,我是这样操作的: 我选择了一个固定点,就是我的座位(上面客户端截图中跳动的红心所在的位置),然后用手机客户端做100次定位操作,同时服务器做log记录下100次的定位结果,然后做分析。

我座位这个点被3个AP包围着,定位效果应该不错,所以结论可能会偏乐观,实际应该选择不同的点。 不过选择不同的点要记录真实的点的坐标,稍显麻烦。后面做进一步改进和测试时,可以选择不同的点做测试,这算作一个todo。 然后就得到100个定位结果,然后可以计算和真实点的偏差,结果如:

其中x、y是定位到的坐标,单位是像素坐标,diff是计算出的偏差,单位是米。

然后按距离排序,得到如下表,是全部数据:

从这个表可以大致分析定位效果:

  • 100个点中,误差小于1米的有4个点
  • 大部分点误差在1米到4米,有93个点,大致呈均匀分布态势
  • 误差大于4米的有3个点,而且误差极大,明显属于失败的噪声点

去掉3个失败的点,剩下的97个点,可以用excel画一个分布图:

分析上面数据,以及实际测试过程,能发现,这个系统应该有一个系统误差。就是测试中,定位结果总是分布在距我大概2米处的某一点周围,应该是系统编码某个地方缺陷造成的。

这是待改进的To Do,预计找到问题解决后,重复上面的测试过程,定位效果能达到95%的点误差小于2米的水平。

另外上面我选的点应该属于定位效果较好的点,一般情况的点的定位精度,得进一步详细测试得出。这里我拍脑袋估计,系统应该在90%的点误差小于5米的水平。

进一步工作,改进与设想

整个系统正在应用到移动组开发的一个找会议室的手机应用“会议室”中,为其增加定位自身的功能。 为了完善系统,现在能想到的改进有:

  • 找到并改进上面说到的 系统误差
  • 完善后,做进一步的评测
  • 考虑2.4G和5G信号的定位差别,目前是不区分的
  • 信号强度和距离的公式的系数做进一步精确
  • 核心定位算法目前采用的是最小二乘法,目前在考虑用更智能的一个方法,叫“位置指纹”,这个算法预计效果更好,也容易实施
  • 目前坐标系统用的自定义的坐标系,这个不利于使用者使用,考虑用更好的坐标系
  • 光有定位接口是不够的,还应该有 坐标和地址相互转换的接口;还应该有导航的接口
  • 推广应用到更多实际的系统中

这些改进,会逐步完善,敬请期待本系列的(下)篇。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/477852.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 1266. 访问所有点的最小时间(数学)

1. 题目 平面上有 n 个点&#xff0c;点的位置用整数坐标表示 points[i] [xi, yi]。请你计算访问所有这些点需要的最小时间&#xff08;以秒为单位&#xff09;。 你可以按照下面的规则在平面上移动&#xff1a; 每一秒沿水平或者竖直方向移动一个单位长度&#xff0c;或者…

Coding Party 邀你出战!飞桨黑客马拉松线下场来啦

12月4-5日&#xff0c;这48H&#xff0c;与100开发者HACK Together“黑客”很酷&#xff1f;和“黑客”一起“战斗”是种什么样的体验&#xff1f;你参与这场“战斗”了吗&#xff1f;PaddlePaddle Hackathon 2021飞桨黑客马拉松&#xff0c;由百度飞桨联合深度学习技术及应用国…

技术动态 | 「知识图谱嵌入技术研究」最新2022综述

转载公众号 | 专知知识图谱(KG)是一种用图模型来描述知识和建模事物之间关联关系的技术. 知识图谱嵌入(KGE)作为一 种被广泛采用的知识表示方法,其主要思想是将知识图谱中的实体和关系嵌入到连续的向量空间中,用来简化操作, 同时保留 KG 的固有结构.它可以使得多种下游任务受益…

全球仅3000人通过的TensorFlow开发人员认证到底有多香!

现在&#xff0c;我们每个人都已经习惯了社交网络&#xff0c;随时随地都能进行微信、QQ语音和视频通话。那么&#xff0c;你是否发现在不同场景下&#xff0c;这些社交软件音频、视频都是那么的流畅&#xff0c;这背后是什么科技在支撑这“声”与“话”的美好呢&#xff1f;这…

LeetCode 1043. 分隔数组以得到最大和(DP)

1. 题目 给出整数数组 A&#xff0c;将该数组分隔为长度最多为 K 的几个&#xff08;连续&#xff09;子数组。分隔完成后&#xff0c;每个子数组的中的值都会变为该子数组中的最大值。 返回给定数组完成分隔后的最大和。 示例&#xff1a; 输入&#xff1a;A [1,15,7,9,2,…

图谱实战 | 安全领域知识图谱建设与典型应用场景总结

转载公众号 | 老刘说NLP 安全知识图谱是网络安全领域专用知识图谱&#xff0c;也是知识图谱应用于安全业务的重要工业尝试。当前&#xff0c;安全领域中存在大量的业务数据&#xff0c;建模需求以及应用需求&#xff0c;了解安全领域知识图谱的建设方法以及典型应用场景&#x…

Hadoop安全实践

前言 在2014年初&#xff0c;我们将线上使用的 Hadoop 1.0 集群切换到 Hadoop 2.2.0 稳定版&#xff0c; 与此同时部署了 Hadoop 的安全认证。本文主要介绍在 Hadoop 2.2.0 上部署安全认证的方案调研实施以及相应的解决方法。 背景 集群安全措施相对薄弱 最早部署Hadoop集群时并…

论文浅尝 | KGQR: 用于交互式推荐的知识图谱增强Q-learning框架

笔记整理&#xff1a;李爽&#xff0c;天津大学链接&#xff1a;https://dl.acm.org/doi/pdf/10.1145/3397271.3401174动机交互式推荐系统(IRS)以其灵活的推荐策略和考虑最佳的长期用户体验而备受关注。为了处理动态用户偏好&#xff0c;研究人员将强化学习(reinforcement lear…

收藏清单:史上最全java自动化测试工具汇总

xUnit frameworks 单元测试框架 JUnit - 常用的测试框架TestNG - 测试框架 Test Data Supplier - TestNG DataProvider封装&#xff0c;让数据的生成更加灵活 TDD \ ATDD \ BDD 工具 JBehave - Behaviour-Driven Development (BDD)测试框架. BDD是从 test-driven development…

LeetCode 1014. 最佳观光组合

1. 题目 给定正整数数组 A&#xff0c;A[i] 表示第 i 个观光景点的评分&#xff0c;并且两个景点 i 和 j 之间的距离为 j - i。 一对景点&#xff08;i < j&#xff09;组成的观光组合的得分为&#xff08;A[i] A[j] i - j&#xff09;&#xff1a;景点的评分之和减去它…

聊聊推荐系统的高阶特征交叉问题

文 | 水哥源 | 知乎Saying1. DCN看起来给了我们很好的允诺&#xff0c;但是细细想来是有一些问题的&#xff0c;这里也可以参考大佬的意见2. 高阶FM的核心设计是先element-wise乘&#xff0c;再对embedding求和。核心优化方法是利用计算中的冗余构建递推关系&#xff0c;然后使…

COS系统的前端演变和发展

背景 美团COS&#xff1a;全称美团网核心业务系统部&#xff0c;以持续整合O2O线下资源&#xff0c;共建高效率、低成本的供应链系统&#xff0c;高效推动O2O生态环境建设为业务目标&#xff0c;负责美团网核心业务系统的建设和管理。 COS系统&#xff0c;伴随着美团3年多的发展…

OpenKG 祝大家元宵节快乐!

OpenKGOpenKG&#xff08;中文开放知识图谱&#xff09;旨在推动以中文为核心的知识图谱数据的开放、互联及众包&#xff0c;并促进知识图谱算法、工具及平台的开源开放。点击阅读原文&#xff0c;进入 OpenKG 网站。

LeetCode 1262. 可被三整除的最大和(DP)

1. 题目 给你一个整数数组 nums&#xff0c;请你找出并返回能被三整除的元素最大和。 示例 1&#xff1a; 输入&#xff1a;nums [3,6,5,1,8] 输出&#xff1a;18 解释&#xff1a;选出数字 3, 6, 1 和 8&#xff0c;它们的和是 18&#xff08;可被 3 整除的最大和&#xff…

LeetCode 1253. 重构 2 行二进制矩阵(贪心)

1. 题目 给你一个 2 行 n 列的二进制数组&#xff1a; 矩阵是一个二进制矩阵&#xff0c;这意味着矩阵中的每个元素不是 0 就是 1。第 0 行的元素之和为 upper。第 1 行的元素之和为 lower。第 i 列&#xff08;从 0 开始编号&#xff09;的元素之和为 colsum[i]&#xff0c;…

论文浅尝 | ExCAR: 一个事件图知识增强的可解释因果推理框架

笔记整理&#xff1a;朱珈徵&#xff0c;天津大学硕士链接&#xff1a;https://aclanthology.org/2021.acl-long.183.pdf动机因果推理旨在理解因果之间的一般因果相关性&#xff0c;对于各种人工智能应用都有很大的价值。先前的研究主要是基于从手工注释的因果事件对中归纳出的…

从ACL2021看对比学习在NLP中的应用

本文首发于微信公众号”夕小瑶的卖萌屋“文 | 花小花Posy源 | 夕小瑶的卖萌屋最近关注对比学习&#xff0c;所以ACL21的论文列表出来后&#xff0c;小花就搜罗了一波&#xff0c;好奇NLPers们都用对比学习干了什么&#xff1f;都是怎么用的呀&#xff1f;效果怎样呀&#xff1f…

美团性能优化之路——性能指标体系

前言 在互联网网站百花齐放的今天&#xff0c;网站响应速度是用户体验的第一要素&#xff0c;其重要性不言而喻&#xff0c;这里有几个关于响应时间的重要条件&#xff1a; 用户在浏览网页时&#xff0c;不会注意到少于0.1秒的延迟&#xff1b;少于1秒的延迟不会中断用户的正常…

图谱实战 | 面向C端场景的概念图谱构成、建设与应用索引

转载公众号 | 老刘说NLPC端是知识图谱应用的一个重要领域&#xff0c;这个领域有大量的用户行为数据&#xff0c;存在着包括搜索、推荐、广告投放等业务。当前&#xff0c;主流的互联网公司&#xff0c;如美团、阿里、腾讯都在尝试相关落地&#xff0c;在此当中&#xff0c;概念…

11 个好用的科研工具推荐!工作效率提升 max!

文 | 炼丹学徒编 | 小轶前阵子&#xff0c;卖萌屋团队群里大家互相分享了一波自己收藏已久的 好用科研工具 。小伙伴们纷纷都有一种相见恨晚的感觉&#xff01;这么多好东西&#xff0c;当然也要分享与各位读者小伙伴啦~也希望大家能把自己用过好用的工具留言在评论区&#xff…