中南大学物联网定位实验报告Word下载.docx
《中南大学物联网定位实验报告Word下载.docx》由会员分享,可在线阅读,更多相关《中南大学物联网定位实验报告Word下载.docx(14页珍藏版)》请在冰豆网上搜索。
![中南大学物联网定位实验报告Word下载.docx](https://file1.bdocx.com/fileroot1/2022-12/8/25477ce3-dae6-46a9-9393-a27ec416320e/25477ce3-dae6-46a9-9393-a27ec416320e1.gif)
虽然传播模型定位法有以上优点,但由于其定位精度不高导致其应用范围不是很广,目前播模型定位法只应用于粗略定位与测距中,其定位步骤如下:
①在己知室内环境下,利用接收信号强度估计此环境下的传播模型与参数值;
②利用①中的传播模型,通过获取未知终端节点的RSS来完成对其定位。
位置指纹定位法是通过移动终端的RSS与指纹库中的指纹数据进行匹配,然后再通过某种算法来计算其位置。
指纹定位算法
无线信号依赖传播环境,在不同位置上,其信道的多径特征也均不相同。
无线信号在传播过程中经反射、折射、散射后,生成与传播环境相关且独特的信号,我们称此多径特征为“位置指纹”。
信号的多径特征包括信号强度、脉冲响应时间、信噪比等,本文主要釆用接收AP信号的强度值(即RSS)作为信号指纹特征。
位置指纹法在定位过程中分`离线/训练'
与`在线/定位'
两个阶段,其定位流程如下图所示。
①离线/训练阶段
指纹定位在离线阶段主要采集定位场所中各参考点位置上的信号多径特征(信号强度),从而建立位置指纹数据库。
②在线/定位阶段在实际定位过程中,移动终端首先会接收到周围AP接入点发出的信号特征记为Rss,然后则可遍历指纹数据库对此RSS矢量进行匹配,最后再采取某种指纹定位算法计算出移动终端的位置。
常用的指纹定位算法有:
最近邻法CNN)、K近邻法(KNN)、K加权近邻法(WKNN)、贝叶斯概率算法、BP神经网络算法等.
假设在定位区域中共有L个位置指纹参考点,记为{F1,F2,....Fl},其与一组位置坐标{L1,L2,....L7}一一映射即指纹Fi在定位区域中对应的位置坐标为Li=(Xi,Yi)。
在“在线/定位”阶段时,移动终端会接收到周围n个AP热点发送的信号强度矢量,记为S,其中S=(S1,S2,..Sn)。
•通过贝叶斯公式计算后验概率:
P(Li|S)*P(Li)=P(S)P(S|Li)*P(Li)
假设选取参考点是随机的,均匀分布,即P(Li)=1/L。
由于在某一位置指纹处,来自每个接入点AP的RSS(接收信号强度)互不相关,所以可以得到:
P(SLi)=P(S1Li)P(S2Li)....P(SnLi)
•观察数据发现某一位置指纹处的接收信号强度服从高斯正态分布,所以可以进行近似模拟。
•最后以概率值P(LiS)作为定位区域中指纹参考点的权重,并估计出移动终端的位置。
4.关键代码
/**
*计算距离,并且找出最小距离的点和值。
*@return
*/
privatePointcalculate(){
minDistance=;
mini=-1;
doubletempDistance;
distance=newdouble[()-1];
PointendPoint=()-1);
for(inti=0;
i<
()-1;
i++){
tempDistance=calculate_Distance(endPoint,(i));
distance[i]=tempDistance;
if(tempDistance<
minDistance){
minDistance=tempDistance;
mini=i;
}
}
return(mini);
}
*计算两点之间的距离
*@parampoint1
*@parampoint2
privatedoublecalculate_Distance(Pointpoint1,Pointpoint2){
floatresult=;
Stringstr;
Map<
String,Integer>
tempMap1=newHashMap<
();
tempMap2=newHashMap<
inti,j;
for(j=0;
j<
j++){
}
for(i=0;
Iterator<
String>
iterator=();
while()){
str=();
if(str)&
&
(str)){
result+=(str)-(str))
*(str)-(str));
}
!
(str)){
if(!
(str)&
return(result);
5.实验结果
代码调试截图
实验界面截图
第一次、第二次扫描截图
截图
计算结果截图
6.室内定位误差分析
由于室内环境比较复杂,信号在室内传播时会受到不同程度的影响,而造成此影响的因素主要有以下三种:
非视距传播、多径传播、阴影效应。
非视距传播
由于在信号的发射端与接收端之间的直射路径上存在障碍物,导致无线电波不能在收发两端进行直射传播,而只能通过反射、折射进行传播,由此在接收端测得的信号特征,如信号到达时间、信号强度、入射角、到达时间差等,将无法准确的反映出收发两端之间的真实距离,我们称这种现象为信号的非视距传播。
多径传播
由于信号接收端所处环境复杂,使得发射的电磁波在向外扩散过程中遇到各种障碍物,使得信号在传播过程中受到反射、散射、绕射等影响,导致接收到的信号为多条路径上信号的矢量和。
由于每条路径上信号的强度、到达时间、到达载波相位都不相同,则产生多径干扰,这种现象即为多径传播。
阴影效应
阴影效应是指移动终端在移动过程中,有一些大型障碍物阻挡了其无线电波的直射路径,从而导致信号接收区域中存在半盲区,在电磁场中形成了阴影,致使信号接收点场强在终端移动过程中起伏变化,我们称此现象为阴影效应。
除以上三种环境客观因素外,指纹定位选取的信号传播模型、定位场景中AP与位置指纹参考点的配置以及选取的定位算法均会影响定位精度。
除此之外,定位温度、方向、移动终端运动状态也均会影响定位精度。
实验二无线传感器网络定位实验
了解典型的无线传感器网络定位算法;
在所给的网络中实现所讲授的无线传感器网络定位算法并进行比较。
2.实验要求
掌握典型的无线传感器网络定位算法基本原理,理解所讲的迭代式多边定位算法、DV-HOP算法、PDM定位算法、基于MDS的定位算法;
利用所给的网络数据,实现两种以上的定位算法并进行比较。
3.算法介绍
基本内容介绍
在本次实验中,共有四个已知的.txt文件,分别命名为:
、、net1_topo_error_5以及net1_topo_error_10。
其中,文件net1_pos中给出了实验网络中节点的位置数据。
每行表示一个节点的位置信息。
格式如下:
节点序号节点x坐标节点y坐标是否锚节点(1代表锚节点,0代表待定位节点),比如:
11
表示节点1,其真实位置为(,106,2282),该节点是锚节点。
再比如:
330
表示节点33,其真实位置是,,该节点是待定位节点。
利用某种定位算法计算出来待定位节点的位置后,就可以根据真实位置计算该节点的定位误差。
文件net1_topo_error_free中给出了网络中相邻节点之间的距离信息。
每一行表示两个节点之间的距离。
节点1序号节点2序号节点之间距离测量值。
比如:
14
表示节点1和节点4可以相互测量出之间的距离,他们之间的距离是
文件net1_topo_error_5和net1_topo_error_10给出的距离分别是增加了5%和10%误差之后的扰动值。
迭代多边定位算法
算法思想:
利用已知信标节点和非信标节点的几组对应关系(两点间距离),对非信标节点进行定位。
(某个非信标节点只要已知3个及以上信标节点与其距离即可对其进行定位。
)定位成功后的非信标节点转换为信标节点,可辅助对其他非信标节点定位。
不断迭代定位过程,知道信标节点集合元素个数在前后两次迭代中数量不变,则迭代终止。
前提条件:
已知位置的锚节点个数要超过3个;
对所有节点来说,在添加完邻接矩阵关系后,是一个连通图,没有孤立节点。
特别说明:
因为在使用迭代多边定位算法对未知节点进行定位时需要利用该节点与3个以上信标节点的直线距离,图是连通图但不是全连通图,所以可能会有部分节点无法定位。
DV-HOP算法
先用Floyd算法将图的最短路径和每两个节点间的最小跳数表示出来,将特定位置的节点到参考节点的距离用网络中的节点的平均每跳距离和节点之间的跳数乘积表示,使用三角形定位的方法来获得节点的位置节点。
图是否为连通图对于迭代多边算法影响可能不会很大,但是在DV-HOP算法中,如果有孤立节点,则会导致程序出错。
PDM算法
PDM算法全称为计算邻近度-距离转换矩阵算法(Proximity-to-DistanceMapping),也就是说通过计算节点间的邻近度-距离转换矩阵来给未知节点进行定位,本算法中涉及到:
通过锚节点间协作构建邻近度-距离转换矩阵D=P*T,对于已知的锚节点,它们之间的跳数可以通过Floyd算法计算出来,即可获取关于所有锚节点的跳数矩阵P,而锚节点的坐标已知,其相互之间的距离可以计算出来,即构造了距离矩阵D。
利用伪逆技术增强鲁棒性,计算出转换矩阵T:
若锚节点的分布要能较准确的刻画网络拓扑性质,我们可以认为矩阵T也符合网络中的非锚节点。
而非锚节点到锚节点的跳数可以用Floyd算出,即P可算出,通过D=T*P可以算出某个点到锚节点的距离,再调用算法一可以算出坐标。
图是否为连通图对于PDM算法影响很大,如果有孤立节点,矩阵运算就不会正确,无法定位。
4.算法实现
第一步:
将数据读入内存。
利用Matlab中已有的函数load将文件中的内容以矩阵的方式读入内存。
Data_post=load('
'
);
Data_road1=load('
net1_topo-error'
Data_road2=load('
Data_road3=load('
culunm_post=size(Data_post);
第二步:
判断锚节的个数。
tempcount=0;
fori=1:
culunm_post
(1)
ifData_post(i,4)==1
tempcount=tempcount+1;
end
end
iftempcount<
3
disp('
锚节点少于3个,DV-hop算法无法执行'
return;
第三步:
初始化距离矩阵,将与锚节点有关的路径读入距离矩阵
先将距离矩阵全部赋值为无穷大,再将每个节点到自身的距离规定为0,在边的信息中,如果有端点为锚节点的,就更新其两点间的距离。
fori=1:
culunm_road
(1)
if(Data_road(i,1)<
=anchors_n)
matrix(Data_road(i,1),Data_road(i,2))=Data_road(i,3);
elseif(Data_road(i,2)<
matrix(Data_road(i,2),Data_road(i,1))=Data_road(i,3);
第四步:
迭代计算
逐一判断每一个非信标节点是否有3个以上锚节点与其相关,如果有3个以上的信标节点与其相关则根据:
其中x,y为未定位的节点的实际位置,(x1,y1),(x2,y2),……是已知的锚节点到该未知节点的距离。
根据以上两个矩阵的转换,可以求得:
,其中x为一个一行两列的矩阵,分别表示未知节点定位后的坐标位置x,y。
定位成功后,把该点的标号加入锚节点集合中并从非锚节点集合中删除,并在距离矩阵中加入与该节点相关的边的信息。
不断迭代运行第四步,直至锚节点集合中元素个数不再变化。
核心代码如下:
(1)计算未知节点位置
point=temp(1,3)^2-temp(1,1)^2-temp(1,2)^2;
forii=2:
k-1
A(ii-1,:
)=2*[temp(1,1)-temp(ii,1)temp(1,2)-temp(ii,2)];
b(ii-1,:
)=[temp(ii,3)^2-temp(ii,1)^2-temp(ii,2)^2-point];
Ans=inv(transpose(A)*A)*transpose(A)*b;
estimated(j,1)=Ans(1,1);
estimated(j,2)=Ans(2,1);
(2)更新锚节点、非锚节点集合以及距离矩阵
anchors_n_t=anchors_n_t+1;
anchors(anchors_n_t)=j;
Locate=find(all==j);
all(Locate)=[];
form=1:
if(Data_road(m,1)==j)
matrix(Data_road(m,1),Data_road(m,2))=Data_road(m,3);
elseif(Data_road(m,2)==j)
matrix(Data_road(m,2),Data_road(m,1))=Data_road(m,3);
第五步:
计算误差,输出结果
将所有的两点间的距离关系读入距离矩阵
fori=1:
shortest_path=matrix;
利用最短路径算法求得两点间的最短路径
fork=1:
nodes_n
fori=1:
forj=1:
ifshortest_path(i,k)+shortest_path(k,j)<
shortest_path(i,j)
shortest_path(i,j)=shortest_path(i,k)+shortest_path(k,j);
jump_n(i,j)=jump_n(k,j);
End
求每个信标节点的校正值
利用函数:
anchor_to_anchor=shortest_path(1:
anchors_n,1:
anchors_n);
fori=1:
anchors_n
hopsize(i)=sum(sqrt(sum(transpose((repmat(true(i,:
),anchors_n,1)...
-true(1:
anchors_n,:
)).^2))))/sum(anchor_to_anchor(i,:
));
第六步:
未知节点计算位置
先通过距离=跳数*校正值求得未知节点到每个锚节点的距离,再根据最小二乘法计算具体位置。
obtained_hopsize=hopsize(find(shortest_path(i,1:
anchors_n)==...
min(shortest_path(i,1:
anchors_n))));
unknown_to_anchors_dist=transpose(obtained_hopsize
(1)*...
shortest_path(i,1:
anchors_n));
A=2*(estimated(1:
anchors_n-1,:
)-repmat(estimated(anchors_n,:
),...
anchors_n-1,1));
anchors_location_square=transpose(sum(transpose...
(estimated(1:
).^2)));
dist_square=unknown_to_anchors_dist.^2;
b=anchors_location_square(1:
anchors_n-1)-...
anchors_location_square(anchors_n)-dist_square(1:
anchors_n-1)+..
dist_square(anchors_n);
estimated(i,:
)=transpose(A\b);
第七步:
利用最短路径算法求得两点间的最短路径,以及最短路径下每对节点的上一跳信息。
构造节点跳数矩阵P_all
根据上一跳矩阵jump_n,通过循环判断可以得出一个32*320的矩阵P_all,P_all(i,j)表示从第i和点到第j个点最少需要多少跳。
forj=1:
temp_num=last_jump(i,j);
while(temp_num~=i)
P_all(i,j)=P_all(i,j)+1;
temp_num=last_jump(i,temp_num);
构造PDM算法所需要的各种矩阵
所有锚节点的跳数矩阵P_anchors、锚节点的距离矩阵D_anchors、转换矩阵T、非锚节点到锚节点的跳数P_Nanchors、未知节点到锚节点的距离D_Nanchors
P_anchors=P_all(1:
D_anchors=pdist2(true_anchors,true_anchors);
D_anchors=D_anchors(1:
T=D_anchors*transpose(P_anchors)*inv(P_anchors*transpose(P_anchors));
P_Nanchors=P_all(1:
anchors_n,33:
320);
D_Nanchors=T*P_Nanchors;
利用最小二乘法估算具体位置
第八步:
5.实验结果和分析
迭代多边定位算法
1、实验结果
(1)无扰动值时的迭代多边定位算法
说明:
红色圆圈表示节点实际位置,蓝色圆点表示利用迭代多边定位算法的估计位置。
(2)5%误差扰动值时的迭代多边定位算法
红色圆圈表示节点实际位置,蓝色圆点表示利用迭代多边定位算法的估计位置,蓝色连线表示某个节点实际位置与估计位置的误差。
(3)10%误差扰动值时的迭代多边定位算法
红色圆圈表示节点实际位置,蓝色圆点表示利用迭代多边定位算法的估计位置,黄色连线表示某个节点实际位置与估计位置的误差。
2、误差分析
三次定位中,误差(方差)分别为:
、、。
可以看出,随着扰动比例的不断提高,该算法的定位精准度在不断下降。
这是由于迭代多边定位算法是通过取N和圆的交点来进行定位的,一旦出现了扰动,将改变两点间的距离,使得用于定位的部分圆半径不正确,出现定位不准确或定位点不合实际的情况。
DV-HOP算法
蓝色“*”表示已知点的数据,红色圆点表示无扰动值时估计数据,蓝色圆点表示5%扰动值时估计数据,黄色