【问题标题】:Wi-Fi position triangulationWi-Fi 位置三角测量
【发布时间】:2013-05-05 07:43:15
【问题描述】:

考虑这张地图:

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

  1. 为简单起见,假设我有一个 1 平方公里乘 1 平方公里 区域,并且我在该区域中有三个 Wi-Fi 热点。坐标系如下:正方形区域的一个角为(0,0,0),对角线最远的角坐标为(1,1,1)。所有位置确定都将仅相对于该坐标系进行(为简单起见,我不想要全局 xyz 坐标)。其中,我在 (x1,y1,z1) , (x2,y2,z2), (x3,y3,z3) 有三个 Wi-Fi 热点。

  2. 我们有一个人的设备能够接收 Wi-Fi 信号并计算位置 (x,y,z) 处的信号强度。设备可以是手机、平板电脑等。

问题:当您现在有以下输入时,动态计算人的位置 (x,y,z):

  1. 从每个 Wi-Fi 热点接收到的信号的信号强度

  2. 以前存储在变量或数据库中的 Wi-Fi 热点坐标。

第一个问题:如何根据上述输入计算位置?我假设信号强度与与路由器的距离成正比,但确切的关系是什么? Skyhook 是如何做到如此准确的?

第二个问题:我相信以上输入就足够了。还有什么需要的吗?

【问题讨论】:

  • 根据信号强度确定热点到用户的距离。这是以热点为中心的圆的半径。三个圆圈相交的地方就是用户的位置。

标签: android ios algorithm wifi triangulation


【解决方案1】:

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

  1. 找到您的水平位置(无高度)。

要找到您的位置,您需要三点,但只需关注两点一秒钟。通过使用两点,您可以与自己创建一个三角形,并根据您在两点之间的信号强度找到您的位置。这将找出您在两个路由器之间的位置。例如,如果您在路由器 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

然后找到另一个路由器,并注意您的信号强度。只需查看 5 和 6 个路由器之间的信号强度关系(在图表中),您应该能够很容易地确定您在哪一边。

  1. 你可以对高度做同样的事情。

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

Skyhook 我认为要么通过 GPS 定位(可能是硬编码),要么与此原理基本相同。 Skyhook 是 Apple 批准的唯一服务,因此 Apple 基本上做了同样的事情,然后确保其他应用程序无法使用它(任何使用受限 802.11 库的 iPhone 应用程序这将被App Store 拒绝)。

如何找到距离:

你需要做一些简单的近似。根据您的环境,这些近似值不会完全相同,因此 -89 英尺(27 米)可能意味着您距离路由器 3 15 英尺(4.5 米),但距离路由器 4 -89 英尺(27 米)可能意味着您在 13 英尺(4 米)之外。无论您做什么,这都不会 100% 准确,但没关系,因为您肯定可以在 5 英尺(1.5 米)以内。

所以你要做的是找到一堆点,从路由器 3 获得读数为 -89,然后记下你的距离。然后,你取一个平均值,然后用这个平均值记入你的数据库(当你从路由器 3 到 -89 时,你是 15 英尺(4.5 米))。然后,您对其他值执行此操作,例如 -50 或其他值,然后记下您的值并找到平均值。现在,如果 -89 表示您在 15 英尺(4.5 米)之外,而 -50 表示您在 25 英尺(4.5 米)之外(仅作为示例),那么您必须在距离为 -75 时估算您的距离路由器 3 除非您想手动获得 -75 的近似值。这对于大量的值来说会很麻烦,但是您必须进行试验以了解使用尽可能少的数据点可以实现多准确。

通过意识到信号强度是对数的,您可以在两个信号强度平均值之间进行近似计算,因此您可以估计,由于 -89 是 15 英尺(4.5 米),那么 -75 将是对数(以 10 为底或以 2 为底,我可以'不记得了,但我倾向于以 10) 为基数,比 -89 远 14/100。

求代码

我在某处有代码,但那是几年前的事了,所以我必须翻遍很多东西才能找到它。我认为从概念上讲,它应该很容易在没有代码的情况下复制。对于我正在测试的安卓设备,我花了大约 50 行 Java 代码。

基本上我拿了一部安卓手机并创建了一个应用程序,让我可以随时显示连接的 Wi-Fi 设备的当前 ID、信号强度、附近的其他 Wi-Fi ID 及其信号强度,然后是 GPS地点。这一切都可以通过 Android 的 API 访问。我认为您需要 API 4 或更高版本的 Android 设备。这是三四年前的事了,所以我只是把它从我的记忆中扔掉。

GPS 定位部分是为了使物理强度和 Wi-Fi 强度之间的映射更容易,而不是必须以其他方式创建我的设施的蓝图,我可以让谷歌地图同时为我做这件事时间,因为我可以在创建距离图时基本上覆盖他们的地图和 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 地图。

上面的很简单,我认为深度图更简单。

理想情况下,您应该尝试使用几个不同的设备,这些设备包含几个不同的无线技术(一些 a 设备、一些 b 设备、n、g 等),以获得更准确的结果。但我发现,准确度并不是什么大不了的事,你会在 5 英尺(1.5 米)左右的范围内。这对我的需要来说已经足够准确了。理想情况下,所有的 Wi-Fi 集线器都是相同的型号,它们通常位于大型设施/公司中,但即便如此,也没什么大不了的。可变性是如此之小,如果您不需要疯狂的准确性,那也没关系。

【讨论】:

  • 谢谢。但是您能否详细说明使用信号强度计算与路由器的距离?我不清楚这里的那部分数学..
  • 是的,还请详细说明db/dbM从单个路由器到米。
  • 好吧,您必须在您所处的环境中对其进行测试。您想要的准确度与您能够确定其位置的准确度相关。借助路由器的半准确读数,您应该能够在距离某人实际位置 5 英尺范围内准确定位,而不会遇到太多麻烦。
  • 很好的解释,请您分享一些代码,以便我们对此有更多了解。专门用于从 wifi 距离获取当前位置。提前致谢。
  • 查看我的编辑。随时问更多问题!
【解决方案2】:

嗯,这是一个信号,所以它的强度会随着距离的平方而下降。请参阅Inverse-square law

Android 将在dBm 中为您提供信号强度。我对那个单位不熟悉,但如果它是音频分贝之类的东西,它就不是线性比例。您需要考虑到这一点。

在一个完美的世界中,场将足够均匀,可以通过纯测量为您提供距离,但如果您通过任何金属进行此操作,任何事情都可能会变得丑陋。此外,您设备的 Wi-Fi 无线电的内部配置可能使其在某些方向上更加敏感。我不是工程师什么的,所以我不知道这些东西会在多大程度上影响最终的结果。这可能无关紧要。

最后,为了获得一个三维位置,我相信你需要四个参考点。如果所有 Wi-Fi 热点都在同一高度,您仍然可以找到您的水平位置。如果不是,您将在他们所在的平面上找到您的位置,这对您来说可能不够准确,具体取决于该平面的陡峭程度。

【讨论】:

    【解决方案3】:

    甚至不用担心将 dBm 转换为距离。

    无线电信号以光速(几乎)传播,但由于环境因素而产生一些衰减。因此,如果您可以“ping”设备,您就可以大致了解它的距离。

    给定一个已知位置的全向天线,然后您可以使用接收回复所需的时间来绘制半径并画一个圆。现在,如果您从多个设备执行此操作,圆圈将相交,这应该为您提供方向。当然这都是二维的。

    你可以在三个维度上做同样的事情,但你会改为绘制球体。您拥有的设备越多,位置就越准确。

    【讨论】:

    • 光在 10^-9 秒内以大约 30 厘米的距离传播,任何精确到该水平的精度都是昂贵的,而且不是消费级的。同样在那种时间范围内,必须考虑电路中电子的速度。如果你要走这条路,我会推荐一个天线阵列,它可以解析为定向输出,这样电路就可以作为一个单元进行校准。然后有 2+ 个这些数组来获得 3d 位置。 - en.wikipedia.org/wiki/Angle_of_arrival
    • 您无法使用 ping over wifi 网络计算手机和路由器之间的距离,因为您的 wifi 传输时间不可靠,您的手机没有 RealTimeOS,您的 wifi 路由器时间不可靠,并且最大 wifi 范围的距离(约 100 米)光在 ((3*10^8m/s)/100m) 中传播,这与 3 GHz 处理器中的一个周期类似,您无法使用常规测量如此精确的时间智能手机,即使你有 300GHz 处理器的智能手机,仍然存在手机和路由器 wifi 传输时间不可靠的问题
    猜你喜欢
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2014-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    • 1970-01-01
    相关资源
    最近更新 更多