該項目使用在ESP32上運行的TensorFlow Lite創(chuàng)建一個語音控制的機器人。它可以響應簡單的單字命令:“左”,“右”,“前進”和“后退”。
硬件部件:
樂鑫ESP32S× 1個
伺服模塊(通用)× 2
通用車輪× 2
I2S麥克風板× 1個
軟件應用程序和在線服務:
PlatformIO IDE
我在Google的Commands數(shù)據(jù)集上使用TensorFlow訓練了一個模型。其中包含大約20個單詞,我選擇了一個很小的單詞子集-足以控制機器人的單詞,但數(shù)量不多,以至于模型變得難以管理。
為了生成訓練數(shù)據(jù),我們將WAV文件加載到其中,并從每個文件中提取頻譜圖。
為了獲得足夠的數(shù)據(jù)用于命令詞,我已經(jīng)多次重復這些詞,以改變音頻的位置并添加隨機噪聲-這為我們的神經(jīng)網(wǎng)絡提供了更多訓練數(shù)據(jù),并應該有助于其推廣。
幾個單詞-前進和后退的示例更少,因此我更經(jīng)常重復這些示例。
我最后得到了一個相當簡單的卷積神經(jīng)網(wǎng)絡,其中包含2個卷積層,然后是一個完全連接的層,然后是一個輸出層。
當我們試圖識別多個不同的單詞時,我們使用“ softmax”激活函數(shù),并使用“ CategoricalCrossentropy”作為我們的損失函數(shù)。
訓練模型后,我得到的訓練數(shù)據(jù)準確度不到92%,而驗證數(shù)據(jù)的準確度則超過92%。測試數(shù)據(jù)集為我們提供了類似的性能水平。
查看混淆矩陣,我們可以看到它主要是將單詞誤分類為無效單詞。這對于我們的用例來說是相當不錯的,因為這應該意味著機器人會誤判誤報而不是誤報。
由于模型似乎不適合,我已經(jīng)在完整的數(shù)據(jù)集上對其進行了訓練。這給了我們大約94%的最終精度,而在混淆矩陣上我們看到了更好的結(jié)果。但是,可能會有些過度擬合。
對于實際的機器人,我構(gòu)建了一個非常簡單的兩輪機器人。為了驅(qū)動車輪,我使用了兩個連續(xù)的伺服系統(tǒng)和小型動力單元。它具有相當寬的軸距,因為帶有ESP32的面包板非常大。
為了在ESP32上運行TensorFlow模型,我使用了TensorFlow Lite。我將其包裝在自己的代碼中,使其更易于使用。
要讀取音頻,我們使用I2S-它可以從模擬麥克風的內(nèi)置ADC讀取,也可以直接從I2S數(shù)字麥克風讀取。
命令檢測器由一個任務運行,該任務等待音頻樣本可用,然后為命令檢測器提供服務。
我們的命令檢測器將音頻數(shù)據(jù)后退一秒鐘,獲取頻譜圖,然后運行預測。
為了提高檢測的魯棒性,我們在多個音頻片段上對預測進行了采樣,并且還拒絕了在先前檢測的一秒鐘內(nèi)發(fā)生的任何檢測。
如果我們檢測到命令,則將其排隊等待命令處理器處理。
我們的命令處理器運行一個任務,該任務偵聽此隊列中的命令。
當命令到達時,它將更改發(fā)送到電動機的PWM信號,以停止電動機或設置所需的方向。
為了向前移動,我們將兩個電機都向前驅(qū)動,對于向后,我們將兩個電機都向后驅(qū)動。對于左,我們反轉(zhuǎn)左電動機并向前驅(qū)動右電動機,而對于右,我們進行相反的,右電動機反向,左電動機向前。
對于我們的連續(xù)伺服器,1500us的占空比將使它們停止,低于此值應使它們反向,而高于此值將使它們向前驅(qū)動。
我略微調(diào)整了右馬達正向值的值,因為它的旋轉(zhuǎn)速度不如左馬達快,這導致機器人轉(zhuǎn)向一側(cè)。
請注意,因為我們有正確的電機上下顛倒驅(qū)動它,所以我們將其反向運行,而將其向后驅(qū)動,則我們將其向前驅(qū)動。
您可能需要校準自己的電動機才能使機器人直線運動。
它運作良好!
它偶爾會混淆單詞并左右混合。
責任編輯:pj
-
機器人
+關(guān)注
關(guān)注
211文章
28557瀏覽量
207680 -
檢測器
+關(guān)注
關(guān)注
1文章
868瀏覽量
47733 -
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
7102瀏覽量
89273 -
頻譜
+關(guān)注
關(guān)注
7文章
884瀏覽量
45703
發(fā)布評論請先 登錄
相關(guān)推薦
評論