蓝牙RSSI测距算法及参数标定

RSSI(Received Signal Strength Indication)

测距算法公式:
d = 1 0 a b s ( R S S I ) − A 10 × n d=10^{\frac{abs(RSSI) - A}{10 \times n}} d=1010×nabs(RSSI)A

符号 说明
d 计算所得距离(单位:m)
RSSI 接收信号强度(单位:dB)
A 发射端和接收端相隔1米时的信号强度
n 环境衰减因子

测距实践:
1.标定A值和n值:多组值可以同时标定A和n值
2.实时获取RSSI值,求出瞬时距离
3.各种滤波算法(平均时间/平均距离/加权等)

蓝牙硬件:传感器漂移/单天线/多天线方案
环境因素:空旷场地/地下停车场/信号遮蔽阻挡反射
连接因素:不同品牌的手机(需要适配不同类型)
三维空间:多角度/多高度/多朝向

应用场景:
1.智能门禁
2.蓝牙钥匙
3.室内定位
4.智能防丢

标定方案:
1.测试幕布及支架/不同品牌的手机
2.多方位多角度多高度采集数据
3.根据采集的数据计算A值和n值
4.标定算法确定A值和n值

采集两组不同的d值与RSSI值,分别为(d1, RSSI1), (d2, RSSI2):
根据距离与信号强度计算n值公式:
n = a b s ( R S S I 1 ) − a b s ( R S S I 2 ) 10 × ( lg ⁡ d 1 − lg ⁡ d 2 ) n = \frac{abs(RSSI1)-abs(RSSI2)}{10 \times (\lg d1 - \lg d2)} n=10×(lgd1lgd2)abs(RSSI1)abs(RSSI2)
根据距离与信号强度计算A值公式:
A = lg ⁡ d 1 × a b s ( R S S I 2 ) − lg ⁡ d 2 × a b s ( R S S I 1 ) lg ⁡ d 1 − lg ⁡ d 2 A = \frac{\lg d1 \times abs(RSSI2) - \lg d2 \times abs(RSSI1)}{\lg d1 - \lg d2} A=lgd1lgd2lgd1×abs(RSSI2)lgd2×abs(RSSI1)

当n值确定后计算A值公式:
A = a b s ( R S S I ) − 10 × n × lg ⁡ d A = abs(RSSI) - 10 \times n \times \lg d A=abs(RSSI)10×n×lgd

因n值及d值均确定,实际A值只与RSSI值相关

Python

import math

def rssi_cal_d(RSSI, A, n):
    return pow(10, float((abs(RSSI) - A) / (10 * n)))

def rssi_cal_A(d1, RSSI1, d2, RSSI2):
    return (math.log10(d1) * abs(RSSI2) - math.log10(d2) * abs(RSSI1)) / (math.log10(d1) - math.log10(d2))

def rssi_cal_n(d1, RSSI1, d2, RSSI2):
    return (abs(RSSI1) - abs(RSSI2)) / (10 * (math.log10(d1) - math.log10(d2)))

t_d1 = 1
t_d2 = 2
t_rssi1 = 1
t_rssi2 = 2

print(rssi_cal_A(t_d1, t_rssi1, t_d2, t_rssi2))
print(rssi_cal_n(t_d1, t_rssi1, t_d2, t_rssi2))

参考:微信小程序iBeacon测距及稳定程序的实现

你可能感兴趣的:(Python)