Wifi位置三angular测量

在这里输入图像说明

我需要了解如何Wifi三angular测量基本上工作。 场景如上图所示。 为了实现wifi三angular测量,我需要至less3个Wifi热点和他们的位置。 设置:
1.为简单起见,假设我有1平方公里乘以1平方公里的面积,而且我在这个地区有3个Wifi热点。 坐标系如下:正方形区域的一个angular是(0,0,0),而对angular最远的angular将有坐标(1,1,1)。 所有的位置确定都是相对于这个坐标系单独完成的(为了简单起见,我不想要全局xyz坐标)。 在这里,我有(x1,y1,z1),(x2,y2,z2),(x3,y3,z3) 3个wifi热点
2.我们有一个能够接收wifi信号并计算位置(x,y,z)信号强度的设备的人。 该设备可以是电话,平板电脑等。
问题:dynamic地计算人员的位置(x,y,z),当他们现在有以下input时,他们四处移动:
1.从每个wifi热点接收的信号的信号强度
2.先前存储在variables或数据库中的wifi热点的坐标。

第一个问题:如何从上面的input计算位置? 我假设信号强度与距离路由器的距离成正比,但确切的关系是什么? Skyhook如何准确地做到这一点?
第二个问题:我相信上述投入是足够的。 还有其他要求吗?

谢谢!

Solutions Collecting From Web of "Wifi位置三angular测量"

这很容易。 这只是一些基本的math。 将其分解成2个部分:

1)find你的水平位置(没有高度)。

要find你的位置,你需要3分,但只是集中在2秒一秒。 通过使用2点,您可以与自己创build一个三angular形,并根据两点之间的信号强度find您的位置。 这将找出你在两个路由器之间的位置。 例如,如果你在路由器3和4之间,而你的信号强度与3相比是-89,你的信号强度到4是-54,那么你知道你比3更接近4。如果你对距离和信号强度做了近似的话,你就可以准确地读出路由器3和4之间的位置。剩下的问题就是确定你在3到4之间的哪一边,因为你可以在路由器的上面或下面有相同的信号强度值(-89,-54)(看图)

6 You could be here 3--------------------------4 You could also be here 5 

然后find另一个路由器,注意你的信号强度。 通过查看5到6个路由器之间的信号强度关系(在图中),你应该能够很容易地确定你在哪一边。

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

要做到以上所有,你只需要一个距离信号强度的近似值,以及路由器之间的距离。 从我的testing(我写了自己的WiFi三angular代码)来看,移动设备的信号强度非常一致,因此一个设备的结果应该与其旁边的设备相同。

skyhook这样做,我想或者通过GPS定位(这可能是硬编码),或基本上相同的原则。 Skyhook是苹果公司唯一批准的服务,所以苹果公司基本上做了同样的事情,然后确保其他应用程序不能使用它(任何iPhone应用程序使用受限制的80211库,其中包含的function,为了做到这一点被拒绝从应用程序商店)。

编辑:如何find距离:

你需要做一些简单的近似。 这些近似值将不会完全相同,这取决于您的环境,所以-89英尺可能意味着您距离路由器3 15英尺,但路由器4的-89可能意味着您距离13英尺。 不pipe你做什么,这都不会是100%准确的,但没关系,因为你可以在5英尺内得到确定的结果。

所以你要做的就是find一堆点,从路由器3的-89得到一个读数,然后记下你的距离。 然后,你取平均值,然后用这个平均值放入你的数据库(当你从路由器3到-89时,你说15英尺)。 然后,您可以为其他值(例如-50或其他值)执行此操作,并记下您的值并find平均值。 现在,如果-89意味着你距离15英尺,-50意味着你距离25英尺(只是一个例子),当你从路由器3到-75时,你必须近似你的距离,除非你想要得到手工逼近-75。 对于大量的数值来说,这会很麻烦,但是您必须试验一下,您可以使用尽可能less的数据点来获得准确的数据。 你可以在两个信号强度平均值之间进行近似,通过认识到信号强度是对数的,所以你可以估计,因为-89是15英尺,那么-75将是对数(基数10或者基数2,我不记得了,但是我是向底部10倾斜)远比-89高14/100。

编辑:要求代码

我有代码的地方,但几年前,所以我不得不挖掘很多东西来find它。 我认为在概念上,应该很容易复制没有代码。 我花了大约50行的Java代码为我正在testing的Android设备。

本质上,我拿了一个android手机,并创build了一个应用程序,让我随时显示连接的无线设备的当前ID,其信号强度,其他附近的WiFi ID和他们的信号强度,然后GPS位置。 这一切都可以通过android的api访问。 我认为你需要在API 4或更高版本的Android设备或东西。 这就好像三,四年前,所以我只是把它从我记忆中扔掉。

GPS定位部分是为了使物理和wifi之间的映射更容易,而不是必须以其他方式创build我的设施的蓝图,我可以在同一时间将Google地图做为我,因为我可以覆盖他们的地图和GPS坐标,同时创build距离图。 尽pipe如此,您仍然需要深度图来映射楼层,而通过查找您是否处于两个路由器中间,我们可以通过手动轻松地完成。 我们知道信号强度对同一楼层的wifi集线器来说是最强的,然后可以通过确保你对不同楼层的wifi集线器有较弱的信号来进行复查。 这个深度图基本上是wifi集线器的列表,以及它们各自的楼层。 我们不需要他们的位置,因为我们可以最好地将信号强度与我们在工厂周围抓取的GPS位置进行匹配,并将信号强度提供给某些集线器。 这是一些简单的math。 所以对于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 } 

然后,当我们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. } 

然后,我们可以很容易地将我们的ClientPosition适配到我们用上述两个对象创build的2D地图。

以上非常简单,深度图更简单在我看来。

理想情况下,您可以尝试使用两种不同的无线技术(包括一些设备,一些b设备,n,g等),以获得更准确的结果。 但是,我发现,准确性并不是什么大不了的事,你会在5英尺左右。 这对我的需求来说足够准确。 理想情况下,所有的无线networking中心都是同一个型号,他们通常在大型设施/公司,但即使如此,它并不是什么大不了的事情。 变化是如此之小,如果你不需要疯狂的准确性,那也没关系。

那么这是一个信号,所以它的强度将会下降到距离的平方。 见反平方律

Android将以dBm为单位提供信号强度。 我对这个单元不熟悉,但是如果它像audio分贝一样,它不是一个线性的尺度。 你会想把它考虑进去。

在一个完美的世界里,这些场地对于纯粹的测量来说是足够统一的,可以让你有距离,但是如果你是通过任何金属来做到这一点,那么任何事情都可能变得丑陋。 此外,您的设备的无线电广播的内部configuration可能会使其在某些方向更加敏感。 我不是工程师或者其他什么人,所以我不知道这些东西会影响最终结果的程度。 这可能是无关紧要的。

最后,对于三维位置,我相信你需要四个参考点。 如果所有的wifi热点都在同一个高度,你仍然可以find你的水平位置。 如果不是这样,你会在飞机上find自己的位置,这可能不够准确,取决于飞机的陡峭程度。

甚至不用担心把DBm转换成距离。 由于环境因素,无线电信号以光的速度(几乎)移动,保存一些衰减。 所以,如果你能“ping”这个设备,你可以对它的距离有一个总体的了解。 给定一个已知位置的全向天线,然后可以使用收到答复的时间绘制一个半径并绘制一个圆圈。 现在,如果你从多个设备做到这一点,圆圈将相交,这应该为你提供方向。 当然这全是2D。 你可以在3D中做同样的事情,但是你应该画阴影。 你有更多的设备更准确的位置可以。