WSN定位:无需测距的质心算法实现

需积分: 14 6 下载量 51 浏览量 更新于2024-09-07 收藏 295KB PDF 举报
实验八:WSN定位技术 本实验主要探讨的是无线传感器网络(Wireless Sensor Network, WSN)中的定位技术,重点是无需测距的质心算法。这种定位方法不需要直接测量节点间的距离和角度信息,因此定位精度可能不如基于精确测距的技术,但它适用于对定位精度要求不高的应用场景,如环境监测、资产追踪等。 实验的核心原理是利用多边形的质心概念。在计算几何学中,多边形的几何中心,即质心,是所有顶点坐标的加权平均值。对于一个多边形,其质心坐标可以通过公式计算得出,例如对于四边形ABCD,如果顶点坐标分别为(x1, y1),(x2, y2),(x3, y3),(x4, y4),质心坐标可以通过加权平均来求得。 实验步骤涉及以下关键点: 1. **锚点与信标节点**:锚点是已知位置的节点,它们周期性地向周围节点发送包含自身标识和位置信息的分组。未知节点通过接收到的不同锚点的信息,判断自身位置。 2. **质心计算**:未知节点通过收集足够多的锚点信息,形成一个多边形,然后计算这些节点构成的多边形的质心,作为自己位置的估计。 3. **Matlab实现**:实验使用Matlab进行编程,其中涉及到的函数有: - `min(A)`:返回向量或矩阵中最小元素。 - `rand`:生成均匀分布的随机数,单个随机数在(0,1)范围内,矩阵则是生成指定维度的随机数。 - `sum(A)`:计算向量或矩阵元素的总和。 - `inf`:表示正无穷大,用于处理某些特殊情况下的计算。 - `zeros`:创建全零数组。 - `plot(X,Y)`:绘制二维曲线图。 - `norm`:计算向量的欧几里得范数,用于衡量误差。 4. **变量与数据结构**:实验中使用的变量包括均匀分布的信标节点位置矩阵`xy`,未知节点数量`n`,未知节点位置矩阵`SS`,通信半径`dm`,质心`cent`,以及估计坐标矩阵`MM`和误差矩阵`e`。 5. **实验目标**:通过实验,学生需要掌握质心算法的基本思想,学会在Matlab环境中实现该算法,并将其应用于解决实际问题,提升数学计算软件的运用能力。 在进行实验时,需注意网络连通性和数据收集的有效性,因为算法的准确性依赖于接收到的锚点信息的数量和质量。尽管质心算法在无须测距的情况下简化了定位过程,但其精度可能会受到节点分布不均匀或通信延迟等因素的影响。因此,对于对定位精度有较高要求的应用,可能需要结合其他定位技术,如RSSI(Received Signal Strength Indicator)或TOA(Time of Arrival)来提高定位精度。

Astar astar; std::vector<std::vector<Node*>> paths(agvs.size()); // 得到agv的路綫 for (int i = 0; i < agvs.size(); i++) { if (agvs[i].getState() == false) { if (agvs[i].getLoad()){//如果是負載的狀態,則任務的起點到任務的終點 if (agvs[i].getCurrentX() == agvs[i].getEndX() && agvs[i].getCurrentY() == agvs[i].getEndY()) { agvs[i].setState(true); agvs[i].setLoad(false); tasks[i].setCompleted(2); task_to_agv(); } Node* start_node = new Node(agvs[i].getCurrentX(), agvs[i].getCurrentY()); Node* end_node1 = new Node(agvs[i].getEndX(), agvs[i].getEndY()); std::vector<Node*> path_to_end = astar.getPath(start_node, end_node1); path_to_end.erase(path_to_end.begin()); std::vector<Node*> path; path.insert(path.end(), path_to_end.begin(), path_to_end.end()); paths[i] = path;} else { //如果是空載的狀態,則行駛到任務的起點 //如果agv已經到達任務起點,變爲負載狀態 if (agvs[i].getCurrentX() == agvs[i].getStartX() && agvs[i].getCurrentY() == agvs[i].getStartY()) { agvs[i].setLoad(true); } Node* start_node = new Node(agvs[i].getCurrentX(), agvs[i].getCurrentY()); Node* end_node = new Node(agvs[i].getStartX(), agvs[i].getStartY()); std::vector<Node*> path_to_start = astar.getPath(start_node, end_node); std::vector<Node*> path; path.insert(path.end(), path_to_start.begin() + 1, path_to_start.end()); paths[i] = path;} }, if (paths.size() > 0) { std:: cout << "wsn"<<endl; for (int i = 0; i < agvs.size(); i++) { if (!paths[i].empty()) { QPainterPath path; for (int j = 0; j < paths[i].size() - 1; j++) { Node* current_node = paths[i][j]; Node* next_node = paths[i][j+1]; path.moveTo(current_node->x25+200+nodeSize/2, current_node->y25+50+nodeSize/2); path.lineTo(next_node->x25+200+nodeSize/2, next_node->y25+50+nodeSize/2); } painter.setPen(QPen(Qt::yellow, 3)); painter.drawPath(path); } } },沒有畫出agv的路徑,怎麽修改

2023-05-24 上传