思路
对于静止点的RSSI定位,信号强度的漂移导致可以从时域方面入手,连续多次采集RSSI,定位后得到多个可能的点,聚类后,继续求平均(如果需要,也能改成加权平均,效果怎么样自行判断),得到精确的位置点。
仿真结果
程序源码
%%此程序用于试验rss定位的想法(仿真)
clc;clear;
% syms x1 y1
source=[11,11;17,11;11,13;17,13;15,12];
scatter(source(:,1),source(:,2));
axis([8,20,8,16]);
dotnum = 2; %探测点的数量
testdot = 20; %测试点,即测试次数(采样点)
unknowndot = [14,13;15,13];
hold on
scatter(unknowndot(1,1),unknowndot(1,2),'or');
for i=1:dotnum;
for j=1:5;
distance(i,j)=((unknowndot(i,1)-source(j,1))^2+(unknowndot(i,2)-source(j,2))^2)^0.5;
rssi(i,j)=-40-10*2*log10(distance(i,j))+5; %rssi的理论值
end
end
% tic
ess1=0;
for i=1:testdot
rssirand=rssi+0.5*distance.*randn(dotnum,5); %加入随机误差的rssi
d=10.^((-35-rssirand)/20);
%%下面用三角定位法子函数来求解位置
[b,n]=sort(d,2,'ascend');
for m=1
A=source(n(m,1),:);
B=source(n(m,2),:);
C=source(n(m,3),:);
dA=d(m,n(m,1));
dB=d(m,n(m,2));
dC=d(m,n(m,3));
% P=Triangle(A,B,C,dA,dB,dC)
[locx(m),locy(m)]=triposition(A(1),A(2),dA,B(1),B(2),dB,C(1),C(2),dC);
ess1=ess1+((locx(1)-unknowndot(1,1))^2+(locy(1)-unknowndot(1,2))^2)^0.5;
end
P(i,:)=[locx(1),locy(1)];
if A(2) == 11 || B(2) == 11 ||C(2) == 11
scatter(locx(m),locy(m),'.B');
else
scatter(locx(m),locy(m),'.r');
end
end
essmean1=ess1/testdot %计算原始定位数据的平均误差(欧氏距离)
[IDX,Pmeans]=kmeans(P,2); %对原始位置数据进行k-means聚类
Pfinal=Pmeans(mode(IDX),:); %筛选出聚类后元素最多的簇的质心
scatter(mean(P(:,1)),mean(P(:,2)),'*r');
title('按照选取的信号源划分');
xlabel('x轴方向位置(米)');
ylabel('y轴方向位置(米)');
figure;
scatter(source(:,1),source(:,2));
hold on
axis([8,20,8,16]);
scatter(unknowndot(1,1),unknowndot(1,2),'or');
for i=1:testdot
if IDX(i) == 1
scatter(P(i,1),P(i,2),'.B');
else
scatter(P(i,1),P(i,2),'.r');
end
end
scatter(Pfinal(1),Pfinal(2),'*r');
title('按照k-means聚类划分');
xlabel('x轴方向位置(米)');
ylabel('y轴方向位置(米)');
essmean2=((Pfinal(1)-unknowndot(1,1))^2+(Pfinal(2)-unknowndot(1,2))^2)^0.5 %新算法的误差
essmean1/essmean2
% toc