多点定位算法

在室内定位中,部署蓝牙信标,在终端接收到蓝牙信标的广播信号,计算RSSI值,推算出各信标到终端的距离,由此实现定位。

RSSI距离转换

  • d:距离
  • A:RSSI在1m时候的初始值
  • RSSI:rssi值
  • n:环境衰减因子,需要实际环境拟合计算得出
    计算公式如下:
    d = 10^{(A-RSSI)/(10*n)}
# 蓝牙距离算法
A = -59 # RSSI at 1m
n = 3.3  # 环境衰减因子,需要实际环境拟合计算得出
RSSI = input('请输入RSSI值:')
d = 10 ** ((A-int(RSSI))  / (10 * n))
print('距离为:%s'%d)

多点定位

因为距离为估算,以蓝牙信标做圆,未必能相交于一点。如下图:
desmos作图
可以通过正规方程求解最优解,以下是代码。

import numpy as np

# 多个点(x,y,d)
a = (4,3,5**(1/2))
b = (4,0,3**(1/2))
c = (3,3,2)
d = (1,1,2)
all_point = [a,c,b,d]

X_list = []
y_list = []
for i in all_point[1:]:
    # x
    X_list.append([all_point[0][0]-i[0],all_point[0][1]-i[1]])
    # y
    yi=[(i[2]**2-all_point[0][2]**2+all_point[0][0]**2+all_point[0][1]**2-i[0]**2-i[1]**2)/2,]
    y_list.append(yi)

X = np.array(X_list)
y = np.array(y_list)

# 正规方程法,其中X和y是array格式
def Normal_Equation(X,y):
    Xt = np.transpose(X)
    XtX = np.dot(Xt,X)
    Xty = np.dot(Xt,y)
    beta = np.linalg.solve(XtX,Xty)
    return beta

beta = Normal_Equation(X,y)
beta

print((beta[0][0],beta[1][0]))

输出为:

(2.904255319148936, 1.1595744680851063)

可见计算结果很符合需求
desmos绘图-加入计算结果

文章作者: PercyC
本文链接:
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 percy家园
算法 算法
喜欢就支持一下吧