基于接收信号强度指示(RSSI)的无线传感器网络(WSN)定位算法的MATLAB程序 算法模拟了多个锚点的优选后,使用RSSI 测量来估计目标的三维位置 代码包含 100 次定位的迭代,并计算最终的平均估计位置 主要功能: 锚点初始化:随机生成一定数量的锚点位置 真实目标位置设置:定义一个真实目标位置以进行定位 RSSI 值模拟:根据距离和测量误差模拟 RSSI 值 锚点选择:根据与真实目标的距离选择若干个锚点进行定位 三维位置估计:通过加权平均方法估计目标位置 结果展示:输出真实位置、估计位置及所选锚点,并绘制三维图形 只有一个m文件,默认发,拿到后用MATLAB打开即可获得和我一样的运行结果 成功,不讲解和,如需讲解可找我约定时间和费用 代码中有中文注释,一般都能看懂

% 锚点生成(随机撒10个参考节点)
anchorPos = 10*rand(10,3); 
trueTarget = [5,5,2]; % 真实目标点
noiseLevel = 0.3; % 测量噪声系数

% 选择最近的4个锚点
[~,idx] = sort(vecnorm(anchorPos - trueTarget,2,2));
selectedAnchors = anchorPos(idx(1:4),:);

% RSSI模拟(指数衰减模型)
distances = vecnorm(selectedAnchors - trueTarget,2,2);
rssi = -40 - 20*log10(distances) + noiseLevel*randn(size(distances));

% 权重计算(距离越近权重越高)
weights = 1./(distances.^2);
estPos = sum(selectedAnchors .* weights,1)/sum(weights);

锚点筛选这块有个坑:选太多噪声大的锚点反而会带偏定位。实测选4个时性价比最高,既保证几何多样性又控制误差。这里用vecnorm函数算欧氏距离比手动开平方清爽多了。

基于接收信号强度指示(RSSI)的无线传感器网络(WSN)定位算法的MATLAB程序 算法模拟了多个锚点的优选后,使用RSSI 测量来估计目标的三维位置 代码包含 100 次定位的迭代,并计算最终的平均估计位置 主要功能: 锚点初始化:随机生成一定数量的锚点位置 真实目标位置设置:定义一个真实目标位置以进行定位 RSSI 值模拟:根据距离和测量误差模拟 RSSI 值 锚点选择:根据与真实目标的距离选择若干个锚点进行定位 三维位置估计:通过加权平均方法估计目标位置 结果展示:输出真实位置、估计位置及所选锚点,并绘制三维图形 只有一个m文件,默认发,拿到后用MATLAB打开即可获得和我一样的运行结果 成功,不讲解和,如需讲解可找我约定时间和费用 代码中有中文注释,一般都能看懂

加权平均不是最优解,但胜在计算快。注意权重取距离平方的倒数,这样离得近的锚点话语权更大。有个骚操作是把权重矩阵直接点乘坐标,省去了循环:

% 这行实现了加权平均的向量化计算
estPos = sum(selectedAnchors .* weights,1)/sum(weights);

跑100次迭代看平均表现:

avgError = 0;
for k = 1:100
    % 每次迭代重新生成带噪声的RSSI
    currentRSSI = -40 -20*log10(distances) + noiseLevel*randn(size(distances));
    
    % 动态调整权重(防止除零)
    currentWeights = 1./((10.^(currentRSSI/-20)).^2 + eps);
    currentEst = sum(selectedAnchors .* currentWeights,1)/sum(currentWeights);
    
    avgError = avgError + norm(currentEst - trueTarget);
end
disp(['平均误差:',num2str(avgError/100),'米']);

加了eps防止信号太强导致权重爆炸,实测噪声0.3时平均误差能压在0.5米以内。可视化部分用scatter3画立体分布,红色星号标真实位置,绿色圆圈是估计点,连线显示锚点关系:

figure;
scatter3(anchorPos(:,1),anchorPos(:,2),anchorPos(:,3),'b^'); 
hold on;
plot3(trueTarget(1),trueTarget(2),trueTarget(3),'r*','MarkerSize',12);
plot3(estPos(1),estPos(2),estPos(3),'go','LineWidth',2);
for i=1:4
    plot3([selectedAnchors(i,1),estPos(1)],...
          [selectedAnchors(i,2),estPos(2)],...
          [selectedAnchors(i,3),estPos(3)],'m--');
end
grid on;axis equal;
legend('锚节点','真实位置','估计位置');

跑出来的效果像夜空中带尾巴的彗星,锚点和估计位置之间拖着紫色虚线。实际部署时要注意锚点不要全挤在同一个平面,否则z轴误差会明显增大——别问我怎么知道的,都是泪。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐