根据信号强度(圆圈之间的交叉区域)查找位置

时间:2015-07-28 07:52:21

标签: matlab math geometry trilateration

我试图根据从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

4 个答案:

答案 0 :(得分:2)

If you want an alternative way of estimating the location without estimating the intersection of circles you can use trilateration. It is a common technique in navigation (e.g. GPS) to estimate a position given a set of distance measurements.

Also, if you wanted the area because you also need an estimate of the uncertainty of the position I would recommend solving the trilateration problem using least squares which will easily give you an estimate of the parameters involved and an error propagation to yield an uncertainty of the location.

答案 1 :(得分: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

答案 2 :(得分: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),")")
        }
    }
}

根据匹配的容差,您不必在每个信号半径的圆周上进行太多迭代即可确定信号源位置的估算值。

答案 3 :(得分:0)

所以基本上你需要交叉4个圆圈。它可以有很多种方法,有两种可以产生精确的交叉区域。

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

另一种似乎导致时间复杂度较差的方法,但在4个圆圈的情况下,这并不重要,就是找到两个圆圈的所有交点并选择那些你感兴趣的点,这是所有其他圈子里面的东西。这些点将是您所在区域的角落,然后重建该区域相当容易。谷歌搜索后,我甚至找到了live demo of this approach