很多情况下大家都采用实际测量的数据进行定位算法的性能分析和验证,但是实际测量的工作量太大、数据不全面、灵活性较小,采用仿真的方法获取RSS数据是另一种可供选择的方式。本文介绍射线跟踪技术的基本原理,以及如何得到用于定位仿真的RSS数据。在此基础上得到位置指纹库与一组测试数据,用于以后定位算法的验证。(本文的原理介绍并不严谨,但求快速理解)
对数距离损耗模型
在自由空间中,没有任何障碍物,信号从发射源向四面八方呈球面形状发射出去,各个方向上没有任何区别,因此信号的功率和距离的平方呈反比:\(P \propto \frac{1}{d^2}\)。
RSS就是功率,但是衰减的单位一般用dB来表示,那么就很容易理解RSS与距离的关系了,RSS衰减与距离的对数呈正比,假设已知一个参考距离\(d_0\)以及这个距离上的RSS为\(RSS(d_0)\),那么,\(RSS(d) = RSS(d_0) - 10n\log(\frac{d}{d_0})\)。自由空间中\(n=2\),这就是最常见的对数距离损耗模型(针对室内的传播模型还有分隔损耗、楼层间分隔损耗、Ericsson多重断点模型等)。下图中的黑线是一组在走廊中测量的实际数据,红线是对数距离损耗模型的拟合结果,可以看出模型可以反映总体趋势,但和真实室内环境下的情况还是有较大区别,注意黑线的波动不是因为噪声,而是实际的信号传播环境造成的。走廊这种场景算是比较简单的,如果在其他一下更复杂的场景下,有更多的信号遮挡、反射等因素存在,RSS不仅和距离位置有关,还和周围的各种障碍物有关系,因此在更复杂一点的场景下,可以用射线跟踪技术来分析。
射线跟踪技术
电磁波沿直线传播,可以将其近似为射线进行分析。对于一个固定的发射源,在自由空间中,利用对数距离衰减模型即可计算各个位置的RSS,但是室内环境很复杂,信号可以遇到墙壁发生反射,各个反射后的信号又可以与未经反射的信号叠加,实际中测量到的信号其实包括了各个反射、绕射、散射信号。在射线跟踪中,计算出发射点与接收点之间的多条传播路径,分别对各个路径的信号进行分析,一般包括信号强度、相位在多次反射或绕射下的计算,然后叠加得到接收点上的信号。
举个例子,下图是一个假定的空旷的房间,有一个发射源(AP)在房间左边的角落,一个接收器在房间的中央,接收器收到这个AP的信号中包含了来自1条直射路径与6条(墙壁)反射路径的信号(多次反射的影响很小,可以忽略),下图右下角的曲线是某条直线上RSS随距离的衰减,在这样稍微复杂一点的环境中,RSS与距离的关系已经不是平滑的对数衰减了。理论上我们可以计算出任意一点的的RSS,图中有6个AP,因此每个位置点可以分别计算出6个RSS。
生成用于位置指纹法的仿真数据
下面介绍一些怎么得到在位置指纹法中进行仿真所需的数据。
RSS仿真环境数据集:设置好房间尺寸和各个AP的位置等各种参数,使用射线跟踪计算每个位置的RSS,位置点的间隔设得小一点(0这里设为0.01m),计算一次射线跟踪后把数据保存起来,以后所有的RSS数据都从这个“RSS仿真环境数据集”中或取。
一个典型的离线指纹库:模拟数据采集的过程,比如每个1m采集一次RSS数据,数据都从上面的“RSS仿真环境中”获取。也可以考虑其他的一些采集方式,或者为采集过程加入噪声,设置采集样本的个数等。
在线定位测试数据:模拟一个目标在房间中运动,获得一条运动轨迹,以及每个轨迹点上的RSS,用来作为定位算法的测试数据。
这个系列的位置指纹法都使用生成的这些数据,用测试数据验证算法的性能。
代码和数据
代码地址:https://github.com/jiangqideng/codeInBlogs/tree/master/IP_raytracing
- main.m:主程序,在仿真环境中,得到离线指纹库,以及在线阶段的测试数据,用于以后的定位测试。
- get_rss_by_ray_tracing.m:简化场景下(空旷房间)的射线跟踪。
- generate_radio_map.m:生成“RSS仿真环境数据集”。
- get_random_trace.m:生成一条随机轨迹。
- get_offline_data_random.m:模拟随机数据采集,生成位置指纹库。
- get_offline_data_uniform.m:模拟均匀数据采集,生成位置指纹库。
- get_online_data.m:模拟在线阶段,生成测试数据。
- radio_map_20_15.mat:生成的“RSS仿真环境数据集”,199914996的数组,比如fingerprint(1000, 1000, 2)代表的是仿真环境中位置(100,100)上接收到的第2个AP的RSS。
- offline_data_rss.mat:离线数据RSS,每行为一个RSS向量
- offline_data_location.mat:离线数据位置点,每行为一个位置点x,y
- online_data_trace.mat:生成测试数据的运动轨迹,10000*2的数组,比如trace(10, :)代表的是第10个时刻目标的位置x和y。
- online_data_rss.mat:生成测试数据中与运行轨迹对应的RSS,10000*6的数组,比如trace(10, :)代表的是第10个时刻时目标测得的各个RSS。
作者:rubbninja
出处:http://www.cnblogs.com/rubbninja/
关于作者:目前主要研究领域为机器学习与无线定位技术,欢迎讨论与指正!
版权声明:本文版权归作者和博客园共有,转载请注明出处。
来源:https://www.cnblogs.com/rubbninja/p/6118430.html