基于信号强度找到位置(圆之间的交集区域)

3

我正在尝试基于从4个Wi-Fi接入点接收到的信号强度来估算位置。我在一个100平方米(10x10)正方形房间的每个角落放置了4个接入点,并使用Android手机在已知位置(x,y)=(9.5,1.5)记录了信号强度。现在,我想检查在这种情况下多普勒定位方法的准确性如何。 使用MATLAB,我应用了一个公式来计算信号强度距离。以下是MATLAB函数的应用:

    function [ d_vect ] = distance( RSS )
    % Calculate distance from signal strength
    result = (27.55 - (20 * log10(2400)) + abs(RSS)) / 20;

    d_vect = power(10, result);

    end

输入的RSS是一个向量,其中包含在测试点(x,y) = (9.5,1.5)测量到的四个信号强度。RSS向量如下所示:

    RSS =

    -57.6000
    -60.4000
    -44.7000
    -54.4000

所有估计距离到每个接入点的结果向量如下所示:

   d_vect =

   7.5386
   10.4061
   1.7072
   5.2154

现在我想基于这些距离和接入点的位置来估算我的位置,以便找到估算位置和已知位置(9.5, 1.5)之间的误差。我想要找到四个圆的交集区域(为了估算位置),每个接入点都是其中一个圆的中心,距离是圆的半径。
我想要找到如图所示的灰色区域: http://www.biologycorner.com/resources/venn4.gif

1
为什么你给它打上了matlab的标签?这根本不像是Matlab代码。 - undefined
你说得对。这是Java代码(我的最终目标是Android)。然而,我正在MATLAB中测试计算。我将放置类似的MATLAB代码。 - undefined
你的标签现在不一致。android标签已经不适用了。另外,你真的应该提供一个mcve(最小完整可复现示例)。在这种情况下,这意味着你应该添加一些样本数据和该数据的预期输出。这将极大地增加你获得有用答案的机会。你的问题目前有点随意。它可能是一个数学、几何甚至是无线网络的问题。 - undefined
那个公式是从哪里来的? - undefined
https://en.wikipedia.org/wiki/Free-space_path_loss - undefined
但是你需要知道传输功率才能使其工作... - undefined
4个回答

2
如果您想要一种不需要估算圆的交点就能估算位置的替代方法,可以使用三边测量。这是导航(例如GPS)中常用的技术,通过一组距离测量来估算位置。
另外,如果您需要面积,因为您还需要对位置的不确定性进行估算,我建议您使用最小二乘法解决三边测量问题,这将轻松地给出参数的估算和误差传播,从而得出位置的不确定性。

如果不是圆/球的交集,那么什么是三边测量呢? - undefined
它们之间有关联但不完全相同,OP问了如何找到交集的显式区域,这比仅仅找到交点要棘手一些(而且实际上也不是必需的)。 - undefined

1
我找到了一个完美解决这个问题的答案。它在这个链接中详细解释:

https://gis.stackexchange.com/questions/40660/trilateration-algorithm-for-n-amount-of-points

我还开发了一些针对这个问题的MATLAB代码。以下是代码:

估算与接入点的距离:

function [ d_vect ] = distance( RSS )
    result = (27.55 - (20 * log10(2400)) + abs(RSS)) / 20;
    d_vect = power(10, result);
end

三边定位函数:
function [] = trilat( X, d, real1, real2 )
cla
circles(X(1), X(5), d(1), 'edgecolor', [0 0 0],'facecolor', 'none','linewidth',4); %AP1 - black
circles(X(2), X(6), d(2), 'edgecolor', [0 1 0],'facecolor', 'none','linewidth',4); %AP2 - green
circles(X(3), X(7), d(3), 'edgecolor', [0 1 1],'facecolor', 'none','linewidth',4); %AP3 - cyan 
circles(X(4), X(8), d(4), 'edgecolor', [1 1 0],'facecolor', 'none','linewidth',4); %AP4 - yellow
axis([0 10 0 10])
hold on
tbl = table(X, d);
d = d.^2;
weights = d.^(-1);
weights = transpose(weights);
beta0 = [5, 5];
modelfun = @(b,X)(abs(b(1)-X(:,1)).^2+abs(b(2)-X(:,2)).^2).^(1/2);
mdl = fitnlm(tbl,modelfun,beta0, 'Weights', weights);
b = mdl.Coefficients{1:2,{'Estimate'}}
scatter(b(1), b(2), 70, [0 0 1], 'filled')
scatter(real1, real2, 70, [1 0 0], 'filled')
hold off

结束

其中,

X:带有AP坐标的矩阵

d:距离估计向量

real1:真实位置x

real2:真实位置y


1
如果您有三组测量数据,包括位置的(x,y)坐标和相应的信号强度。例如:
m1 = (x1,y1,s1)
m2 = (x2,y2,s2)
m3 = (x3,y3,s3)

然后,您可以计算每个点位置之间的距离:
d12 = Sqrt((x1 - x2)^2 + (y1 - y2)^2)
d13 = Sqrt((x1 - x3)^2 + (y1 - y3)^2)
d23 = Sqrt((x2 - x3)^2 + (y2 - y3)^2)

现在考虑每个信号强度测量都表示一个来自某个距离位置的发射器。这个距离将是从信号强度被测量的位置开始的半径,因为此时还不知道信号来自哪个方向。而且,信号越弱...半径就越大。换句话说,信号强度测量与半径成反比。信号强度越小,半径越大,反之亦然。因此,计算我们三个点的比例,尽管还不准确,但是半径是可以计算出来的:
r1 = 1/s1
r2 = 1/s2
r3 = 1/s3

现在,对于每一对距离不同的点,我们可以计算一个常数(C),其中每个位置的半径刚好相互接触。例如,对于点对1和2:

Ca * r1 + Ca * r2 = d12

解决常数Ca的问题:
Ca = d12 / (r1 + r2)

我们也可以为另外两对进行同样的操作。

Cb = d13 / (r1 + r3)

Cc = d23 / (r2 + r3)

好的...选择最大的C常数,可以是Ca、Cb或者Cc。然后,使用圆的参数方程求出坐标相交的位置。我会解释。

圆的参数方程为:

x = radius * Cos(theta)
y = radius * Sin(theta)

如果 Ca 是找到的最大常数,那么您将比较点1和点2,例如:
Ca * r1 * Cos(theta1) == Ca * r2 * Cos(theta2) && 
Ca * r1 * Sin(theta1) == Ca * r2 * Sin(theta2)

迭代theta1和theta2从0到360度,对于两个圆。你可以编写如下代码:

for theta1 in 0 ..< 360 {
    for theta2 in 0 ..< 360 {

        if( abs(Ca*r1*cos(theta1) - Ca*r2*cos(theta2)) < 0.01 && abs(Ca*r1*sin(theta1) - Ca*r2*sin(theta2)) < 0.01 ) {
            print("point is: (", Ca*r1*cos(theta1), Ca*r1*sin(theta1),")")
        }
    }
}

根据您对匹配的容忍度,您不需要在每个信号半径的周长周围进行太多次迭代,即可确定信号源位置的估计值。


0

基本上,你需要求解4个圆的交集。有很多方法可以实现这个目标,其中有两种方法可以生成精确的交集区域。

第一种方法是从一个圆开始,将其与第二个圆相交,然后将结果区域与第三个圆相交,以此类推。也就是说,在每一步中,你都知道当前的交集区域,并将其与一个新的圆相交。交集区域始终是由圆弧所界定的区域,因此要将其与新的圆相交,你需要沿着区域的边界行走,并检查每个边界弧是否与新的圆相交。如果相交,那么你只保留位于新圆内部的弧的部分,记住你应该从新圆开始继续遍历弧的边界,直到找到下一个交点。

另一种方法似乎会导致更糟糕的时间复杂度,但在你的情况下,4个圆的情况并不重要。这种方法是找到两个圆的所有交点,并只选择那些对你有兴趣的点,也就是那些位于所有其他圆内部的点。这些点将成为你区域的角落,然后重新构建区域就相对容易了。经过一番搜索,我甚至找到了一个此方法的实时演示

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接