Wifi位置三角测量

san*_* mk 20 algorithm android triangulation wifi ios

在此输入图像描述

我需要了解Wifi三角测量基本上是如何工作的.场景如上图所示.为了实现wifi三角测量,我需要至少3个Wifi热点及其位置.设置:
1.为简单起见,我们假设我有1平方公里乘1平方公里的区域,我在这个区域有3个Wifi热点.坐标系如下:方形区域的1角为(0,0,0),对角最远的角为坐标(1,1,1).所有位置确定都是相对于该坐标系统单独进行的(为简单起见,我不需要全局xyz坐标).在此范围内,我在(x1,y1,z1),(x2,y2,z2),(x3,y3,z3)处有3个wifi热点.
我们有一个人有一个能够接收wifi信号并计算位置(x,y,z)信号强度的设备.该设备可以是手机,平板电脑等
.问题:动态计算人的位置(x,y,z),当你现在有以下输入时它们四处移动:
1.从每个输入接收的信号的信号强度wifi热点
2.以前存储在变量或数据库中的wifi热点的坐标.

第一个问题:如何根据输入计算位置?我假设信号强度与路由器的距离成正比,但具体的关系是什么?Skyhook如何准确地做到这一点?
第二个问题:我认为上述投入已足够.还有什么需要吗?

谢谢!

Mag*_*1um 19

这很简单.这只是一些基本的数学.将其分为两部分:

1)找到你的水平位置(没有高度).

要找到你的位置,你需要3分,但只需要专注于2分.通过使用2个点,您可以自己创建一个三角形,并根据两点之间的信号强度找到您的位置.这将找出您在两个路由器之间的位置.例如,如果你在路由器3和4之间,并且你的信号强度与3相比是-89而你的信号强度为4是-54,你知道你比4更接近3.如果你做一个距离与信号强度的近似值,你可以准确地读出路由器3和4之间的位置.剩下的问题是确定你在3到4之间的哪一侧,因为您可以在路由器上方或下方具有相同的信号强度值(-89,-54)(查看图表)

           6

   You could be here

3--------------------------4

  You could also be here

            5
Run Code Online (Sandbox Code Playgroud)

然后找到另一台路由器,注意你的信号强度.通过查看5到6个路由器之间的信号强度关系(在图中),您应该能够非常轻松地确定您在哪一侧.

2)你可以用高度做同样的事情.

要完成上述所有操作,您实际上只需要近似距离与信号强度以及路由器之间的距离.根据我的测试(我编写了自己的WiFi三角测量代码),移动设备的信号强度非常均匀,因此一个设备应该与旁边的设备具有相同的结果.

skyhook这样做我认为要么通过GPS定位(它可能是硬编码),或基本上与此相同的原理.Skyhook是唯一获得苹果认可的服务,因此Apple基本上做了同样的事情,然后确保其他应用程序无法使用它(任何使用包含这些功能的受限制的80211库的iPhone应用程序都将执行此操作被应用程序商店拒绝).

编辑:如何找到距离:

你需要做一些简单的近似.根据您的环境,这些近似值不会完全相同,因此-89英尺可能意味着您距离路由器3 15英尺,但路由器4的-89可能意味着您距离13英尺.无论你做什么,这都不是百分之百准确,但这没关系,因为你可以确保在5英尺内.

所以你所做的就是找到一堆积分,你可以从路由器3中获得-89的读数,然后记下你的距离.然后,你取一个平均值,然后用这个平均值放入你的数据库(这表示当你从路由器3到-89时,你只有15英尺).然后,您可以为其他值执行此操作,例如-50或其他任何值,然后记下您的值并找到平均值.现在,如果-89意味着你距离15英尺,而-50意味着你距离25英尺(只是一个例子),当你从路由器3到-75时你必须近似你的距离,除非你想得到用手近似-75.对于大量的值来说,这将是繁琐的,但是您必须尝试使用​​尽可能少的数据点来查看准确度.您可以通过意识到信号强度是对数来近似两个信号强度平均值,因此您可以估计,因为-89是15英尺,然后-75将是对数的(基数10或基数2,我不记得但我是倾向于基地10)比-89更远14/100倍.

编辑:要求代码

我在某个地方有代码,但是几年前我就不得不挖掘很多东西才能找到它.我认为从概念上讲,没有代码就很容易复制.我测试的Android设备花了大约50行java代码.

基本上我拿了一个Android手机并创建了一个应用程序,允许我随时显示连接的wifi设备的当前ID,其信号强度,其他附近的WiFi ID和他们的信号强度,然后GPS位置.这可以通过android的api访问.我认为你需要API 4或更高版本的Android设备.这就像3或4年前所以我只是把它从我记忆中抛出来.

GPS定位部分是为了使物理和wifi强度之间的映射更容易,而不是必须以其他方式创建我的设施的蓝图,我可以让谷歌地图同时为我做这个,因为我可以覆盖他们的地图和GPS坐标基本上是在创建距离地图的同时.你仍然需要一个深度图来映射楼层,我们可以通过查找你是否在两个路由器的中间很容易地手工完成.我们知道同一楼层的wifi集线器的信号强度最强,然后可以通过确保在不同楼层的wifi集线器上有较弱的信号来进行双重检查.该深度图本质上是wifi集线器的列表,以及它们各自的楼层.我们不需要他们的位置,因为我们可以最好地将信号强度调整到我们在设施周围行走时抓住的GPS位置并抓住某些集线器的信号强度.这是一些简单的数学.因此,对于2D平面位置,从顶部向下看,我们有一堆像这样的对象:

BestFitObject{
   Tuple<long, long> GPSLocation;
   List<Tuple<WifiDevice, signedInt>> WifiReadings; //WifiDeviceName(through UUID or some other way), tupled with the signalStrength when that bestFit reading was taken
}

WifiDevice{
   UUID ID; //Think a string should work fine, might be an internal type that encompasses UUID which woudl be better.
   int floorNumber;
   Tuple<long, long> GPSLocation; //Not entirely necessary, could provide better accuracy though
}
Run Code Online (Sandbox Code Playgroud)

然后,当我们ping客户端设备并希望最适合它时,它会返回如下对象:

ClientPosition{
   List<Tuple<UUID, signedIt> NearbySignals; //Tuple of the UUID of the wifi device and the signal strength taken during the time of the ping.  
}
Run Code Online (Sandbox Code Playgroud)

然后,我们可以轻松地将ClientPosition最适合我们使用上述两个对象创建的2D地图.

以上是非常简单的,深度图甚至更简单在我看来.

理想情况下,你想尝试打几个不同的设备,包括几个不同的无线技术(一些设备,一些设备,n,g等)只是为了获得更准确的结果.我发现的是,准确性不是那么大,而且你将在5英尺左右.这对我的需求来说足够准确.理想情况下,所有的wifi集线器都是相同的型号,它们通常在大型设施/公司中,但即便如此,它并没有那么大的优惠.变化是如此之小,如果你不需要疯狂的准确性,那就无所谓了.


Chr*_*ode 6

嗯,这是一个信号,所以它的强度会下降到距离的平方.参见反平方定律

Android将以dBm为您提供信号强度.我不熟悉那个单元,但如果它像音频分贝一样,它不是线性刻度.你想要考虑到这一点.

在一个完美的世界中,这些领域将足够均匀,可以进行纯粹的测量,从而为您提供距离,但如果您通过任何金属做到这一点,那么事情可能会变得难看.此外,设备的wifi无线电的内部配置可能使其在某些方向上更敏感.我不是工程师或其他任何人,所以我不知道这些事情将在多大程度上影响最终结果.这可能是无关紧要的.

最后,对于三维位置,我相信你需要四个参考点.如果所有wifi热点都处于同一高度,您仍然可以找到您的水平位置.如果不是,你将在他们所在的飞机上找到你的位置,这对你来说可能不够准确,这取决于飞机的陡峭程度.