声控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 的相关设定要修改成符合自己环境的设定。
成果展示
参考资料
- 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.