基于DV-Hop算法的无线传感器网络节点定位仿真系统
项目简介
本项目是一个基于MATLAB开发的无线传感器网络(WSN)节点定位仿真系统。项目完整实现了经典的DV-Hop(Distance Vector Hop)非测距定位算法。该系统模拟了在二维监测区域内随机部署传感器节点的过程,通过仿真网络泛洪、距离估算和坐标计算三个核心阶段,实现了对未知节点的位置估计,并提供了直观的可视化结果和误差分析。
该仿真主要用于展示基于连通性的WSN粗粒度定位技术,利用网络的拓扑结构而非物理测距(如RSSI或ToA)来实现定位,适用于硬件成本低、对定位精度要求相对宽松的应用场景。
功能特性
- 随机网络部署:支持在指定尺寸的二维区域内随机生成信标节点(锚节点)和未知节点,并根据设定的通信半径构建网络拓扑。
- 全网跳数计算:通过模拟算法计算网络中所有节点之间的最小跳数(Shortest Path Hop Count)。
- 平均每跳距离估算:信标节点根据自身已知位置和与其他信标的跳数,计算并广播校正后的平均跳距(HopSize)。
- 位置解算:未知节点利用估算的距离信息,通过最小二乘法(Least Squares)配合伪逆矩阵求解自身坐标。
- 可视化展示:
*
初始分布图:展示节点分布及通信范围示意。
*
定位结果对比图:同时显示信标、真实位置、估计位置,并用连线表示误差偏移。
*
误差统计图:通过柱状图直观展示每个被定位节点的绝对误差。
- 多维度评价:自动计算并输出定位覆盖率、平均定位误差以及相对于通信半径的归一化误差。
系统要求
- MATLAB R2016a 及以上版本
- 无需额外的工具箱(Toolbox),仅依赖MATLAB基础数学与绘图功能
使用方法
- 确保MATLAB环境已准备就绪。
- 将脚本文件保存到本地目录。
- 在MATLAB中打开脚本文件。
- 直接运行函数
main()。 - 程序将依次弹出三个图形窗口显示仿真过程,并在命令窗口(Command Window)输出详细的统计数据。
代码实现逻辑与核心算法
本项目在一个主函数中通过六个阶段完整实现了DV-Hop算法流程,具体实现细节如下:
1. 参数设置与环境初始化
- 参数配置:区域设定为 100x100 米,节点总数为 100 个,信标节点占比 20%(即20个信标,80个未知节点),通信半径设定为 30 米。
- 节点部署:使用
rand 函数生成均匀分布的随机坐标。前 Anchor_Num 个节点被指定为信标节点(红色三角形),其余为未知节点(蓝色圆圈)。
2. 建立距离矩阵与计算跳数 (拓扑构建)
- 欧氏距离计算:遍历所有节点对,计算两两之间的物理欧氏距离。
- 邻接与跳数初始化:依据通信半径
Comm_Radius 判断连通性。若距离小于半径,跳数记为1;否则初始化为无穷大(inf)。 - Floyd-Warshall 算法:代码采用三重循环实现了Floyd算法,计算全网任意两个节点之间的最短跳数路径。这是模拟网络泛洪(Flooding)阶段的关键步骤,确保所有节点获得到达信标节点的最小跳数。
3. 校正值计算 (HopSize)
- 每个信标节点通过获取其他所有信标节点的位置和跳数信息,计算网络的平均每跳距离。
- 计算公式:
HopSize = ∑(信标间距离) / ∑(信标间跳数)。 - 代码中包含逻辑判断,确保只计算互相可达的信标节点,防止除以零的错误。
4. 未知节点距离估算
- 最近信标选择:未知节点遍历跳数矩阵,寻找离自己跳数最少的那个信标节点。
- 距离估算:未知节点采用最近信标的
HopSize 作为自己的平均跳距,并乘以到各信标的跳数,从而得到到各个信标节点的估算物理距离。 - 公式:
Est_Distance = Hops * HopSize。
5. 坐标计算 (最小二乘法)
- 几何定位原理:采用多边测量法(三边测量法的推广)。代码设置了门槛,必须至少连接到3个信标节点才通过计算,否则标记为无法定位。
- 线性化方程:构建 $Ax = b$ 线性方程组。为了消除非线性的平方项,算法选取最后一个可用的信标作为基准节点,将其他信标的距离方程与其相减。
* 矩阵
A 包含坐标差分项:$2(x_i - x_{base}), 2(y_i - y_{base})$。
* 向量
b 包含距离和坐标的平方差项。
- 稳健求解:使用
pinv(A)(摩尔-彭若斯伪逆)求解 $Ax=b$,以得到未知坐标 Pos。相比直接求逆,伪逆能更好地处理矩阵可能存在的病态或奇异问题。
6. 误差分析与可视化
- 误差计算:计算估计坐标与真实坐标之间的欧氏距离作为定位误差。
- 覆盖率统计:统计成功定位的节点数量(排除因信标不足3个而无法定位的节点)。
- 图形绘制:
* 利用
plot 函数绘制真实位置和估计位置,并使用绿色实线连接它们以直观展示误差大小。
* 利用
bar 函数绘制每个节点的误差分布直方图。
- 数据输出:在控制台打印平均误差、最大误差及归一化误差等关键指标。