TinyML在机器人中的应用——创建语音控制机器人子系统

时间: 2024-05-24 01:16:31 |   作者: 研发创新

  nyML领域基础概念的坚实理解,我们将把我们的知识应用到真实的生活中的项目中。

  在深入研究这一个项目之前,我想说明一下,这一个项目将使用现有的数据集,Google Colabs和由Pete Warden和哈佛大学TinyML团队开发的Arduino代码。为了在我们的微控制器单元(MCU)上部署,他们的资源将为我们提供:

  在这个项目中,我们将构建一个简单的机器人子系统,使用机器学习来响应语音命令。微控制器将收集来自麦克风的输入,使用ML来监听唤醒词,如“向前”和“向后”,然后在命令的方向上驱动一个小型直流电机。

  由于已经有很多关于用微控制器控制电机的好信息,本文将大多分布在在演示如何:

  在Arduino上运行本地推理,并让它控制由标准电池电源(AA或9 V)供电的电机

  在这一个项目中,你将有很大的自由选择其他类似的部分来复制这个项目。;

  在此之后,我们应该安装此项目所需的库。要执行此操作,请转到工具→管理库。从那里,搜索并下载以下库:

  一般来说,ML工作流将从收集和标记数据集开始开始,然后从头开始设计模型架构。为了时间和简单起见,我们将通过利用一些现成的数据集和预先训练的关键字识别模型来“作弊”,这两个模型都是由Pete Warden开发的。为了利用这些资源并训练我们的模型,我们将使用哈佛大学TinyML团队开发的Google Colab中的脚本。;

  首先,确保您在Colab中使用图形处理单元(GPU)运行时(如图3所示),因为这将显著加快训练时间。一旦你这样做了,所有的代码都可以按原样使用了。;只需点击每个单元格左上角的黑色运行按钮,按顺序运行每个单元格。& ;

  我们使用的模型架构是tiny_conv,我们将总共训练15,000步。前12,000个将使用0.001的学习率,最后3,000个将使用0.0001的学习率。此外,我们还将训练模型来理解“forwards”和“backwards”这两个词,Warden的关键字定位(KWS)数据集已经包含了这两个词。这可以在图4中看到。

  .这是Colab中的一部分,我们在这里定义要训练的单词、训练参数和模型架构

  请记住,培训可能需要几个小时才能完成,因此请确保您的计算机已插入电源,并且您的互联网连接稳定。

  训练完成后,您将到达Colab中标记为步骤2的点。这里是量化开始的地方。

  首先,我们冻结我们的模型,这是将所有相关的训练结果(图,权重等)组合到一个文件中进行推理的过程。一旦我们有了一个冻结的模型,我们将把模型转换成一个TFLite模型。哈佛建立的脚本使这样的一个过程相对容易,输出的TFLite模型应该是完全量化的。最终的模型大小应该在20 kB以下。

  当完全转换后,Colab有脚本可用于比较量化和非量化模型之间的准确性。如果一切正常,准确度应该几乎相同。

  您可能会有点不知所措,因为这段代码中有很多内容;但是,出于本项目的目的,我们不要关注其中的大部分内容。

  如图7所示,在文件的顶部,我们将添加几个#define语句来定义Arduino上的哪些引脚将连接到电机驱动器上的哪些引脚。对我们的项目,我们将使用D2作为ENABLE信号,D3作为Driver1A输入,D4作为Driver2A输入。请确保还将这些引脚设置为RespondToCommand()函数中的pinMode()函数的输出。

  从那里我们大家可以定义我们的运动控制功能。这个函数接受一个速度(我们不会为了这一个项目的目的而改变它),以及一个Driver1A和Driver2A的逻辑值。基本上,如果驱动程序1A是高,驱动程序2A是低,电机将在一个方向旋转。如果反过来,我们的马达就会朝相反的方向旋转。

  现在剩下的唯一事情就是更改代码中已经存在的命令响应。如图8所示,我们将更改命令响应,以便如果找到的命令的第一个字符是f(即找到的命令是Forward),它将使电机向前旋转。我们对后退命令执行相同的操作。

  有了所有的软件的方式,我们现在可以建立我们的电机驱动器电路。上面列出了BOM,示意图如下图9所示。

  我们使用4.5到21 V的电压源为Arduino和L293D供电。接线A输入端,D2连接到EN 1,2。我们在每个信号上都有一个1 k Ω下拉电阻,以确保始终定义我们的状态,为了安全起见,我们还有一个0.1 μ F电容用于去耦。