我试图根据从4个Wi接入点接收到的信号强度来估计一个位置。我从一个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
发布于 2015-11-03 13:18:56
我找到了一件能很好地解决这个问题的衣服。本链接对此作了详细解释:
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-07-28 15:36:21
发布于 2018-11-03 01:32:05
如果你用(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),")")
}
}
}根据您对匹配的容忍度,您不必在每个信号半径的周围进行太多的迭代来确定信号源位置的估计值。
https://stackoverflow.com/questions/31670411
复制相似问题