
程序概述
该程序基于RSSI(接收信号强度指示)原理实现Wi-Fi定位,适用于在三维空间中定位未知点。程序通过多个锚点(基站)测量信号强度,并计算目标点的位置。
程序使用以下公式进行位置计算:
-
路径损耗模型公式:
R S S I = A − 10 n log 10 ( d ) RSSI = A - 10n\log_{10}(d) RSSI=A−10nlog10(d)
其中:
- R S S I RSSI RSSI 为接收信号强度
- A A A 为发射功率和接收功率之差的常数项
- n n n 为路径损耗指数
- d d d 为发射机和接收机之间的距离
-
三边测量定位公式:
假设有3个已知位置的蓝牙信标节点 ( x 1 , y 1 ) (x_1, y_1) (x1,y1), ( x 2 , y 2 ) (x_2, y_2) (x2,y2), ( x 3 , y 3 ) (x_3, y_3) (x3,y3),以及与之对应的三个距离 d 1 d_1 d1, d 2 d_2 d2, d 3 d_3 d3,则目标位置 ( x , y ) (x, y) (x,y) 可以由以下方程组求解:
{ ( x − x 1 ) 2 + ( y − y 1 ) 2 = d 1 2 ( x − x 2 ) 2 + ( y − y 2 ) 2 = d 2 2 ( x − x 3 ) 2 + ( y − y 3 ) 2 = d 3 2 \begin{cases} (x - x_1)^2 + (y - y_1)^2 = d_1^2 \\ (x - x_2)^2 + (y - y_2)^2 = d_2^2 \\ (x - x_3)^2 + (y - y_3)^2 = d_3^2 \end{cases} ⎩ ⎨ ⎧(x−x1)2+(y−y1)2=d12(x−x2)2+(y−y2)2=d22(x−x3)2+(y−y3)2=d32
-
最小二乘法定位公式:
假设有 n n n 个已知位置的蓝牙信标节点 ( x i , y i ) (x_i, y_i) (xi,yi), 以及与之对应的 n n n 个距离 d i d_i di, 则目标位置 ( x , y ) (x, y) (x,y) 可以通过最小二乘法求解:
[ x y ] = ( ∑ i = 1 n [ x i y i ] T [ x i y i ] ) − 1 ∑ i = 1 n [ x i y i ] T d i \begin{bmatrix} x \\ y \end{bmatrix} = \left(\sum_{i=1}^n \begin{bmatrix} x_i & y_i \end{bmatrix}^T \begin{bmatrix} x_i & y_i \end{bmatrix}\right)^{-1} \sum_{i=1}^n \begin{bmatrix} x_i & y_i \end{bmatrix}^T d_i [xy]=(i=1∑n[xiyi]T[xiyi])−1i=1∑n[xiyi]Tdi
以上是基于RSSI的常用蓝牙定位公式,实际应用中可能需要根据具体场景和要求进行适当调整和优化。
程序运行
运行方法
只有一个 . m .m .m文件,运行即可
运行结果
得到的运行结果如下:
- 结果绘图,显示Wi-Fi锚点位置、待定位点的真实值、计算值:

- 命令行的坐标输出:

代码各模块的功能
- 锚点生成: 随机生成多个蓝牙基站的三维空间坐标。
- RSSI模拟: 根据距离和信号强度模型生成待定位点的RSSI测量值。
- 位置估计: 根据RSSI测量值和锚点坐标计算未知点的位置。
- 结果可视化: 绘制锚点位置、真实位置和估计位置的三维图形。
源代码
部分源代码如下:
% 基于RSSI原理的Wi-Fi定位程序,N个锚点、三维空间
% 2024-10-10/Ver1
clear; clc; close all; % 清除工作区、命令窗口和关闭所有图形窗口
rng(0); %固定随机数种子
RSSI_err = 1; % 定义RSSI测量误差
n = 100; %定义蓝牙基站的数量
% 使用正弦和余弦函数生成各个蓝牙基站的坐标(并添加微小随机偏移)
baseP = 10*[sin(1:n)+0.01*[1:n]+1;cos(4*(1:n))+0.01*[1:n]+1;cos(2*(1:n))+0.01*[1:n]+1]';
% 定义信号强度与距离的关系
% 假设信号强度衰减模型为: RSSI(d) = RSSI_0 - 10*n*log10(d)
RSSI_0 = -30; % 在1米处的信号强度
n = 2; % 衰减因子
% 模拟未知点的位置
true_position = [10,10,20]; % 待定位点真实坐标
distances = sqrt(sum((baseP - true_position).^2, 2)); % 计算距离
RSSI_measurements = RSSI_0 - 10*n*log10(distances) + RSSI_err*randn(size(distances)); % 添加噪声
% 定位函数
estimated_position = rssi_localization(RSSI_measurements, baseP, RSSI_0, n);
%% 绘图
figure; % 创建新图形窗口
plot3(baseP(:,1), baseP(:,2), baseP(:,3), 'ro'); % 锚节点
hold on; % 保持当前图形
plot3(true_position(1), true_position(2), true_position(3), 'bo', 'MarkerSize', 10, 'DisplayName', '真实位置');% 绘制真实位置,蓝色圆点
plot3(estimated_position(1), estimated_position(2), estimated_position(3), 'k^', 'MarkerSize', 10, 'DisplayName', '估计位置');% 绘制估计位置,绿色叉
legend('Wi-Fi基站位置', '真实位置', '估计位置'); % 添加图例
xlabel('X (m)'); % X轴标签
ylabel('Y (m)'); % Y轴标签
ylabel('Z (m)'); % Z轴标签
title('定位结果与基站位置绘制'); % 图标题
% 更多代码、上述函数的内容见:https://gf.bilibili.com/item/detail/1106434012
总结
本程序通过RSSI原理实现了在三维空间中对未知点的定位。用户可根据需要修改基站数量、位置、RSSI测量误差等参数,以适应不同的定位场景。
1403

被折叠的 条评论
为什么被折叠?



