2

我正在尝试根据从 4 个 Wi-Fi 接入点接收到的信号强度来估计位置。我测量了 4 个接入点的信号强度,这些接入点位于 100 平方米(10x10)的方形房间的每个角落。我使用 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

4 回答 4

2

如果您想要另一种估计位置而不估计圆的交点的方法,您可以使用trilateration。在给定一组距离测量值的情况下估计位置是导航(例如 GPS)中的常用技术。

此外,如果您想要该区域,因为您还需要估计位置的不确定性,我建议使用最小二乘法解决三边测量问题,这很容易让您估计所涉及的参数和误差传播以产生不确定性地点。

于 2015-07-28T15:36:21.737 回答
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:具有 APs 坐标的矩阵

d:距离估计向量

real1: 真实位置 x

real2:实际位置 y

于 2015-11-03T13:18:56.647 回答
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),")")
        }
    }
}

根据您对匹配的容差,您不必围绕每个信号半径的圆周进行太多迭代来确定信号源位置的估计值。

于 2018-11-03T01:32:05.393 回答
0

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

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

另一种方法似乎会导致更糟糕的时间复杂度,但在您的 4 个圆的情况下,这并不重要,是找到两个圆的所有交点并仅选择您感兴趣的那些点,即位于所有其他圈子内。这些点将是您所在区域的角落,然后重建该区域相当容易。在谷歌搜索了一下之后,我什至找到了这种方法的现场演示

于 2015-07-28T10:28:30.883 回答