这是我的代码:
import create
robot = create.Create(3)
robot.toFullMode()
robot.setSong(0,[(36,16),(36,16),(38,32),(36,32),(53,32),(52,32),\
(36,16),(36,16),(38,32),(36,32),(55,32),(41,32),\
(36,16),(36,16),(48,32),(33,32)])
robot.setSong(1,[(53,32),(40,32),(38,32),(34,16),(34,16),\
(33,32),(41,32),(43,32),(41,32)])
robot.playSongNumber(0)
robot.playSongNumber(1)
第一首歌曲可以播放,但第二首却不能……有什么原因吗? 这是使用 iRobot Create 的
create.py
Python 接口进行编码的:
playSongNumber
检查当前是否正在播放歌曲,它将忽略新歌曲,直到第一首歌曲播放完毕。您可以通过轮询 song-playing?
传感器(编号 37)来检查歌曲是否完成。
创建开放接口文档位于此处:
http://www.irobot.com/filelibrary/pdfs/hrd/create/create%20open%20interface_v2.pdf
摘自该文件:
播放歌曲
此命令可让您选择一个 使用歌曲从添加到 iRobot Create 的歌曲中播放歌曲 命令。您必须使用歌曲添加一首或多首歌曲才能创建 命令以便播放命令起作用。此外,该命令还执行 如果歌曲已经在播放,则不起作用。等到当前正在播放的 在发送此命令之前歌曲已完成。注意“播放歌曲” 传感器数据包可用于检查Create是否准备好接受 这个命令。
歌曲播放
数据包 ID:37 数据字节:1 个无符号
OI的状况 歌曲播放器已返回。 1 = 当前正在播放的 OI 歌曲; 0 = OI 歌曲 不玩了。
在没有看到任何文档或源代码的情况下,这是一个疯狂的猜测,但是......
我敢打赌,
playSongNumber
函数只是向机器人发送播放命令,而不等待它完成,当你在它已经在播放某些内容时向它发送播放命令时,它会忽略你。
如果我是对的,那么希望 API 提供某种方法来等待它完成。如果它没有提供这一点,但它确实提供了一种轮询当前状态的方法,您可以在循环中执行此操作(在每次检查之间短暂休眠),直到完成。如果它甚至没有提供这一点,那么您必须通过计算音符数量(或添加持续时间,如果每一对中的数字之一是持续时间)来计算出这首歌需要多长时间,然后睡觉长。