无线传感器网络实验指导书.docx
《无线传感器网络实验指导书.docx》由会员分享,可在线阅读,更多相关《无线传感器网络实验指导书.docx(12页珍藏版)》请在冰豆网上搜索。
无线传感器网络实验指导书
无线传感器网络
实验指导书
信息工程学院
实验一质心算法
一、实验目的
掌握合并质心算法的基本思想;
学会利用MATLAB实现质心算法;
学会利用数学计算软件解决实际问题。
二、实验内容和原理
无需测距的定位技术不需要直接测量距离和角度信息。
定位精度相对较低,不过可以满足某些应用的需要。
在计算几何学里多边形的几何中心称为质心,多边形顶点坐标的平均值就是质心节点的坐标。
假设多边形定点位置的坐标向量表示为pi=(xi,yi)T,则这个多边形的质心坐标为:
例如,如果四边形ABCD的顶点坐标分别为(x1,y1),(x2,y2),(x3,y3)和(x4,y4),则它的质心坐标计算如下:
这种方法的计算与实现都非常简单,根据网络的连通性确定出目标节点周围的信标参考节点,直接求解信标参考节点构成的多边形的质心。
锚点周期性地向临近节点广播分组信息,该信息包含了锚点的标识和位置。
当未知结点接收到来自不同锚点的分组信息数量超过某一门限或在一定接收时间之后,就可以计算这些锚点所组成的多边形的质心,作为确定出自身位置。
由于质心算法完全基于网络连通性,无需锚点和未知结点之间的协作和交互式通信协调,因而易于实现。
三、实验内容及步骤
该程序在Matlab环境下完成无线传感器中的质心算法的实现。
在长为100米的正方形区域,信标节点(锚点)为90个,随机生成50个网络节点。
节点的通信距离为30米。
需完成:
分别画出不同通信半径,不同未知节点数目下的误差图,并讨论得到的结果
所用到的函数:
1.M=min(A)返回A最小的元素.
如果A是一个向量,然后min(A)返回A的最小元素.
如果A是一个矩阵,然后min(A)是一个包含每一列的最小值的行向量。
2.rand
X=rand返回一个单一均匀分布随机数在区间(0,1)。
X=rand(n)返回n--n矩阵的随机数字。
3.S=sum(A)返回A沿其大小不等于1的第一个数组维度的元素的总和。
如果A是一个向量,sum(A)可返回元素的总和。
如果A是一个矩阵,然后sum(A)返回一个行向量包含每个列的总和。
4.inf无穷大
此MATLAB函数返回正无穷大的IEEE算术表示。
除以零和溢出等操作会生成无穷值,从而导致结果因太大而无法表示为传统的浮点值
5.zeros-创建全零数组
X=zeros返回标量0.
X=zeros(n)-由-n矩阵的零返回n.
6.plot(X,Y)画出Y随X变化的2D曲线。
plot(X,Y,o)用o描述(X,Y)这一点。
7.n=norm(v)返回的2-范数或欧氏范数的向量v.
n=norm(v,p)返回向量范数定义的sum(abs(v)^p)^(1/p),这里p是任何正值,Inf或-Inf.
8.s=num2str(A)数值数组转换为字符数组输出,它表示的数字。
输出格式取决于原始值的大小。
num2str是用于标签和标题情节与数字值。
所用到的变量:
xy:
均匀分布的信标节点位置矩阵
n:
未知节点数量
SS:
未知节点位置矩阵
dm:
通信半径
cent:
质心
MM:
未知节点估计坐标矩阵
e:
估计位置和实际位置距离矩阵(误差)
四、源程序
clear
clc
%锚节点节点设置
fori=1:
1:
10%1到10,步长是1;画出锚点,前一个括号是标号。
forj=1:
1:
10
x(j+(i-1)*10)=(i-1)*10;
y(j+(i-1)*10)=(j-1)*10;
end
end
figure%出现图形界面
plot(x,y,'k.');%黑点
holdon%继续画图
axis([01000100]);
xy=[x;y];把X,Y的坐标付给矩阵XY
xy;
holdon
xm=90;
ym=90;
n=50;%未知节点
fori=1:
1:
n
Sx(i)=rand(1,1)*xm;%产生一个一行一列的矩阵;依然是0-1中任意一个值。
Sy(i)=rand(1,1)*ym;
plot(Sx(i),Sy(i),'r*');%红星
xlabel('x轴');
ylabel('y轴');
holdon
end
dm=30;%通信半径
m=100;一共100个点;
forj=1:
1:
n%未知节点循环;每一个未知节点都与在通讯范围内所有的锚点算一遍距离,放到一个矩阵中,通讯距离以外的点为零。
SS=[Sx(j);Sy(j)];
k=0;%表示通信半径内的信标节点数
fori=1:
1:
m
d=norm((xy(:
i)-SS),2);%2范数就是求直线距离;不管行,第i列;
ifd<=dm是否在范围内,取出信标节点,放到XX,yy中
xx(j,i)=xy(1,i);第1行第i列;%X坐标都给了XX
yy(j,i)=xy(2,i);第2行第i列;
k=k+1;
else
xx(j,i)=0;
yy(j,i)=0;
end
end
ifk~=0%k不等于零
cent(:
j)=[sum(xx(j,:
));sum(yy(j,:
))]/k;%第j行的所有列
else
cent(:
j)=0;令第j列的所有元素为零。
end
plot(cent(1,j),cent(2,j),'o');
holdon
plot([cent(1,j)Sx(j)],[cent(2,j)Sy(j)],'R--');%估计位置和真实位置连接
title('Centroid');
holdon
MM=[cent(1,j);cent(2,j)];
e(j)=norm((MM-SS),2);%定位误差
end
%figure/dm
%axis([0n01])
%j=1:
1:
n
%plot(j,e(j),'-r.')
%holdon
%title('Centroid')
%E=sum(e)/n
E=sum(e)/(n*dm);
disp(['定位误差=',num2str(E)]);%将结果转换成字符串输出
实验二DV-hop算法
一、实验目的
掌握DV-hop算法的基本思想;
学会利用MATLAB实现DV-hop算法;
学会利用数学计算软件解决实际问题。
二、实验内容和原理
DV-Hop算法解决了低锚点密度引发的问题,它根据距离矢量路由协议的原理在全网范围内广播跳数和位置。
已知锚点L1与L2、L3之间的距离和跳数。
L2计算得到校正值(即平均每跳距离)为(40+75)/(2+5)=16.42m。
假设传感器网络中的待定位节点A从L2获得校正值,则它与3个锚点之间的距离分别是L1=3×16.42,L2=2×16.42,L3=3×16.42,然后使用多边测量法确定节点的位置。
图1DVhop算法示意图
三、实验内容及步骤
该程序在Matlab环境下完成无线传感器中的DV-Hop算法的实现。
在长为100米的正方形区域,随机生成100个网络节点,其中信标节点(锚点)为8个,未知坐标节点为92个。
节点的通信距离为50米。
可算出最短路经算法计算节点间跳数、每个信标节点的校正值并可用用跳数估计距离。
(1000-1000,300个节点,60个信标节点)
所用到的函数:
参见上节:
质心算法;
需完成:
1)运行程序,生成随机分布的节点;
2)更正程序中的错误,求每个信标节点的校正值;
3)继续运行程序,利用跳数估计待求节点的距离。
四、源程序
%~~~~~~~~~~DV-Hop算法~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
%BorderLength-----正方形区域的边长,单位:
m
%NodeAmount-------网络节点的个数
%BeaconAmount---信标节点数
%Sxy--------------用于存储节点的序号,横坐标,纵坐标的矩阵
%Beacon----------信标节点坐标矩阵;BeaconAmount*BeaconAmount
%UN-------------未知节点坐标矩阵;2*UNAmount
%Distance------未知节点到信标节点距离矩阵;2*BeaconAmount
%h---------------节点间初始跳数矩阵
%X---------------节点估计坐标初始矩阵,X=[x,y]'
%R------------------节点的通信距离,一般为10-100m
clear,closeall;
BorderLength=100;
NodeAmount=100;
BeaconAmount=8;
UNAmount=NodeAmount-BeaconAmount;
R=50;
%D=zeros(NodeAmount,NodeAmount);%未知节电到信标节点距离初始矩阵;BeaconAmount行NodeAmount列
h=zeros(NodeAmount,NodeAmount);%初始跳数为0;NodeAmount行NodeAmount列
X=zeros(2,UNAmount);%节点估计坐标初始矩阵
%~~~~~~~~~在正方形区域内产生均匀分布的随机拓扑~~~~~~~~~~~~~~~~~~~~
C=BorderLength.*rand(2,NodeAmount);
%带逻辑号的节点坐标
Sxy=[[1:
NodeAmount];C];%将1-NodeAmount与C上下合到一起,产生一个总矩阵。
Beacon=[Sxy(2,1:
BeaconAmount);Sxy(3,1:
BeaconAmount)];%信标节点坐标
UN=[Sxy(2,(BeaconAmount+1):
NodeAmount);Sxy(3,(BeaconAmount+1):
NodeAmount)];%未知节点坐标
%画出节点分布图
plot(Sxy(2,1:
BeaconAmount),Sxy(3,1:
BeaconAmount),'r*',Sxy(2,(BeaconAmount+1):
NodeAmount),Sxy(3,(BeaconAmount+1):
NodeAmount),'k.')
xlim([0,BorderLength]);
ylim([0,BorderLength]);
title('*红色信标节点.黑色未知节点')
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~初始化节点间距离、跳数矩阵~~~~~~~~~~~~~~~~~~~~~~
fori=1:
NodeAmount
forj=1:
NodeAmount
Dall(i,j)=((Sxy(2,i)-Sxy(2,j))^2+(Sxy(3,i)-Sxy(3,j))^2)^0.5;%所有节点间相互距离
if(Dall(i,j)<=R)&(Dall(i,j)>0)
h(i,j)=1;%初始跳数矩阵
elseifi==j
h(i,j)=0;%自己到自己的距离
elseh(i,j)=inf;
end
end
end
%~~~~~~~~~~~最短路经算法计算节点间跳数~~~~~~~~~~~~~~~~~~~~
fork=1:
NodeAmount
fori=1:
NodeAmount
forj=1:
NodeAmount
ifh(i,k)+h(k,j)h(i,j)=h(i,k)+h(k,j);
end
end
end
end
h
%~~~~~~~~~~~~~求每个信标节点的校正值~~~~~~~~~~~~~~~~~~~~~~~~~~
h1=h(1:
BeaconAmount,1:
BeaconAmount);%从大矩阵中取出信标节点的跳数
D1=Dall(1:
BeaconAmount,1:
BeaconAmount);%从大矩阵中取出信标节点的距离
fori=1:
BeaconAmount
dhop(i,1)=sum(D1(i,:
))/sum(h1(i,:
));%每个信标节点的平均每跳距离
end
D2=Dall(1:
BeaconAmount,(BeaconAmount+1):
NodeAmount);%新标节点与未知节点的距离,逗号前面是行的范围,后面是列的范围。
fori=1:
BeaconAmount
forj=1:
UNAmount
ifmin(D2(:
j))==D2(i,j)
Dhop(1,j)=dhop(i,j);%未知节点从最近的信标获得校正值
end
end
end
Dhop
%~~~~~~~~~~~~~~~~用跳数估计距离~~~~~~~~~~~~~~~~~~~
hop1=h(1:
BeaconAmount,(BeaconAmount+1):
NodeAmount)%未知节点到信标跳数,BeaconAmount行UNAmount列
fori=1:
UNAmount
hop=Dhop(1,i);%hop为从最近信标获得的校正值
Distance(:
i)=hop*hop1(:
i);%%Beacon行UN列;
end
%%~~~~~~~~~~~~~最小二乘法求未知点坐标~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
d=Distance;
fori=1:
2
forj=1:
(BeaconAmount-1)
a(i,j)=Beacon(i,j)-Beacon(i,BeaconAmount);
end
end
%a为第一个信标节点和最后一个信号节点的坐标差值,保留最后一个信标节点
%a'
A=-2*(a');
%d=d1';
form=1:
UNAmount
fori=1:
(BeaconAmount-1)
B(i,1)=d(i,m)^2-d(BeaconAmount,m)^2-Beacon(1,i)^2+Beacon(1,BeaconAmount)^2-Beacon(2,i)^2+Beacon(2,BeaconAmount)^2;
%前九个信标节点到未知节点的距离平方
%最后信标节点到未知节点的距离平方
%前九个信标节点横坐标平方
%最后信标节点到未知节点的横坐标平方
%前九个信标节点纵坐标平方
%最后信标节点纵坐标平方
end
X1=inv(A'*A)*A'*B;%inv是求逆矩阵
X(1,m)=X1(1,1);
X(2,m)=X1(2,1);
end
%X为估计的未知节点位置
fori=1:
UNAmount
error(Z,i)=(((X(1,i)-UN(1,i))^2+(X(2,i)-UN(2,i))^2)^0.5);%估计出的信号位置到实际位置间的距离
end
avgerror(Z)=sum(error(Z,:
))/UNAmount;%平均错误
Accuracy(Z)=avgerror(Z)/R;%节点精确度
R=R+10;
end
%%~~~~~~~~~~~~~~~~~~~~~~~~画出节点精确度图~~~~~~~~~~~~
%Accuracy
figure;plot(20:
10:
90,Accuracy,'-o')
xlabel('通信半径/m');
ylabel('定位精度/100%');
title('节点精确度');
D
D
D
D
D
U
U
U
U
U
D
D
D
D
D
U
U
U
U
U
D
D
D
D
D
U
U
U
U
U
U
U
U
U
U
U
U
U
U
U