我没有使用 monte carlo 定理,但要在这种情况下使用三边测量,您首先需要使用信号传播路径损耗公式将 RSS 值转换为距离:
def rss_to_meters(rss: float, c: float, phi: float) -> float:
return Math.Log10(10, (c - rss) / (10 * phi))
其中 c 是在发送和接收天线之间一米距离处测得的平均 RSS。在我的例子中,它通常接近 -50dB。 phi 是路径损耗指数,一个介于 1 和 4 之间的值,其中 4 是噪音很大的环境(例如,有很多家具)。在许多情况下,3 可能是一个很好的猜测。
由于 RSSI 波动很大,因此输入此方法的 rss 最好是多个样本的平均值。您仍然不太可能使用三边测量公式获得准确的预测,但这里是:
def get_a(d2: float, d3: float, x2: float, x3: float, y2: float, y3: float) -> float:
return ((d2 ** d2 - d3 ** d3) - (x2 ** x2 - x3 ** x3) - (y2 ** y2 - y3 ** y3)) / 2
def get_b(d1, d2, x1, x2, y1, y2) -> float:
return ((d2 ** d2 - d1 ** d1) - (x2 ** x2 - x1 ** x1) - (y2 ** y2 - y1 ** y1)) / 2
def get_position_y(a: float, b: float, x1: float, x2: float, x3: float, y1: float, y2: float, y3: float) -> float:
return (b * (x3 - x2) - a * (x1 - x2) ) / ( (y1 - y2) * (x3 - x2) - (y3 - y2) * (x1 - x2) )
def get_position_x(a: float, y: float, y3: float, y2: float, x3: float, x2: float) -> float:
return (a - (y * (y3 - y2) ) ) / (x3 - x2)
您应该选择三个最近的锚点来进行计算,因为 RSS 在距离越远的地方波动越大。 d1 表示 (x, y) 处的未知节点与 (x1, y1) 处的第一个锚点之间的距离。 'd2' 是 (x, y) 处的未知节点与 (x2, y2) 处的第二个锚点之间的距离。 'd2' 是 (x, y) 处的未知节点与 (x3, y3) 处的第二个锚点之间的距离。因此,您还需要知道每个锚点(或图像中的“主题”)的二维坐标。您可以使用 get_position_x() 和 get_position_y() 获得最终坐标 (x, y)。 a 和 b 并不重要,只是计算 x 和 y 坐标的间歇步骤。
这种三边测量方法源自以下论文:https://ieeexplore.ieee.org/document/1391018
通常,RSS 结合三边测量算法会产生极差的定位精度,因为 RSS 测量结果的噪声很大,即使在计算平均 RSS 之后也是如此。三边测量需要良好的距离近似值才能正常运行。更好的替代方法是使用本文中介绍的“修改后的加权质心定位”算法:https://ieeexplore.ieee.org/document/4447528。当使用嘈杂的 RSS 样本时,此算法通常更宽容。