在Python / Jupyter Lab中使用三边测量法查找位置并使用蒙特卡罗定理过滤它们

qrjkbowd  于 2023-02-10  发布在  Python
关注(0)|答案(1)|浏览(226)

我是Python的新手。最近我刚开始使用Jupyter Lab。所以,我收集了一个RSS提要值在Excel CSV文件中。我想应用trilateration公式在其中找到位置。但我绝对不知道我该怎么做。有人能帮助我吗?所以数据收集像附件中的图片。enter image description here
收集的数据样本也在下文中给出。
https://aiubedu60714-my.sharepoint.com/emoji symbols:x/g/personal/18-36632-1_student_aiub_edu/EZx44mosc7pInAsxAFX5J1wBylO7rmtmxNqW8SIAXRoIyw?e=92L8v8
并且我还想尝试蒙特卡罗定理来找到精度值。
如果您能指导我整个手术过程,我将不胜感激。

gmxoilav

gmxoilav1#

我没有使用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波动很大,因此最好将多个样本的平均值作为该方法的输入值,使用三边测量公式仍然不太可能获得准确的预测值,但可以使用以下公式:

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样本时,该算法通常更宽容。

相关问题