gpt4 book ai didi

android - Wi-Fi位置三角剖分

转载 作者:行者123 更新时间:2023-12-01 19:04:19 30 4
gpt4 key购买 nike

考虑这张 map :

我需要了解Wi-Fi三角测量的基本原理。上图中描绘了该场景。为了实现Wi-Fi三角测量,我至少需要三个Wi-Fi热点及其位置。设置:

  • 为简单起见,假设我有一个 1平方公里x 1平方公里区域,并且我在该区域有三个Wi-Fi热点。坐标系如下:正方形区域的一个角为(0,0,0),对角最远的角将具有坐标(1,1,1)。所有位置确定都将仅相对于此坐标系完成(为简单起见,我不希望使用全局xyz坐标)。在其中,我在(x1,y1,z1),(x2,y2,z2),(x3,y3,z3)处有三个Wi-Fi热点。
  • 我们有一个设备可以接收Wi-Fi信号并可以在(x,y,z)位置计算信号强度的人。该设备可以是电话,平板电脑等。

  • 问题:当您现在具有以下输入时,动态计算人的位置(x,y,z),因为他们会四处移动:
  • 从每个Wi-Fi热点接收的信号的信号强度
  • 先前存储在变量或数据库中的Wi-Fi热点的坐标。

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

    最佳答案

    这很容易。这只是一些基本的数学。将其分为两部分:

  • 查找您的水平位置(无高度)。

  • 要找到您的位置,您需要三点,但是第二秒钟只需要注意两点即可。通过使用两个点,您可以自己创建一个三角形,并根据两个点之间的信号强度找到位置。这将找出您在两个路由器之间的位置。例如,如果您位于路由器3和4之间,并且与3相比,信号强度为-89,而与4相比,信号强度为-54,那么您知道自己比3更接近3。如果您将距离与信号强度进行比较,则可以非常准确地了解路由器3和4之间的位置。剩下的问题就是确定您在3和4之间处于哪一侧。 ,因为您可能在路由器的上方或下方具有相同的信号强度值(-89,-54)(请参见示意图)
               6

    You could be here

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

    You could also be here

    5
    然后,只需找到另一个路由器,并注意您的信号强度即可。您只需看一下5个和6个路由器之间的信号强度关系即可(图中)轻松地确定要站在哪一侧。
  • 您可以用高度做同样的事情。

  • 要完成上述所有操作,您实际上仅需要距离与信号强度之间的近似值,以及路由器之间的距离即可。根据我的测试(我编写了自己的Wi-Fi三角测量代码),移动设备之间的信号强度相当均匀,因此一台设备应具有与其附近设备相同的结果。
    我认为 Skyhook是通过GPS定位(可能是硬编码的)或与此基本相同的原理来完成的。 Skyhook是苹果公司为此批准的唯一服务,因此苹果公司基本上做了同样的事情,然后确保其他应用程序无法使用它(任何使用受限 802.11库的iPhone应用程序都必须包含该函数,以便执行此操作。被 App Store拒绝)。
    如何找到距离:
    您需要做一些简单的近似。根据您的环境,这些近似值可能不尽相同,因此-89英尺(27米)可能意味着您距离路由器3 15英尺(4.5 m),但是距路由器4则-89英尺(27 m)可能意味着您距离13英尺(4 m)。无论您做什么,这都不会是100%准确的,但这没关系,因为您可以确定在5英尺(1.5米)以内。
    因此,您要做的就是找到很多点,从路由器3的-89处获得读数,然后记下距离。然后,您取一个平均值,然后使用该平均值将其放到数据库中(这表示从路由器3到-89时,您只有15英尺(4.5 m))。然后,您对其他值(例如-50或其他值)执行此操作,然后记下您的值并找到平均值。现在,如果-89表示您距离4.5毫米(15英尺),而-50表示您距离4.5毫米(25英尺)(仅举一个例子),那么当您距-75的距离约为路由器3,除非您想手动获得-75的近似值。对于成千上万的值而言,这将很繁琐,但是您必须进行实验,以查看尽可能少的数据点所能达到的精度。
    您可以意识到信号强度是对数的,因此可以在两个信号强度平均值之间进行近似估算,因此您可以估计由于-89为15英尺(4.5 m),因此-75是对数的(以10为底数或以2为底,我不记得了,但我倾向于以10为底的底数比-89大14/100。
    询问代码
    我在某个地方有代码,但是那是几年前的事,所以我必须挖掘很多东西才能找到它。我认为从概念上讲,无需代码即可轻松复制。我为要测试的android设备花了大约50行Java代码。
    本质上,我带了一个android手机并创建了一个应用程序,该应用程序允许我随时显示所连接Wi-Fi设备的当前ID,其信号强度,附近的其他Wi-Fi ID及其信号强度以及GPS位置。所有这些都可以通过Android的API访问。我认为您需要使用API​​ 4或更高版本的Android设备。就像三,四年前一样,所以我只是把它从我记得的东西中剔除掉。
    GPS位置部分是使物理强度和Wi-Fi强度之间的映射更容易,而不是必须以其他方式创建我的设施的蓝图,我可以让Google map 同时为我做这件事。可以在创建距离图的同时将其 map 和GPS坐标叠加在一起。不过,您仍然需要一个深度图来绘制楼层平面图,我们可以很容易地通过发现您是否位于两个路由器之间来轻松完成此操作。
    我们知道,同一楼层的Wi-Fi集线器的信号强度最强,然后可以通过确保到不同楼层的Wi-Fi集线器的信号较弱来进行仔细检查。该深度图实质上是Wi-Fi集线器及其各自楼层的列表。
    我们不需要它们的位置,因为我们可以使信号强度最适合我们在设施周围走动并捕获某些集线器的信号强度时所捕获的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 would 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 Wi-Fi device and the signal strength taken during the time of the ping.
    }
    然后,我们可以轻松地将ClientPosition最佳地拟合到使用上述两个对象创建的2D映射。
    上面非常简单,我认为深度图甚至更简单。
    理想情况下,您希望尝试使用包含多种不同无线技术的多种不同设备(某些设备,某些b设备,n,g等),以获得更准确的结果。但是我发现准确度并不重要,您将在5英尺(1.5 m)左右的范围内。这足以满足我的需求。理想情况下,所有Wi-Fi集线器都是相同的型号,它们通常位于大型设施/公司中,但是即使那样,这也没什么大不了的。变异是如此之小,如果您不需要疯狂的准确性,那就没关系了。

    关于android - Wi-Fi位置三角剖分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16485370/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com