基于jupyter notebook的python编程-----通过python编程实现RSSI测距定位技术仿真


对于物联网专业的学生,物联网定位这门课程是肯定需要学习的,对于定位技术,需要学习的有很多,例如:TOA、TDOA、RSSI测距、RSSI指纹定位技术等,本次博客,林君学长主要带大家了解RSSI测距定位技术,通过python代码来进行RSSI测距定位技术的仿真,一起来看吧!

一、RSSI测距定位简介

1、什么是RSSI测距定位

1)、Received Signal Strength Indication接收的信号强度指示,无线发送层的可选部分,用来判定链接质量,以及是否增大广播发送强度。
2)、通过接收到的信号强弱测定信号点与接收点的距离,进而根据相应数据进行定位计算的一种定位技术。如无线传感的ZigBee网络CC2431芯片的定位引擎就采用的这种技术、算法。接收机测量电路所得到的接收机输入的平均信号强度指示。这一测量值一般不包括天线增益或传输系统的损耗。

RSSI(Received Signal Strength Indicator)是接收信号的强度指示,它的实现是在反向通道基带接收滤波器之后进行的。
为了获取反向信号的特征,在RSSI的具体实现中做了如下处理:在104us内进行基带IQ功率积分得到RSSI的瞬时值;然后在约1秒内对8192个RSSI的瞬时值进行平均得到RSSI的平均值,即RSSI(平均)=sum(RSSI(瞬时))/8192,同时给出1秒内RSSI瞬时值的最大值和RSSI瞬时值大于某一门限时的比率(RSSI瞬时值大于某一门限的个数/8192)。由于
RSSI是通过在数字域进行功率积分而后反推到天线口得到的,反向通道信号传输特性的不一致会影响RSSI的精度。
在空载下看RSSI的平均值是判断干扰的最主要手段。对于新开局,用户很少,空载下的RSSI电平一般小于-105dBm。在业务存在的情况下,有多个业务时RSSI平均值一般不会超过-95dBm。从接收质量FER上也可以参考判断是否有干扰存在。通过以发现是否存在越区覆盖而造成干扰,也可以从
Ec/Io与手机接收功率来判断是否有干扰。对于外界干扰,通过频谱仪分析进一步查出是否存在干扰源。

2、RSSI测距定位优点

1)、定位精度:一般有相对精度和绝对精度。相对精度是指单位时间的标准偏差,定位偏差越小,定位精确度越高。绝对定位精度是指系统针对命令输入或理想输入的输出,更直观的说应该叫不确定度,即估计坐标与真实坐标的偏差。
2)、规模:不同的算法要求,就有不同的规模。可以是房间,超市,机场,整个楼房或者建筑物。定位的规模也包括,一个定位系统算法,可以同时定位多个目标。
3)、信标节点密度:在定位区域内,信标节点人工部署,信标节点的分布规律可以主观布置,但是其分布方式会受到节点传感网络的实际环境影响,另外节点的拓扑结构也会受到限制。一般,定位精度受到信标节点密度影响,其趋势是随着密度的增加,定位精度随之提高。但是也有门限,当节点密度到达某一门限值,精度便不会再提高。
4)、节点密度:一般用网络的平均连通度表示。也即是在通信距离范围内,所有节点接收到信标节点的数据信息的总和。需要注意的是一些定位方式会受到节点密度的影响。
5)、容错性和自适应性:容错性指在故障存在前提下,定位系统不失效,仍然维持系统正常工作的特性。定位的自适应是指在定位系统处理和分析数据信息时,数据本身根据其特征自动调节处理方法、顺序、参数、约束条件,使其与数据的特征相适应,达到效果的最优。

在定位技术中,定位系统和算法都是针对某一特定环境,实验平台比较理想。然而实际环境复杂,会导致节点失效,从而导致定位精度不高和误差较大。6)功耗:功耗是实现WSN设计系统的资源损耗,也是定位技术设计实现必须考虑的因素。但传感器节点电源功耗与定位系统算法的计算,传送数据,存储有关,也就成了影响其定位精度的关键指标。

3、RSSI测距定位技术与其他定位技术的比较

在这里插入图片描述

二、RSSI测距定位python代码仿真

1、RSSI测距定位技术原理

1)、利用已知发射信号强度和接收节点收到的信号强度,计算在传输过程的损耗,使用信号模型将损耗转化为待定位目标与已知节点之间的距离。
2)、RSSI测距定位技术原理示意图如下所示:
在这里插入图片描述

2、python代码仿真

1)、导入需要的python库

import numpy as np
from numpy import random
import matplotlib.pyplot as plt
  • numpy: 进行数学与矩阵的计算
  • random: 产生随机矩阵
  • matplotlib.pyplot: 绘制定位仿真的图像

2)、TOA-LLOP算法python设计
(1)、TOA-LLOP算法模型
在这里插入图片描述
(2)、TOA-LLOP算法原理:
在这里插入图片描述
(3)、TOA-LLOP算法python设计

def TOA_LLOP(A,p,j):
    A=np.array(A)
    m=A.shape[0]
    k=np.array([np.sum(A**2,1)]).T
    k1=np.delete(k,j,axis=0)
    A1=np.delete(A,j,axis=0)
    A2=A1-np.ones((m-1,1))*A[j,:]
    p1=np.delete(p,j,axis=0)
    p2=p[j]**2*np.ones([m-1,1])-p1**2-(k[j]*np.ones([m-1,1])-k1)
    theta=np.dot(np.dot(1/2*np.linalg.inv(np.dot(A2.T,A2)),A2.T),p2)
    theta=theta.T
    return theta

3)、计算在传输过程的损耗参数

def parameter_est(A,sigma):
    A=np.array(A)
    m=A.shape[0]
    pd0=0
    n=3
    d=np.zeros((m,m))
    tt=5
    sigma1=10**(sigma/10)
    h1=np.array([])
    G1=np.array([])
    prd=np.array([])
    for i in range(m):
        for j in range(m):
            if i!=j:
                d[i,j]=np.linalg.norm(A[i,:]-A[j,:])
                for k in range(tt):
                    t=pd0-10*n*np.log10(d[i,j])-sigma1*random.randn()
                    prd=np.insert(prd,len(prd),t)
                RSSI=np.mean(prd)
                prd=np.array([])
                d_distance=-10*np.log10(d[i,j])
                h1=np.hstack((h1,RSSI))
                G1=np.hstack((G1,d_distance))
    h=np.array([h1]).T
    m1=h.shape[0]
    G=np.hstack((np.ones((m1,1)),np.array([G1]).T))
    x=np.dot(np.dot(np.linalg.inv(np.dot(G.T,G)),G.T),h)
    pd0_est=x[0,0]
    n_est=x[1,0]
    return pd0_est, n_est

RSSI的测量值由对数路径损耗模型产生,为减小波动造成的误差,其值可由多次测量取平均值来得到

4)、定义测量位置,调用算法和损耗参数函数

BS1=[0,0]
BS2=[500,0]
BS3=[500,500]
BS4=[0,500]
MS=[100,100]
std_var=[0,2,4,6]
A=[BS1,BS2,BS3,BS4]
number=10000
pd0=0
n=3
tt=5
RMSE1=np.array([])
RMSE2=np.array([])
rssi=np.array([[],[],[],[]])
for j in range(len(std_var)):
    error1=0
    error2=0
    std_var1=std_var[j]
    for i in range(number):
        r1=A-np.ones((4,1))*MS
        r2=np.sqrt(np.array([np.sum(r1**2,axis=1)]).T)
        for k in range(tt):
            t=pd0-10*n*np.log10(r2)-(10**(std_var1/10))*random.random(size=(4,1))
            rssi=np.hstack((rssi,t))
        RSSI=np.array([np.mean(rssi,1)]).T
        rssi=np.array([[],[],[],[]])
        r1=10**((RSSI-pd0)/(-10*n))
        p_est,n_est=parameter_est(A,std_var1)
        r2= 10**((RSSI-p_est)/(-10*n_est))
        theta1=TOA_LLOP(A,r1,1)
        theta2=TOA_LLOP(A,r2,1)
        error1=error1+np.linalg.norm(MS-theta1)**2
        error2=error2+np.linalg.norm(MS-theta2)**2
    RMSE1=np.insert(RMSE1,j,(error1/number)**(1/2))
    RMSE2=np.insert(RMSE2,j,(error2/number)**(1/2))

定义基站位置等基础变量,实现RSSI测量定位技术仿真
5)、做出理想情况与实际情况下的RMSE曲线对比图

plt.plot(std_var,RMSE1,"-o",std_var,RMSE2,"-s")
plt.legend(["Ideal","Real"],loc='upper left')
plt.xlabel('The standard deviation of RSS measurement (db)')
plt.ylabel('RMSE')
plt.title('db-RMSE')
plt.show()

3、仿真结果

1)、仿真结果如下所示:
在这里插入图片描述
2)、上图为理想情况下(参考距离路径损耗和路径损耗因子已知)与实际情况下的RMSE曲线对比图,横坐标为噪声方差,纵坐标为RMSE。
3)、代码运行时间大约1分钟左右,因为需要进行矩阵的运算和很多次的循环,所以需要1分钟的时间来运行代码,所以小伙伴在进行python运行的时候,记得耐心等待一下,最后才会出现效果图,代码本身是一定没有问题的哈!

4、仿真结论

1)、RSSI的测量值由对数路径损耗模型产生,为减小波动造成的误差,其值可由多次测量取平均值来得到
2)、对数路径损耗模型中的参考距离路径损耗和路径损耗因子可通过参考点相互之间的测量值估计
3)、从上图我们可以得出结论,随着噪声方差增大,RMSE也随之增大,但在实际情况中,噪声方差越大,RMSE变化得越大,这说明RSSI测距定位性能是中等的,而且,我们可以看到,RMSE普遍在25以上,这说明RSSI测距的定位精度一般

三、RSSI测距定位技术源码

1、python仿真源码如下所示

import numpy as np
from numpy import random
import matplotlib.pyplot as plt
def parameter_est(A,sigma):
    A=np.array(A)
    m=A.shape[0]
    pd0=0
    n=3
    d=np.zeros((m,m))
    tt=5
    sigma1=10**(sigma/10)
    h1=np.array([])
    G1=np.array([])
    prd=np.array([])
    for i in range(m):
        for j in range(m):
            if i!=j:
                d[i,j]=np.linalg.norm(A[i,:]-A[j,:])
                for k in range(tt):
                    t=pd0-10*n*np.log10(d[i,j])-sigma1*random.randn()
                    prd=np.insert(prd,len(prd),t)
                RSSI=np.mean(prd)
                prd=np.array([])
                d_distance=-10*np.log10(d[i,j])
                h1=np.hstack((h1,RSSI))
                G1=np.hstack((G1,d_distance))
    h=np.array([h1]).T
    m1=h.shape[0]
    G=np.hstack((np.ones((m1,1)),np.array([G1]).T))
    x=np.dot(np.dot(np.linalg.inv(np.dot(G.T,G)),G.T),h)
    pd0_est=x[0,0]
    n_est=x[1,0]
    return pd0_est, n_est
def TOA_LLOP(A,p,j):
    A=np.array(A)
    m=A.shape[0]
    k=np.array([np.sum(A**2,1)]).T
    k1=np.delete(k,j,axis=0)
    A1=np.delete(A,j,axis=0)
    A2=A1-np.ones((m-1,1))*A[j,:]
    p1=np.delete(p,j,axis=0)
    p2=p[j]**2*np.ones([m-1,1])-p1**2-(k[j]*np.ones([m-1,1])-k1)
    theta=np.dot(np.dot(1/2*np.linalg.inv(np.dot(A2.T,A2)),A2.T),p2)
    theta=theta.T
    return theta
BS1=[0,0]
BS2=[500,0]
BS3=[500,500]
BS4=[0,500]
MS=[100,100]
std_var=[0,2,4,6]
A=[BS1,BS2,BS3,BS4]
number=10000
pd0=0
n=3
tt=5
RMSE1=np.array([])
RMSE2=np.array([])
rssi=np.array([[],[],[],[]])
for j in range(len(std_var)):
    error1=0
    error2=0
    std_var1=std_var[j]
    for i in range(number):
        r1=A-np.ones((4,1))*MS
        r2=np.sqrt(np.array([np.sum(r1**2,axis=1)]).T)
        for k in range(tt):
            t=pd0-10*n*np.log10(r2)-(10**(std_var1/10))*random.random(size=(4,1))
            rssi=np.hstack((rssi,t))
        RSSI=np.array([np.mean(rssi,1)]).T
        rssi=np.array([[],[],[],[]])
        r1=10**((RSSI-pd0)/(-10*n))
        p_est,n_est=parameter_est(A,std_var1)
        r2= 10**((RSSI-p_est)/(-10*n_est))
        theta1=TOA_LLOP(A,r1,1)
        theta2=TOA_LLOP(A,r2,1)
        error1=error1+np.linalg.norm(MS-theta1)**2
        error2=error2+np.linalg.norm(MS-theta2)**2
    RMSE1=np.insert(RMSE1,j,(error1/number)**(1/2))
    RMSE2=np.insert(RMSE2,j,(error2/number)**(1/2))
plt.plot(std_var,RMSE1,"-o",std_var,RMSE2,"-s")
plt.legend(["Ideal","Real"],loc='upper left')
plt.xlabel('The standard deviation of RSS measurement (db)')
plt.ylabel('RMSE')
plt.title('db-RMSE')
plt.show()

以上就是本次博客的全部内容啦,通过本次博客,大家可以更好的了解到RSSI测距定位的算法原理,RSSI的测量值由对数路径损耗模型产生,为减小波动造成的误差,其值可由多次测量取平均值来得到;同时,林君学长也希望大家能够深入的了解代码的具体意思,理解原理;代码有错误的地方记得给林君学长留言改正。
同时、遇到问题的小伙伴也记得评论区留言,林君学长看到会给大家回复解答的,这个学长不太冷!

陈一月的又一天编程岁月^ _ ^

猜你喜欢

转载自blog.csdn.net/qq_42451251/article/details/106576458