完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
本文基于此项现状,提出了RSS-距离-位置的指纹定位模型,用于训练的数据库不再是多个RSS的数据,而是经换算后的距离数据,在基站的功率发生变化时,仅需要以很少的样本测试得到RSS的距离衰减函数,则可以运用原有的模型进行指纹定位,进而确定位置信息。节省了模型的后期维护成本,同时提高模型的可移植性,即使更换了所有的发射基站,原有模型在经过简单的计算后依然可以直接使用。
理论介绍 指纹 位置指纹可以是多种类型的,任何“位置独特”的(对区分位置有帮助的)特征都能被用来做为一个位置指纹。 在某个恒定的发射功率下,信号的RSS取决于接收器的位置。RSS的获取很简单,因为它是大多数无线通信设备正常运行中所必需的。很多通信系统需要RSS信息用来感知链路的质量,实现切换,适应传输速率等功能。RSS不受信号带宽的影响,不要求通信方式占用大的带宽,因此RSS是一个很受欢迎的信号特征,并广泛应用于定位中。 KNN KNN(K-NearesNeighbor,即K邻近法)是一个理论上比较成熟的、也是最简单的机器学习算法之一。用老话就说:“人以群分,物以类聚”。一个样本与数据集中的k个样本最相似, 如果这k个样本中的大多数属于某一个类别, 则该样本也属于这个类别。也就是说,该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别,算法流程图如图: KNN方法在类别决策时,只与极少量的相邻样本有关。 对数损耗模型 依据信号强度定位,其实质是依据信号能量值随传播距离的增加而衰减的特性来反映出标签与阅读器之间实际的几何距离。因此,信号衰减规律的准确性,直接影响系统定位的准确性。入射信号在室内环境传播的过程中会由于室内障碍物等引起反射、绕射、折射和散射现象而形成多个路径传输,具有不同强度、相位和时延的信号在接收端会叠加形成的衰减的、相位不断变化的信号波形。因此信道衰落统计特性模型的研究主要是多径环境中的幅度衰落。 多径环境中的信号衰落幅度可服从不同分布,这依赖于测量时覆盖的面积,起主导作用的强信号存在与否等。其主要分布包括用于描述平坦衰落信号或独立多径分量接收包络统计时变特性的瑞利分布、描述存在一个主要的静态(非衰落) 信号分量时小尺度衰落包络分布的莱斯分布和对数正态分布7。 假设有一个固定的信号发射源,其平均RSS的衰减和距离的对数成正比,在最简单的情况下,RSSI可以表示为: 其中, α 称为路径损耗指数, P t 为发送功率, K 是一个取决于环境和信号频率的常数, d 为距离, n 为衰减因子,亦可称为相对距离,经实验, n 在拟合模型时可以使计算过程更加稳定,一般取2即可。RSSI可以被用来计算移动设备与AP之间的距离。 对数损耗模型是信号发射基站的参数,它受到环境、天气、电磁场干扰等影响,同时当发射源更换或功率变化时,原有的指纹模型即不再适用,损耗模型也应该重新构建8。 数据库建立 RSSI指纹采集 系统的使用分为两个阶段,离线的RSS指纹采集阶段和在线定位阶段。离线阶段,将网络搭建好之后,需要在定位环境中采集大量RP的RSS指纹并存储,RSS指纹地图建好之后才能进入实时定位阶段,指纹地图建立好之后在一段较长的时间内都能使用该地图。 建立指纹数据库是指纹定位方法实现的前提。确定性指纹匹配KNN算法,根据定位点测量的RSSI信号强度与指纹数据库中存储的指纹点 RSSI 信号强度进行匹配,考察定位点与指纹点的相似程度,以此来对定位点的位置进行估计。指纹数据库的建立,首先要按照一定的方法采集处理 RSSI 信号强度,形成指纹数据,然后将指纹数据存储在数据库中,待定位时使用。 坐标定位计算阶段是使用KNN算法和距离权重算法来查找要估算的目标节点的坐标值。首先,参考节点和目标节点之间的欧几里德距离使用最佳估计值计算 在信息楼105实验室 7.483 m × 3.75 m的环境中,放置3个路由器用于信号发送,将整个环境分割成如图所示的24个网格,在线条交叉点分别测试每个路由器的RSS数据,形成 横向 6 × 纵向 3 × 3 个路由器=54组数据,将其命名为fingerprint.采集装置使用wifi模块ESP8266,并使用STM32F103ZET6进行AT命令的发送和数据预处理。 数据由stm32接收后预处理,分拣出有用信息,实时显示在显示屏上,如图: 同时由串口传输至计算机后,在matlab上构建三维数据库,数据如下: fingerprint(:,:,1) = -39 ~ -52 ~ -44 ~ -56 ~ -52 ~ -63; -44 ~ -38 ~ -49 ~ -52 ~ -44 ~ -58; -38 ~ -35 ~ -36 ~ -49 ~ -50 ~ -51. fingerprint(:,:,2) = -44 ~ -43 ~ -39 ~ -37 ~ -44 ~ -38; -45 ~ -43 ~ -44 ~ -40 ~ -36 ~ -28; -69 ~ -60 ~ -40 ~ -41 ~ -36 ~ -33. fingerprint(:,:,3) = -51 ~ -51 ~ -51 ~ -40 ~ -41 ~ -22; -62 ~ -56 ~ -48 ~ -51 ~ -65 ~ -31; -67 ~ -61 ~ -50 ~ -61 ~ -54 ~ -43. 衰减模型建立 RSSI的数据经信号衰减模型换算后可得到近似的距离值。三个路由器分别采集多组RSSI与distance的对应数据。 对第一列数据拟合,得到如图所示的结果: 拟合过程在python里实现,设定模型为: ,其中,a和b为待定系数,由代码进行最小二乘法求其最优解,直至拟合函数与原有的数据最小均方误差最小,输出a与b的值。 部分程序如下(python): # edit by callmiaoup # data 2021.4.20 # modified 2021.7.17 import numpy as np import matplotlib.pyplot as plt from scipy import optimize def func(x, a, b): # 需要拟合的函数 return 2*100 ** ((x+a)/b) # 拟合点 RSSI = [9.5, 15, 15, 19.5, 18, 20, 23, 24.5, 21, 21, 18.5, 26.5, 29, 24.5, 24, 28 ,26, 25, 24.5, 27, 30.5, 30, 27.5, 29, 36.5, 27, 36, 35, 31.5, 40, 34.5, 36.5, 40] d = [1, 1.5, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 22, 24, 26, 28, 32, 34, 36, 40, 45, 50, 55, 60, 80] a4, b4 = optimize.curve_fit(func, d, RSSI, maxfev=500000)[0] x4 = np.arange(1, 40, 0.01) y4 = 2*100 ** ((x4-a4)/b4) plt.figure() plt.scatter(RSSI[:], d[:], 25, "b") plt.plot(x4, y4, "k-") plt.legend(['fit','DATA']) plt.xlabel('|RSSI| (dB)') plt.ylabel('distance (dm)') plt.show() 运用同样的方法可求得其他2个路由器的衰减模型。解得三个路由器的衰减模型表达式,如公式: 数据测试 在预设环境中实时定位时,matlab中已存入该环境的RSS指纹数据库,3个AP放置在固定位置,用户手持用户节点,用户节点周期性的发送数据,AP收到数据后将自身产生的的RSS信息传入matlab,计算数据后进行定位算法的执行并将定位结果展示出来。 静态功率 当各个路由器的信号发射功率不变时,即为静态功率下的定位,由matlab进行求解,实验数据来自真实的复杂的环境,求解结果如图所示: 图中圆圈代表所选测试集的真实位置,*号代表由KNN计算而来的位置,虚线连接了真实位置与计算位置,便于辨别对应的点。此方法求得的位置均方误差为0.8601,最大偏差距离为1.8028米。 动态功率 用更换第三台路由器的方法模拟路由器天线故障或更换设备的情况,继续沿用上述方法定位,则会造成误差明显变大,结果如图: 图中圆圈代表所选测试集的真实位置,*号代表由KNN计算而来的位置,虚线连接了真实位置与计算位置,便于辨别对应的点。此方法求得的位置均方误差为1.4598,最大偏差为2.8443米。 重新拟合各路由器信号衰减模型的数据,得下式的结果: 将原有的RSS-位置指纹的定位方法更改为RSS-距离-位置指纹的方法,在matlab源码中加入距离衰减模型公式: fingerprint_d=2.*power(10, (-fingerprint-17)/25); 即可批量将指数表示的信号强度批量转化为距离数组,从而由RSS指纹转变为距离指纹,修改原有算法思想,如图: 原有定位按照RSSI来作为指纹,虽然数据的采集较为方便,但是一旦有信号发射器故障,或者更换了部分发射器,整个指纹库(至少有一个维度)的所有指纹数据均需要修改,维护成本过高。但是如果将每个RSSI换算为距离,再根据距离指纹定位,可以减少人工更新指纹库的繁琐工作。 重新获取测试集中对应路由器3的RSS,用上述方法定位的结果如图: 图中圆圈代表所选测试集的真实位置,*号代表由KNN计算而来的位置,虚线连接了真实位置与计算位置,便于辨别对应的点。此方法求得的位置均方误差为1.1934,最大偏差为2米,两项指标均优于传统的指纹定位。 结论 本文分别实现了基于RSS位置指纹的室内定位系统,基于RSSI与距离的非线性拟合,以及基于距离位置指纹的定位系统。主要贡献为:针对位置指纹法在实际运用中可能存在的问题,引入RSS-距离-指纹模型,改进模型计算出的位置坐标更接近实际坐标,这使得定位精度更高。 实验结果表明,与传统的定位算法相比,该算法的定位精度显著提高9。 K邻近法分类经常被用于定位算法进行研究,但是很多人对此的研究仅仅止步于模拟与仿真,本文用实际采集的数据进行实验,用更真实的结果证明了算法的可行性。 源代码 拟合数据的代码: # edit by callmiaoup # data 2021.4.20 # modified 2021.7.17 import numpy as np import matplotlib.pyplot as plt from scipy import optimize def func(x, a, b): # 需要拟合的函数 return 2*100 ** ((x+a)/b) # 拟合点 RSSI = [9.5, 15, 15, 19.5, 18, 20, 23, 24.5, 21, 21, 18.5, 26.5, 29, 24.5, 24, 28 ,26, 25, 24.5, 27, 30.5, 30, 27.5, 29, 36.5, 27, 36, 35, 31.5, 40, 34.5, 36.5, 40] d = [1, 1.5, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 22, 24, 26, 28, 32, 34, 36, 40, 45, 50, 55, 60, 80] a4, b4 = optimize.curve_fit(func, d, RSSI, maxfev=500000)[0] x4 = np.arange(1, 40, 0.01) y4 = 2*100 ** ((x4-a4)/b4) plt.figure() plt.scatter(RSSI[:], d[:], 25, "b") plt.plot(x4, y4, "k-") plt.legend(['fit','DATA']) plt.xlabel('|RSSI| (dB)') plt.ylabel('distance (dm)') plt.show() |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1627 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1550 浏览 1 评论
984 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
688 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1601 浏览 2 评论
1867浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
650浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
518浏览 3评论
536浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
506浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 13:18 , Processed in 0.708171 second(s), Total 75, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号