这一节,我想让 NAO 在每一次侦测到人脸的时候都说一句“你好,人类”。为了达到这一点,我们需要使用 ALFacedetection 模型下的”FaceDetected”事件。
    所以我们需要用 Python 写一个 NAOqi 模型出来。而要创建模型,我们首先需要一个中间件(Broker)。

    下面是一个例子:

    1. # -*- encoding: UTF-8 -*-
    2. """每当侦测到人脸时都要说一声“你好,人类”"""
    3. import sys
    4. import time
    5. from naoqi import ALProxy
    6. from naoqi import ALBroker
    7. from naoqi import ALModule
    8. from optparse import OptionParser
    9. pip = "nao.local"
    10. # 用全局变量来存储"HumanGreeter"模型中的实例
    11. HumanGreeter = None
    12. memory = None
    13. class HumanGreeterModule(ALModule):
    14. def __init__(self, name):
    15. ALmodule.__init__(self, name)
    16. #在这里不需要IP和端口,
    17. #因为我们可以在之后用自己写的中间件去连NAOqi中的中间件
    18. #创建一个ALTextToSpeech稍后使用
    19. self.tts = ALProxy("ALTextToSpeech")
    20. #使用FaceDetected事件
    21. global memory
    22. memory = ALProxy("ALMemory")
    23. memory.subscribeToEvent("FaceDetected",
    24. "HumanGreeter", "onFaceDetected")
    25. def onFaceDetected(self,*_args):
    26. #这个方法将会在每次侦测到人脸的时候被调用
    27. #当走路的时候不使用该事件
    28. #以避免多次重复
    29. memory.unsubscribeToEvent("FaceDetected", "HumanGreeter")
    30. self.tts.setLanguage("Chinese")
    31. self.tts.say("你好,人类")
    32. #再次使用上面那个方法
    33. memory.subscribeToEvent("FaceDetected",
    34. "HumanGreeter", "onFaceDetected")
    35. def main():
    36. """ Main entry point
    37. """
    38. parser = OptionParser()
    39. parser.add_option("--pip",
    40. help="Parent broker port. The IP address or your robot",
    41. dest="pip")
    42. parser.add_option("--pport",
    43. help="Parent broker port. The port NAOqi is listening to",
    44. dest="pport",
    45. type="int")
    46. parser.set_defaults(
    47. pip=NAO_IP,
    48. pport=9559)
    49. (opts, args_) = parser.parse_args()
    50. pip = opts.pip
    51. pport = opts.pport
    52. #我们需要用这个中间件来构建NAOqi模型并使用其他模型
    53. #这个中间件必须在运行期间始终有效
    54. myBroker = ALBroker("myBroker",
    55. "0.0.0.0", # 监听所有的
    56. 0, # 找到一个空端口并使用它
    57. pip, # 父类中间件IP
    58. pport) # 父类中间件端口
    59. #注意:HumanGreeter必须是全局变量
    60. #传入结构体的名字必须是这个变量的名字
    61. global HumanGreeter
    62. HumanGreeter = HumanGreeterModule("HumanGreeter")
    63. try:
    64. while True:
    65. time.sleep(1)
    66. except KeyboardInterrupt:
    67. print
    68. print "Interrupted by user, shutting down"
    69. myBroker.shutdown()
    70. sys.exit(0)
    71. if __name__ == "__main__":
    72. main()

    一些注意事项:

    • 要确保我们对实例使用的是全局变量
    • 要确保我们传入 ALModule 的结构体的名字是自己的变量的名字
    • 如果我们为此方法编写了文档字符串,且它不以下划线开头,则我们的类的方法会自动转换为绑定方法。(The method of your class are automatically transform into bound methods, providing that you wrote a doc string for this method, and it does not start with an underscore.)
    • 一旦建立了 ALBroker 对象,我们需要使这个对象一直有效,以使订阅(the subscribing)工作。 我们还需要中间件处于有效状态才能创建代理而不必指定 IP 或端口。
    • 脚本必须有—pip 和—pport 才能工作

    补充内容: 让 Python 脚本在 NAO 上运行的方法:

    将脚本传到 NAO 上,如/home/nao/reacting_to_events.py,然后编辑/home/nao/naoqi/preferences 下的 autoload.ini 文件,加上:

    1. [python]
    2. /home/nao/reacting_to_events.py

    请注意,在运行脚本时 NAOqi 会自动设置-pip 和-pport 值。

    最后,运行这个脚本,然后把你的脸放在 NAO 的面前,你将会听到一声”你好,人类“。


    瓦雀