聲控86小六足





專案起源

此專案源起自86小六足專案的衍伸,
「ROS上竟然有一個語音識別器呢!」Sayer99 說道。
Sayer99 靈光一閃:「咦?如果把這個辨識器加上機器人,
不就可以用說的來控制機器人了嗎?」
隨後 Sayer99 就開始了這個專案。



功能說明

本專案利用 ROS (Robot Operating System) 上的語音辨識套件 pocketsphinx 來製作聲控 86小六足。



準備材料

  1. 一台 86小六足
  2. 裝好 ROS 的電腦一台,本文裝的 ROS 版本為 ROS Hydro Medusa
  3. 麥克風,接上電腦收音用,若是使用有內建麥克風的筆記型電腦則不用額外準備此項
  4. ESP8266,用來讓小六足透過 WiFi 與電腦上的 ROS 溝通



環境架設

安裝 pocketsphinx 套件

第一步要先在 ROS 裡安裝 pocketsphinx 這個語音辨識套件,讓電腦能夠完成語音辨識,並把結果透過字串傳給小六足,小六足再藉由此字串決定要做甚麼樣的動作。以下為安裝 pocketsphinx 的步驟:

sudo apt-get install gstreamer0.10-pocketsphinx
sudo apt-get install ros-hydro-pocketsphinx
sudo apt-get install ros-hydro-audio-common
sudo apt-get install libasound2

測試語音辨識

pocketsphinx package 中含有一個 node recognizer.py,可以處理音訊接收與辨識,並把辨識到的結果以 std_msgs/String 發布到 /recognizer/output 這個 topic。安裝完畢之後就先來做個簡單的測試,把電腦接上麥克風之後,執行:

roslaunch pocketsphinx robocup.launch

接著嘗試說一些 robocup 中設定的字詞,例如 bring me the glass, go to the kitchen, come with me 等等,順利的話就能在視窗中看到結果了。



詞彙製作

因為 recognizer.py 是把音訊分析之後的結果拿去與一個字庫做比對,然後從字庫裡選出一個最接近的結果當作辨識結果,例如上面的例子,用到的字即是別人為了 robocup 設計的。所以自定義字庫是非常必要的,畢竟如果只需要幾條簡單的命令,用太大範圍的字庫反而會降低辨識的成功率,依照自己的需求來制定字庫才能達到最佳的效果。製作方式非常簡單,先新增一個文字檔,例如 hexapod_command.txt,產生之後輸入自己需要的字詞,例如:

stop
move forward
move backward
move left
move right
half speed
full speed

完成之後要使用 online CMU language model(lm) tool 來將 hexapod_command.txt 轉成 .dic 與 .lm 檔,以提供給 recognizer.py 當作參數使用。下載網頁產生出來的檔案之後,放到一個自己心儀的資料夾裡,接著在 pocketsphinx package 裡面新增一個 launch file:

<launch>
  <node name="recognizer" pkg="pocketsphinx" type="recognizer.py" output="screen">
    <param name="lm" value="PATH OF HEXAPOD_COMMAND/hexapod_command.lm"/>
    <param name="idct" value="PATH OF HEXAPOD_COMMAND/hexapod_command.dic"/>
  </node>
</launch>

之後執行這個 launch file,recognizer 就可以運用 hexapod_command.txt 的內容來辨識囉!



動作控制

本動作是採用 86ME Mk-II 的預設專案 86Hexapod.rbm 的步行動作,你可以在 C:\ProgramData\86ME\examples 裡面找到它。
開啟專案後記得要根據每台86小六足去微調它的 offset 值,可以校正一些伺服機上的小誤差。

硬體配置方面是 86Hexapod + ESP8266,透過 Rosserial86 來與 ROS 連線,控制程式是由 86ME 產生出來的小六足控制程式下去修改的,利用一個 callback function 把 /recognizer/output 中的字串接出來,然後讓程式判斷要觸發哪個動作,這樣就完成聲控小六足了(範例程式),記得 setup() 中 wifi 的相關設定要修改成符合自己環境的設定。



成果展示

— DEMO影片 —




參考資料

[1] R. Patrick Goebel. ROS By Example, vol. 1, ch. 9.



自造遊樂園主頁面

The text of the 86Duino reference is licensed under a Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain.