该项目使用在ESP32上运行的TensorFlow Lite创建一个语音控制的机器人。它可以响应简单的单字命令:“左”,“右”,“前进”和“后退”。
硬件部件:
乐鑫ESP32S× 1个
伺服模块(通用)× 2
通用车轮× 2
Gerneric USB移动电源× 1个
I2S麦克风板× 1个
软件应用程序和在线服务:
PlatformIO IDE
我在Google的Commands数据集上使用TensorFlow训练了一个模型。其中包含大约20个单词,我选择了一个很小的单词子集-足以控制机器人的单词,但数量不多,以至于模型变得难以管理。
为了生成训练数据,我们将WAV文件加载到其中,并从每个文件中提取频谱图。
为了获得足够的数据用于命令词,我已经多次重复这些词,以改变音频的位置并添加随机噪声-这为我们的神经网络提供了更多训练数据,并应该有助于其推广。
几个单词-前进和后退的示例更少,因此我更经常重复这些示例。
我最后得到了一个相当简单的卷积神经网络,其中包含2个卷积层,然后是一个完全连接的层,然后是一个输出层。
当我们试图识别多个不同的单词时,我们使用“ softmax”激活函数,并使用“ CategoricalCrossentropy”作为我们的损失函数。
训练模型后,我得到的训练数据准确度不到92%,而验证数据的准确度则超过92%。测试数据集为我们提供了类似的性能水平。
查看混淆矩阵,我们可以看到它主要是将单词误分类为无效单词。这对于我们的用例来说是相当不错的,因为这应该意味着机器人会误判误报而不是误报。
由于模型似乎不适合,我已经在完整的数据集上对其进行了训练。这给了我们大约94%的最终精度,而在混淆矩阵上我们看到了更好的结果。但是,可能会有些过度拟合。
对于实际的机器人,我构建了一个非常简单的两轮机器人。为了驱动车轮,我使用了两个连续的伺服系统和小型动力单元。它具有相当宽的轴距,因为带有ESP32的面包板非常大。
为了在ESP32上运行TensorFlow模型,我使用了TensorFlow Lite。我将其包装在自己的代码中,使其更易于使用。
要读取音频,我们使用I2S-它可以从模拟麦克风的内置ADC读取,也可以直接从I2S数字麦克风读取。
命令检测器由一个任务运行,该任务等待音频样本可用,然后为命令检测器提供服务。
我们的命令检测器将音频数据后退一秒钟,获取频谱图,然后运行预测。
为了提高检测的鲁棒性,我们在多个音频片段上对预测进行了采样,并且还拒绝了在先前检测的一秒钟内发生的任何检测。
如果我们检测到命令,则将其排队等待命令处理器处理。
我们的命令处理器运行一个任务,该任务侦听此队列中的命令。
当命令到达时,它将更改发送到电动机的PWM信号,以停止电动机或设置所需的方向。
为了向前移动,我们将两个电机都向前驱动,对于向后,我们将两个电机都向后驱动。对于左,我们反转左电动机并向前驱动右电动机,而对于右,我们进行相反的,右电动机反向,左电动机向前。
对于我们的连续伺服器,1500us的占空比将使它们停止,低于此值应使它们反向,而高于此值将使它们向前驱动。
我略微调整了右马达正向值的值,因为它的旋转速度不如左马达快,这导致机器人转向一侧。
请注意,因为我们有正确的电机上下颠倒驱动它,所以我们将其反向运行,而将其向后驱动,则我们将其向前驱动。
您可能需要校准自己的电动机才能使机器人直线运动。
它运作良好!
它偶尔会混淆单词并左右混合。
责任编辑:pj
全部0条评论
快来发表一下你的评论吧 !