创建别名

别名(Alias)

使用别名可以更加迅速地向许多致动器同时发送命令。

它们由“createAlias”动态定义到DCM。可以改变这些别名。

每个Alias都有一个名称和一份致动器名称列表。

通过“setAlias”,可以只使用一个方法来要求更新带有不同定时命令的所有的致动器,而且无需回馈所有致动器的名称。

注意:

请注意,目前,改变别名还无法做到线程安全。

注意:

到目前为止,DCM尚不宜使用大量的别名。

“createAlias”(创建别名)方法

/** * Create or change the alias * An alias is create to update many actuator (as with set) at the same time * * @param pParams ALValue with all data * pParams[0] Is the alias name (a new one or an already created one) * Then there is a list of x actuator name * pParams[1][0] The name of the 1st actuator * pParams[1][1] The name of the 2nd actuator * pParams[1][2] ... * * @result Same as param, but with the name removed if the actuator is not found * */ ALValue DCM::createAlias(ALValue& pParams)

所得结果是一个输入点参数的复制文件,没有找到致动器名的地方用""代替。 可以使用这个返回结果来检查某个或多个致动器名是否有误。

向别名发送命令时,最有效的方法是 “setAlias”。但是您也可以使用“set”方法,加上发送至每个致动器的相同的命令。 参见以下范例:

使用实例

Python语言:

import naoqi from naoqi import ALProxy dcm = ALProxy("DCM","127.0.0.1",9559) dcm.createAlias([ "ChestLeds", [ "ChestBoard/Led/Red/Actuator/Value", "ChestBoard/Led/Green/Actuator/Value", "ChestBoard/Led/Blue/Actuator/Value" ] ])

C++语言:

// Program running in a module. Do not forget the #include "dcmproxy.h" try { DCMProxy* dcm = new DCMProxy(pBroker); ALValue commands; commands.arraySetSize(2); commands[0] = string("ChestLeds"); commands[1].arraySetSize(3); commands[1][0] = string("ChestBoard/Led/Red/Actuator/Value"); commands[1][1] = string("ChestBoard/Led/Green/Actuator/Value"); commands[1][2] = string("ChestBoard/Led/Blue/Actuator/Value"); ALValue result = dcm->createAlias(commands); cout << result.toString() << endl; } AL_CATCH_ERR(return false;);

定义一个新的别名“ChestLeds”,包括3个致动器(3个发光二极管),按照“红、绿、蓝”的顺序定义。

以下为一个"set"方法范例。所有发光二极管前后两次渐亮、渐暗。

Python语言:

import naoqi from naoqi import ALProxy dcm = ALProxy("DCM","127.0.0.1",9559) dcm.createAlias([ "ChestLeds", [ "ChestBoard/Led/Red/Actuator/Value", "ChestBoard/Led/Green/Actuator/Value", "ChestBoard/Led/Blue/Actuator/Value" ] ]) dcm.set([ "ChestLeds", "ClearAll", [ [1.0, dcm.getTime(1000)], [0.0, dcm.getTime(2000)], [1.0, dcm.getTime(3000)], [0.0, dcm.getTime(4000)] ] ])

C++语言:

// Program running in a module. Do not forget the #include "dcmproxy.h" try { DCMProxy* dcm = new DCMProxy(pBroker); ALValue commandsAlias; ALValue commands; commandsAlias.arraySetSize(2); commandsAlias[0] = string("ChestLeds"); commandsAlias[1].arraySetSize(3); commandsAlias[1][0] = string("ChestBoard/Led/Red/Actuator/Value"); commandsAlias[1][1] = string("ChestBoard/Led/Green/Actuator/Value"); commandsAlias[1][2] = string("ChestBoard/Led/Blue/Actuator/Value"); dcm->createAlias(commandsAlias); commands.arraySetSize(3); commands[0] = string("ChestLeds"); commands[1] = string("ClearAll"); commands[2].arraySetSize(4); commands[2][0].arraySetSize(2); commands[2][0][0] = 1.0; commands[2][0][1] = dcm->getTime(1000); commands[2][1].arraySetSize(2); commands[2][1][0] = 0.0; commands[2][1][1] = dcm->getTime(2000); commands[2][2].arraySetSize(2); commands[2][2][0] = 1.0; commands[2][2][1] = dcm->getTime(3000); commands[2][3].arraySetSize(2); commands[2][3][0] = 0.0; commands[2][3][1] = dcm->getTime(4000); dcm->set(commands); } AL_CATCH_ERR(return false;);

注释:

这里的所有范例都使用“dcm.getTime()”来获得定时命令请求的所有时间。 这只是一个例子,还有其它更好的使用方法。 例如,您可以在启动时只完成一次“dcm.getTime()”,然后增加每毫秒整数值。 或者如果机器人上有一个模块在运行时,也可以使用CPU时钟。





Copyright © 2010 Aldebaran-Robotics - 版权所有