蓝牙定位在室内场景的应用与实现

116 阅读6分钟

一、引言

室内定位场景的应用越来越广泛,如人员定位、资产管理、导航服务等。蓝牙定位作为一种成本低、精度相对较高的定位技术,成为了室内定位的理想选择。

二、三边测量法在蓝牙定位中的应用

三边测量法(Trilateration)是一种常用的定位算法,通过测量未知点到三个已知位置点的距离,来确定未知点的位置。数学模型如下:

1、已知三个蓝牙设备的位置

假设三个蓝牙设备的位置分别为 (x1,y1), (x2,y2), (x3,y3)。

2、测量距离

测量未知点 (x0,y0) 到这三个蓝牙设备的距离分别为 d1, d2, d3。

3、建立方程

建立以下方程组
(x1−x0)**2+(y1−y0)2=d12

(x2−x0)**2+(y2−y0)2=d22

(x3−x0)**2+(y3−y0)2=d32

4、求解方程

A1=−2(x2−x1),B1=−2(y2−y1),C1=(x22−x12)+(y22−y12)−(d22−d12)

A2=−2(x3−x2),B2=−2(y3−y2),C2=(x32−x22)+(y32−y22)−(d32−d22)

 

x0=(B1C2−B2C1)/(A1B2−A2B1)

y0=(A2C1−A1C2)/(A1B2−A2B1)

 

三、蓝牙设备位置与定位范围的关系

在实际应用中,蓝牙设备的位置和布局对定位范围和精度有重要影响。以下是一些关键点:

1、蓝牙设备位置的选择

a. 蓝牙设备应均匀分布在定位区域,以确保信号覆盖均匀,减少定位盲区。

b. 蓝牙设备应避免放置在金属或其他可能干扰信号的物体附近,以减少信号衰减和反射。

2、定位范围

a. 蓝牙设备的信号覆盖范围通常在10米至100米之间,具体范围取决于蓝牙设备的功率和环境因素。

b. 蓝牙设备的布局和数量直接影响定位精度。

四、计算距离

信号强度会随着距离的增加而衰减。通常使用对数距离路径损耗模型来计算距离:

d= Math.pow(10, (Math.abs(rssi) - A) / (10 * n));

其中:

d 是发射器和接收器之间的距离,单位是米(m)。

rssi是接收到的信号强度,通常是一个负值,单位是分贝毫瓦(dBm)。

A 是在参考距离(1米)上接收到的RSSI值的绝对值,单位是分贝毫瓦(dBm)。取1米处RSSI的信号强度绝对值。

n 是环境衰减因子,n的值需要根据硬件情况确定。

 

五、蓝牙设备信息获取与定位功能实现

1、蓝牙设备扫描

扫描蓝牙设备可以使用原生平台或微信平台,这里选用微信小程序。我们需要实现蓝牙设备的扫描功能,确保能够准确地发现蓝牙设备。

// 初始化蓝牙模块

wx.openBluetoothAdapter({

  success: function () {

    console.log('蓝牙模块初始化成功');

    // 开始搜索蓝牙设备

    wx.startBluetoothDevicesDiscovery({

      services: [], // 可以指定需要搜索的蓝牙设备的主服务的 UUID

      allowDuplicatesKey: true, // 允许重复上报同一个蓝牙设备,用于获取最新的RSSI值

      interval: 100, // 搜索蓝牙设备的间隔

      success: function () {

        console.log('开始搜索蓝牙设备成功');

        // 监听发现蓝牙设备的事件

        wx.onBluetoothDeviceFound(function (res) {

          let devices = res.devices;

          devices.forEach(v=>{

            // 搜索到的蓝牙设备很多,这里只保留预设好的蓝牙设备

            if(v.name&&v.name.indexOf('Aikaka')!==-1){

              let index = arlist.findIndex(val=>val.name===v.name);

              let {name,RSSI} = v;

              let item = {name,RSSI};

              const A = 70; // 1米处的RSSI值的绝对值

              const n = 1.56; // 环境衰减因子

              const distance = Math.pow(10, (Math.abs(RSSI) - A) / (10 * n));

              item.distance = distance;

              // 用来判断设备更新还是新增

              if(index>=0){

                arlist[index] = item;

              }else{

                arlist.push(item)

              }

            }

          });

          // demo中默认只有三个蓝牙设备,真实场景中可以筛选最强信号的三个点位来进行计算

          if(arlist.length===3){

            calculatePosition(arlist);

          }

        });

      },

      fail: function (res) {

        console.log('开始搜索蓝牙设备失败', res);

      }

    });

  },

  fail: function (res) {

    console.log('蓝牙模块初始化失败', res);

  }

});

 

 

2、RSSI 值的实时更新

为确保RSSI值能够及时更新,设置 allowDuplicatesKey: true,这样系统会不断上报最新RSSI值,确保设备列表中的RSSI值实时更新。

3、定位数据处理与算法实现

在连接到蓝牙设备并读取到定位数据后,我们需要对这些数据进行处理,以实现精准的定位。我们采用了三边测量法(Trilateration)来计算用户的位置。

// 三边测量法计算位置

function calculatePosition(beacons) {

  const { x: x1, y: y1, distance: r1 } = beacons[0];

  const { x: x2, y: y2, distance: r2 } = beacons[1];

  const { x: x3, y: y3, distance: r3 } = beacons[2];

  // 计算中间变量

  const A1 = -2 * (x2 - x1);

  const B1 = -2 * (y2 - y1);

  const C1 = (x2 ** 2 - x1 ** 2) + (y2 ** 2 - y1 ** 2) - (r2 ** 2 - r1 ** 2);

  const A2 = -2 * (x3 - x2);

  const B2 = -2 * (y3 - y2);

  const C2 = (x3 ** 2 - x2 ** 2) + (y3 ** 2 - y2 ** 2) - (r3 ** 2 - r2 ** 2);

  // 求解线性方程组

  const denominator = A1 * B2 - A2 * B1;

  if (denominator === 0) {

    console.error('无法求解,分母为零');

    return;

  }

  const x0 = (B1 * C2 - B2 * C1) / denominator;

  const y0 = (A2 * C1 - A1 * C2) / denominator;

  console.log('未知点:', x0, y0);

}

 

六、总结

在本文中,我们深入探讨了蓝牙定位技术在室内场景中的应用与实现,涵盖了从理论基础到实际操作的多个方面。通过详细阐述三边测量法的数学模型及其求解过程,展示了蓝牙定位技术的核心算法及其在实际应用中的有效性。我们分析了蓝牙设备的位置与布局对定位范围和精度的显著影响,强调了合理布局在提升系统性能中的关键作用。本文还介绍了如何通过RSSI值计算距离,并展示了在微信小程序中实现蓝牙设备扫描、RSSI值实时更新以及定位数据处理的具体方法。合理布局蓝牙设备、确保信号覆盖均匀且避免信号干扰,对于提高定位精度和范围至关重要。展望未来,进一步的研究可以探索提高定位精度和可靠性,以及将蓝牙定位技术与其他技术结合,实现更广泛的定位应用,从而为业务的智能化管理和服务提供更有力的支持。