首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据信号强度(圆圈相交区域)找到位置

根据信号强度(圆圈相交区域)找到位置
EN

Stack Overflow用户
提问于 2015-07-28 07:52:20
回答 4查看 2.4K关注 0票数 2

我试图根据从4个Wi接入点接收到的信号强度来估计一个位置。我从一个100平方米(10x10)的正方形房间的每个角落的4个接入点测量信号强度。我用Android手机记录了已知位置(x,y) = (9.5,1.5)的信号强度。现在,我想检查一下,在这种情况下,多边办法的准确性如何。利用MATLAB,用信号强度计算距离公式。下面的MATLAB函数说明了该公式的应用:

代码语言:javascript
复制
    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矢量如下所示:

代码语言:javascript
复制
    RSS =

    -57.6000
    -60.4000
    -44.7000
    -54.4000

得到的向量与每个接入点的所有估计距离如下:

代码语言:javascript
复制
   d_vect =

   7.5386
   10.4061
   1.7072
   5.2154

现在,我想根据这些距离和接入点位置来估计我的位置,以便找出估计位置和已知位置(9.5,1.5)之间的误差。我想找出四个圆之间的交集面积(为了估计一个位置),其中每个接入点是其中一个圆的中心,距离是圆的半径。

我想找到这张图中所示的灰色区域:http://www.biologycorner.com/resources/venn4.gif

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-11-03 13:18:56

我找到了一件能很好地解决这个问题的衣服。本链接对此作了详细解释:

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

我也为这个问题开发了一些MATLAB代码。下面是:

估计接入点的距离:

代码语言:javascript
复制
function [ d_vect ] = distance( RSS )
    result = (27.55 - (20 * log10(2400)) + abs(RSS)) / 20;
    d_vect = power(10, result);
end

三位一体的功能:

代码语言:javascript
复制
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

票数 1
EN

Stack Overflow用户

发布于 2015-07-28 15:36:21

如果您想要一种估计位置而不估计圆圈交集的替代方法,则可以使用三边。在导航(例如GPS)中,估计给定一组距离测量的位置是一种常见的技术。

另外,如果你想要这个区域,因为你也需要估计这个位置的不确定性,我建议你用最小二乘来解决这个三边线问题,它可以很容易地给出所涉及的参数的估计和误差传播,从而产生一个位置的不确定性。

票数 2
EN

Stack Overflow用户

发布于 2018-11-03 01:32:05

如果你用(x,y)坐标和相应的信号强度进行三组测量。例如:

代码语言:javascript
复制
m1 = (x1,y1,s1)
m2 = (x2,y2,s2)
m3 = (x3,y3,s3)

然后,您可以计算每个点位置之间的距离:

代码语言:javascript
复制
d12 = Sqrt((x1 - x2)^2 + (y1 - y2)^2)
d13 = Sqrt((x1 - x3)^2 + (y1 - y3)^2)
d23 = Sqrt((x2 - x3)^2 + (y2 - y3)^2)

现在考虑一下,每一个信号强度的测量都意味着该信号的发射器,它来自某个距离的某个位置。这个距离将是距离测量信号强度的位置的半径,因为在这一点上,人们不会知道信号的来源方向。而且信号越弱。半径越大。换句话说,信号强度的测量将与半径成反比。信号强度越小,半径越大,反之亦然。所以,算出我们三个点的比例半径,虽然还不准确:

代码语言:javascript
复制
r1 = 1/s1
r2 = 1/s2
r3 = 1/s3

所以,现在,在每一对点上,根据它们的距离,我们可以计算出一个常数(C),其中每个位置的半径都会相互接触。例如,对于点对1和2:

代码语言:javascript
复制
Ca * r1 + Ca * r2 = d12

..。求解恒定Ca:

代码语言:javascript
复制
Ca = d12 / (r1 + r2)

..。另外两对也可以这样做。

代码语言:javascript
复制
Cb = d13 / (r1 + r3)

Cc = d23 / (r2 + r3)

好吧..。选择最大C常数( Ca、Cb或Cc )。然后,用一个圆的参数方程来找出坐标相交的地方。我会解释的。

圆的参数方程是:

代码语言:javascript
复制
x = radius * Cos(theta)
y = radius * Sin(theta)

如果Ca是发现的最大常数,那么您可以比较点1和2,例如:

代码语言:javascript
复制
Ca * r1 * Cos(theta1) == Ca * r2 * Cos(theta2) && 
Ca * r1 * Sin(theta1) == Ca * r2 * Sin(theta2)

..。将theta1和theta2从0到360度迭代,用于两个圆圈。您可以编写如下代码:

代码语言:javascript
复制
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),")")
        }
    }
}

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31670411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档