Android Kontakt信标:确定信标距离时结果不一致且不可靠

Android Kontakt信标:确定信标距离时结果不一致且不可靠,android,bluetooth,bluetooth-lowenergy,ibeacon,android-bluetooth,Android,Bluetooth,Bluetooth Lowenergy,Ibeacon,Android Bluetooth,使用Kontakt SDK,我实现了一个简单的应用程序来监视和测量我所在地区的Kontakt信标。我注意到,所报告的检测到的信标的距离波动很大(例如,信标的实际距离为10米,但返回的距离为2米,并且可能在距离上跳得非常明显),即使信标不太远。我已经阅读了文档,在信标硬件端(tx功率/频率)、SDK端(扫描模式和相关)使用了所有不同的变量,并尝试了多种设备——我似乎没有做任何事情来提高准确性。我只是想知道是否有人能为我指出问题的正确方向 我确实知道,信标信号可能会因环境和接收设备本身硬件的许多因素

使用Kontakt SDK,我实现了一个简单的应用程序来监视和测量我所在地区的Kontakt信标。我注意到,所报告的检测到的信标的距离波动很大(例如,信标的实际距离为10米,但返回的距离为2米,并且可能在距离上跳得非常明显),即使信标不太远。我已经阅读了文档,在信标硬件端(tx功率/频率)、SDK端(扫描模式和相关)使用了所有不同的变量,并尝试了多种设备——我似乎没有做任何事情来提高准确性。我只是想知道是否有人能为我指出问题的正确方向

我确实知道,信标信号可能会因环境和接收设备本身硬件的许多因素而发生显著变化;但是,当似乎没有办法获得一致的距离信息时,我不知道如何才能创建基于准确接近信标的用户体验

任何类型的指导、意见或建议都将不胜感激。谢谢。

一些提示:

  • 正确设定您的期望值。使用信标的距离估计仅为估计值。它们极易受到反射、障碍物、无线电噪音和不同型号手机上不同的接收器天线的影响。后者是Android设备上的一个特殊问题

  • 设置尽可能高的传输功率以最大化信噪比

  • 校准新发射机功率电平的信标

  • 设置尽可能高的广告频率(最好为10 Hz或更高),以提供尽可能多的RSSI统计样本。这使得距离估计变化较小

  • 确保您的信标未处于可连接模式。当可连接时,一些Android设备每扫描周期只能读取一个样本,通常为每秒一次

  • 尝试一个现成的扫描仪应用程序,看看它是否能提供更好的估计。如果确实如此,您可以尝试使用它所基于的开放源代码


在做了所有这些事情之后,你仍然会看到变化和不准确,但你会最大限度地获得可能的结果。当几个信标可见时,距离估计对于确定哪个信标最近最有用。它们在测量绝对距离时不太有用。

除了davidgyoung已经说过的以外: BLE目前不是一种很有前途的测量距离的方法。即使仅仅通过跳频,使用原始数据时,计算的距离也会跳到实际距离的2-3倍左右。请参见我的问答:

这取决于您的要求:您是否希望用户在不移动或旋转设备的情况下静止一分钟?用户还能避免任何移动障碍物、附近的Wi-Fi源或其他干扰吗?设备温度也起作用。然后,通过取中值或平均值,可以得到相当稳定的值。另一个好的选择是卡尔曼滤波器。通过使用对数法线阴影模型,可以计算距离:

d=d0*10^((RSSI0-RSSI)/10n) 
距离d以米为单位,n在自由空间中为2,在实际条件下大于2。必须针对每个环境对其进行校准。RSSI0是在距离d0处测得的RSSI值


但是,如果用户应该移动,请忘记距离。这至少是我在花了几周时间讨论这个话题后得出的结论。

如果你在安卓系统中实现,你会面临这种严重的波动问题,因为安卓系统中没有降噪算法。但同样的,你可以在IOS中检查,结果要好得多,因为IOS支持降噪算法。现在,根据从信标接收到的RSSI/距离值,您可以做3件事-

a) 自己为应用程序实现降噪算法。(我认为这是一个艰难的过程。)

b) 对接收到的值实施高斯滤波器。我的意思是将从信标接收到的所有RSSI/距离值存储在arraylist中,每10个值按升序排序,排除3个最小值和3个最大值,其余4个值计算平均值,平均值为最终值。(这是一个容易解决且可靠的解决方案。)

c) 对接收到的值实施卡尔曼滤波。这是迄今为止最好的可用过滤器。然而,这是非常困难的实现比高斯滤波器,但从这个滤波器的结果是最好的

您可以从上面选择任何解决方案:)