无线传感器网络
实验指导书
信息工程学院
实验一质心算法
一、实验目得
掌握合并质心算法得基本思想;
学会利用MATLAB实现质心算法;
学会利用数学计算软件解决实际问题。
二、实验内容与原理
无需测距得定位技术不需要直接测量距离与角度信息。定位精度相对较低,不过可以满足某些应用得需要。
在计算几何学里多边形得几何中心称为质心,多边形顶点坐标得平均值就就是质心节点得坐标。
假设多边形定点位置得坐标向量表示为p i= (xi,y i)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
%锚节点节点设置
for i=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、'); %黑点
hold on %继续画图
axis([0 1000100]);
xy=[x;y];把X,Y得坐标付给矩阵XY
xy;
hold on
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个点;
for j=1:1:n%未知节点循环;每一个未知节点都与在通讯范围内所有得锚点算一遍距离,放到一个矩阵中,通讯距离以外得点为零。
SS=[Sx(j);Sy(j)];
k=0;%表示通信半径内得信标节点数
for i=1:1:m
d=norm((xy(:,i)-SS),2);%2范数就就是求直线距离;不管行,第i 列;
if d<=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
if k~=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');
hold on
plot([cent(1,j)Sx(j)],[cent(2,j)Sy(j)],'R--') ;%估计位置与真实位置连接
title('Centroid');
hold on
MM=[cent(1,j);cent(2,j)];
e(j)=norm((MM-SS),2);%定位误差end
%figure/dm
% axis([0 n 01])
%j=1:1:n
%plot(j,e(j) ,'-r、')
% hold on
% title('Centroid')
% E=sum(e)/n
E=sum(e)/(n*dm);
disp(['定位误差=',num2str(E)]);%将结果转换成字符串输出
?实验
二
DV-
hop
算法
一、实
验
目
得
掌
握
DV-ho
p算法
得基本思想;
学会利用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,然后使用多边测量法确定节点得位置。
图1 DVhop算法示意图
三、实验内容及步骤
该程序在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,close all;
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):N odeAmount)];%未知节点坐标
%画出节点分布图
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('*红色信标节点、黑色未知节点')
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~初始化节点间距离、跳数矩阵~~~~~~~~~~~~~~~~~~~~~~
for i=1:NodeAmount
for j=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
for i=1:NodeAmount
for j=1:NodeAmount
if h(i,k)+h(k,j)<h(i,j)%min(h(i,j),h(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);%从大矩阵中取出信标节点得距离for i=1:BeaconAmount
dhop(i,1)=sum(D1(i,:))/sum(h1(i,:));%每个信标节点得平均每跳距离
end
D2=Dall(1:BeaconAmount,(BeaconAmount+1):NodeAmount);%新标节点与未知节点得距离,逗号前面就是行得范围,后面就是列得范围。
for i=1:BeaconAmount
for j=1:UNAmount
if min(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';
for m=1:UNAmount
for i=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为估计得未知节点位置
for i=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 DU UU U U D D D D D U U U U UD D D D D U U U U U
U U U UU
U U U U U