通过BLE信标,ESP32和机器学习将猫本地化

2021-02-06 19:58:13

tl; dr /摘要。该系统可用于使用附着在物体上的蓝牙低功耗(BLE)信标,一组廉价的ESP32探测器和机器学习模型来对猫在建筑物中的位置进行定位。

这是用于创建内部猫定位器的管道的概述。实际上,它可以应用于任何动物(包括人类)或物体以及任何建筑物。该系统的工作原理如下:

BLE信号由位于此处和此处的ESP32检测到;他们正在测量BLE信标的信号强度。

python程序正在从所有ESP32检测器获取最近的测量值(即信号强度值)

here这里的挑战是使用许多探测器,这些探测器的数量远远少于房间的数量,而让ML来完成其余的工作。

is这不是现成的程序集。由于每种情况都不同(即硬件设置,房屋大小,房间数量等),请将此仓库视为构建和自定义系统的框架。

要跟踪的移动对象。一只猫。狗也可以。小心鱼。可以不止一个。我用两只猫。 💰〜0 $

BLE发射器。 BLE信标。一切都会好。我使用了NotiOne按钮,它们运作良好并且具有其他功能(此处未使用)。但是更便宜的东西也可以。 💰n x 10-20 $

BLE检测器。我用了四个ESP32。我猜中等房屋/公寓的4-6应该足够了。可以将现代树莓派与BLE结合使用。 💰n x 4 $

数据处理。服务器/计算机。我使用过amd64 Debian,但任何Raspberry Pi都应该不错。可以是远程的。可以在微控制器中完成(请参阅:更多说明)

我为检测器提供了一个简单的C / Arduino代码。当然,它可以做得更多(我的ESP还可以测量温度,湿度和其他参数):

许多事情可以调整和优化(例如,MAC地址数组而不是单个变量,从服务器读取MAC地址等)。

具有BLE功能的Raspberry Pi可以包含在检测器组中。这里的命令是:

我们需要一台带有数据库的服务器。我使用influx,但是任何都会好用的(MySQL甚至文本文件!)

请记住,必须在相同的环境(相同的scikit和numpy版本!)中再次使用经过训练的ML模型。这可以通过使用专用的cond环境来保证

可以在任何计算机(例如笔记本电脑)上进行ML模型的训练,并将下一模型转移到主服务器。记住要保持相同的模块版本(使用conda环境)。请参阅下一节模型训练。

训练好模型并准备就绪时(请参阅下一节),我们使用python程序来获取最后的BLE信号强度数据,并基于此来预测猫的定位。请参阅检测部分以获取更多信息和代码示例。

在这里,我们收集用于训练ML算法的数据。这意味着我们必须从所有带有信标定位的传感器中收集信号强度数据。也就是说,假设我们有四个ESP32传感器,我们需要创建一个像这样的表:

其中每行(度量)表示同时从给定位置的信标读取的RSSI值。请参阅jupyter笔记本进行数据预处理。

每个房间的数据点的数量(即BLE信标的不同位置)是可变的,并取决于房间的大小。就我而言,就像这里:

记住要为您的猫准备可用的空间,不仅是花朵,还包括桌子,衣柜或枝形吊灯等;-)

现在,我们将探讨几种预处理算法以及几种机器学习方法。我们不知道哪种情况最适合我们,因此我们将在交叉验证实验中对它们全部进行探查。

最终的模型将使用75%的数据集(训练)构建,而25%的模型将作为测试数据集。

我们可以看到,在本例中,带有Min-Max Scaler的MLP分类器可提供最佳结果。

nswer不是。此处的最佳精度与初始设置(0.83)相同,因此我们将使用带有Min-Max Scaler的MLP分类器。

使用带有最小-最大缩放器的MLP分类器构建的最终模型可提供等于0.88的平衡精度。挺好!如果我们看混淆矩阵:

我们将看到(信不信由你)所有未贴标签的预测都是针对彼此靠近的位置(例如,room_m在办公室附近的空间等)中。因此,这很合理。

为了进行检测,您可以使用jupyter Notebook第6节中的代码段或简单程序的代码。该程序使用numpy数组作为数据源,但是可以从文件中读取或从数据库中获取它。

收集用于训练ML的数据。我每隔1分钟收集一次数据。这给了我时间来更改信标在房间中的位置。测量值自动存储在数据库中(入库)。我记下了在给定房间中收集数据的时间跨度,然后在该时间段内从db中获取数据,分配了房间标签,并保存在csv文件中。

要收集平坦表面(地板)的数据,可以使用诸如Roomba之类的设备,该设备顶部装有信标。工作正常!

优化ESP32检测器的位置,以覆盖整个空间并为每个房间提供独特的信号模式

(?)考虑BLE信标的电池电量,因为这可能会影响发射功率。我不确定。

在收集对象的定位数据一段时间后,我们可以创建另一个ML模型来及时预测对象的定位(即,如果是星期一早上,则猫在冰箱附近;如果是星期六下午,则猫是睡在浴室等)。这可能涉及其他变量,例如室温,湿度等。

使用以下(cool!)项目将预测步骤移至(另一个)微控制器(ESP32,ESP8266):https://github.com/eloquentarduino/micromlgen(无需具有专用的预测服务器)