hello~这里是lbs智能定位,如果有项目需求和技术交流欢迎来私信我们~点击文章最下方可获取智慧医院解决方案!

低功耗蓝牙(BLE)是蓝牙定位的核心,基础原理是信号测量和位置计算,本文就医院蓝牙定位技术的核心,基于低功耗蓝牙(BLE)技术进行拆解和展开医院场景的应用。

一、智慧医院方案之蓝牙定位技术的核心拆解

1.信标广播

低耗能的蓝牙信标周期性广播唯一ID。

2.信号测量

通过RSSI或者AoA两种方式获取位置信息,两种方式区别如下:

(1)接收信号强度(RSSI):原理是利用信号衰减程度推算距离,距离越远,信号就越弱,精度一般是1-3米,部署简单、成本低,但容易受到干扰。

(2)到达角(AoA):原理是利用天线阵列测量信号到达不同天线的相位差计算角度,需要蓝牙5.1+协议的支持,精度10-30厘米,满足高精度定位需求,抗干扰能力强,但需部署天线阵列,成本高。

RSSI 距离推算 和 AoA 角度计算 的核心算法实现代码:
import math
import numpy as np
from typing import Tuple, Optional


class Positioning:
    def __init__(self):
        # -------------------------- RSSI 配置参数 --------------------------
        self.rssi_ref = -55  # 参考距离下的 RSSI 值(1米处实测,需根据硬件校准)
        self.d_ref = 1.0     # 参考距离(米)
        self.path_loss_exp = 2.4  # 路径损耗指数(自由空间2.2-2.4,室内3-4,需实测校准)
        self.rssi_variance = 3.0  # RSSI 测量方差(用于误差估计)
        
        # -------------------------- AoA 配置参数 --------------------------
        self.antenna_num = 4  # 天线阵列数量(均匀线性阵列,至少2个)
        self.antenna_spacing = 0.1  # 天线间距(米,建议为信号波长的1/2,蓝牙2.4G波长≈0.125米)
        self.signal_freq = 2.4e9  # 信号频率(蓝牙2.4GHz)
        self.wavelength = 3e8 / self.signal_freq  # 信号波长(米)

    # -------------------------- RSSI 距离计算 --------------------------
    def rssi_to_distance(self, rssi_measured: float) -> Tuple[float, float]:
        """
        基于对数距离路径损耗模型,通过 RSSI 计算距离
        :param rssi_measured: 实测 RSSI 值(dBm,负数)
        :return: (distance: 推算距离(米), distance_error: 距离误差估计(米))
        """
        if rssi_measured >= 0:
            raise ValueError("RSSI 值应为负数(dBm),请检查测量数据")
        
        # 对数距离公式:RSSI = RSSI_ref - 10*n*log10(d/d_ref) + 噪声
        # 反推距离:d = d_ref * 10^[(RSSI_ref - RSSI_measured)/(10*n)]
        distance = self.d_ref * (10 ** ((self.rssi_ref - rssi_measured) / (10 * self.path_loss_exp)))
        
        # 误差估计(基于 RSSI 测量方差推导)
        distance_error = distance * (math.log(10) / (10 * self.path_loss_exp)) * self.rssi_variance
        return round(distance, 3), round(distance_error, 3)

    # -------------------------- AoA 角度计算 --------------------------
    def aoa_to_angle(self, phase_diffs: list) -> Tuple[Optional[float], float]:
        """
        基于均匀线性天线阵列,通过相位差计算信号到达角(AoA)
        :param phase_diffs: 相邻天线间的相位差列表(单位:弧度,长度=antenna_num-1)
        :return: (aoa_angle: 到达角(度,范围[-90,90]), angle_error: 角度误差估计(度))
        """
        # 输入校验
        if len(phase_diffs) != self.antenna_num - 1:
            raise ValueError(f"相位差列表长度应为 {self.antenna_num-1}(天线数量-1)")
        
        # 相位差均值(减小噪声影响)
        avg_phase_diff = np.mean(phase_diffs)
        
        # AoA 核心公式:sin(θ) = (Δφ * λ) / (2π * d),θ为到达角(与阵列法线夹角)
        sin_theta = (avg_phase_diff * self.wavelength) / (2 * math.pi * self.antenna_spacing)
        
        # 钳位 sinθ 到 [-1,1](避免测量噪声导致的数值错误)
        sin_theta = max(min(sin_theta, 1.0), -1.0)
        
        # 计算角度(弧度转角度)
        aoa_rad = math.asin(sin_theta)
        aoa_angle = math.degrees(aoa_rad)
        
        # 角度误差估计(基于相位测量方差,假设相位误差为0.1弧度)
        phase_error = 0.1  # 经验值,需根据硬件调整
        angle_error = math.degrees((phase_error * self.wavelength) / (2 * math.pi * self.antenna_spacing * math.cos(aoa_rad + 1e-6)))
        angle_error = round(angle_error, 2)
        
        return round(aoa_angle, 2), angle_error

    # -------------------------- 多源融合定位(可选) --------------------------
    def fuse_rssi_aoa(self, rssi_list: list, aoa_list: list) -> Tuple[float, float]:
        """
        多基站 RSSI+AoA 融合定位(基于三角测量)
        :param rssi_list: 多个基站的 RSSI 推算距离列表(米)
        :param aoa_list: 多个基站的 AoA 角度列表(度)
        :return: (x: 目标x坐标(米), y: 目标y坐标(米))
        """
        if len(rssi_list) != len(aoa_list) or len(rssi_list) < 2:
            raise ValueError("至少需要2个基站的 RSSI 和 AoA 数据")
        
        # 简化版三角测量(假设基站坐标已知,这里以基站0为原点,基站1在x轴上)
        # 实际使用时需替换为真实基站坐标(x_i, y_i)
        base_stations = [
            (0.0, 0.0),    # 基站0:坐标(0,0)
            (5.0, 0.0),    # 基站1:坐标(5,0)(可扩展更多基站)
        ][:len(rssi_list)]
        
        # 构建超定方程组:(x - x_i)^2 + (y - y_i)^2 = d_i^2
        A = []
        b = []
        for i, (d, theta, (x_i, y_i)) in enumerate(zip(rssi_list, aoa_list, base_stations)):
            if i == 0:
                continue  # 以第一个基站为参考,消去常数项
            # 两式相减:(x-x_i)^2 - (x-x_0)^2 + (y-y_i)^2 - (y-y_0)^2 = d_i^2 - d_0^2
            A.append([2*(x_0 - x_i), 2*(y_0 - y_i)])
            b.append(d_i**2 - d_0**2 - x_0**2 + x_i**2 - y_0**2 + y_i**2)
        
        x_0, y_0 = base_stations[0]
        A = np.array(A)
        b = np.array(b)
        
        # 最小二乘求解
        x, y = np.linalg.lstsq(A, b, rcond=None)[0]
        return round(x, 3), round(y, 3)


# -------------------------- 测试用例 --------------------------
if __name__ == "__main__":
    positioning = Positioning()
    
    # 1. RSSI 距离计算测试(模拟室内环境,实测RSSI=-65dBm)
    print("="*50)
    rssi_meas = -65
    dist, dist_err = positioning.rssi_to_distance(rssi_meas)
    print(f"RSSI 定位结果:")
    print(f"实测 RSSI: {rssi_meas} dBm")
    print(f"推算距离: {dist} 米(误差±{dist_err}米)")
    print(f"精度范围: {dist-dist_err:.3f} - {dist+dist_err:.3f} 米")
    
    # 2. AoA 角度计算测试(模拟蓝牙5.1天线阵列,4个天线,相位差[0.8, 0.9, 0.7]弧度)
    print("\n" + "="*50)
    phase_diffs = [0.8, 0.9, 0.7]  # 相邻天线相位差(实测数据需从硬件获取)
    aoa_angle, aoa_err = positioning.aoa_to_angle(phase_diffs)
    print(f"AoA 定位结果:")
    print(f"相邻天线相位差: {phase_diffs} 弧度")
    print(f"到达角: {aoa_angle} 度(误差±{aoa_err}度)")
    print(f"精度范围: {aoa_angle-aoa_err:.2f} - {aoa_angle+aoa_err:.2f} 度")
    
    # 3. RSSI+AoA 融合定位测试(2个基站)
    print("\n" + "="*50)
    rssi_list = [dist, 3.2]  # 基站0和基站1的RSSI推算距离
    aoa_list = [aoa_angle, -15.2]  # 基站0和基站1的AoA角度
    x, y = positioning.fuse_rssi_aoa(rssi_list, aoa_list)
    print(f"RSSI+AoA 融合定位结果:")
    print(f"目标坐标 (x, y): ({x} 米, {y} 米)")

3.位置解算

通过三角定位、指纹匹配等定位算法,结合多个信标数据计算最终的坐标,以下列出三种定位算法:

(1)三角定位

至少需要3个非共线的信标,通过每个信标的RSSI值计算距离,以信标为圆心化圆,信号相交的点就是目标位置,引入卡尔曼滤波减少信号波动造成的影响可以优化定位的精度

(2)指纹匹配

提前采集每个区域内的信号特征并建立指纹库,将实时采集的信号与指纹库的进行对比来确定目标位置,精度可以到一米以内。

(3)AoA角度定位

 接收端部署天线阵列,测量信号到达不同天线的相位差,通过相位差与天线间距的几何关系计算入射角度,是多基站的交叉定位,能够实现亚米级的精度。

二、智慧医院方案之蓝牙定位技术的应用

1.可视化分析

综合态势界面可以直览人员、设备的数据,为决策提供真实支撑,如实时人员统计、区域统计、设备状态、当日报警统计等。

2.患者定位监护

实时显示病房区域内的患者位置和体征数据,可按时间点/段查询历史运动轨迹、停留地点和停留时长;支持自定义划分电子围栏的形状、规则,一旦违反相应的规则,后台立即触发报警,患者体征数据异常也会触发报警;遇到紧急情况时,可点击一键SOS求助,管理平台能够立即收到求助信息和患者的实际位置。

3.物资定位盘点

实时定位设备的所在位置,可以查询物资的总数、剩余数量,生成可视化数据报表,方便总结和汇报,支持一键搜索和查看历史活动轨迹;设备融合了loT传感器,电量不足会提前预警、温度湿度超标也会报警,预防性降低维护成本和宕机风险。

4.医护定位管理

安全实时监护,精准定位医护人员,支持视频联动,紧急情况下可快速调配最近的安保人员;巡更巡检人员在范围内签到能够记录准确的时间和地点,确保人员按照规划的路线进行巡检;人员可以利用电子签到打卡,一旦进入范围内,识别人员身份进行打卡签到,可以生成在岗率统计表。

BLE定位技术以低成本、低功耗、高兼容性的优势,成为医院数字化转型适用的关键技术,它已经实现多技术协同,与GPS等室外技术协同,可以进行室内外的无缝切换,构建强力的医疗物联网,成为医院运营者的得力助手。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐