基于Wi-Fi指纹匹配的室内定位-仿真获取WiFi RSSI数据
WiFi指纹匹配是室内定位最为基础和常见的研究,但是WiFi指纹的采集可以称得上是labor-intensive和time-consuming。现在,给大家分享一下我们课题组之前在做WiFi指纹定位时的基于射线跟踪技术仿真WiFi RSSI实验代码。
对数路径损耗模型
WiFi信号强度在空间中传播符合路径损耗模型。本文介绍的是较为常用的对数路径损耗模型,如下公式:
RSS衰减与距离的对数呈正比,假设已知一个参考距离d0以及这个距离上的RSS为
RSS(d0),那么距离为d的RSS(d)就可以通过上式计算得到。n是环境因子,在自由空间中一般取2就可以。
下图是实际RSS和模型仿真RSS的比较。在实际环境中,因为受到多径效应、非视距传播等噪声的影响,信号强度会发生变化,所以实际测量到的Wi-Fi信号一般如红线所示。
利用射线跟踪技术仿真得到Wi-Fi的RSSI数据
Wi-Fi信号沿直线传播,可以将其近似为射线进行分析。对于一个固定的发射源(即WiFi AP),在自由空间中,利用对数距离衰减模型即可计算各个位置的RSS,但是室内环境很复杂,信号可以遇到墙壁发生反射,各个反射后的信号又可以与未经反射的信号叠加,实际中测量到的信号其实包括了各个反射、绕射、散射信号。在射线跟踪中,计算出发射点与接收点之间的多条传播路径,分别对各个路径的信号进行分析,一般包括信号强度、相位在多次反射或绕射下的计算,然后叠加得到接收点上的信号。
在仿真实验中,我们把每个Wi-Fi AP看成一个固定的发射源,而接收器则要接受来自不同Wi-Fi AP的信号。接收器收到的信号中包含了来自每个WiFi AP的1条直射路径与6条(墙壁)反射路径的信号,因为反射后信号很小,所以我们不考虑反射信号路径。根据对数路径损耗模型,我们理论上可以计算出室内每点的WiFi RSSI强度,用于室内定位指纹库建立。
如下图,是仿真得到的某WiFi AP所覆盖的WiFi信号强度。
仿真实验MATLAB代码
实际上在射线仿真实验中涉及到了通信原理的知识,但是因为我本人不是通信出身,所以不做具体说明,想要了解射线传播原理的同学自己搜索相关知识~
以下是主程序代码:
if ~exist('radio_map_20_15.mat', 'file') %生成仿真环境disp('正在模拟射线跟踪...');generate_radio_map(0.01); % 仿真射线网格大小
endclc
clear;
load radio_map_30_30.mat;
%变量为fingerprint %默认尺寸为20m*15m * 10ap,网格大小为0.01m
%注意:这里的仿真环境(fingerprint)是一个精度很高的指纹库,后面从这个仿真环境中进行取样(采集数据)并生成用于定位的指纹库。%% 获取离线指纹库
%如果要研究指纹库构建上的优化,在这部分改进
[offline_rss, offline_location] = get_offline_data_uniform(fingerprint,100); %均匀采样
offline_location=offline_location/100;
idx=[1:1:length(offline_location)]';
offline_location=[offline_location,idx];
save('offline_data_uniform', 'offline_rss', 'offline_location');
[offline_rss, offline_location] = get_offline_data_random(fingerprint); %随机采样
offline_location=offline_location/100;
save('offline_data_random', 'offline_rss', 'offline_location');%% 获取在线定位阶段的数据
%前面默认的数据集的密度是0.01m,这样的话整个仿真系统的位置最小分辨率为0.01m,trace总是0.01的整数倍
roomLength = 30;
roomWidth = 30;
t = 1000;
[ loc, rss ] = get_online_data( fingerprint, 1, roomLength, roomWidth, t ); %得到轨迹与对应的RSS
save('online_data', 'loc', 'rss');
%%
clear fingerprint;
本仿真实验的完整代码:仿真获取WiFi RSSI数据
WiFi指纹定位的项目代码:WiFi指纹定位