基于RSSI原理的Wi-Fi定位程序,通过RSSI测距后使用三边法定位,为了方便读者修改,锚点数量可自适应调整(>3个即可)。适用范围为三维空间,轨迹使用EKF(扩展卡尔曼滤波)进行滤波,模拟wifi与IMU的数据融合
文章目录
- 程序介绍
- 代码概述
- 核心模块解析
- 环境初始化与参数设置
- 目标运动与RSSI测量
- 定位算法实现
- 扩展卡尔曼滤波(EKF)
- 运行结果
- 扩展建议
- MATLAB源代码
程序介绍
代码概述
本程序实现了一套基于RSSI(接收信号强度指示)的三维Wi-Fi定位系统,结合扩展卡尔曼滤波(EKF)对动态轨迹进行滤波优化。代码主要功能包括:
- 多锚点自适应定位:支持任意数量(N≥3)的锚节点(基站)配置
- 三维空间建模:支持三维坐标系的定位与轨迹跟踪
- 动态误差模拟:通过噪声注入模拟真实环境中的信号衰减与测量误差
- EKF轨迹优化:通过状态估计提升定位精度,降低噪声影响
- 可视化分析:三维轨迹对比、各轴误差曲线及定量误差输出
核心模块解析
环境初始化与参数设置
clear; clc; close all;
rng(0); % 固定随机种子确保可重复性
RSSI_err = 0.1; % RSSI测量噪声标准差
n = 10; % 锚节点数量
baseP = 10*[sin(1:n)+...]; % 生成锚节点坐标(三维正弦分布+随机偏移)
- 锚节点生成:通过正弦/余弦函数构造非均匀分布的基站,模拟现实场景中的几何多样性。
- 信号衰减模型:
RSSI(d) = RSSI_0 - 10n*log10(d)
,其中RSSI_0=-30
为1米处基准强度,n=5
为路径损耗因子。
目标运动与RSSI测量
positions = repmat(position0,21,1) + [...] % 目标运动轨迹(匀速+高度恒定)
distances = sqrt(sum((baseP - true_position).^2, 2));
RSSI_measurements = RSSI_0 - 10*nn*log10(d) + 噪声 % 含噪声的RSSI值
- 轨迹生成:目标点从
(5,5,5)
出发,X/Y轴匀速运动,Z轴固定。 - RSSI模拟:基于对数距离路径损耗模型,添加高斯噪声模拟测量误差。
定位算法实现
function estimated_pos = rssi_localization(...)distances = 10.^((RSSI_0 - RSSI)/(10*n)); % RSSI转距离p_out = position_3dim(distances, anchors); % 最小二乘法解算坐标
end
- 定位原理:通过多基站RSSI值反推距离,构建超定方程组,采用**伪逆矩阵(pinv)**求解最优位置。
- 数学方法:线性最小二乘(LS)估计,适用于非共线锚点配置。
扩展卡尔曼滤波(EKF)
% 状态模型
Xpre = [X_ekf(1,k-1)+0.2; X_ekf(2,k-1)-0.2; X_ekf(3,k-1)] + 噪声
% 雅可比矩阵
F = eye(3); H = eye(3); % 线性运动/观测模型
Kk = PP * H' / (H*PP*H' + R); % 卡尔曼增益计算
X_ekf(:,k) = Xpre + Kk*(Z(:,k)-Z_hat) % 状态更新
- 运动模型:假设目标X轴速度+0.2m/s,Y轴速度-0.2m/s,Z轴静止。
- 噪声抑制:通过协方差矩阵
Q
(过程噪声)、R
(观测噪声)平衡预测与测量权重。
运行结果
-
定位与滤波结果示意图:
-
误差曲线图:
-
命令行输出的结果:
扩展建议
- 非线性改进:若目标运动含加速度,需修改EKF中
F
矩阵并重新计算雅可比行列式 - 多源融合:添加IMU传感器数据,构建多传感器融合定位系统
- 锚点优化:结合几何精度因子(GDOP)分析最优锚点布置方案
MATLAB源代码
部分代码和详细的框架如下:
% 基于RSSI原理的WiFi定位程序,N个锚点(数量可自适应)、三维空间,轨迹使用EKF进行滤波
% 2025-04-23/Ver1clear; clc; close all; % 清除工作区、命令窗口和关闭所有图形窗口
rng(0); %固定随机数种子
RSSI_err = 0.1; % 定义RSSI测量误差
n = 10; %定义蓝牙基站的数量
% 使用正弦和余弦函数生成各个蓝牙基站的坐标(并添加微小随机偏移)
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米处的信号强度
nn = 5; % 衰减因子
% 模拟未知点的位置
% true_position = [10,10,20]; % 待定位点真实坐标% 生成目标点坐标%% EKF部分
%% 滤波模型初始化%% 运动模型%% 扩展卡尔曼滤波 (EKF)%% 输出%% 绘图
% 轨迹图% 误差绘图%% 位置与误差输出%% 定位函数定义
完整代码下载链接:https://download.csdn.net/download/callmeup/90675730
如有其他需求或导航、定位滤波相关的代码定制,请点击下方卡片联系作者