物联网定位技术实验报告书
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
中南大学
信息科学与工程学院
物联网定位技术实验报告书
实验名称:网络定位算法研究
成员:董嘉伟
指导老师:张士庚
完成时间:2013-6-1
目录
●实验目的
●实验设备
●实验要求
●实验背景
●实验原理
●实验实现(部分)
●实验结果展示及分析
●实现小结
一、实验目的
掌握常用网络定位算法,并能够独立完成和实现。
二、实验设备
硬件:计算机
软件:VS2012、C#4.0
三、实验要求
●在给定的两个网络中,编程实现前面所讲的定位算法
●选择至少两个定位算法进行实现
●计算所得的定位结果的误差
●对不同定位算法的效果进行分析比较
●撰写实验报告
●扩展:考虑距离测量有误差的情况?
四、实验背景
无线传感器网络(WSN)定位问题在军事、楼宇自动化、跟踪与监测等方面都有广泛的应用,一直是WSN的技术热点之一。尽管全球无线定位系统(GPS)提供了很好定位手段,并在很多方面发挥着重要的作用,但也存在着一些不足。比如:GPS不适合于室内环境定位,其能量消耗将减少传感器节点的生存寿命,GPS 及其天线增大了节点的体积等,
因此GPS并不适用于无线传感器网络。针对无线传感器网络开展专门的不依赖于GPS的定位研究(特别是分布式定位算法),具有重要的意义。
很多学者研究了无线传感器网络节点精确定位问题,提出了许多有效的算法。这些算法依据是否计算节点间的距离,可分为距离无关定位算法和距离相关定位算法。距离无关定位算法如最小包含圆算法、DV-Hop(distance vector-hop)算法、多向度量法(MDS)等。这些方法大多通过几何方法实现,依赖于网络的拓扑结构,从而影响了定位精度。距离相关定位算法一般先通过某种测距方法确定未知节点与初始锚节点的距离,然后根据这个距离利用三边关系、多边关系或边角关系等确定未知节点的位置。测距方法有到达时间法(TOA)、到达时间差法(TDOA)、接收信号强度法(RSSI)等。距离相关定位算法的定位精度依赖于测距的准确性,其测距误差可用测距的百分比来衡量。依据到初始锚节点的跳数可以分为单跳定位和多跳定位,单跳定位算法如APIT定位算法,到达角定位算法[10]等。多跳定位算法如DV-Hop(distance vector-hop)算法、迭代多边定位(iterative multilateration) 算法等。单跳定位早于无线传感器网络的出现,是多跳定位的基本技术。
五、实验原理
当网络的连通性较好时(每个节点至少有3个邻居节点),设盲节点(xi,Yi)的周围有k个参考节点 (x1,y1),(x2,y2),(x3,y3)…(x4,Y4),它们与盲节点(xi,yi)的之间的测距离为r,1,r2,r3,…,rk。设(Xi,yi)的估计值为(x0,y0)。参考节点到估计位置距离与测距之间的差异用fi(x0,y0)表示:
求解如下最小二乘估计来获得最优的位置估计(x0, y0):
当矩阵A 是列满秩时可以得到如式所示的最小二乘解。
迭代多边定位过程如下:首先由预定的锚节点( 坐标给定) 通过式估计盲节点的坐标,然后将这些已定位的盲节点当作参考节点参与其他盲节点的定位,下一轮得到坐标的盲节点又可以做为参考节点参与其他盲节点的定位。依次类推,式层层迭代运行,对网络中的所有盲节点进行定位( 如图1 所示) 。
图1 多边定位迭代运行
在图1 中初始锚节点1 ,节点2 ,节点3可用来估计节点4 的位置,初始锚节点3 ,节点5 ,节点6 可用来估计节点7 的位置,节点 4 和节点7 当做参考节点,和节点 6 一起估计节点8 的位置。当然节点8 可以当作参考节点去参与其他盲节点的定位。
六、实验实现
本次使用C#语言来实现,详细源码看压缩包中工程文件。
节点类Node:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace网络定位算法比较
{
class Node//节点类
{
//节点属性
private int NodeID;//节点ID号
private double realX;//节点的真实经度
private double realY;//节点的真实纬度
private bool IsBasic;//是否为锚节点
private ArrayList arNode = new ArrayList();//索引器数组
public void setID(int id)
{
this.NodeID=id;
}
public int getID()
{
return this.NodeID;
}
public void setRealX(double realX)
{
this.realX = realX;
}
public double getRealX()
{
return this.realX;
}
public void setRealY(double realY)
{
this.realY = realY;
}
public double getRealY()
{
return this.realY;
}
public void setIsBasic(int a)
{
if (a == 1)
this.IsBasic = true;
else
this.IsBasic = false;
}
public bool getIsBasic()
{
return this.IsBasic;
}
public double X { set; get; }
public double Y { set; get; }
//索引器
public Node this[int index]
{
get { return (Node)arNode[index];}
set { arNode.Insert(index, value); }
}
}
}
迭代计算方法Calc():
public void Calc(int id, int num)
{
//Node[] node = NodeList.ToArray();
double[] nodeX= new double[num];//存放锚节点X坐标信息
double[] nodeY= new double[num];//存放锚节点Y坐标信息
double[] dist=new double[num];//存放距离信息
int nodesum=0;//参与计算的节点数量,最大值为num-1
for (int i = 1; i < 321; i++)
{
if (distance[id, i] > 0 && NodeList[i - 1].getIsBasic() == true)
{
nodeX[nodesum] = NodeList[i - 1].getRealX();
nodeY[nodesum] = NodeList[i - 1].getRealY();
dist[nodesum] =distance[id,i];