法国Nao机器人如何实现舞蹈同步

很早之前就打算写一下博客,但一直都被Hold住了,直到现在才开始,在接下来的一段时间,小编会陆陆续续更新一些关于Nao的博客
以下方法,仅供参考,大神请移步
篇幅比较少,大家理解方法就好。

原理:
1. 同步各个机器人的时间,可以以网络时间为基准,也可以在其中一台机器人的时间为基准
2.机器人预加载舞蹈程序,等待接收指令
3.接收到指令,通过延时相对基准时间的偏移实现同步舞蹈

注意:以下仅仅是一些代码片段,仅作参考

实现:
1.  同步网络的时间,并记录偏移时间delayTime,以下使用循环同步时间只是为了减少偏移时间
from naoqi import ALProxy
import os

cmd = "/usr/sbin/ntpdate -u ntp.api.bz | awk -F ' ' '{print $10}'"
while True:
	delayTime = os.popen(cmd).read()
	delayTime = float(delayTime)
	if abs(delayTime) < 0.01:
		break

memory = ALProxy("ALMemory", "127.0.0.1", 9559)
</pre><pre class="python" name="code">注:/usr/sbin/ntpdate需要root权限,如果需要开机启动或者不想手动切换,可以修改一个叫su的配置文件使切换root不要输密码,或者修改一个叫sudoers的配置文件,使得普通用户可以运行/usr/sbin/ntpdate,推荐修改后者

2. 机器人预加载舞蹈程序,通过ALBehaviorManager,这个小编觉得很重要,之前看过一份关于舞蹈同步的文档,里面介绍了好几种方法,但是效果都不太理想,没有介绍过这一部分,原因在于不同机器人如果不预加载程序而直接运行,是无法保证同步的,毕竟就算完全相同的电脑的启动程序的时间都是有偏差的。
behavior = ALProxy("ALBehaviorManager", "127.0.0.1", 9559)
behavior.preloadBehavior("舞蹈程序名") 
delayTime = memory.getData("DelayTime")
memory.insertData("DelayTime", delayTime)

3.等待接收指令,这里可以使用事件来激活,也可以通过通知ALNotification或者其他类型的来发送指令,这里就不伸展开来了,考虑到网络原因,小编采用的是传感器事件,在触发事件之后等待时间的秒数刚好为0时开始执行事件执行函数,事件执行函数里面要对之前同步时间得到的偏移进行延时
while True:
    if datetime.datetime.now().second == 0:
        //事件执行函数
注:建议在延时时多延时2秒左右,因为时间偏移可能会出现负值

完整代码就不留在这里了,毕竟代码写得太挫不好意思拿出手,我会把一些代码放在GitHub上,实在有需要的可以到GitHub上面参考一下,关于一些API的使用就不作阐述,有需要直接研究文档即可,小编会陆陆续续写一些关于Nao的博客,有需要的可以继续关注

你可能感兴趣的:(nao,舞蹈同步,机器人舞蹈同步)