聲控86小六足
專案起源

此專案源起自86小六足專案的衍伸,
「ROS上竟然有一個語音識別器呢!」Sayer99 說道。
Sayer99 靈光一閃:「咦?如果把這個辨識器加上機器人,
不就可以用說的來控制機器人了嗎?」
隨後 Sayer99 就開始了這個專案。
功能說明
本專案利用 ROS (Robot Operating System) 上的語音辨識套件 pocketsphinx 來製作聲控 86小六足。
準備材料
- 一台 86小六足
- 裝好 ROS 的電腦一台,本文裝的 ROS 版本為 ROS Hydro Medusa
- 麥克風,接上電腦收音用,若是使用有內建麥克風的筆記型電腦則不用額外準備此項
- 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.