Skip to main content

SEEED XIAO RP2040 上的 TinyML(动作识别)

在本教程中,我们将向您展示如何利用 Seeed Studio XIAO RP2040 上的加速度计结合 Edge Impulse 来实现动作识别。我们在这里提供的代码由最新版本的 XIAO RP2040 开发板支持。

所需材料

硬件

在本教程中,我们需要准备以下材料:

pir

硬件设置

pir

软件

所需的库列在下面。强烈建议使用这里的代码来检查硬件是否正常工作。如果您在安装库时遇到问题,请参考这里

开始使用

首先,我们将运行一些演示来检查开发板和显示屏是否正常工作。如果您的设备正常,您可以继续下一步说明。

检查电路连接和加速度计

打开 Arduino IDE,导航到 Sketch -> Include Library -> Manage Libraries... 并在库管理器中搜索并安装 U8g2 library

pir

安装完成后,复制以下代码并运行它。

#include <Wire.h>
#include "MMA7660.h"
MMA7660 accelemeter;
#define CONVERT_G_TO_MS2 9.80665f

void setup() {
Serial.begin(115200);
while (!Serial);
accelemeter.init();
}


void loop() {

float ax, ay, az;
accelemeter.getAcceleration(&ax, &ay, &az);

Serial.print(ax * CONVERT_G_TO_MS2,4);
Serial.print('\t');
Serial.print(ay * CONVERT_G_TO_MS2,4);
Serial.print('\t');
Serial.println(az * CONVERT_G_TO_MS2,4);

}

上传代码并拔掉 Seeed Studio XIAO RP2040 后。 然后,打开串口监视器,你将看到如下输出:

pir

如果一切正常,我们可以继续并将 Seeed Studio XIAO RP2040 连接到 Edge Impulse。

连接到 Edge Impulse

训练模型的精度对最终结果非常重要。如果你的输出训练结果低至 65% 以下,我们强烈建议你进行更多次训练或添加更多数据。

pir

  • 步骤 2. 选择"Accelerometer data"并点击"Let's get started!"

pir

pir

  • 步骤 3. 在你的计算机中安装 Edge Impulse CLI

  • 步骤 4. 在你的 terminalcmdpowershell 中运行命令来启动它。

sudo edge-impulse-data-forwarder
  • 步骤 5. 我们需要使用 CLI 将 Seeed Studio XIAO RP2040 连接到 Edge Impulse。首先,登录您的账户并选择您的项目

为加速度计和设备命名。

返回到 Edge Impulse "数据采集" 页面,如果连接成功,结果应该是这样的。您可以在页面右侧找到显示的 "XIAO RP2040" 设备。

pir

  • 步骤 6. 选择传感器为 "3 axes"。将您的标签命名为 updown,将采样长度(毫秒)修改为 20000,然后点击开始采样。

pir

pir

  • 步骤 8. 通过点击原始数据右上角并选择 "Split Sample" 来分割数据。点击 +Add Segment,然后点击图表。重复此操作超过 20 次以添加片段。点击 Split,您将看到每个样本数据为 1 秒。

pir

  • 步骤 9. 重复步骤 7.步骤 8.,用不同的名称标记数据以点击不同的运动数据,如 circleline 等。提供的示例是分类上下、左右和圆圈。您可以根据需要在此处更改。
note

在步骤 8 中,分割时间为 1 秒,这意味着您在步骤 7 中至少要在一秒内完成一次上下摆动。否则,结果将不准确。同时,您可以根据自己的运动速度调整分割时间。

  • 步骤 10. 创建脉冲

点击 Create impulse -> Add a processing block -> 选择 Spectral Analysis -> Add a learning block -> 选择 Classification (Keras) -> Save Impulse

pir

  • 步骤 11. 频谱特征

点击并设置

点击 Spectral features -> 下拉页面点击 Save parameters -> 点击 Generate features

输出页面应该是这样的:

pir

pir

  • 步骤 12. 训练您的模型

点击 NN Classifier -> 点击 Start training -> 选择 Unoptimized (float32)

pir

  • 步骤 13. 模型测试

点击 Model testing -> 点击 Classify all

如果您的准确率较低,您可以通过增加训练集和延长采样时间来检查您的数据集

我们在下载模型时也能够获得评估结果

pir

  • 步骤 14. 构建 Arduino 库

点击 Deployment -> 点击 Arduino Library -> 点击 Build -> 下载 .ZIP 文件

pir

  • 步骤 15. .ZIP 文件的名称非常重要,默认情况下它设置为您的 Edge Impulse 项目名称。这里项目名称是 "RP2040"。选择文件为 "将 ".ZIP 文件" 添加到您的 Arduino 库中

pir

  • 步骤 16. 打开 Arduino -> 点击 Sketch -> 点击 Include Library -> ADD .ZIP Library

复制下面的代码,如果 edgeimpluse 上的项目名称是自定义的,那么 zip 存档文本将是相同的名称。您可以将 include 的第一行更改为您的头文件。

#include <XIAO_RP2040_inferencing.h> // 自定义名称需要将此头文件更改为您自己的文件名
#include <Wire.h>
#include "MMA7660.h"
MMA7660 accelemeter;

#define CONVERT_G_TO_MS2 9.80665f
#define MAX_ACCEPTED_RANGE 2.0f

static bool debug_nn = false;

void setup()
{
Serial.begin(115200);
while (!Serial);
Serial.println("Edge Impulse 推理演示");
accelemeter.init();
}

float ei_get_sign(float number) {
return (number >= 0.0) ? 1.0 : -1.0;
}

void loop()
{
ei_printf("\n2秒后开始推理...\n");

delay(2000);

ei_printf("采样中...\n");

// 在此为我们将从IMU读取的值分配缓冲区
float buffer[EI_CLASSIFIER_DSP_INPUT_FRAME_SIZE] = { 0 };

for (size_t ix = 0; ix < EI_CLASSIFIER_DSP_INPUT_FRAME_SIZE; ix += 3) {
// 确定下一个时钟周期(然后稍后休眠)
uint64_t next_tick = micros() + (EI_CLASSIFIER_INTERVAL_MS * 1000);
accelemeter.getAcceleration(&buffer[ix], &buffer[ix + 1], &buffer[ix + 2]);

for (int i = 0; i < 3; i++) {
if (fabs(buffer[ix + i]) > MAX_ACCEPTED_RANGE) {
buffer[ix + i] = ei_get_sign(buffer[ix + i]) * MAX_ACCEPTED_RANGE;
}
}

buffer[ix + 0] *= CONVERT_G_TO_MS2;
buffer[ix + 1] *= CONVERT_G_TO_MS2;
buffer[ix + 2] *= CONVERT_G_TO_MS2;

delayMicroseconds(next_tick - micros());
}

// 将原始缓冲区转换为我们可以分类的信号
signal_t signal;
int err = numpy::signal_from_buffer(buffer, EI_CLASSIFIER_DSP_INPUT_FRAME_SIZE, &signal);
if (err != 0) {
ei_printf("从缓冲区创建信号失败 (%d)\n", err);
return;
}

// 运行分类器
ei_impulse_result_t result = { 0 };

err = run_classifier(&signal, &result, debug_nn);
if (err != EI_IMPULSE_OK) {
ei_printf("错误:运行分类器失败 (%d)\n", err);
return;
}

// 打印预测结果
ei_printf("预测结果 ");
ei_printf("(DSP: %d ms., 分类: %d ms., 异常: %d ms.)",
result.timing.dsp, result.timing.classification, result.timing.anomaly);
ei_printf(": \n");
for (size_t ix = 0; ix < EI_CLASSIFIER_LABEL_COUNT; ix++) {
ei_printf(" %s: %.5f\n", result.classification[ix].label, result.classification[ix].value);
}
#if EI_CLASSIFIER_HAS_ANOMALY == 1
ei_printf(" 异常分数: %.3f\n", result.anomaly);
#endif

}

pir

  • 步骤 17. 移动或握住 Seeed Studio XIAO RP2040 并检查结果:

点击 Arduino 右上角的监视器。

当您将 Seeed Studio XIAO RP2040 按圆圈和直线方向移动时:

监视器将输出类似以下内容:

15:45:45.434 -> 
15:45:45.434 -> Starting inferencing in 2 seconds...
15:45:47.414 -> Sampling...
15:45:48.439 -> Predictions (DSP: 6 ms., Classification: 1 ms., Anomaly: 0 ms.):
15:45:48.439 -> Circle: 0.59766
15:45:48.439 -> line: 0.40234
15:45:48.439 ->

恭喜!您已经完成了项目的最后部分。建议您可以尝试更多方向并检查哪一个会产生最佳输出。

资源

技术支持与产品讨论

感谢您选择我们的产品!我们在这里为您提供不同的支持,以确保您使用我们产品的体验尽可能顺畅。我们提供多种沟通渠道,以满足不同的偏好和需求。

Loading Comments...