声控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 的相关设定要修改成符合自己环境的设定。



成果展示





参考资料

  • 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.