物联网定位技术实验DV-Hop报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

物联网定位技术实验报告----------DV-Hop
姓名学号:
专业班级:物联网工程
指导老师:
完成时间:20170425
目录
实验一常用无线传感器网络定位算法实现与比较 (1)
1实验背景 (1)
2.实验目的 (1)
3.使用的工具 (1)
4.DV-Hop算法基本思想与基本原理 (1)
5.实验详细设计 (1)
实验一常用无线传感器网络定位算法实现与比较
1实验背景
DV-Hop定位机制由美国路特葛斯大学的DragosNiculescu等人提出的,DV-Hop算法是为了避免对节点间的距离直接进行测量而提出的一种基于距离矢量路由(根据目的地远近决定最好路径)的非测距定位算法。

非常类似于传统网络中的距离向量路由(从相邻站点收集网络列表,来路由选择)机制。

2实验目的
2.实验目的
1.(课堂完成)掌握典型的无线传感器网络定位算法基本原理,理解所讲的
迭代式多边定位算法、DV-HOP算法、PDM定位算法、基于MDS的定
位算法;
2.(实验完成)利用所给的网络数据,实现两种以上的定位算法并进行比较。

3.使用的工具与语言
工具:Visual studio
语言:C#
4.DV-Hop算法基本思想与基本原理
(1)通过距离矢量路由方法使未知节点获得与信标节点之间的最小跳数
(2)并计算出每跳的平均距离,然后以每跳平均距离和最小跳数的乘积作为未知节点
与信标节点之间的估计距离,
(3)再利用多边测量法获得未知节点的位置估算。

5.实验详细设计
5.1本实验用到的基本数据类型
Node(int NodeId,double x, do uble y,intisBeacon)//节点类NodeId—节点id
X,y–节点的坐标
isBeacon–是否为锚节点
List<Node>NodeList–保存节点的信息
Dictionary<int, int>hopCountTable–保存着路由信息
double[,] d = newdouble[288, 32]; --锚节点i与锚节点j之间的实际距离
path[b, c]–表示两点之间的跳数
double avg --以锚节点i为基准,计算出的平均每跳距离
本实验用到的计算方法是极大似然估计法
double[,] A = newdouble[31, 2]; -- 表示如下A的信息
double[] B = newdouble[31]; -- 表示如下B的信息
double[] C = newdouble[2]; -- 表示如下X的值
5.2.本实验用到的一些函数
publicstaticvoid Floyd(int[,] path, int n)//找出两点最小跳数
publicstaticdouble AvgHopSize(List<Node> list)//计算每跳的平均距离publicstaticvoid Multilateration(double[,] A, double[] B, double[] C)//多变定位
本实验分四大阶段:
第1阶段:读取信息---读取net1_pos.txt中的节点数据并存入List<Node>NodeList中,读取net1_topo-error free.txt中的节点距离数据,并存入string[] num中。

共有32个
锚节点,288个普通节点。

代码如下
foreach(string line in File.ReadAllLines("net1_pos.txt"))
{
string temp = Regex.Replace(line.Trim(), "\\s+", " ");//匹配空格的正则表达式
string[] num = temp.Split(' ');//将““去掉,并将temp转化为数组
Node tempNode = new Node(int.Parse(num[0]),
double.Parse(num[1]),
double.Parse(num[2]),
int.Parse(num[3]));
NodeList.Add(tempNode);
}
foreach(string line in File.ReadAllLines("net1_topo-error free.txt"))
{
string temp = Regex.Replace(line.Trim(), "\\s+", " ");
string[] num = temp.Split(' ');
path[int.Parse(num[0]), int.Parse(num[1])] = 1;
path[int.Parse(num[1]), int.Parse(num[0])] = 1;
}
第2阶段:每个参考节点利用其它参考节点的位置信息和相隔最小跳数来计算平均每跳距离,并将其作为一个校正值广播至网络中。

当接收到校正值后,节点根据跳数
计算与参考节点之间的距离。

这里用到个方法。

找出两点最小跳数的Floyd(path,
320);计算每跳的平均距离的AvgHopSize(list);
这两个方法的代码如下:
publicstaticvoid Floyd(int[,] path, int n)//找出两点最小跳数
{
for (int a = 1; a <= n; a++)
for (int b = 1; b <= n; b++)
for (int c = 1; c <= n; c++)
path[b, c] = Math.Min(path[b, c], path[b, a] + path[a, c]);
}
publicstaticdouble AvgHopSize(List<Node> list)//计算平均每跳距离
{
double distance=0.0;
int size = 0;
for (int i = 0; i<list.Count; i++)
for (int j = i + 1; j <list.Count; j++)
{
distance += Math.Sqrt((list[i].realX - list[j].realX)
* (list[i].realX - list[i].realX)
+ (list[i].realY - list[j].realY)
* (list[i].realY - list[j].realY));
size += list[i].HopCountTable[j + 1];
}
double avg = distance / size;
return avg;
}
第3阶段:当未知节点获得与3个或更多参考节点的距离时,根据极大似然估计法来计算未知节点的位置。

在使用极大释然估计法来计算未知节点之前,准备如下:
○1求出A:令点list[0]的x坐标为Xn,y的坐标为Yn。

得到如下
double[,] A = newdouble[31, 2];
for (int j = 0; j < 31; j++)
{
A[j, 0] = 2 * (list[0].realX - list[j + 1].realX);
A[j, 1] = 2 * (list[0].realY - list[j + 1].realY);
}
○2求出B用跳数*平均距离avg得到d,再由节点的x,y坐标的平方
根据
可得代码如下
double[,] d = newdouble[288, 32];
for (int j = 0; j <NodeList.Count - 32; j++)
for (int i = 0; i< 32; i++)
d[j, i] = (NodeList[j + 32].HopCountTable[i + 1] * avg)
* (NodeList[j + 32].HopCountTable[i + 1] * avg); double[] B1 = newdouble[31];
for(int j=0;j<31;j++)
{
B1[j] = (NodeList[j + 1].realX) * (NodeList[j + 1].realX)
+ (NodeList[j + 1].realY) * (NodeList[j + 1].realY) - (NodeList[0].realX) * (NodeList[0].realX)
- (NodeList[0].realY) * (NodeList[0].realY);
}
double[,] B2 = newdouble[288, 31];
for (int j = 0; j <NodeList.Count - 32; j++)
for (int i = 0; i< 31; i++)
B2[j,i] = d[j, i + 1] - d[j, 0];
double[] B = newdouble[31];
double[] C = newdouble[2];
for (int j = 0; j <NodeList.Count - 32; j++)
{
for (int i = 0; i< 31; i++)
{
B[i] = B2[j, i] - B1[i];
}
○3由极大似然估计法公式计算可得普通节点的坐标值
根据C#的预定义函数可得如下代码:其中C[ , ]中存着普通节点的坐标值publicstaticvoid Multilateration(double[,] A, double[] B, double[] C)//最大释然估计法{ var matrixA = DenseMatrix.OfArray(A);
var vectorB = new DenseVector(B);
var resultX = matrixA.QR().Solve(vectorB);
C[0] = double.Parse(resultX[0].ToString());
C[1] = double.Parse(resultX[1].ToString())
}
6.部分运行结果截图如下:。

相关文档
最新文档